diff --git a/clients.go b/clients.go
index c260b98..7fc8c48 100644
--- a/clients.go
+++ b/clients.go
@@ -1,15 +1,19 @@
 package apiGatewayConfDeploy
 
 import (
+	"github.com/30x/apid-core"
+	"github.com/30x/apidApigeeSync"
 	"io/ioutil"
 	"net/http"
 	"net/url"
+	"strings"
 )
 
 const (
 	trackerConfigStatusEndpoint = "/serviceconfigstatus"
 	trackerHeartbeatEndpoint    = "/serviceheartbeat/{uuid}"
 	trackerRegisterEndpoint     = "/serviceregister/{uuid}"
+	ApigeeSyncTokenSelector     = "ApigeeSyncToken"
 )
 
 type trackerClientInterface interface {
@@ -28,17 +32,18 @@
 	trackerBaseUrl string
 	clusterId      string
 	httpclient     *http.Client
+	handler        *tokenEventHandler
 }
 
 func (t *trackerClient) putConfigStatus(configId, status, uuid, created string) trackerResponse {
-	uri, err := url.Parse(t.trackerBaseUrl + trackerConfigStatusEndpoint)
+	uri, err := url.Parse(t.trackerBaseUrl + strings.Replace(trackerConfigStatusEndpoint, "{uuid}", uuid, 1))
 	if err != nil {
 		log.Errorf("putConfigStatus failed to parse tracker uri: %v", err)
 		return (internalError(err))
 	}
-	req, err := http.NewRequest("PUT", uri, nil)
+	req, err := http.NewRequest("PUT", uri.String(), nil)
 	req.Header.Add("configid", configId)
-	req.Header.Add("Authorization", getAuthToken())
+	req.Header.Add("Authorization", t.handler.getBearerToken())
 	req.Header.Add("status", status)
 	req.Header.Add("uuid", uuid)
 	req.Header.Add("created", created)
@@ -55,8 +60,16 @@
 	case http.StatusOK:
 		res.code = r.StatusCode
 		res.contentType = r.Header.Get("Content-type")
+	case http.StatusUnauthorized, http.StatusForbidden:
+		res.code = http.StatusInternalServerError
+		res.errString = "apid token rejected by tracker"
+		return res
 	default:
-		res.code = r.StatusCode
+		if 400 <= res.code && res.code < 500 {
+			res.code = http.StatusInternalServerError
+		} else {
+			res.code = r.StatusCode
+		}
 		res.contentType = r.Header.Get("Content-type")
 		body, err := ioutil.ReadAll(r.Body)
 		if err != nil {
@@ -68,14 +81,13 @@
 }
 
 func (t *trackerClient) postRegister(uuid, pod, created, name, podType, serviceType string) trackerResponse {
-	uri, err := url.Parse(t.trackerBaseUrl + trackerRegisterEndpoint)
+	uri, err := url.Parse(t.trackerBaseUrl + strings.Replace(trackerRegisterEndpoint, "{uuid}", uuid, 1))
 	if err != nil {
 		log.Errorf("postRegister failed to parse tracker uri: %v", err)
 		return (internalError(err))
 	}
-	req, err := http.NewRequest("PUT", uri, nil)
-	req.Header.Add("uuid", uuid)
-	req.Header.Add("Authorization", getAuthToken())
+	req, err := http.NewRequest("PUT", uri.String(), nil)
+	req.Header.Add("Authorization", t.handler.getBearerToken())
 	req.Header.Add("pod", pod)
 	req.Header.Add("podtype", podType)
 	req.Header.Add("created", created)
@@ -94,8 +106,16 @@
 	case http.StatusOK:
 		res.code = r.StatusCode
 		res.contentType = r.Header.Get("Content-type")
+	case http.StatusUnauthorized, http.StatusForbidden:
+		res.code = http.StatusInternalServerError
+		res.errString = "apid token rejected by tracker"
+		return res
 	default:
-		res.code = r.StatusCode
+		if 400 <= res.code && res.code < 500 {
+			res.code = http.StatusInternalServerError
+		} else {
+			res.code = r.StatusCode
+		}
 		res.contentType = r.Header.Get("Content-type")
 		body, err := ioutil.ReadAll(r.Body)
 		if err != nil {
@@ -107,21 +127,20 @@
 }
 
 func (t *trackerClient) putHeartbeat(uuid, updated string) trackerResponse {
-	uri, err := url.Parse(t.trackerBaseUrl + trackerHeartbeatEndpoint)
+	uri, err := url.Parse(t.trackerBaseUrl + strings.Replace(trackerHeartbeatEndpoint, "{uuid}", uuid, 1))
 	if err != nil {
 		log.Errorf("putHeartbeat failed to parse tracker uri: %v", err)
-		return (internalError(err))
+		return internalError(err)
 	}
-	req, err := http.NewRequest("PUT", uri, nil)
-	req.Header.Add("uuid", uuid)
-	req.Header.Add("Authorization", getAuthToken())
+	req, err := http.NewRequest("PUT", uri.String(), nil)
+	req.Header.Add("Authorization", t.handler.getBearerToken())
 	req.Header.Add("updated", updated)
 	req.Header.Add("clusterid", t.clusterId)
 
 	r, err := t.httpclient.Do(req)
 	if err != nil {
 		log.Errorf("trackerClient communication error: %v", err)
-		return (internalError(err))
+		return internalError(err)
 	}
 	defer r.Body.Close()
 	res := trackerResponse{}
@@ -129,12 +148,20 @@
 	case http.StatusOK:
 		res.code = r.StatusCode
 		res.contentType = r.Header.Get("Content-type")
+	case http.StatusUnauthorized, http.StatusForbidden:
+		res.code = http.StatusInternalServerError
+		res.errString = "apid token rejected by tracker"
+		return res
 	default:
-		res.code = r.StatusCode
+		if 400 <= res.code && res.code < 500 {
+			res.code = http.StatusInternalServerError
+		} else {
+			res.code = r.StatusCode
+		}
 		res.contentType = r.Header.Get("Content-type")
 		body, err := ioutil.ReadAll(r.Body)
 		if err != nil {
-			return (internalError(err))
+			return internalError(err)
 		}
 		res.errString = string(body)
 	}
@@ -147,7 +174,21 @@
 	return res
 }
 
-func getAuthToken() string {
-	//TODO
-	return "Bearer "
+type tokenEventHandler struct {
+	token string
+}
+
+func (h *tokenEventHandler) Handle(e apid.Event) {
+	if tokenEvent, ok := e.(*apidApigeeSync.TokenEvent); ok {
+		h.token = tokenEvent.AccessToken
+	}
+}
+
+func (h *tokenEventHandler) getBearerToken() string {
+	return "Bearer " + h.token
+}
+
+func (h *tokenEventHandler) initListener(services apid.Services) {
+
+	services.Events().Listen(ApigeeSyncTokenSelector, h)
 }
diff --git a/init.go b/init.go
index 2eb59f1..6107072 100644
--- a/init.go
+++ b/init.go
@@ -21,6 +21,7 @@
 	"time"
 
 	"github.com/30x/apid-core"
+	"net/http"
 	"sync"
 )
 
@@ -40,6 +41,8 @@
 	configDownloadQueueSize          = "apigeesync_download_queue_size"
 	configBlobServerBaseURI          = "apigeesync_blob_server_base"
 	configStoragePath                = "local_storage_path"
+	maxIdleConnsPerHost              = 10
+	httpTimeout                      = time.Minute
 )
 
 var (
@@ -114,6 +117,29 @@
 
 	apidClusterId = config.GetString(configApidClusterID)
 
+	// initialize token handler
+
+	tokenHandler := &tokenEventHandler{}
+	tokenHandler.initListener(services)
+
+	// initialize tracker client
+
+	client := &trackerClient{
+		trackerBaseUrl: configApiServerBaseURI,
+		clusterId:      apidClusterId,
+		httpclient: &http.Client{
+			Transport: &http.Transport{
+				MaxIdleConnsPerHost: maxIdleConnsPerHost,
+			},
+			Timeout: httpTimeout,
+			CheckRedirect: func(req *http.Request, _ []*http.Request) error {
+				req.Header.Set("Authorization", tokenHandler.getBearerToken())
+				return nil
+			},
+		},
+		handler: tokenHandler,
+	}
+
 	// initialize db manager
 
 	dbMan := &dbManager{
@@ -124,14 +150,18 @@
 	// initialize api manager
 
 	apiMan := &apiManager{
-		dbMan:               dbMan,
-		deploymentsEndpoint: deploymentsEndpoint,
-		blobEndpoint:        blobEndpoint,
-		eTag:                0,
-		deploymentsChanged:  make(chan interface{}, 5),
-		addSubscriber:       make(chan chan deploymentsResult),
-		removeSubscriber:    make(chan chan deploymentsResult),
-		apiInitialized:      false,
+		dbMan:                dbMan,
+		trackerCl:            client,
+		deploymentsEndpoint:  deploymentsEndpoint,
+		blobEndpoint:         blobEndpoint,
+		configStatusEndpoint: configStatusEndpoint,
+		heartbeatEndpoint:    heartbeatEndpoint,
+		registerEndpoint:     registerEndpoint,
+		eTag:                 0,
+		deploymentsChanged:   make(chan interface{}, 5),
+		addSubscriber:        make(chan chan deploymentsResult),
+		removeSubscriber:     make(chan chan deploymentsResult),
+		apiInitialized:       false,
 	}
 
 	// initialize bundle manager
