diff --git a/Dockerfile b/Dockerfile
index 69f9723..81fb111 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -8,10 +8,9 @@
 
 # install dependencies
 RUN apk update \
-    && apk add gcc tar libtool zlib jemalloc jemalloc-dev perl \ 
+    && apk add gcc tar libtool zlib jemalloc jemalloc-dev perl \
     make musl-dev openssl-dev pcre-dev g++ zlib-dev curl python \
-    perl-test-longstring perl-list-moreutils perl-http-message \
-    geoip-dev nodejs
+    perl-test-longstring perl-list-moreutils perl-http-message geoip-dev
 
 # openresty build
 ENV OPENRESTY_VERSION=1.9.7.3 \
diff --git a/api-gateway-config/conf.d/management_apis.conf b/api-gateway-config/conf.d/management_apis.conf
index eccdcb1..067eb95 100644
--- a/api-gateway-config/conf.d/management_apis.conf
+++ b/api-gateway-config/conf.d/management_apis.conf
@@ -83,21 +83,31 @@
                  ngx.status = 400
                  ngx.say("Invalid verb")
              end
-
          }
-     }
+    }
 
-    location /subscribe {
+    location /v1/sync {
         access_by_lua_block {
             local mgmt = require("management")
-            mgmt.subscribe()
+            local requestMethod = ngx.req.get_method()
+            if requestMethod == "GET" then
+                mgmt.sync()
+            else
+                ngx.say("Invalid verb")
+            end
         }
     }
 
-    location /unsubscribe {
+    location /v1/subscribe {
         access_by_lua_block {
             local mgmt = require("management")
-            mgmt.unsubscribe()
+            local requestMethod = ngx.req.get_method()
+            if requestMethod == "GET" then
+                mgmt.subscribe()
+            else
+                ngx.say("Invalid verb")
+            end
         }
     }
+
 }
diff --git a/api-gateway-config/scripts/lua/lib/filemgmt.lua b/api-gateway-config/scripts/lua/lib/filemgmt.lua
index ca1d793..f1a6e1c 100644
--- a/api-gateway-config/scripts/lua/lib/filemgmt.lua
+++ b/api-gateway-config/scripts/lua/lib/filemgmt.lua
@@ -73,8 +73,6 @@
   })
   file:write(location)
   file:close()
-  -- reload nginx to refresh conf files
-  os.execute("/usr/local/sbin/nginx -s reload")
   return fileLocation
 end
 
@@ -86,8 +84,6 @@
 function _M.deleteResourceConf(baseConfDir, tenant, gatewayPath)
   local fileLocation = utils.concatStrings({baseConfDir, tenant, "/", gatewayPath, ".conf"})
   os.execute(utils.concatStrings({"rm -f ", fileLocation}))
-  -- reload nginx to refresh conf files
-  os.execute("/usr/local/sbin/nginx -s reload")
   return fileLocation
 end
 
diff --git a/api-gateway-config/scripts/lua/lib/logger.lua b/api-gateway-config/scripts/lua/lib/logger.lua
index c1e5680..a5fd418 100644
--- a/api-gateway-config/scripts/lua/lib/logger.lua
+++ b/api-gateway-config/scripts/lua/lib/logger.lua
@@ -21,6 +21,7 @@
 --- @module logger
 -- Module to handle logging in a single place
 -- @author Cody Walker (cmwalker), Alex Song (songs)
+local utils = require "lib/utils"
 
 local _M = {}
 
@@ -33,6 +34,13 @@
 --- Handle debug stream to stdout
 -- @param s String to write to debug stream
 function _M.debug(s)
+  if s == nil then
+    s = "nil"
+  elseif type(s) == "table" then
+    s = utils.serializeTable(s)
+  elseif type(s) == "boolean" then
+    s = (s == true) and "true" or "false"
+  end
   os.execute("echo \"" .. s .. "\"")
 end
 
diff --git a/api-gateway-config/scripts/lua/lib/redis.lua b/api-gateway-config/scripts/lua/lib/redis.lua
index 62b2322..25b5a8e 100644
--- a/api-gateway-config/scripts/lua/lib/redis.lua
+++ b/api-gateway-config/scripts/lua/lib/redis.lua
@@ -60,13 +60,13 @@
     connect, err = red:connect(host, port)
   end
   if not connect then
-    request.err(500, utils.concatStrings({"Failed to connect to redis: ", err}))  
+    request.err(500, utils.concatStrings({"Failed to connect to redis: ", err}))
   end
   -- Authenticate with Redis
   if password ~= nil and password ~= "" then
     local res, err = red:auth(password)
     if not res then
-      request.err(500, utils.concatStrings({"Failed to authenticate: ", err}))  
+      request.err(500, utils.concatStrings({"Failed to authenticate: ", err}))
     end
   end
   return red
@@ -90,11 +90,35 @@
 -- @param red Redis client instance
 -- @param id id of API
 -- @param apiObj the api to add
-function _M.addAPI(red, id, apiObj)
+-- @param existingAPI existing api to update
+function _M.addAPI(red, id, apiObj, existingAPI)
+  if existingAPI == nil then
+    local apis = _M.getAllAPIs(red)
+    -- Return error if api with basepath already exists
+    for apiId, obj in pairs(apis) do
+      if apiId%2 == 0 then
+        obj = cjson.decode(obj)
+        if obj.tenantId == apiObj.tenantId and obj.basePath == apiObj.basePath then
+          request.err(500, "basePath not unique for given tenant.")
+        end
+      end
+    end
+  else
+    -- Delete all resources for the existingAPI
+    local basePath = existingAPI.basePath:sub(2)
+    for path, v in pairs(existingAPI.resources) do
+      local gatewayPath = utils.concatStrings({basePath, ngx.escape_uri(path)})
+      local redisKey = utils.concatStrings({"resources:", existingAPI.tenantId, ":", ngx.unescape_uri(gatewayPath)})
+      _M.deleteResource(red, redisKey, REDIS_FIELD)
+    end
+  end
+  -- Add new API
+  apiObj = cjson.encode(apiObj):gsub("\\", "")
   local ok, err = red:hset("apis", id, apiObj)
   if not ok then
     request.err(500, utils.concatStrings({"Failed to save the API: ", err}))
   end
+  return apiObj
 end
 
 --- Get all APIs from redis
@@ -168,7 +192,7 @@
 -- @param resourceObj redis object containing operations for resource
 function _M.createResource(red, key, field, resourceObj)
   -- Add/update resource to redis
-  local ok, err = red:hset(key, field, resourceObj)
+  ok, err = red:hset(key, field, resourceObj)
   if not ok then
     request.err(500, utils.concatStrings({"Failed to save the resource: ", err}))
   end
@@ -188,10 +212,31 @@
   if resourceObj == ngx.null then
     return nil
   end
-
   return resourceObj
 end
 
+--- Get all resource keys in redis
+-- @param red redis client instance
+function getAllResourceKeys(red)
+  -- Find all resourceKeys in redis
+  local resources, err = red:scan(0, "match", "resources:*:*")
+  if not resources then
+    request.err(500, util.concatStrings({"Failed to retrieve resource keys: ", err}))
+  end
+  local cursor = resources[1]
+  local resourceKeys = resources[2]
+  while cursor ~= "0" do
+    resources, err = red:scan(cursor, "match", "resources:*:*")
+    if not resources then
+      request.err(500, util.concatStrings({"Failed to retrieve resource keys: ", err}))
+    end
+    cursor = resources[1]
+    for k, v in pairs(resources[2]) do
+      resourceKeys[#resourceKeys + 1] = v
+    end
+  end
+  return resourceKeys
+end
 --- Delete resource in redis
 -- @param red redis client instance
 -- @param key redis resource key
@@ -204,6 +249,7 @@
   if resourceObj == ngx.null then
     request.err(404, "Resource doesn't exist.")
   end
+  -- Delete redis resource
   local ok, err = red:del(key)
   if not ok then
     request.err(500, utils.concatStrings({"Failed to delete the resource: ", err}))
@@ -221,10 +267,23 @@
 -- @param id id of tenant
 -- @param tenantObj the tenant to add
 function _M.addTenant(red, id, tenantObj)
+  local tenants = _M.getAllTenants(red)
+  -- Return tenant from redis if it already exists
+  for tenantId, obj in pairs(tenants) do
+    if tenantId%2 == 0 then
+      obj = cjson.decode(obj)
+      if obj.namespace == tenantObj.namespace and obj.instance == tenantObj.instance then
+        return cjson.encode(obj)
+      end
+    end
+  end
+  -- Add new tenant
+  tenantObj = cjson.encode(tenantObj)
   local ok, err = red:hset("tenants", id, tenantObj)
   if not ok then
     request.err(500, utils.concatStrings({"Failed to add the tenant: ", err}))
   end
+  return tenantObj
 end
 
 --- Get all tenants from redis
@@ -297,79 +356,38 @@
 ------- Pub/Sub with Redis --------
 -----------------------------------
 
+--- Sync with redis on startup and create conf files for resources that are already in redis
+-- @param red redis client instance
+function _M.syncWithRedis(red)
+  logger.debug("Sync with redis in progress...")
+  local resourceKeys = getAllResourceKeys(red)
+  for k, resourceKey in pairs(resourceKeys) do
+    local prefix, tenant, gatewayPath = resourceKey:match("([^,]+):([^,]+):([^,]+)")
+    local resourceObj = _M.getResource(red, resourceKey, REDIS_FIELD)
+    filemgmt.createResourceConf(BASE_CONF_DIR, tenant, ngx.escape_uri(gatewayPath), resourceObj)
+  end
+  os.execute("/usr/local/sbin/nginx -s reload")
+  logger.debug("All resources synced.")
+end
+
 --- Subscribe to redis
 -- @param redisSubClient the redis client that is listening for the redis key changes
 -- @param redisGetClient the redis client that gets the changed resource to update the conf file
 function _M.subscribe(redisSubClient, redisGetClient)
-  -- create conf files for existing resources in redis
-  syncWithRedis(redisGetClient, ngx)
-  -- enable keyspace notifications
-  local ok, err = redisGetClient:config("set", "notify-keyspace-events", "KEA")
+  logger.debug("Subscribed to redis and listening for key changes...")
+  local ok, err = redisSubClient:config("set", "notify-keyspace-events", "KEA")
   if not ok then
-    request.err(500, utils.concatStrings({"Failed setting notify-keyspace-events: ", err}))
+    request.err(500, utils.concatStrings({"Failed to subscribe to redis: ", err}))
   end
   ok, err = redisSubClient:psubscribe("__keyspace@0__:resources:*:*")
   if not ok then
     request.err(500, utils.concatStrings({"Failed to subscribe to redis: ", err}))
   end
-  ngx.say("\nSubscribed to redis and listening for key changes...")
-  ngx.flush(true)
-  subscribe(redisSubClient, redisGetClient, ngx)
-  ngx.exit(ngx.status)
-end
-
---- Sync with redis on startup and create conf files for resources that are already in redis
--- @param red redis client instance
-function syncWithRedis(red)
-  logger.debug("\nCreating nginx conf files for existing resources...")
-  local redisKeys, err = red:keys("*")
-  if not redisKeys then
-    request.err(500, util.concatStrings({"Failed to sync with Redis: ", err}))
-  end
-  -- Find all redis keys with "resources:*:*"
-  local resourcesExist = false
-  for k, redisKey in pairs(redisKeys) do
-    local index = 1
-    local tenant = ""
-    local gatewayPath = ""
-    for word in string.gmatch(redisKey, '([^:]+)') do
-      if index == 1 then
-        if word ~= "resources" then
-          break
-        else
-          resourcesExist = true
-          index = index + 1
-        end
-      else
-        if index == 2 then
-          tenant = word
-        elseif index == 3 then
-          gatewayPath = word
-          -- Create new conf file
-          local resourceObj = _M.getResource(red, redisKey, REDIS_FIELD)
-          local fileLocation = filemgmt.createResourceConf(BASE_CONF_DIR, tenant, ngx.escape_uri(gatewayPath), resourceObj)
-          logger.debug(utils.concatStrings({"Updated file: ", fileLocation}))
-        end
-        index = index + 1
-      end
-    end
-  end
-  if resourcesExist == false then
-    logger.debug("No existing resources.")
-  end
-end
-
---- Subscribe helper method
--- Starts a while loop that listens for key changes in redis
--- @param redisSubClient the redis client that is listening for the redis key changes
--- @param redisGetClient the redis client that gets the changed resource to update the conf file
-function subscribe(redisSubClient, redisGetClient)
   while true do
     local res, err = redisSubClient:read_reply()
     if not res then
       if err ~= "timeout" then
-        ngx.say("Read reply error: ", err)
-        ngx.exit(ngx.status)
+        request.err(500, utils.concatStrings({"Failed to read from redis: ", err}))
       end
     else
       local index = 1
@@ -391,29 +409,17 @@
       local resourceObj = _M.getResource(redisGetClient, redisKey, REDIS_FIELD)
       if resourceObj == nil then
         local fileLocation = filemgmt.deleteResourceConf(BASE_CONF_DIR, tenant, ngx.escape_uri(gatewayPath))
+        os.execute("/usr/local/sbin/nginx -s reload")
         logger.debug(utils.concatStrings({"Redis key deleted: ", redisKey}))
         logger.debug(utils.concatStrings({"Deleted file: ", fileLocation}))
       else
         local fileLocation = filemgmt.createResourceConf(BASE_CONF_DIR, tenant, ngx.escape_uri(gatewayPath), resourceObj)
+        os.execute("/usr/local/sbin/nginx -s reload")
         logger.debug(utils.concatStrings({"Redis key updated: ", redisKey}))
         logger.debug(utils.concatStrings({"Updated file: ", fileLocation}))
       end
     end
   end
-  ngx.exit(ngx.status)
-end
-
-
---- Unsubscribe from redis
--- @param red redis client instance
-function _M.unsubscribe(red)
-  local ok, err = red:unsubscribe("__keyspace@0__:resources:*:*")
-  if not ok then
-    request.err(500, utils.concatStrings({"Failed to unsubscribe to redis: ", err}))
-  end
-  _M.close(red, ngx)
-  ngx.say("Unsubscribed from redis")
-  ngx.exit(ngx.status)
 end
 
 return _M
\ No newline at end of file
diff --git a/api-gateway-config/scripts/lua/lib/request.lua b/api-gateway-config/scripts/lua/lib/request.lua
index 0ef5999..9a61a3e 100644
--- a/api-gateway-config/scripts/lua/lib/request.lua
+++ b/api-gateway-config/scripts/lua/lib/request.lua
@@ -31,7 +31,7 @@
 -- @param msg error message
 function err(code, msg)
   ngx.status = code
-  ngx.print(utils.concatStrings({"Error: ", msg}))
+  ngx.say(utils.concatStrings({"Error: ", msg}))
   ngx.exit(ngx.status)
 end
 
@@ -40,7 +40,7 @@
 -- @param obj object to return
 function success(code, obj)
   ngx.status = code
-  ngx.print(obj)
+  ngx.say(obj)
   ngx.exit(ngx.status)
 end
 
diff --git a/api-gateway-config/scripts/lua/management.lua b/api-gateway-config/scripts/lua/management.lua
index a09ff51..9f9ea48 100644
--- a/api-gateway-config/scripts/lua/management.lua
+++ b/api-gateway-config/scripts/lua/management.lua
@@ -24,7 +24,6 @@
 
 local cjson = require "cjson"
 local redis = require "lib/redis"
-local filemgmt = require "lib/filemgmt"
 local utils = require "lib/utils"
 local logger = require "lib/logger"
 local request = require "lib/request"
@@ -56,22 +55,9 @@
 function _M.addAPI()
   -- Open connection to redis or use one from connection pool
   local red = redis.init(REDIS_HOST, REDIS_PORT, REDIS_PASS, 1000)
-  -- Check for api id and use existingAPI if it already exists in redis
+  -- Check for api id from uri and use existingAPI if it already exists in redis
   local uri = string.gsub(ngx.var.request_uri, "?.*", "")
-  local apiId, existingAPI
-  local index = 1
-  for word in string.gmatch(uri, '([^/]+)') do
-    if index == 3 then
-      apiId = word
-    end
-    index = index + 1
-  end
-  if apiId ~= nil then
-    existingAPI = redis.getAPI(red, apiId)
-    if existingAPI == nil then
-      request.err(404, utils.concatStrings({"Unknown API id ", apiId}))
-    end
-  end
+  local existingAPI = checkURIForExisting(red, uri, "api")
   -- Read in the PUT JSON Body
   ngx.req.read_body()
   local args = ngx.req.get_body_data()
@@ -80,6 +66,13 @@
   end
   -- Convert json into Lua table
   local decoded = cjson.decode(args)
+  -- Check for api id in JSON body
+  if existingAPI == nil and decoded.id ~= nil then
+    existingAPI = redis.getAPI(red, decoded.id)
+    if existingAPI == nil then
+      request.err(404, utils.concatStrings({"Unknown API id ", decoded.id}))
+    end
+  end
   -- Error checking
   local fields = {"name", "basePath", "tenantId", "resources"}
   for k, v in pairs(fields) do
@@ -90,12 +83,7 @@
   end
   -- Format basePath
   local basePath = decoded.basePath:sub(1,1) == '/' and decoded.basePath:sub(2) or decoded.basePath
-  -- Add resources to redis and create nginx conf files
-  for path, resource in pairs(decoded.resources) do
-    local gatewayPath = utils.concatStrings({basePath, ngx.escape_uri(path)})
-    addResource(red, resource, gatewayPath, decoded.tenantId)
-  end
-  -- Return managedUrl object
+  -- Create managedUrl object
   local uuid = existingAPI ~= nil and existingAPI.id or utils.uuid()
   local managedUrl = utils.concatStrings({"http://", MANAGEDURL_HOST, ":", MANAGEDURL_PORT, "/api/", decoded.tenantId})
   if basePath:sub(1,1) ~= '' then
@@ -109,9 +97,13 @@
     resources = decoded.resources,
     managedUrl = managedUrl
   }
-  managedUrlObj = cjson.encode(managedUrlObj):gsub("\\", "")
   -- Add API object to redis
-  redis.addAPI(red, uuid, managedUrlObj)
+  managedUrlObj = redis.addAPI(red, uuid, managedUrlObj, existingAPI)
+  -- Add resources to redis
+  for path, resource in pairs(decoded.resources) do
+    local gatewayPath = utils.concatStrings({basePath, ngx.escape_uri(path)})
+    addResource(red, resource, gatewayPath, decoded.tenantId)
+  end
   redis.close(red)
   -- Return managed url object
   ngx.header.content_type = "application/json; charset=utf-8"
@@ -206,7 +198,6 @@
   end
   local resourceObj = redis.generateResourceObj(operations, apiId)
   redis.createResource(red, redisKey, REDIS_FIELD, resourceObj)
-  filemgmt.createResourceConf(BASE_CONF_DIR, tenantId, gatewayPath, resourceObj)
 end
 
 --- Get one or all APIs from the gateway
@@ -306,13 +297,14 @@
   if api == nil then
     request.err(404, utils.concatStrings({"Unknown API id ", id}))
   end
+  -- Delete API
+  redis.deleteAPI(red, id)
   -- Delete all resources for the API
   local basePath = api.basePath:sub(2)
   for path, v in pairs(api.resources) do
     local gatewayPath = utils.concatStrings({basePath, ngx.escape_uri(path)})
     deleteResource(red, gatewayPath, api.tenantId)
   end
-  redis.deleteAPI(red, id)
   redis.close(red)
   request.success(200, {})
 end
@@ -324,7 +316,6 @@
 function deleteResource(red, gatewayPath, tenantId)
   local redisKey = utils.concatStrings({"resources:", tenantId, ":", ngx.unescape_uri(gatewayPath)})
   redis.deleteResource(red, redisKey, REDIS_FIELD)
-  filemgmt.deleteResourceConf(BASE_CONF_DIR, tenantId, gatewayPath)
 end
 
 -----------------------------
@@ -343,20 +334,7 @@
   local red = redis.init(REDIS_HOST, REDIS_PORT, REDIS_PASS, 1000)
   -- Check for tenant id and use existingTenant if it already exists in redis
   local uri = string.gsub(ngx.var.request_uri, "?.*", "")
-  local tenantId, existingTenant
-  local index = 1
-  for word in string.gmatch(uri, '([^/]+)') do
-    if index == 3 then
-      tenantId = word
-    end
-    index = index + 1
-  end
-  if tenantId ~= nil then
-    existingTenant = redis.getTenant(red, tenantId)
-    if existingTenant == nil then
-      request.err(400, utils.concatStrings({"Unknown tenant id ", tenantId}))
-    end
-  end
+  local existingTenant = checkURIForExisting(red, uri, "tenant")
   -- Read in the PUT JSON Body
   ngx.req.read_body()
   local args = ngx.req.get_body_data()
@@ -365,6 +343,13 @@
   end
   -- Convert json into Lua table
   local decoded = cjson.decode(args)
+  -- Check for tenant id in JSON body
+  if existingTenant == nil and decoded.id ~= nil then
+    existingTenant = redis.getTenant(red, decoded.id)
+    if existingTenant == nil then
+      request.err(404, utils.concatStrings({"Unknown Tenant id ", decoded.id}))
+    end
+  end
   -- Error checking
   local fields = {"namespace", "instance"}
   for k, v in pairs(fields) do
@@ -379,8 +364,7 @@
     namespace = decoded.namespace,
     instance = decoded.instance
   }
-  tenantObj = cjson.encode(tenantObj)
-  redis.addTenant(red, uuid, tenantObj)
+  tenantObj = redis.addTenant(red, uuid, tenantObj)
   redis.close(red)
   ngx.header.content_type = "application/json; charset=utf-8"
   request.success(200, tenantObj)
@@ -490,24 +474,22 @@
 ----- Pub/Sub with Redis -----
 ------------------------------
 
---- Subscribe to redis
--- GET /subscribe
-function _M.subscribe()
-  -- Initialize and connect to redis
-  local redisGetClient = redis.init(REDIS_HOST, REDIS_PORT, REDIS_PASS, 1000)
-  local redisSubClient = redis.init(REDIS_HOST, REDIS_PORT, REDIS_PASS, 60000) -- read_reply will timeout every minute
-  logger.debug(utils.concatStrings({"\nConnected to redis at ", REDIS_HOST, ":", REDIS_PORT}))
-  redis.subscribe(redisSubClient, redisGetClient)
+--- Sync with redis
+-- GET /v1/sync
+function _M.sync()
+  local red = redis.init(REDIS_HOST, REDIS_PORT, REDIS_PASS, 10000)
+  logger.debug(utils.concatStrings({"Connected to redis at ", REDIS_HOST, ":", REDIS_PORT}))
+  redis.syncWithRedis(red)
   ngx.exit(200)
 end
 
---- Unsusbscribe to redis
--- GET /unsubscribe
-function _M.unsubscribe()
-  -- Initialize and connect to redis
-  local red = redis.init(REDIS_HOST, REDIS_PORT, REDIS_PASS, 1000)
-  redis.unsubscribe(red)
-  request.success(200, "Unsubscribed to redis")
+--- Subscribe to redis
+-- GET /v1/subscribe
+function _M.subscribe()
+  local redisGetClient = redis.init(REDIS_HOST, REDIS_PORT, REDIS_PASS, 1000)
+  local redisSubClient = redis.init(REDIS_HOST, REDIS_PORT, REDIS_PASS, 1000)
+  redis.subscribe(redisSubClient, redisGetClient)
+  ngx.exit(200)
 end
 
 ---------------------------
@@ -606,6 +588,38 @@
   return redisKey
 end
 
+
+--- Check for api id from uri and use existingAPI if it already exists in redis
+-- @param red Redis client instance
+-- @param uri Uri of request. Eg. /v1/apis/{id}
+-- @param type type to look for in redis. "api" or "tenant"
+function checkURIForExisting(red, uri, type)
+  local id, existing
+  local index = 1
+  -- Check if id is in the uri
+  for word in string.gmatch(uri, '([^/]+)') do
+    if index == 3 then
+      id = word
+    end
+    index = index + 1
+  end
+  -- Get object from redis
+  if id ~= nil then
+    if type == "api" then
+      existing = redis.getAPI(red, id)
+      if existing == nil then
+        request.err(404, utils.concatStrings({"Unknown API id ", id}))
+      end
+    elseif type == "tenant" then
+      existing = redis.getTenant(red, id)
+      if existing == nil then
+        request.err(404, utils.concatStrings({"Unknown Tenant id ", id}))
+      end
+    end
+  end
+  return existing
+end
+
 --- Parse the request uri to get the redisKey, tenant, and gatewayPath
 -- @param requestURI String containing the uri in the form of "/resources/<tenant>/<path>"
 -- @return list containing redisKey, tenant, gatewayPath
diff --git a/api-gateway-config/tests/run-tests.sh b/api-gateway-config/tests/run-tests.sh
index 6e137da..1eaa926 100755
--- a/api-gateway-config/tests/run-tests.sh
+++ b/api-gateway-config/tests/run-tests.sh
@@ -1,4 +1,4 @@
 #!/bin/sh
 
 # Run unit tests
-busted -c --output=TAP --helper=set_paths spec/test.lua
\ No newline at end of file
+busted --output=TAP --helper=set_paths spec/test.lua
\ No newline at end of file
diff --git a/api-gateway-config/tests/spec/test.lua b/api-gateway-config/tests/spec/test.lua
index 89e7052..5547e61 100644
--- a/api-gateway-config/tests/spec/test.lua
+++ b/api-gateway-config/tests/spec/test.lua
@@ -44,16 +44,16 @@
     local code = 500
     local msg = 'Internal server error\n'
     request.err(code, msg)
-    assert.are.equal(ngx._body, 'Error: ' .. msg)
-    assert.are.equal(ngx._exit, code)
+    assert.are.equal('Error: ' .. msg .. '\n', ngx._body)
+    assert.are.equal(code, ngx._exit)
   end)
 
   it('should return correct success response', function()
     local code = 200
     local msg ='Success!\n'
     request.success(code, msg)
-    assert.are.equal(ngx._body, msg)
-    assert.are.equal(ngx._exit, code)
+    assert.are.equal(msg .. '\n', ngx._body)
+    assert.are.equal(code, ngx._exit)
   end)
 end)
 
diff --git a/init.sh b/init.sh
index b81d4d1..a553b75 100755
--- a/init.sh
+++ b/init.sh
@@ -53,7 +53,8 @@
 
 if [[ -n "${redis_host}" && -n "${redis_port}" ]]; then
     sleep 1  # sleep until api-gateway is set up
-    curl -s http://0.0.0.0:9000/subscribe # subscribe to redis key changes for routes
+    curl -s http://0.0.0.0:9000/v1/sync & # sync with redis
+    curl -s http://0.0.0.0:9000/v1/subscribe # subscribe to redis key changes for routes
 else
     echo "REDIS_HOST and/or REDIS_PORT not defined"
 fi
