diff --git a/.travis.yml b/.travis.yml
deleted file mode 100644
index a902a1c..0000000
--- a/.travis.yml
+++ /dev/null
@@ -1,15 +0,0 @@
-language: go
-
-go:
-  - 1.7.x
-
-before_install:
-  - sudo add-apt-repository ppa:masterminds/glide -y
-  - sudo apt-get update -q
-  - sudo apt-get install glide -y
-
-install:
-  - glide install
-
-script:
-  - go test $(glide novendor)
diff --git a/api.go b/api.go
index 676d6fc..d68a498 100644
--- a/api.go
+++ b/api.go
@@ -48,16 +48,11 @@
 }
 
 type ApiDeployment struct {
-	ID               string          `json:"id"`
+	Org              string          `json:"org"`
+	Env              string          `json:"env"`
 	ScopeId          string          `json:"scopeId"`
-	Created          string          `json:"created"`
-	CreatedBy        string          `json:"createdBy"`
-	Updated          string          `json:"updated"`
-	UpdatedBy        string          `json:"updatedBy"`
-	ConfigJson       json.RawMessage `json:"configuration"`
-	BundleConfigJson json.RawMessage `json:"bundleConfiguration"`
-	DisplayName      string          `json:"displayName"`
-	URI              string          `json:"uri"`
+	Type             int             `json:"type"`
+	BlobURL          string          `json:"url"`
 }
 
 // sent to client
@@ -65,10 +60,12 @@
 
 
 
-const deploymentsEndpoint = "/deployments"
+const deploymentsEndpoint = "/configurations"
+const BlobEndpoint = "/blob/{blobId}"
 
 func InitAPI() {
 	services.API().HandleFunc(deploymentsEndpoint, apiGetCurrentDeployments).Methods("GET")
+	services.API().HandleFunc(BlobEndpoint, apiReturnBlobData).Methods("GET")
 }
 
 func writeError(w http.ResponseWriter, status int, code int, reason string) {
@@ -133,7 +130,7 @@
 			subscribers = make(map[chan deploymentsResult]struct{})
 			go func() {
 				eTag := incrementETag()
-				deployments, err := getReadyDeployments()
+				deployments, err := getUnreadyDeployments()
 				log.Debugf("delivering deployments to %d subscribers", len(subs))
 				for subscriber := range subs {
 					log.Debugf("delivering to: %v", subscriber)
@@ -150,6 +147,10 @@
 	}
 }
 
+func apiReturnBlobData(w http.ResponseWriter, r *http.Request) {
+
+}
+
 func apiGetCurrentDeployments(w http.ResponseWriter, r *http.Request) {
 
 	// If returning without a bundle (immediately or after timeout), status = 404
@@ -233,16 +234,11 @@
 
 	for _, d := range dataDeps {
 		apiDeps = append(apiDeps, ApiDeployment{
-			ID:               d.ID,
-			ScopeId:          d.DataScopeID,
-			Created:          convertTime(d.Created),
-			CreatedBy:        d.CreatedBy,
-			Updated:          convertTime(d.Updated),
-			UpdatedBy:        d.UpdatedBy,
-			BundleConfigJson: []byte(d.BundleConfigJSON),
-			ConfigJson:       []byte(d.ConfigJSON),
-			DisplayName:      d.BundleName,
-			URI:              d.LocalBundleURI,
+			ScopeId:    d.DataScopeID,
+			Org:   	    d.OrgID,
+			Env:        d.EnvID,
+			Type:       d.Type,
+			BlobURL:    d.BlobURL,
 		})
 	}
 
@@ -269,17 +265,3 @@
 	return strconv.FormatInt(e, 10)
 }
 
-func convertTime(t string) string {
-	if t == "" {
-		return ""
-	}
-	formats := []string{sqliteTimeFormat, sqlTimeFormat, iso8601, time.RFC3339}
-	for _, f := range formats {
-		timestamp, err := time.Parse(f, t)
-		if err == nil {
-			return timestamp.Format(iso8601)
-		}
-	}
-	log.Panic("convertTime: Unsupported time format: " + t)
-	return ""
-}
diff --git a/api_test.go b/api_test.go
deleted file mode 100644
index 1a9f81b..0000000
--- a/api_test.go
+++ /dev/null
@@ -1,273 +0,0 @@
-package apiGatewayDeploy
-
-import (
-	"bytes"
-	"encoding/json"
-	"io/ioutil"
-	"net/http"
-	"net/http/httptest"
-	"net/url"
-	"time"
-
-	. "github.com/onsi/ginkgo"
-	. "github.com/onsi/gomega"
-	"strconv"
-)
-
-var _ = Describe("api", func() {
-
-	Context("GET /deployments", func() {
-
-		It("should get empty set if no deployments", func() {
-
-			uri, err := url.Parse(testServer.URL)
-			uri.Path = deploymentsEndpoint
-
-			res, err := http.Get(uri.String())
-			Expect(err).ShouldNot(HaveOccurred())
-			defer res.Body.Close()
-
-			Expect(res.StatusCode).Should(Equal(http.StatusOK))
-
-			var depRes ApiDeploymentResponse
-			body, err := ioutil.ReadAll(res.Body)
-			Expect(err).ShouldNot(HaveOccurred())
-			json.Unmarshal(body, &depRes)
-
-			Expect(len(depRes)).To(Equal(0))
-			Expect(string(body)).Should(Equal("[]"))
-		})
-
-		It("should debounce requests", func(done Done) {
-			var in = make(chan interface{})
-			var out = make(chan []interface{})
-
-			go debounce(in, out, 3*time.Millisecond)
-
-			go func() {
-				defer GinkgoRecover()
-
-				received, ok := <-out
-				Expect(ok).To(BeTrue())
-				Expect(len(received)).To(Equal(2))
-
-				close(in)
-				received, ok = <-out
-				Expect(ok).To(BeFalse())
-
-				close(done)
-			}()
-
-			in <- "x"
-			in <- "y"
-		})
-
-		It("should get current deployments", func() {
-
-			deploymentID := "api_get_current"
-			insertTestDeployment(testServer, deploymentID)
-
-			uri, err := url.Parse(testServer.URL)
-			uri.Path = deploymentsEndpoint
-
-			res, err := http.Get(uri.String())
-			Expect(err).ShouldNot(HaveOccurred())
-			defer res.Body.Close()
-
-			Expect(res.StatusCode).Should(Equal(http.StatusOK))
-
-			var depRes ApiDeploymentResponse
-			body, err := ioutil.ReadAll(res.Body)
-			Expect(err).ShouldNot(HaveOccurred())
-			json.Unmarshal(body, &depRes)
-
-			Expect(len(depRes)).To(Equal(1))
-
-			dep := depRes[0]
-
-			Expect(dep.ID).To(Equal(deploymentID))
-			Expect(dep.ScopeId).To(Equal(deploymentID))
-			Expect(dep.DisplayName).To(Equal(deploymentID))
-
-			var config bundleConfigJson
-
-			err = json.Unmarshal(dep.ConfigJson, &config)
-			Expect(err).ShouldNot(HaveOccurred())
-			Expect(config.Name).To(Equal("/bundles/1"))
-
-			err = json.Unmarshal(dep.BundleConfigJson, &config)
-			Expect(err).ShouldNot(HaveOccurred())
-			Expect(config.Name).To(Equal("/bundles/1"))
-		})
-
-		It("should get 304 for no change", func() {
-
-			deploymentID := "api_no_change"
-			insertTestDeployment(testServer, deploymentID)
-
-			uri, err := url.Parse(testServer.URL)
-			uri.Path = deploymentsEndpoint
-			res, err := http.Get(uri.String())
-			Expect(err).ShouldNot(HaveOccurred())
-			defer res.Body.Close()
-			Expect(res.Header.Get("etag")).ShouldNot(BeEmpty())
-
-			req, err := http.NewRequest("GET", uri.String(), nil)
-			req.Header.Add("Content-Type", "application/json")
-			req.Header.Add("If-None-Match", res.Header.Get("etag"))
-
-			res, err = http.DefaultClient.Do(req)
-			Expect(err).ShouldNot(HaveOccurred())
-			defer res.Body.Close()
-			Expect(res.StatusCode).To(Equal(http.StatusNotModified))
-		})
-
-		It("should get empty set after blocking if no deployments", func() {
-
-			uri, err := url.Parse(testServer.URL)
-			uri.Path = deploymentsEndpoint
-
-			query := uri.Query()
-			query.Add("block", "1")
-			uri.RawQuery = query.Encode()
-
-			res, err := http.Get(uri.String())
-			Expect(err).ShouldNot(HaveOccurred())
-			defer res.Body.Close()
-
-			var depRes ApiDeploymentResponse
-			body, err := ioutil.ReadAll(res.Body)
-			Expect(err).ShouldNot(HaveOccurred())
-			json.Unmarshal(body, &depRes)
-
-			Expect(res.StatusCode).Should(Equal(http.StatusOK))
-			Expect(string(body)).Should(Equal("[]"))
-		})
-
-		It("should get new deployment set after blocking", func(done Done) {
-
-			deploymentID := "api_get_current_blocking"
-			insertTestDeployment(testServer, deploymentID)
-			uri, err := url.Parse(testServer.URL)
-			uri.Path = deploymentsEndpoint
-			res, err := http.Get(uri.String())
-			Expect(err).ShouldNot(HaveOccurred())
-			defer res.Body.Close()
-			eTag := res.Header.Get("etag")
-			Expect(eTag).ShouldNot(BeEmpty())
-
-			deploymentID = "api_get_current_blocking2"
-			go func() {
-				defer GinkgoRecover()
-
-				query := uri.Query()
-				query.Add("block", "1")
-				uri.RawQuery = query.Encode()
-				req, err := http.NewRequest("GET", uri.String(), nil)
-				req.Header.Add("Content-Type", "application/json")
-				req.Header.Add("If-None-Match", eTag)
-
-				res, err := http.DefaultClient.Do(req)
-				Expect(err).ShouldNot(HaveOccurred())
-				defer res.Body.Close()
-				Expect(res.StatusCode).To(Equal(http.StatusOK))
-
-				Expect(res.Header.Get("etag")).ShouldNot(BeEmpty())
-				Expect(res.Header.Get("etag")).ShouldNot(Equal(eTag))
-
-				var depRes ApiDeploymentResponse
-				body, err := ioutil.ReadAll(res.Body)
-				Expect(err).ShouldNot(HaveOccurred())
-				json.Unmarshal(body, &depRes)
-
-				Expect(len(depRes)).To(Equal(2))
-
-				dep := depRes[1]
-
-				Expect(dep.ID).To(Equal(deploymentID))
-				Expect(dep.ScopeId).To(Equal(deploymentID))
-				Expect(dep.DisplayName).To(Equal(deploymentID))
-
-				close(done)
-			}()
-
-			time.Sleep(250 * time.Millisecond) // give api call above time to block
-			insertTestDeployment(testServer, deploymentID)
-			deploymentsChanged <- deploymentID
-		})
-
-		It("should get 304 after blocking if no new deployment", func() {
-
-			deploymentID := "api_no_change_blocking"
-			insertTestDeployment(testServer, deploymentID)
-			uri, err := url.Parse(testServer.URL)
-			uri.Path = deploymentsEndpoint
-			res, err := http.Get(uri.String())
-			Expect(err).ShouldNot(HaveOccurred())
-			defer res.Body.Close()
-			Expect(res.Header.Get("etag")).ShouldNot(BeEmpty())
-
-			query := uri.Query()
-			query.Add("block", "1")
-			uri.RawQuery = query.Encode()
-			req, err := http.NewRequest("GET", uri.String(), nil)
-			req.Header.Add("Content-Type", "application/json")
-			req.Header.Add("If-None-Match", res.Header.Get("etag"))
-
-			res, err = http.DefaultClient.Do(req)
-			Expect(err).ShouldNot(HaveOccurred())
-			defer res.Body.Close()
-			Expect(res.StatusCode).To(Equal(http.StatusNotModified))
-		})
-	})
-
-})
-
-func insertTestDeployment(testServer *httptest.Server, deploymentID string) {
-
-	uri, err := url.Parse(testServer.URL)
-	Expect(err).ShouldNot(HaveOccurred())
-
-	uri.Path = "/bundles/1"
-	bundleUri := uri.String()
-	bundle := bundleConfigJson{
-		Name:         uri.Path,
-		URI:          bundleUri,
-		ChecksumType: "crc32",
-	}
-	bundle.Checksum = testGetChecksum(bundle.ChecksumType, bundleUri)
-	bundleJson, err := json.Marshal(bundle)
-	Expect(err).ShouldNot(HaveOccurred())
-
-	tx, err := getDB().Begin()
-	Expect(err).ShouldNot(HaveOccurred())
-
-	dep := DataDeployment{
-		ID:                 deploymentID,
-		BundleConfigID:     deploymentID,
-		ApidClusterID:      deploymentID,
-		DataScopeID:        deploymentID,
-		BundleConfigJSON:   string(bundleJson),
-		ConfigJSON:         string(bundleJson),
-		Created:            "",
-		CreatedBy:          "",
-		Updated:            "",
-		UpdatedBy:          "",
-		BundleName:         deploymentID,
-		BundleURI:          bundle.URI,
-		BundleChecksum:     bundle.Checksum,
-		BundleChecksumType: bundle.ChecksumType,
-		LocalBundleURI:     "x",
-		DeployStatus:       "",
-		DeployErrorCode:    0,
-		DeployErrorMessage: "",
-	}
-
-	err = InsertDeployment(tx, dep)
-	Expect(err).ShouldNot(HaveOccurred())
-
-	err = tx.Commit()
-	Expect(err).ShouldNot(HaveOccurred())
-}
-
-
diff --git a/apidGatewayDeploy-api.yaml b/apidGatewayDeploy-api.yaml
deleted file mode 100644
index c26d47f..0000000
--- a/apidGatewayDeploy-api.yaml
+++ /dev/null
@@ -1,231 +0,0 @@
-swagger: '2.0'
-info:
-  version: 0.0.1
-  title: Edge X Apid Gateway Deploy
-  contact:
-    name: Apigee, Inc.
-    url: http://www.apigee.com/
-    email: sales@apigee.com
-  license:
-    name: Apache 2.0
-    url: https://www.apache.org/licenses/LICENSE-2.0
-basePath: /deployments
-schemes:
-  - http
-consumes:
-  - application/json
-produces:
-  - application/json
-paths:
-  /:
-    get:
-      description: Retrieve current deployment system and bundles to install.
-      parameters:
-        - name: If-None-Match
-          in: header
-          type: string
-          description: "If request If-None-Match header matches the ETag of deployment, the server returns a 304 Not Modified response indicating that the client already has the most recent bundle list."
-        - name: block
-          in: query
-          type: integer
-          description: 'If block > 0 AND if there is no new bundle list available, then block for up to the specified number of seconds until a new bundle list becomes available. If no new deployment becomes available, then return 304 Not Modified if If-None-Match is specified.'
-      responses:
-        '200':
-          headers:
-            ETag:
-              description: "Client should reuse ETag value in If-None-Match header of the next GET request."
-              type: string
-          description: The deployment system and bundles to install.
-          examples:
-            application/json: [
-  {
-    "id":  "1234567890",
-    "displayName": "abc123",
-    "created":"1481917061",
-    "updated":"1481917061",
-    "createdBy":"mdobs",
-    "updatedBy":"mdobs",
-    "scopeId": "ABCDEF",
-    "uri": "file:///tmp/F1ERRO/0c9853d1ad9b7ec9f7d16ed16ada1be4/archive/369a01f320f926cd8ffac5dfda83b1d8a2129ab3.zip",
-    "configurationJson": {
-      "PropA": "scope1bundle1propA",
-      "PropSCOPE_LEVEL": "aaa",
-      "PropCLUSTER_LEVEL": "xxx"
-    }
-  },
-  {
-    "id":  "1234567891",
-    "displayName": "abc123_2",
-    "created":"1481917061",
-    "updated":"1481917061",
-    "createdBy":"mdobs",
-    "updatedBy":"mdobs",
-    "scopeId": "ABCDEF",
-    "uri": "file:///tmp/F1ERRO/0c9853d1ad9b7ec9f7d16ed16ada1be4/archive/369a01f320f926cd8ffac5dfda83b1d8a2129ab3.zip",
-    "configurationJson": {
-      "PropA": "scope1bundle2propA",
-      "PropSCOPE_LEVEL": "aaa",
-      "PropCLUSTER_LEVEL": "xxx"
-    }
-  },
-  {
-    "id":  "1234567892",
-    "displayName": "abc1234",
-    "created":"1481917061",
-    "updated":"1481917061",
-    "createdBy":"mdobs",
-    "updatedBy":"mdobs",
-    "scopeId": "ABCDEF",
-    "uri": "file:///tmp/F1ERRO/0c9853d1ad9b7ec9f7d16ed16ada1be4/archive/369a01f320f926cd8ffac5dfda83b1d8a2129ab3.zip",
-    "configurationJson": {
-      "PropA": "scope1bundlepropA",
-      "PropSCOPE_LEVEL": "aaa",
-      "PropCLUSTER_LEVEL": "xxx"
-    }
-  },
-  {
-    "id":  "1234567893",
-    "displayName": "abc123",
-    "created":"1481917061",
-    "updated":"1481917061",
-    "createdBy":"mdobs",
-    "updatedBy":"mdobs",
-    "scopeId": "EFGHIJK",
-    "uri": "file:///tmp/F1ERRO/0c9853d1ad9b7ec9f7d16ed16ada1be4/archive/369a01f320f926cd8ffac5dfda83b1d8a2129ab3.zip",
-    "configurationJson": {
-      "PropA": "scope2bundle1propA",
-      "PropSCOPE_LEVEL": "bbb",
-      "PropCLUSTER_LEVEL": "xxx"
-    }
-  },
-  {
-    "id":  "1234567894",
-    "displayName": "abc123_2",
-    "created":"1481917061",
-    "updated":"1481917061",
-    "createdBy":"fierrom",
-    "updatedBy":"fierrom",
-    "scopeId": "EFGHIJK",
-    "uri": "file:///tmp/F1ERRO/0c9853d1ad9b7ec9f7d16ed16ada1be4/archive/369a01f320f926cd8ffac5dfda83b1d8a2129ab3.zip",
-    "configurationJson": {
-      "PropA": "scope2bundle2propA",
-      "PropSCOPE_LEVEL": "bbb",
-      "PropCLUSTER_LEVEL": "xxx"
-    }
-  }
-]
-          schema:
-            $ref: '#/definitions/DeploymentResponse'
-        '304':
-          description: Deployment not modified.
-    put:
-      description: Save results of deployment
-      parameters:
-        - name: _
-          in: body
-          required: true
-          description: Success or failure response
-          schema:
-            $ref: '#/definitions/DeploymentResult'
-      responses:
-        '200':
-          description: OK
-        default:
-          description: Error response
-          schema:
-            $ref: '#/definitions/ErrorResponse'
-
-definitions:
-
-  ErrorResponse:
-    required:
-      - errorCode
-      - reason
-    properties:
-      errorCode:
-        type: number
-      reason:
-        type: string
-    example: {
-      "errorCode": 601,
-      "reason": "Something's wrong"
-    }
-
-  DeploymentResponse:
-    type: array
-    items:
-      $ref: '#/definitions/DeploymentBundle'
-
-  DeploymentBundle:
-    type: object
-    required:
-      - id
-      - scopeId
-      - createdBy
-      - created
-      - updatedBy
-      - updated
-      - displayName
-      - uri
-      - configurationJson
-    properties:
-      id:
-        type: string
-      scopeId:
-        type: string
-      createdBy:
-        type: string
-      created:
-        type: number
-      updatedBy:
-        type: string
-      updated:
-        type: number
-      displayName:
-        type: string
-      uri:
-        type: string
-      configurationJson:
-        type: object
-
-  DeploymentResult:
-    type: array
-    items:
-      $ref: '#/definitions/DeploymentBundleResult'
-    example: [
-      {
-        "id": "1234567890",
-        "status": "SUCCESS"
-      },
-      {
-        "id":  "1234567890",
-        "status": "SUCCESS"
-      },
-      {
-        "id":  "1234567890",
-        "status": "SUCCESS"
-      }
-    ]
-
-  DeploymentBundleResult:
-    type: object
-    required:
-      - id
-      - status
-    properties:
-      id:
-        type: string
-      message:
-        type: string
-      errorCode:
-        type: number
-      status:
-        type: string
-        enum:
-          - "SUCCESS"
-          - "FAIL"
-    description: Status of SUCCESS or FAIL plus error
-    example: {
-      "id": 1234567890,
-      "status": "SUCCESS"
-    }
\ No newline at end of file
diff --git a/apidGatewayDeploy_suite_test.go b/apidGatewayDeploy_suite_test.go
deleted file mode 100644
index 236fe51..0000000
--- a/apidGatewayDeploy_suite_test.go
+++ /dev/null
@@ -1,138 +0,0 @@
-package apiGatewayDeploy
-
-import (
-	. "github.com/onsi/ginkgo"
-	. "github.com/onsi/gomega"
-
-	"encoding/hex"
-
-	"github.com/30x/apid-core"
-	"github.com/30x/apid-core/factory"
-
-	"io/ioutil"
-	"net/http"
-	"net/http/httptest"
-	"net/url"
-	"os"
-	"testing"
-	"time"
-)
-
-var (
-	tmpDir              string
-	testServer          *httptest.Server
-	testLastTrackerVars map[string]string
-	testLastTrackerBody []byte
-)
-
-var _ = BeforeSuite(func() {
-	apid.Initialize(factory.DefaultServicesFactory())
-
-	config := apid.Config()
-
-	var err error
-	tmpDir, err = ioutil.TempDir("", "api_test")
-	Expect(err).NotTo(HaveOccurred())
-
-	config.Set("local_storage_path", tmpDir)
-	config.Set(configApidInstanceID, "INSTANCE_ID")
-	config.Set(configApidClusterID, "CLUSTER_ID")
-	config.Set(configApiServerBaseURI, "http://localhost")
-	config.Set(configDebounceDuration, "1ms")
-
-	apid.InitializePlugins("")
-
-	// init full DB
-	db, err := data.DB()
-	Expect(err).NotTo(HaveOccurred())
-	err = InitDBFullColumns(db)
-	Expect(err).NotTo(HaveOccurred())
-	SetDB(db)
-
-	bundleCleanupDelay = time.Millisecond
-	bundleRetryDelay = 10 * time.Millisecond
-	markDeploymentFailedAfter = 50 * time.Millisecond
-	concurrentDownloads = 1
-	downloadQueueSize = 1
-
-	router := apid.API().Router()
-	// fake an unreliable bundle repo
-	count := 1
-	failedOnce := false
-	router.HandleFunc("/bundles/failonce", func(w http.ResponseWriter, req *http.Request) {
-		if failedOnce {
-			vars := apid.API().Vars(req)
-			w.Write([]byte("/bundles/" + vars["id"]))
-		} else {
-			failedOnce = true
-			w.WriteHeader(500)
-		}
-	}).Methods("GET")
-
-	router.HandleFunc("/bundles/{id}", func(w http.ResponseWriter, req *http.Request) {
-		count++
-		vars := apid.API().Vars(req)
-		if count%2 == 0 && vars["id"] != "checksum" {
-			w.WriteHeader(500)
-			return
-		}
-		if vars["id"] == "longfail" {
-			time.Sleep(markDeploymentFailedAfter + (250 * time.Millisecond))
-		}
-		w.Write([]byte("/bundles/" + vars["id"]))
-
-	}).Methods("GET")
-
-	// fake an unreliable APID tracker
-	router.HandleFunc("/clusters/{clusterID}/apids/{instanceID}/deployments",
-		func(w http.ResponseWriter, req *http.Request) {
-			count++
-			if count%2 == 0 {
-				w.WriteHeader(500)
-				return
-			}
-
-			testLastTrackerVars = apid.API().Vars(req)
-			testLastTrackerBody, err = ioutil.ReadAll(req.Body)
-			Expect(err).ToNot(HaveOccurred())
-
-			w.Write([]byte("OK"))
-
-		}).Methods("PUT")
-	testServer = httptest.NewServer(router)
-})
-
-var _ = AfterSuite(func() {
-	apid.Events().Close()
-	if testServer != nil {
-		testServer.Close()
-	}
-	os.RemoveAll(tmpDir)
-})
-
-var _ = BeforeEach(func() {
-	var err error
-	apiServerBaseURI, err = url.Parse(testServer.URL)
-	Expect(err).NotTo(HaveOccurred())
-
-	_, err = getDB().Exec("DELETE FROM edgex_deployment")
-	Expect(err).ShouldNot(HaveOccurred())
-
-	_, err = getDB().Exec("UPDATE etag SET value=1")
-})
-
-func TestApidGatewayDeploy(t *testing.T) {
-	RegisterFailHandler(Fail)
-	RunSpecs(t, "ApidGatewayDeploy Suite")
-}
-
-func testGetChecksum(hashType, uri string) string {
-	url, err := url.Parse(uri)
-	Expect(err).NotTo(HaveOccurred())
-
-	hashWriter, err := getHashWriter(hashType)
-	Expect(err).NotTo(HaveOccurred())
-
-	hashWriter.Write([]byte(url.Path))
-	return hex.EncodeToString(hashWriter.Sum(nil))
-}
diff --git a/bundle.go b/bundle.go
index 5a2c977..8bd756c 100644
--- a/bundle.go
+++ b/bundle.go
@@ -1,22 +1,15 @@
 package apiGatewayDeploy
 
 import (
-	"crypto/md5"
-	"crypto/sha256"
-	"crypto/sha512"
+
 	"encoding/base64"
-	"encoding/hex"
-	"errors"
 	"fmt"
-	"hash"
-	"hash/crc32"
 	"io"
 	"io/ioutil"
 	"net/http"
 	"net/url"
 	"os"
 	"path"
-	"strings"
 	"time"
 )
 
@@ -42,19 +35,11 @@
 
 func queueDownloadRequest(dep DataDeployment) {
 
-	hashWriter, err := getHashWriter(dep.BundleChecksumType)
-	if err != nil {
-		msg := fmt.Sprintf("invalid bundle checksum type: %s for deployment: %s", dep.BundleChecksumType, dep.ID)
-		log.Error(msg)
-		return
-	}
-
 	retryIn := bundleRetryDelay
 	maxBackOff := 5 * time.Minute
 	markFailedAt := time.Now().Add(markDeploymentFailedAfter)
 	req := &DownloadRequest{
 		dep:          dep,
-		hashWriter:   hashWriter,
 		bundleFile:   getBundleFile(dep),
 		backoffFunc:  createBackoff(retryIn, maxBackOff),
 		markFailedAt: markFailedAt,
@@ -64,7 +49,6 @@
 
 type DownloadRequest struct {
 	dep          DataDeployment
-	hashWriter   hash.Hash
 	bundleFile   string
 	backoffFunc  func()
 	markFailedAt time.Time
@@ -73,18 +57,11 @@
 func (r *DownloadRequest) downloadBundle() {
 
 	dep := r.dep
-	log.Debugf("starting bundle download attempt for %s: %s", dep.ID, dep.BundleURI)
-
-	deployments, err := getDeployments("WHERE id=$1", dep.ID)
-	if err == nil && len(deployments) == 0 {
-		log.Debugf("never mind, deployment %s was deleted", dep.ID)
-		return
-	}
+	log.Debugf("starting bundle download attempt for %s: %s", dep.ID, dep.BlobID)
 
 	r.checkTimeout()
 
-	r.hashWriter.Reset()
-	tempFile, err := downloadFromURI(dep.BundleURI, r.hashWriter, dep.BundleChecksum)
+	tempFile, err := downloadFromURI(dep.BlobID)
 
 	if err == nil {
 		err = os.Rename(tempFile, r.bundleFile)
@@ -98,7 +75,7 @@
 	}
 
 	if err == nil {
-		err = updateLocalBundleURI(dep.ID, r.bundleFile)
+		err = updatelocal_fs_location(dep.BlobID, r.bundleFile)
 	}
 
 	if err != nil {
@@ -110,7 +87,7 @@
 		return
 	}
 
-	log.Debugf("bundle for %s downloaded: %s", dep.ID, dep.BundleURI)
+	log.Debugf("bundle for %s downloaded: %s", dep.ID, dep.BlobID)
 
 	// send deployments to client
 	deploymentsChanged <- dep.ID
@@ -122,25 +99,59 @@
 		if time.Now().After(r.markFailedAt) {
 			r.markFailedAt = time.Time{}
 			log.Debugf("bundle download timeout. marking deployment %s failed. will keep retrying: %s",
-				r.dep.ID, r.dep.BundleURI)
+				r.dep.ID, r.dep.BlobID)
 		}
 	}
 }
 
 func getBundleFile(dep DataDeployment) string {
 
-	// the content of the URI is unfortunately not guaranteed not to change, so I can't just use dep.BundleURI
+	// the content of the URI is unfortunately not guaranteed not to change, so I can't just use dep.BlobID
 	// unfortunately, this also means that a bundle cache isn't especially relevant
 	fileName := dep.DataScopeID + "_" + dep.ID
 
 	return path.Join(bundlePath, base64.StdEncoding.EncodeToString([]byte(fileName)))
 }
 
-func downloadFromURI(uri string, hashWriter hash.Hash, expectedHash string) (tempFileName string, err error) {
+func getSignedURL(blobId string) (string, error) {
 
-	log.Debugf("Downloading bundle: %s", uri)
+	blobUri, err := url.Parse(config.GetString(configBlobServerBaseURI))
+	if err != nil {
+		log.Panicf("bad url value for config %s: %s", blobUri, err)
+	}
+
+	//TODO : Just a temp Hack
+	blobUri.Path = path.Join(blobUri.Path, "/v1/blobstore/signeduri?action=GET&key=" + blobId)
+	uri := blobUri.String()
+
+	surl, err := getURIReader(uri)
+	if err != nil {
+		log.Errorf("Unable to get signed URL from BlobServer %s: %v", uri, err)
+		return "", err
+	}
+
+	signedURL, err := ioutil.ReadAll(surl)
+	if err != nil {
+		log.Errorf("Invalid response from BlobServer for {%s} error: {%v}", uri, err)
+		return "", err
+	}
+	return string(signedURL), nil
+}
+
+
+// downloadFromURI involves retrieving the signed URL for the blob, and storing the resource locally
+// after downloading the resource from GCS (via the signed URL)
+func downloadFromURI(blobId string) (tempFileName string, err error) {
 
 	var tempFile *os.File
+	log.Debugf("Downloading bundle: %s", blobId)
+
+	uri, err := getSignedURL(blobId)
+	if err != nil {
+		log.Errorf("Unable to get signed URL for blobId {%s}, error : {%v}", blobId, err)
+		return
+	}
+
 	tempFile, err = ioutil.TempFile(bundlePath, "download")
 	if err != nil {
 		log.Errorf("Unable to create temp file: %v", err)
@@ -149,55 +160,27 @@
 	defer tempFile.Close()
 	tempFileName = tempFile.Name()
 
-	var bundleReader io.ReadCloser
-	bundleReader, err = getURIFileReader(uri)
+	var confReader io.ReadCloser
+	confReader, err = getURIReader(uri)
 	if err != nil {
 		log.Errorf("Unable to retrieve bundle %s: %v", uri, err)
 		return
 	}
-	defer bundleReader.Close()
+	defer confReader.Close()
 
-	// track checksum
-	teedReader := io.TeeReader(bundleReader, hashWriter)
-
-	_, err = io.Copy(tempFile, teedReader)
+	_, err = io.Copy(tempFile, confReader)
 	if err != nil {
 		log.Errorf("Unable to write bundle %s: %v", tempFileName, err)
 		return
 	}
 
-	// check checksum
-	checksum := hex.EncodeToString(hashWriter.Sum(nil))
-	if checksum != expectedHash {
-		err = errors.New(fmt.Sprintf("Bad checksum on %s. calculated: %s, given: %s", tempFileName, checksum, expectedHash))
-		log.Error(err.Error())
-		return
-	}
-
 	log.Debugf("Bundle %s downloaded to: %s", uri, tempFileName)
 	return
 }
 
 // retrieveBundle retrieves bundle data from a URI
-func getURIFileReader(uriString string) (io.ReadCloser, error) {
+func getURIReader(uriString string) (io.ReadCloser, error) {
 
-	uri, err := url.Parse(uriString)
-	if err != nil {
-		return nil, fmt.Errorf("DownloadFileUrl: Failed to parse urlStr: %s", uriString)
-	}
-
-	// todo: add authentication - TBD?
-
-	// assume it's a file if no scheme - todo: remove file support?
-	if uri.Scheme == "" || uri.Scheme == "file" {
-		f, err := os.Open(uri.Path)
-		if err != nil {
-			return nil, err
-		}
-		return f, nil
-	}
-
-	// GET the contents at uriString
 	client := http.Client{
 		Timeout: bundleDownloadConnTimeout,
 	}
@@ -206,42 +189,11 @@
 		return nil, err
 	}
 	if res.StatusCode != 200 {
-		return nil, fmt.Errorf("Bundle uri %s failed with status %d", uriString, res.StatusCode)
+		return nil, fmt.Errorf("GET uri %s failed with status %d", uriString, res.StatusCode)
 	}
 	return res.Body, nil
 }
 
-func getHashWriter(hashType string) (hash.Hash, error) {
-
-	var hashWriter hash.Hash
-
-	switch strings.ToLower(hashType) {
-	case "":
-		hashWriter = fakeHash{md5.New()}
-	case "md5":
-		hashWriter = md5.New()
-	case "crc32":
-		hashWriter = crc32.NewIEEE()
-	case "sha256":
-		hashWriter = sha256.New()
-	case "sha512":
-		hashWriter = sha512.New()
-	default:
-		return nil, errors.New(
-			fmt.Sprintf("invalid checksumType: %s. valid types: md5, crc32, sha256, sha512", hashType))
-	}
-
-	return hashWriter, nil
-}
-
-type fakeHash struct {
-	hash.Hash
-}
-
-func (f fakeHash) Sum(b []byte) []byte {
-	return []byte("")
-}
-
 func initializeBundleDownloading() {
 
 	// create workers
diff --git a/bundle_test.go b/bundle_test.go
deleted file mode 100644
index 46e7a74..0000000
--- a/bundle_test.go
+++ /dev/null
@@ -1,338 +0,0 @@
-package apiGatewayDeploy
-
-import (
-	"encoding/json"
-	"net/url"
-	"time"
-
-	"net/http"
-	"net/http/httptest"
-
-	"io/ioutil"
-
-	. "github.com/onsi/ginkgo"
-	. "github.com/onsi/gomega"
-)
-
-var _ = Describe("bundle", func() {
-
-	Context("download", func() {
-
-		It("should timeout connection and retry", func() {
-			defer func() {
-				bundleDownloadConnTimeout = time.Second
-			}()
-			bundleDownloadConnTimeout = 100 * time.Millisecond
-			firstTime := true
-			ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
-				if firstTime {
-					firstTime = false
-					time.Sleep(1 * time.Second)
-					w.WriteHeader(500)
-				} else {
-					w.Write([]byte("/bundles/longfail"))
-				}
-			}))
-			defer ts.Close()
-
-			uri, err := url.Parse(ts.URL)
-			Expect(err).ShouldNot(HaveOccurred())
-			uri.Path = "/bundles/longfail"
-
-			tx, err := getDB().Begin()
-			Expect(err).ShouldNot(HaveOccurred())
-
-			deploymentID := "bundle_download_fail"
-			dep := DataDeployment{
-				ID:                 deploymentID,
-				DataScopeID:        deploymentID,
-				BundleURI:          uri.String(),
-				BundleChecksum:     testGetChecksum("crc32", uri.String()),
-				BundleChecksumType: "crc32",
-			}
-
-			err = InsertDeployment(tx, dep)
-			Expect(err).ShouldNot(HaveOccurred())
-
-			err = tx.Commit()
-			Expect(err).ShouldNot(HaveOccurred())
-
-			queueDownloadRequest(dep)
-
-			var listener = make(chan deploymentsResult)
-			addSubscriber <- listener
-			result := <-listener
-
-			Expect(result.err).NotTo(HaveOccurred())
-			Expect(len(result.deployments)).To(Equal(1))
-			d := result.deployments[0]
-			Expect(d.ID).To(Equal(deploymentID))
-		})
-
-		It("should timeout deployment, mark status as failed, then finish", func() {
-
-			proceed := make(chan bool)
-			failedOnce := false
-			ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
-				if failedOnce {
-					proceed <- true
-					time.Sleep(markDeploymentFailedAfter)
-					w.Write([]byte("/bundles/longfail"))
-				} else {
-					failedOnce = true
-					time.Sleep(markDeploymentFailedAfter)
-					w.WriteHeader(500)
-				}
-			}))
-			defer ts.Close()
-
-			deploymentID := "bundle_download_fail"
-
-			uri, err := url.Parse(ts.URL)
-			Expect(err).ShouldNot(HaveOccurred())
-
-			uri.Path = "/bundles/longfail"
-			bundleUri := uri.String()
-			bundle := bundleConfigJson{
-				Name:         uri.Path,
-				URI:          bundleUri,
-				ChecksumType: "crc32",
-			}
-			bundle.Checksum = testGetChecksum(bundle.ChecksumType, bundleUri)
-			bundleJson, err := json.Marshal(bundle)
-			Expect(err).ShouldNot(HaveOccurred())
-
-			tx, err := getDB().Begin()
-			Expect(err).ShouldNot(HaveOccurred())
-
-			dep := DataDeployment{
-				ID:                 deploymentID,
-				BundleConfigID:     deploymentID,
-				ApidClusterID:      deploymentID,
-				DataScopeID:        deploymentID,
-				BundleConfigJSON:   string(bundleJson),
-				ConfigJSON:         string(bundleJson),
-				Created:            "",
-				CreatedBy:          "",
-				Updated:            "",
-				UpdatedBy:          "",
-				BundleName:         deploymentID,
-				BundleURI:          bundle.URI,
-				BundleChecksum:     bundle.Checksum,
-				BundleChecksumType: bundle.ChecksumType,
-				LocalBundleURI:     "",
-				DeployStatus:       "",
-				DeployErrorCode:    0,
-				DeployErrorMessage: "",
-			}
-
-			err = InsertDeployment(tx, dep)
-			Expect(err).ShouldNot(HaveOccurred())
-
-			err = tx.Commit()
-			Expect(err).ShouldNot(HaveOccurred())
-
-			trackerHit := false
-			tracker := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
-				defer GinkgoRecover()
-
-				b, err := ioutil.ReadAll(r.Body)
-				Expect(err).ShouldNot(HaveOccurred())
-				var received apiDeploymentResults
-				json.Unmarshal(b, &received)
-
-				expected := apiDeploymentResults{
-					{
-						ID:        deploymentID,
-						Status:    RESPONSE_STATUS_FAIL,
-						ErrorCode: TRACKER_ERR_BUNDLE_DOWNLOAD_TIMEOUT,
-						Message:   "bundle download failed",
-					},
-				}
-				Expect(received).To(Equal(expected))
-				trackerHit = true
-				w.Write([]byte("OK"))
-			}))
-			defer tracker.Close()
-			apiServerBaseURI, err = url.Parse(tracker.URL)
-			Expect(err).ShouldNot(HaveOccurred())
-
-			queueDownloadRequest(dep)
-
-			<-proceed
-
-			// get error state deployment
-			deployments, err := getDeployments("WHERE id=$1", deploymentID)
-			Expect(err).ShouldNot(HaveOccurred())
-
-			Expect(len(deployments)).To(Equal(1))
-			d := deployments[0]
-
-			Expect(d.ID).To(Equal(deploymentID))
-			Expect(d.DeployStatus).To(Equal(RESPONSE_STATUS_FAIL))
-			Expect(d.DeployErrorCode).To(Equal(TRACKER_ERR_BUNDLE_DOWNLOAD_TIMEOUT))
-			Expect(d.DeployErrorMessage).ToNot(BeEmpty())
-			Expect(d.LocalBundleURI).To(BeEmpty())
-
-			Expect(trackerHit).To(BeTrue())
-
-			var listener = make(chan deploymentsResult)
-			addSubscriber <- listener
-			<-listener
-
-			// get finished deployment
-			// still in error state (let client update), but with valid local bundle
-			deployments, err = getDeployments("WHERE id=$1", deploymentID)
-			Expect(err).ShouldNot(HaveOccurred())
-
-			Expect(len(deployments)).To(Equal(1))
-			d = deployments[0]
-
-			Expect(d.ID).To(Equal(deploymentID))
-			Expect(d.DeployStatus).To(Equal(RESPONSE_STATUS_FAIL))
-			Expect(d.DeployErrorCode).To(Equal(TRACKER_ERR_BUNDLE_DOWNLOAD_TIMEOUT))
-			Expect(d.DeployErrorMessage).ToNot(BeEmpty())
-			Expect(d.LocalBundleURI).To(BeAnExistingFile())
-		})
-
-		It("should not continue attempts if deployment has been deleted", func() {
-
-			deploymentID := "bundle_download_deployment_deleted"
-
-			uri, err := url.Parse(testServer.URL)
-			Expect(err).ShouldNot(HaveOccurred())
-
-			uri.Path = "/bundles/failonce"
-			bundleUri := uri.String()
-			bundle := bundleConfigJson{
-				Name:         uri.Path,
-				URI:          bundleUri,
-				ChecksumType: "crc32",
-			}
-			bundle.Checksum = testGetChecksum(bundle.ChecksumType, bundleUri)
-			bundleJson, err := json.Marshal(bundle)
-			Expect(err).ShouldNot(HaveOccurred())
-
-			tx, err := getDB().Begin()
-			Expect(err).ShouldNot(HaveOccurred())
-
-			dep := DataDeployment{
-				ID:                 deploymentID,
-				BundleConfigID:     deploymentID,
-				ApidClusterID:      deploymentID,
-				DataScopeID:        deploymentID,
-				BundleConfigJSON:   string(bundleJson),
-				ConfigJSON:         string(bundleJson),
-				Created:            "",
-				CreatedBy:          "",
-				Updated:            "",
-				UpdatedBy:          "",
-				BundleName:         deploymentID,
-				BundleURI:          bundle.URI,
-				BundleChecksum:     bundle.Checksum,
-				BundleChecksumType: bundle.ChecksumType,
-				LocalBundleURI:     "",
-				DeployStatus:       "",
-				DeployErrorCode:    0,
-				DeployErrorMessage: "",
-			}
-
-			err = InsertDeployment(tx, dep)
-			Expect(err).ShouldNot(HaveOccurred())
-
-			err = tx.Commit()
-			Expect(err).ShouldNot(HaveOccurred())
-
-			queueDownloadRequest(dep)
-
-			// skip first try
-			time.Sleep(bundleRetryDelay)
-
-			// delete deployment
-			tx, err = getDB().Begin()
-			Expect(err).ShouldNot(HaveOccurred())
-			deleteDeployment(tx, dep.ID)
-			err = tx.Commit()
-			Expect(err).ShouldNot(HaveOccurred())
-
-			// wait for final
-			time.Sleep(bundleRetryDelay)
-
-			// No way to test this programmatically currently
-			// search logs for "never mind, deployment bundle_download_deployment_deleted was deleted"
-		})
-	})
-
-	Context("checksums", func() {
-
-		It("should download with empty checksumType", func() {
-			checksumDownloadValid("")
-		})
-
-		It("should fail download with bad empty checksumType", func() {
-			checksumDownloadInvalid("")
-		})
-
-		It("should fail download with bad md5", func() {
-			checksumDownloadInvalid("md5")
-		})
-
-		It("should download with good md5", func() {
-			checksumDownloadValid("md5")
-		})
-
-		It("should fail download with bad md5", func() {
-			checksumDownloadInvalid("md5")
-		})
-
-		It("should download with good crc32", func() {
-			checksumDownloadValid("crc32")
-		})
-
-		It("should fail download with bad crc32", func() {
-			checksumDownloadInvalid("crc32")
-		})
-
-		It("should download with good sha256", func() {
-			checksumDownloadValid("sha256")
-		})
-
-		It("should fail download with bad sha256", func() {
-			checksumDownloadInvalid("sha256")
-		})
-
-		It("should download correctly with sha512", func() {
-			checksumDownloadValid("sha512")
-		})
-
-		It("should fail download with bad sha512", func() {
-			checksumDownloadInvalid("sha512")
-		})
-	})
-})
-
-func checksumDownloadValid(checksumType string) {
-	defer GinkgoRecover()
-
-	uri, err := url.Parse(testServer.URL)
-	Expect(err).ShouldNot(HaveOccurred())
-	uri.Path = "/bundles/checksum"
-	checksum := testGetChecksum(checksumType, uri.String())
-	hash, err := getHashWriter(checksumType)
-	Expect(err).NotTo(HaveOccurred())
-	_, err = downloadFromURI(uri.String(), hash, checksum)
-	Expect(err).NotTo(HaveOccurred())
-}
-
-func checksumDownloadInvalid(checksumType string) {
-	defer GinkgoRecover()
-
-	uri, err := url.Parse(testServer.URL)
-	Expect(err).ShouldNot(HaveOccurred())
-	uri.Path = "/bundles/checksum"
-	checksum := "invalidchecksum"
-	hash, err := getHashWriter(checksumType)
-	Expect(err).NotTo(HaveOccurred())
-	_, err = downloadFromURI(uri.String(), hash, checksum)
-	Expect(err).To(HaveOccurred())
-}
diff --git a/cmd/apidGatewayDeploy/deployments.json b/cmd/apidGatewayDeploy/deployments.json
deleted file mode 100644
index 72efd9f..0000000
--- a/cmd/apidGatewayDeploy/deployments.json
+++ /dev/null
@@ -1,24 +0,0 @@
-[
-  {
-    "id": "api_no_change_blocking",
-    "scopeId": "api_no_change_blocking",
-    "created": "",
-    "createdBy": "",
-    "updated": "",
-    "updatedBy": "",
-    "configuration": {
-      "name": "/bundles/1",
-      "uri": "http://127.0.0.1:53589/bundles/1",
-      "checksumType": "crc-32",
-      "checksum": "c65a0f2a"
-    },
-    "bundleConfiguration": {
-      "name": "/bundles/1",
-      "uri": "http://127.0.0.1:53589/bundles/1",
-      "checksumType": "crc-32",
-      "checksum": "c65a0f2a"
-    },
-    "displayName": "api_no_change_blocking",
-    "uri": "x"
-  }
-]
\ No newline at end of file
diff --git a/cmd/apidGatewayDeploy/main.go b/cmd/apidGatewayDeploy/main.go
deleted file mode 100644
index 3939944..0000000
--- a/cmd/apidGatewayDeploy/main.go
+++ /dev/null
@@ -1,132 +0,0 @@
-package main
-
-import (
-	"encoding/json"
-	"flag"
-	"github.com/30x/apid-core"
-	"github.com/30x/apid-core/factory"
-	"github.com/30x/apidGatewayDeploy"
-	_ "github.com/30x/apidGatewayDeploy"
-	"io/ioutil"
-	"os"
-)
-
-func main() {
-	deploymentsFlag := flag.String("deployments", "", "file path to a deployments file (for testing)")
-	flag.Parse()
-	deploymentsFile := *deploymentsFlag
-
-	apid.Initialize(factory.DefaultServicesFactory())
-
-	log := apid.Log()
-	log.Debug("initializing...")
-
-	configService := apid.Config()
-
-	var deployments apiGatewayDeploy.ApiDeploymentResponse
-	if deploymentsFile != "" {
-		log.Printf("Running in temp dir using deployments file: %s", deploymentsFile)
-		tmpDir, err := ioutil.TempDir("", "apidGatewayDeploy")
-		if err != nil {
-			log.Panicf("ERROR: Unable to create temp dir", err)
-		}
-		defer os.RemoveAll(tmpDir)
-
-		configService.Set("data_path", tmpDir)
-
-		if deploymentsFile != "" {
-			bytes, err := ioutil.ReadFile(deploymentsFile)
-			if err != nil {
-				log.Errorf("ERROR: Unable to read bundle config file at %s", deploymentsFile)
-				return
-
-			}
-
-			err = json.Unmarshal(bytes, &deployments)
-			if err != nil {
-				log.Errorf("ERROR: Unable to parse deployments %v", err)
-				return
-			}
-		}
-	}
-
-	apid.InitializePlugins("")
-
-	insertTestDeployments(deployments)
-
-	// print the base url to the console
-	basePath := "/deployments"
-	port := configService.GetString("api_port")
-	log.Print()
-	log.Printf("API is at: http://localhost:%s%s", port, basePath)
-	log.Print()
-
-	// start client API listener
-	api := apid.API()
-	err := api.Listen()
-	if err != nil {
-		log.Print(err)
-	}
-}
-
-func insertTestDeployments(deployments apiGatewayDeploy.ApiDeploymentResponse) error {
-
-	if len(deployments) == 0 {
-		return nil
-	}
-
-	log := apid.Log()
-
-	db, err := apid.Data().DB()
-	if err != nil {
-		return err
-	}
-	apiGatewayDeploy.SetDB(db)
-
-	err = apiGatewayDeploy.InitDB(db)
-	if err != nil {
-		return err
-	}
-
-	tx, err := db.Begin()
-	if err != nil {
-		return err
-	}
-
-	for _, ad := range deployments {
-
-		dep := apiGatewayDeploy.DataDeployment{
-			ID:                 ad.ID,
-			BundleConfigID:     ad.ID,
-			ApidClusterID:      ad.ID,
-			DataScopeID:        ad.ScopeId,
-			BundleConfigJSON:   string(ad.BundleConfigJson),
-			ConfigJSON:         string(ad.ConfigJson),
-			Created:            "",
-			CreatedBy:          "",
-			Updated:            "",
-			UpdatedBy:          "",
-			BundleName:         ad.DisplayName,
-			BundleURI:          ad.URI,
-			BundleChecksum:     "",
-			BundleChecksumType: "",
-			LocalBundleURI:     ad.URI,
-		}
-
-		err = apiGatewayDeploy.InsertDeployment(tx, dep)
-		if err != nil {
-			log.Error("Unable to insert deployment")
-			return err
-		}
-
-	}
-
-	err = tx.Commit()
-	if err != nil {
-		return err
-	}
-
-	apiGatewayDeploy.InitAPI()
-
-	return nil
-}
diff --git a/cover.sh b/cover.sh
deleted file mode 100755
index a378f75..0000000
--- a/cover.sh
+++ /dev/null
@@ -1,13 +0,0 @@
-#!/usr/bin/env bash
-
-set -e
-echo "mode: atomic" > coverage.txt
-
-for d in $(go list ./... | grep -v vendor); do
-    go test -coverprofile=profile.out -covermode=atomic $d
-    if [ -f profile.out ]; then
-        tail -n +2 profile.out >> coverage.txt
-        rm profile.out
-    fi
-done
-go tool cover -html=coverage.txt -o cover.html
diff --git a/data.go b/data.go
index b09c0cb..d261023 100644
--- a/data.go
+++ b/data.go
@@ -4,9 +4,8 @@
 	"database/sql"
 	"sync"
 
-	"encoding/json"
 	"github.com/30x/apid-core"
-	"strings"
+
 )
 
 var (
@@ -16,76 +15,32 @@
 
 type DataDeployment struct {
 	ID                 string
-	BundleConfigID     string
-	ApidClusterID      string
+	OrgID              string
+	EnvID              string
 	DataScopeID        string
-	BundleConfigJSON   string
-	ConfigJSON         string
-	Created            string
-	CreatedBy          string
+	Type               int
+	Name		   string
+	Revision           string
+	BlobID             string
+	BlobResourceID     string
 	Updated            string
 	UpdatedBy          string
-	BundleName         string
-	BundleURI          string
-	LocalBundleURI     string
-	BundleChecksum     string
-	BundleChecksumType string
-	DeployStatus       string
-	DeployErrorCode    int
-	DeployErrorMessage string
+	Created		   string
+	CreatedBy          string
+	BlobFSLocation     string
+	BlobURL            string
 }
 
 type SQLExec interface {
 	Exec(query string, args ...interface{}) (sql.Result, error)
 }
 
-func InitDBFullColumns(db apid.DB) error {
-	_, err := db.Exec(`
-	CREATE TABLE IF NOT EXISTS edgex_deployment (
-		id character varying(36) NOT NULL,
-		bundle_config_id varchar(36) NOT NULL,
-		apid_cluster_id varchar(36) NOT NULL,
-		data_scope_id varchar(36) NOT NULL,
-		bundle_config_json text NOT NULL,
-		config_json text NOT NULL,
-		created timestamp without time zone,
-		created_by text,
-		updated timestamp without time zone,
-		updated_by text,
-		bundle_config_name text,
-		bundle_uri text,
-		local_bundle_uri text,
-		bundle_checksum text,
-		bundle_checksum_type text,
-		deploy_status string,
-		deploy_error_code int,
-		deploy_error_message text,
-		PRIMARY KEY (id)
-	);
-	`)
-	if err != nil {
-		return err
-	}
-
-	log.Debug("Database tables created.")
-	return nil
-}
-
 func InitDB(db apid.DB) error {
 	_, err := db.Exec(`
-	CREATE TABLE IF NOT EXISTS edgex_deployment (
-		id character varying(36) NOT NULL,
-		bundle_config_id varchar(36) NOT NULL,
-		apid_cluster_id varchar(36) NOT NULL,
-		data_scope_id varchar(36) NOT NULL,
-		bundle_config_json text NOT NULL,
-		config_json text NOT NULL,
-		created timestamp without time zone,
-		created_by text,
-		updated timestamp without time zone,
-		updated_by text,
-		bundle_config_name text,
-		PRIMARY KEY (id)
+	CREATE TABLE IF NOT EXISTS edgex_blob_available (
+   		blob_id character varying NOT NULL,
+   		local_fs_location character varying NOT NULL,
+   		access_url character varying
 	);
 	`)
 	if err != nil {
@@ -96,31 +51,6 @@
 	return nil
 }
 
-func alterTable(db apid.DB) error {
-	queries := []string{
-		"ALTER TABLE edgex_deployment ADD COLUMN bundle_uri text;",
-		"ALTER TABLE edgex_deployment ADD COLUMN local_bundle_uri text;",
-		"ALTER TABLE edgex_deployment ADD COLUMN bundle_checksum text;",
-		"ALTER TABLE edgex_deployment ADD COLUMN bundle_checksum_type text;",
-		"ALTER TABLE edgex_deployment ADD COLUMN deploy_status string;",
-		"ALTER TABLE edgex_deployment ADD COLUMN deploy_error_code int;",
-		"ALTER TABLE edgex_deployment ADD COLUMN deploy_error_message text;",
-	}
-
-	for _, query := range queries {
-		_, err := db.Exec(query)
-		if err != nil {
-			if strings.Contains(err.Error(), "duplicate column name")   {
-				log.Warnf("AlterTable warning: %s", err)
-			} else {
-				return err
-			}
-		}
-	}
-	log.Debug("Database table altered.")
-	return nil
-}
-
 func getDB() apid.DB {
 	dbMux.RLock()
 	db := unsafeDB
@@ -136,232 +66,113 @@
 	unsafeDB = db
 }
 
-func InsertDeployment(tx *sql.Tx, dep DataDeployment) error {
-	return insertDeployments(tx, []DataDeployment{dep})
-}
-
-func insertDeployments(tx *sql.Tx, deps []DataDeployment) error {
-
-	log.Debugf("inserting %d edgex_deployment", len(deps))
-
-	stmt, err := tx.Prepare(`
-	INSERT INTO edgex_deployment
-		(id, bundle_config_id, apid_cluster_id, data_scope_id,
-		bundle_config_json, config_json, created, created_by,
-		updated, updated_by, bundle_config_name, bundle_uri, local_bundle_uri,
-		bundle_checksum, bundle_checksum_type, deploy_status,
-		deploy_error_code, deploy_error_message)
-		VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15,$16,$17,$18);
-	`)
-	if err != nil {
-		log.Errorf("prepare insert into edgex_deployment failed: %v", err)
-		return err
-	}
-	defer stmt.Close()
-
-	for _, dep := range deps {
-		log.Debugf("insertDeployment: %s", dep.ID)
-
-		_, err = stmt.Exec(
-			dep.ID, dep.BundleConfigID, dep.ApidClusterID, dep.DataScopeID,
-			dep.BundleConfigJSON, dep.ConfigJSON, dep.Created, dep.CreatedBy,
-			dep.Updated, dep.UpdatedBy, dep.BundleName, dep.BundleURI,
-			dep.LocalBundleURI, dep.BundleChecksum, dep.BundleChecksumType, dep.DeployStatus,
-			dep.DeployErrorCode, dep.DeployErrorMessage)
-		if err != nil {
-			log.Errorf("insert into edgex_deployment %s failed: %v", dep.ID, err)
-			return err
-		}
-	}
-
-	log.Debug("inserting edgex_deployment succeeded")
-	return err
-}
-
-func updateDeploymentsColumns(tx *sql.Tx, deps []DataDeployment) error {
-
-	log.Debugf("updating %d edgex_deployment", len(deps))
-
-	stmt, err := tx.Prepare(`
-	UPDATE edgex_deployment SET
-		(bundle_uri, local_bundle_uri,
-		bundle_checksum, bundle_checksum_type, deploy_status,
-		deploy_error_code, deploy_error_message)
-		= ($1,$2,$3,$4,$5,$6,$7) WHERE id = $8
-	`)
-	if err != nil {
-		log.Errorf("prepare update edgex_deployment failed: %v", err)
-		return err
-	}
-	defer stmt.Close()
-
-	for _, dep := range deps {
-		log.Debugf("updateDeploymentsColumns: processing deployment %s, %v", dep.ID, dep.BundleURI)
-
-		_, err = stmt.Exec(
-			dep.BundleURI,
-			dep.LocalBundleURI, dep.BundleChecksum, dep.BundleChecksumType, dep.DeployStatus,
-			dep.DeployErrorCode, dep.DeployErrorMessage, dep.ID)
-		if err != nil {
-			log.Errorf("updateDeploymentsColumns of edgex_deployment %s failed: %v", dep.ID, err)
-			return err
-		}
-	}
-
-	log.Debug("updateDeploymentsColumns of edgex_deployment succeeded")
-	return err
-}
-
-func getDeploymentsToUpdate(db apid.DB) (deployments []DataDeployment, err error) {
-	deployments, err = getDeployments("WHERE bundle_uri IS NULL AND local_bundle_uri IS NULL AND deploy_status IS NULL")
-	if err != nil {
-		log.Errorf("getDeployments in getDeploymentsToUpdate failed: %v", err)
-		return
-	}
-	var bc bundleConfigJson
-	for i, _ := range deployments {
-		log.Debugf("getDeploymentsToUpdate: processing deployment %v, %v", deployments[i].ID, deployments[i].BundleConfigJSON)
-		json.Unmarshal([]byte(deployments[i].BundleConfigJSON), &bc)
-		if err != nil {
-			log.Errorf("JSON decoding Manifest failed: %v", err)
-			return
-		}
-		deployments[i].BundleName = bc.Name
-		deployments[i].BundleURI = bc.URI
-		deployments[i].BundleChecksumType = bc.ChecksumType
-		deployments[i].BundleChecksum = bc.Checksum
-
-		log.Debugf("Unmarshal: %v", deployments[i].BundleURI)
-	}
-	return
-}
-
-func deleteDeployment(tx *sql.Tx, depID string) error {
-
-	log.Debugf("deleteDeployment: %s", depID)
-
-	stmt, err := tx.Prepare("DELETE FROM edgex_deployment where id = $1;")
-	if err != nil {
-		log.Errorf("prepare delete from edgex_deployment %s failed: %v", depID, err)
-		return err
-	}
-	defer stmt.Close()
-
-	_, err = stmt.Exec(depID)
-	if err != nil {
-		log.Errorf("delete from edgex_deployment %s failed: %v", depID, err)
-		return err
-	}
-
-	log.Debugf("deleteDeployment %s succeeded", depID)
-	return err
-}
-
-// getReadyDeployments() returns array of deployments that are ready to deploy
-func getReadyDeployments() (deployments []DataDeployment, err error) {
-	return getDeployments("WHERE local_bundle_uri != $1", "")
-}
-
-// getUnreadyDeployments() returns array of deployments that are not yet ready to deploy
+// getUnreadyDeployments() returns array of resources that are not yet to be processed
 func getUnreadyDeployments() (deployments []DataDeployment, err error) {
-	return getDeployments("WHERE local_bundle_uri = $1", "")
-}
 
-// getDeployments() accepts a "WHERE ..." clause and optional parameters and returns the list of deployments
-func getDeployments(where string, a ...interface{}) (deployments []DataDeployment, err error) {
+	err = nil
 	db := getDB()
 
-	var stmt *sql.Stmt
-	stmt, err = db.Prepare(`
-	SELECT id, bundle_config_id, apid_cluster_id, data_scope_id,
-		bundle_config_json, config_json, created, created_by,
-		updated, updated_by, bundle_config_name, bundle_uri,
-		local_bundle_uri, bundle_checksum, bundle_checksum_type, deploy_status,
-		deploy_error_code, deploy_error_message
-	FROM edgex_deployment
-	` + where)
+	rows, err := db.Query(`
+	SELECT id, org_id, env_id, name, revision, project_runtime_blob_metadata.blob_id, resource_blob_id
+		FROM project_runtime_blob_metadata
+			LEFT JOIN edgex_blob_available
+			ON project_runtime_blob_metadata.blob_id = edgex_blob_available.blob_id
+		WHERE edgex_blob_available.blob_id IS NULL;
+	`)
+
 	if err != nil {
-		return
-	}
-	defer stmt.Close()
-	var rows *sql.Rows
-	rows, err = stmt.Query(a...)
-	if err != nil {
-		if err == sql.ErrNoRows {
-			return
-		}
-		log.Errorf("Error querying edgex_deployment: %v", err)
+		log.Errorf("DB Query for project_runtime_blob_metadata failed %v", err)
 		return
 	}
 	defer rows.Close()
 
-	deployments = dataDeploymentsFromRows(rows)
-
-	return
-}
-
-func dataDeploymentsFromRows(rows *sql.Rows) (deployments []DataDeployment) {
 	for rows.Next() {
 		dep := DataDeployment{}
-		rows.Scan(&dep.ID, &dep.BundleConfigID, &dep.ApidClusterID, &dep.DataScopeID,
-			&dep.BundleConfigJSON, &dep.ConfigJSON, &dep.Created, &dep.CreatedBy,
-			&dep.Updated, &dep.UpdatedBy, &dep.BundleName, &dep.BundleURI,
-			&dep.LocalBundleURI, &dep.BundleChecksum, &dep.BundleChecksumType, &dep.DeployStatus,
-			&dep.DeployErrorCode, &dep.DeployErrorMessage,
-		)
+		rows.Scan(&dep.ID, &dep.OrgID, &dep.EnvID,  &dep.Name, &dep.Revision, &dep.BlobID,
+			&dep.BlobResourceID)
 		deployments = append(deployments, dep)
+		log.Debugf("New configurations to be processed Id {%s}, blobId {%s}", dep.ID, dep.BlobID)
+	}
+	if len(deployments) == 0 {
+		log.Debug("No new resources found to be processed")
+		err = sql.ErrNoRows
 	}
 	return
+
 }
 
+// getDeployments()
+func getReadyDeployments() (deployments []DataDeployment, err error) {
 
+	err = nil
+	db := getDB()
 
-func updateLocalBundleURI(depID, localBundleUri string) error {
-
-	stmt, err := getDB().Prepare("UPDATE edgex_deployment SET local_bundle_uri=$1 WHERE id=$2;")
-	if err != nil {
-		log.Errorf("prepare updateLocalBundleURI failed: %v", err)
-		return err
-	}
-	defer stmt.Close()
-
-	_, err = stmt.Exec(localBundleUri, depID)
-	if err != nil {
-		log.Errorf("update edgex_deployment %s localBundleUri to %s failed: %v", depID, localBundleUri, err)
-		return err
-	}
-
-	log.Debugf("update edgex_deployment %s localBundleUri to %s succeeded", depID, localBundleUri)
-
-	return nil
-}
-
-func InsertTestDeployment(tx *sql.Tx, dep DataDeployment) error {
-
-	stmt, err := tx.Prepare(`
-	INSERT INTO edgex_deployment
-		(id, bundle_config_id, apid_cluster_id, data_scope_id,
-		bundle_config_json, config_json, created, created_by,
-		updated, updated_by, bundle_config_name)
-		VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11);
+	rows, err := db.Query(`
+	SELECT a.id, a.org_id, a.env_id, a.name, a.revision, a.blob_id,
+		a.resource_blob_id, a.created_at, a.created_by, a.updated_at, a.updated_by,
+		b.local_fs_location, b.access_url
+		FROM project_runtime_blob_metadata as a
+			INNER JOIN edgex_blob_available as b
+			ON a.blob_id = b.blob_id
 	`)
+
 	if err != nil {
-		log.Errorf("prepare insert into edgex_deployment failed: %v", err)
+		log.Errorf("DB Query for project_runtime_blob_metadata failed %v", err)
+		return
+	}
+	defer rows.Close()
+
+	for rows.Next() {
+		dep := DataDeployment{}
+		rows.Scan(&dep.ID, &dep.OrgID, &dep.EnvID, &dep.Name, &dep.Revision, &dep.BlobID,
+			&dep.BlobResourceID, &dep.Created, &dep.CreatedBy, &dep.Updated,
+			&dep.UpdatedBy, &dep.BlobFSLocation, &dep.BlobURL)
+		deployments = append(deployments, dep)
+		log.Debugf("New Configurations available Id {%s} BlobId {%s}", dep.ID, dep.BlobID)
+	}
+	if len(deployments) == 0 {
+		log.Debug("No resources ready to be deployed")
+		err = sql.ErrNoRows
+	}
+	return
+
+}
+
+func updatelocal_fs_location(depID, local_fs_location string) error {
+
+	// TODO DEMO ONLY
+	access_url := "http://localhost:9090/blob/" + depID
+	stmt, err := getDB().Prepare(`
+		INSERT INTO edgex_blob_available (blob_id, local_fs_location, access_url)
+			VALUES (?, ?, ?)`)
+	if err != nil {
+		log.Errorf("PREPARE updatelocal_fs_location failed: %v", err)
 		return err
 	}
 	defer stmt.Close()
 
-	log.Debugf("InsertTestDeployment: %s", dep.ID)
-
-	_, err = stmt.Exec(
-		dep.ID, dep.BundleConfigID, dep.ApidClusterID, dep.DataScopeID,
-		dep.BundleConfigJSON, dep.ConfigJSON, dep.Created, dep.CreatedBy,
-		dep.Updated, dep.UpdatedBy, dep.BundleName)
+	_, err = stmt.Exec(depID, local_fs_location, access_url)
 	if err != nil {
-		log.Errorf("insert into edgex_deployment %s failed: %v", dep.ID, err)
+		log.Errorf("UPDATE edgex_blob_available id {%s} local_fs_location {%s} failed: %v", depID, local_fs_location, err)
 		return err
 	}
 
-	log.Debug("InsertTestDeployment edgex_deployment succeeded")
-	return err
+	log.Debugf("INSERT edgex_blob_available {%s} local_fs_location {%s} succeeded", depID, local_fs_location)
+	return nil
+
+}
+
+func getLocalFSLocation (blobId string) (locfs string , err error) {
+
+	db := getDB()
+
+	rows, err := db.Query("SELECT local_fs_location FROM edgex_blob_available WHERE blob_id = " + blobId)
+	if err != nil {
+		log.Errorf("SELECT local_fs_location failed %v", err)
+		return "", err
+	}
+
+	defer rows.Close()
+	rows.Scan(&locfs)
+	return
 }
diff --git a/glide.yaml b/glide.yaml
deleted file mode 100644
index c36bfa1..0000000
--- a/glide.yaml
+++ /dev/null
@@ -1,11 +0,0 @@
-package: github.com/30x/apidGatewayDeploy
-import:
-- package: github.com/30x/apid-core
-  version: master
-- package: github.com/apigee-labs/transicator/common
-  version: master
-testImport:
-- package: github.com/onsi/ginkgo
-  version: master
-- package: github.com/onsi/gomega
-  version: master
diff --git a/init.go b/init.go
index 98b9346..96b1bde 100644
--- a/init.go
+++ b/init.go
@@ -21,16 +21,19 @@
 	configApidClusterID         = "apigeesync_cluster_id"
 	configConcurrentDownloads   = "apigeesync_concurrent_downloads"
 	configDownloadQueueSize     = "apigeesync_download_queue_size"
+	configBlobServerBaseURI     = "apigeesync_blob_server_base"
 )
 
 var (
 	services            apid.Services
 	log                 apid.LogService
 	data                apid.DataService
+	config              apid.ConfigService
 	bundlePath          string
 	debounceDuration    time.Duration
 	bundleCleanupDelay  time.Duration
 	apiServerBaseURI    *url.URL
+	blobServerURL       string
 	apidInstanceID      string
 	apidClusterID       string
 	downloadQueueSize   int
@@ -46,11 +49,16 @@
 	log = services.Log().ForModule("apiGatewayDeploy")
 	log.Debug("start init")
 
-	config := services.Config()
+	config = services.Config()
 
 	if !config.IsSet(configApiServerBaseURI) {
 		return pluginData, fmt.Errorf("Missing required config value: %s", configApiServerBaseURI)
 	}
+
+	if !config.IsSet(configBlobServerBaseURI) {
+		return pluginData, fmt.Errorf("Missing required config value: %s", configBlobServerBaseURI)
+	}
+
 	var err error
 	apiServerBaseURI, err = url.Parse(config.GetString(configApiServerBaseURI))
 	if err != nil {
@@ -96,7 +104,7 @@
 	}
 
 	data = services.Data()
-
+	blobServerURL = config.GetString(configBlobServerBaseURI)
 	concurrentDownloads = config.GetInt(configConcurrentDownloads)
 	downloadQueueSize = config.GetInt(configDownloadQueueSize)
 	relativeBundlePath := config.GetString(configBundleDirKey)
diff --git a/listener.go b/listener.go
index e9cd113..95d20f4 100644
--- a/listener.go
+++ b/listener.go
@@ -1,12 +1,12 @@
 package apiGatewayDeploy
 
 import (
-	"encoding/json"
 	"os"
 	"time"
 
 	"github.com/30x/apid-core"
 	"github.com/apigee-labs/transicator/common"
+	"database/sql"
 )
 
 const (
@@ -52,35 +52,12 @@
 		log.Panicf("Unable to access database: %v", err)
 	}
 
-	// alter table
-	err = alterTable(db)
-	if err != nil {
-		log.Panicf("Alter table failed: %v", err)
-	}
-	// ensure that no new database updates are made on old database
+	// Update the DB pointer
 	dbMux.Lock()
 	SetDB(db)
 	dbMux.Unlock()
 
-	// update deployments
-	deps, err := getDeploymentsToUpdate(db)
-	if err != nil {
-		log.Panicf("Unable to getDeploymentsToUpdate: %v", err)
-	}
-	tx, err := db.Begin()
-	if err != nil {
-		log.Panicf("Error starting transaction: %v", err)
-	}
-	defer tx.Rollback()
-	err = updateDeploymentsColumns(tx, deps)
-	if err != nil {
-		log.Panicf("updateDeploymentsColumns failed: %v", err)
-	}
-	err = tx.Commit()
-	if err != nil {
-		log.Panicf("Error committing Snapshot update: %v", err)
-	}
-
+	InitDB(db)
 	startupOnExistingDatabase()
 	log.Debug("Snapshot processed")
 }
@@ -89,7 +66,8 @@
 	// start bundle downloads that didn't finish
 	go func() {
 		deployments, err := getUnreadyDeployments()
-		if err != nil {
+
+		if err != nil && err != sql.ErrNoRows {
 			log.Panicf("unable to query database for unready deployments: %v", err)
 		}
 		log.Debugf("Queuing %d deployments for bundle download", len(deployments))
@@ -156,27 +134,18 @@
 func dataDeploymentFromRow(row common.Row) (d DataDeployment, err error) {
 
 	row.Get("id", &d.ID)
-	row.Get("bundle_config_id", &d.BundleConfigID)
-	row.Get("apid_cluster_id", &d.ApidClusterID)
+	row.Get("org_id", &d.OrgID)
+	row.Get("env_id", &d.EnvID)
 	row.Get("data_scope_id", &d.DataScopeID)
-	row.Get("bundle_config_json", &d.BundleConfigJSON)
-	row.Get("config_json", &d.ConfigJSON)
-	row.Get("created", &d.Created)
-	row.Get("created_by", &d.CreatedBy)
-	row.Get("updated", &d.Updated)
-	row.Get("updated_by", &d.UpdatedBy)
-
-	var bc bundleConfigJson
-	json.Unmarshal([]byte(d.BundleConfigJSON), &bc)
-	if err != nil {
-		log.Errorf("JSON decoding Manifest failed: %v", err)
-		return
-	}
-
-	d.BundleName = bc.Name
-	d.BundleURI = bc.URI
-	d.BundleChecksumType = bc.ChecksumType
-	d.BundleChecksum = bc.Checksum
+	row.Get("bundle_config_json", &d.Type)
+	row.Get("config_json", &d.Name)
+	row.Get("created", &d.Revision)
+	row.Get("created_by", &d.BlobID)
+	row.Get("created_by", &d.BlobResourceID)
+	row.Get("created_by", &d.Updated)
+	row.Get("created_by", &d.UpdatedBy)
+	row.Get("created_by", &d.Created)
+	row.Get("updated", &d.CreatedBy)
 
 	return
 }
diff --git a/listener_test.go b/listener_test.go
deleted file mode 100644
index c253eb3..0000000
--- a/listener_test.go
+++ /dev/null
@@ -1,343 +0,0 @@
-package apiGatewayDeploy
-
-import (
-	"encoding/json"
-	"net/url"
-
-	"net/http/httptest"
-
-	"net/http"
-
-	"fmt"
-	"github.com/30x/apid-core"
-	"github.com/apigee-labs/transicator/common"
-	. "github.com/onsi/ginkgo"
-	. "github.com/onsi/gomega"
-)
-
-var _ = Describe("listener", func() {
-
-	Context("ApigeeSync snapshot event", func() {
-
-		/*
-		 * Note that the test snapshot should not be empty.
-		 * If it's empty, you can't use deploymentsResult chan to mark the end of processing,
-		 * so the threads generated by startupOnExistingDatabase() will mess up later tests
-		 */
-		It("should set DB to appropriate version", func(done Done) {
-			saveDB := getDB()
-			deploymentID := "set_version_test"
-			snapshot, dep := createSnapshotDeployment(deploymentID, "test_version")
-
-			db, err := data.DBVersion(snapshot.SnapshotInfo)
-			Expect(err).ShouldNot(HaveOccurred())
-
-			err = InitDB(db)
-			Expect(err).ShouldNot(HaveOccurred())
-
-			insertDeploymentToDb(dep, db)
-			expectedDB, err := data.DBVersion(snapshot.SnapshotInfo)
-			Expect(err).NotTo(HaveOccurred())
-
-			var listener = make(chan deploymentsResult)
-			addSubscriber <- listener
-
-			apid.Events().Emit(APIGEE_SYNC_EVENT, &snapshot)
-
-			result := <-listener
-			Expect(result.err).ShouldNot(HaveOccurred())
-
-			// DB should have been set
-			Expect(getDB() == expectedDB).Should(BeTrue())
-
-			SetDB(saveDB)
-			close(done)
-		})
-
-		It("should process unready on existing db startup event", func(done Done) {
-
-			saveDB := getDB()
-
-			deploymentID := "startup_test"
-
-			snapshot, dep := createSnapshotDeployment(deploymentID, "test_unready")
-
-			db, err := data.DBVersion(snapshot.SnapshotInfo)
-			Expect(err).ShouldNot(HaveOccurred())
-
-			err = InitDB(db)
-			Expect(err).ShouldNot(HaveOccurred())
-
-			insertDeploymentToDb(dep, db)
-
-			var listener = make(chan deploymentsResult)
-			addSubscriber <- listener
-
-			apid.Events().Emit(APIGEE_SYNC_EVENT, &snapshot)
-
-			result := <-listener
-			Expect(result.err).ShouldNot(HaveOccurred())
-
-			Expect(len(result.deployments)).To(Equal(1))
-			d := result.deployments[0]
-
-			Expect(d.ID).To(Equal(deploymentID))
-
-			SetDB(saveDB)
-			close(done)
-		})
-
-		It("should send deployment statuses on existing db startup event", func(done Done) {
-
-			saveDB := getDB()
-
-			successDep := DataDeployment{
-				ID:                 "success",
-				LocalBundleURI:     "x",
-				DeployStatus:       RESPONSE_STATUS_SUCCESS,
-				DeployErrorCode:    1,
-				DeployErrorMessage: "message",
-			}
-
-			failDep := DataDeployment{
-				ID:                 "fail",
-				LocalBundleURI:     "x",
-				DeployStatus:       RESPONSE_STATUS_FAIL,
-				DeployErrorCode:    1,
-				DeployErrorMessage: "message",
-			}
-
-			blankDep := DataDeployment{
-				ID:             "blank",
-				LocalBundleURI: "x",
-			}
-
-			ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
-				defer GinkgoRecover()
-
-				var results apiDeploymentResults
-				err := json.NewDecoder(r.Body).Decode(&results)
-				Expect(err).ToNot(HaveOccurred())
-
-				Expect(results).To(HaveLen(2))
-
-				Expect(results).To(ContainElement(apiDeploymentResult{
-					ID:        successDep.ID,
-					Status:    successDep.DeployStatus,
-					ErrorCode: successDep.DeployErrorCode,
-					Message:   successDep.DeployErrorMessage,
-				}))
-				Expect(results).To(ContainElement(apiDeploymentResult{
-					ID:        failDep.ID,
-					Status:    failDep.DeployStatus,
-					ErrorCode: failDep.DeployErrorCode,
-					Message:   failDep.DeployErrorMessage,
-				}))
-
-				SetDB(saveDB)
-				close(done)
-			}))
-
-			var err error
-			apiServerBaseURI, err = url.Parse(ts.URL)
-			Expect(err).NotTo(HaveOccurred())
-
-			// init without info == startup on existing DB
-			var snapshot = common.Snapshot{
-				SnapshotInfo: "test",
-				Tables:       []common.Table{},
-			}
-
-			db, err := data.DBVersion(snapshot.SnapshotInfo)
-			Expect(err).NotTo(HaveOccurred())
-
-			err = InitDBFullColumns(db)
-			Expect(err).NotTo(HaveOccurred())
-
-			tx, err := db.Begin()
-			Expect(err).ShouldNot(HaveOccurred())
-
-			err = InsertDeployment(tx, successDep)
-			Expect(err).ShouldNot(HaveOccurred())
-			err = InsertDeployment(tx, failDep)
-			Expect(err).ShouldNot(HaveOccurred())
-			err = InsertDeployment(tx, blankDep)
-			Expect(err).ShouldNot(HaveOccurred())
-
-			err = tx.Commit()
-			Expect(err).ShouldNot(HaveOccurred())
-
-			apid.Events().Emit(APIGEE_SYNC_EVENT, &snapshot)
-		})
-	})
-
-	Context("ApigeeSync change event", func() {
-
-		It("inserting event should deliver the deployment to subscribers", func(done Done) {
-
-			deploymentID := "add_test_1"
-
-			event, dep := createChangeDeployment(deploymentID)
-
-			// insert full deployment columns
-			tx, err := getDB().Begin()
-			Expect(err).ShouldNot(HaveOccurred())
-			err = InsertDeployment(tx, dep)
-			Expect(err).ShouldNot(HaveOccurred())
-			err = tx.Commit()
-			Expect(err).ShouldNot(HaveOccurred())
-
-			var listener = make(chan deploymentsResult)
-			addSubscriber <- listener
-
-			apid.Events().Emit(APIGEE_SYNC_EVENT, &event)
-
-			// wait for event to propagate
-			result := <-listener
-			Expect(result.err).ShouldNot(HaveOccurred())
-
-			deployments, err := getReadyDeployments()
-			Expect(err).ShouldNot(HaveOccurred())
-
-			Expect(len(deployments)).To(Equal(1))
-			d := deployments[0]
-
-			Expect(d.ID).To(Equal(deploymentID))
-			Expect(d.BundleName).To(Equal(dep.BundleName))
-			Expect(d.BundleURI).To(Equal(dep.BundleURI))
-
-			close(done)
-		})
-
-		It("delete event should deliver to subscribers", func(done Done) {
-
-			deploymentID := "delete_test_1"
-
-			// insert deployment
-			event, dep := createChangeDeployment(deploymentID)
-
-			// insert full deployment columns
-			tx, err := getDB().Begin()
-			Expect(err).ShouldNot(HaveOccurred())
-			err = InsertDeployment(tx, dep)
-			Expect(err).ShouldNot(HaveOccurred())
-			err = tx.Commit()
-			Expect(err).ShouldNot(HaveOccurred())
-
-			listener := make(chan deploymentsResult)
-			addSubscriber <- listener
-			apid.Events().Emit(APIGEE_SYNC_EVENT, &event)
-			// wait for event to propagate
-			result := <-listener
-			Expect(result.err).ShouldNot(HaveOccurred())
-
-			// delete deployment
-			deletDeploymentFromDb(dep, getDB())
-			row := common.Row{}
-			row["id"] = &common.ColumnVal{Value: deploymentID}
-			event = common.ChangeList{
-				Changes: []common.Change{
-					{
-						Operation: common.Delete,
-						Table:     DEPLOYMENT_TABLE,
-						OldRow:    row,
-					},
-				},
-			}
-
-			listener = make(chan deploymentsResult)
-			addSubscriber <- listener
-			apid.Events().Emit(APIGEE_SYNC_EVENT, &event)
-			result = <-listener
-			Expect(result.err).ShouldNot(HaveOccurred())
-			Expect(len(result.deployments)).To(Equal(0))
-			close(done)
-		})
-	})
-})
-
-func createChangeDeployment(deploymentID string) (common.ChangeList, DataDeployment) {
-	uri, err := url.Parse(testServer.URL)
-	Expect(err).ShouldNot(HaveOccurred())
-
-	uri.Path = "/bundles/1"
-	bundleUri := uri.String()
-	bundle := bundleConfigJson{
-		Name:         uri.Path,
-		URI:          bundleUri,
-		ChecksumType: "crc32",
-	}
-	bundle.Checksum = testGetChecksum(bundle.ChecksumType, bundleUri)
-	bundle1Json, err := json.Marshal(bundle)
-	Expect(err).ShouldNot(HaveOccurred())
-
-	row := common.Row{}
-	row["id"] = &common.ColumnVal{Value: deploymentID}
-	row["bundle_config_json"] = &common.ColumnVal{Value: string(bundle1Json)}
-
-	changeList := common.ChangeList{
-		Changes: []common.Change{
-			{
-				Operation: common.Insert,
-				Table:     DEPLOYMENT_TABLE,
-				NewRow:    row,
-			},
-		},
-	}
-	dep, err := dataDeploymentFromRow(changeList.Changes[0].NewRow)
-	return changeList, dep
-}
-
-func insertDeploymentToDb(dep DataDeployment, db apid.DB) {
-	tx, err := db.Begin()
-	Expect(err).ShouldNot(HaveOccurred())
-	defer tx.Rollback()
-	err = InsertTestDeployment(tx, dep)
-	Expect(err).ShouldNot(HaveOccurred())
-	err = tx.Commit()
-	Expect(err).ShouldNot(HaveOccurred())
-}
-
-func deletDeploymentFromDb(dep DataDeployment, db apid.DB) {
-	tx, err := db.Begin()
-	Expect(err).ShouldNot(HaveOccurred())
-	defer tx.Rollback()
-	err = deleteDeployment(tx, dep.ID)
-	Expect(err).ShouldNot(HaveOccurred())
-	err = tx.Commit()
-	Expect(err).ShouldNot(HaveOccurred())
-}
-
-func createSnapshotDeployment(deploymentID string, snapInfo string) (common.Snapshot, DataDeployment) {
-	uri, err := url.Parse(testServer.URL)
-	Expect(err).ShouldNot(HaveOccurred())
-
-	uri.Path = "/bundles/1"
-	bundleUri := uri.String()
-	bundle := bundleConfigJson{
-		Name:         uri.Path,
-		URI:          bundleUri,
-		ChecksumType: "crc32",
-	}
-	bundle.Checksum = testGetChecksum(bundle.ChecksumType, bundleUri)
-
-	jsonBytes, err := json.Marshal(bundle)
-	Expect(err).ShouldNot(HaveOccurred())
-	fmt.Println("JSON :" + string(jsonBytes))
-
-	dep := DataDeployment{
-		ID:                 deploymentID,
-		DataScopeID:        deploymentID,
-		BundleURI:          bundle.URI,
-		BundleChecksum:     bundle.Checksum,
-		BundleChecksumType: bundle.ChecksumType,
-		BundleConfigJSON:   string(jsonBytes),
-	}
-
-	// init without info == startup on existing DB
-	var snapshot = common.Snapshot{
-		SnapshotInfo: snapInfo,
-		Tables:       []common.Table{},
-	}
-	return snapshot, dep
-}
