diff --git a/.gitignore b/.gitignore
index d0a944a..021d01b 100644
--- a/.gitignore
+++ b/.gitignore
@@ -15,3 +15,6 @@
 
 # Concourse
 secrets.yml
+
+# npm
+npm-debug.log
diff --git a/.travis.yml b/.travis.yml
index 5c783c9..7cc1918 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -14,4 +14,4 @@
   - ./install-deps.sh
 
 script:
-  - busted --output=TAP --helper=set_paths spec/test.lua
\ No newline at end of file
+  - busted --output=TAP --helper=set_paths --pattern=.lua scripts
\ No newline at end of file
diff --git a/README.md b/README.md
index 2a59f2f..bbf8a4e 100644
--- a/README.md
+++ b/README.md
@@ -1,5 +1,7 @@
 apigateway
 =============
+[![Build Status](https://travis-ci.org/openwhisk/apigateway.svg?branch=master)](https://travis-ci.org/openwhisk/apigateway)
+
 A performant API Gateway based on Openresty and NGINX.
 
 Project status
@@ -54,8 +56,6 @@
  
 ### Testing
 
- Unit tests can be found in the `api-gateway-config/tests/spec` directory.
-
  First install the necessary dependencies:
  ```
   make test-build
@@ -64,5 +64,4 @@
  ```
   make test-run
  ```
- This will output the results of the tests as well as generate a code coverage report.
 
diff --git a/api-gateway-config/scripts/lua/routing.lua b/api-gateway-config/scripts/lua/routing.lua
index 4dedfa7..e9d90a4 100644
--- a/api-gateway-config/scripts/lua/routing.lua
+++ b/api-gateway-config/scripts/lua/routing.lua
@@ -38,10 +38,11 @@
 local _M = {}
 
 --- Main function that handles parsing of invocation details and carries out implementation
-function processCall()
+function _M.processCall()
   -- Get resource object from redis
   local red = redis.init(REDIS_HOST, REDIS_PORT, REDIS_PASS, 10000)
-  local redisKey = findRedisKey(red)
+  local resourceKeys = redis.getAllResourceKeys(red, ngx.var.tenant)
+  local redisKey = _M.findRedisKey(resourceKeys, ngx.var.tenant, ngx.var.gatewayPath)
   if redisKey == nil then
     return request.err(404, 'Not found.')
   end
@@ -82,9 +83,10 @@
 end
 
 --- Find the correct redis key based on the path that's passed in
--- @param red
-function findRedisKey(red)
-  local resourceKeys = redis.getAllResourceKeys(red, ngx.var.tenant)
+-- @param resourceKeys list of resourceKeys to search through
+-- @param tenant tenantId
+-- @param path path to look for
+function _M.findRedisKey(resourceKeys, tenant, path)
   -- Construct a table of redisKeys based on number of slashes in the path
   local keyTable = {}
   for i, key in pairs(resourceKeys) do
@@ -100,14 +102,14 @@
     table.insert(keyTable[count], key)
   end
   -- Find the correct redisKey
-  local redisKey = utils.concatStrings({"resources:", ngx.var.tenant, ":", ngx.var.gatewayPath})
+  local redisKey = utils.concatStrings({"resources:", tenant, ":", path})
   local _, count = string.gsub(redisKey, "/", "")
   for i = count, 0, -1 do
     local countString = tostring(i)
     if keyTable[countString] ~= nil then
       for _, key in pairs(keyTable[countString]) do
         -- Check for exact match or path parameter match
-        if key == redisKey or key == utils.concatStrings({redisKey, "/"}) or pathParamMatch(key, redisKey) == true then
+        if key == redisKey or key == utils.concatStrings({redisKey, "/"}) or _M.pathParamMatch(key, redisKey) == true then
           local res = {string.match(key, "([^:]+):([^:]+):([^:]+)")}
           ngx.var.gatewayPath = res[3]
           return key
@@ -127,7 +129,7 @@
 --- Check redis if resourceKey matches path parameters
 -- @param key key that may have path parameter variables
 -- @param resourceKey redis resourceKey to check if it matches path parameter
-function pathParamMatch(key, resourceKey)
+function _M.pathParamMatch(key, resourceKey)
   local pathParamVars = {}
   for w in string.gfind(key, "({%w+})") do
     w = string.sub(w, 2, string.len(w) - 1)
@@ -185,6 +187,4 @@
   end
 end
 
-_M.processCall = processCall
-
 return _M
diff --git a/api-gateway-config/tests/install-deps.sh b/api-gateway-config/tests/install-deps.sh
index 5f9d12d..cda61f1 100755
--- a/api-gateway-config/tests/install-deps.sh
+++ b/api-gateway-config/tests/install-deps.sh
@@ -11,3 +11,4 @@
 luarocks install --tree=lua_modules sha1
 luarocks install --tree=lua_modules md5
 luarocks install --tree=lua_modules fakeredis
+luarocks install --tree=lua_modules net-url
diff --git a/api-gateway-config/tests/run-tests.sh b/api-gateway-config/tests/run-tests.sh
index 1eaa926..64591ee 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 --output=TAP --helper=set_paths spec/test.lua
\ No newline at end of file
+busted --output=TAP --helper=set_paths --pattern=.lua scripts
\ No newline at end of file
diff --git a/api-gateway-config/tests/scripts/lua/lib/logger.lua b/api-gateway-config/tests/scripts/lua/lib/logger.lua
new file mode 100644
index 0000000..0070bf9
--- /dev/null
+++ b/api-gateway-config/tests/scripts/lua/lib/logger.lua
@@ -0,0 +1,36 @@
+-- Copyright (c) 2016 IBM. All rights reserved.
+--
+--   Permission is hereby granted, free of charge, to any person obtaining a
+--   copy of this software and associated documentation files (the "Software"),
+--   to deal in the Software without restriction, including without limitation
+--   the rights to use, copy, modify, merge, publish, distribute, sublicense,
+--   and/or sell copies of the Software, and to permit persons to whom the
+--   Software is furnished to do so, subject to the following conditions:
+--
+--   The above copyright notice and this permission notice shall be included in
+--   all copies or substantial portions of the Software.
+--
+--   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+--   IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+--   FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+--   AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+--   LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+--   FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+--   DEALINGS IN THE SOFTWARE.
+
+local fakengx = require 'fakengx'
+local logger = require 'lib/logger'
+
+describe('Testing logger module', function()
+  before_each(function()
+    _G.ngx = fakengx.new()
+  end)
+
+  it('Should handle error stream', function()
+    local msg = 'Error!'
+    logger.err(msg)
+    local expected = 'LOG(4): ' .. msg .. '\n'
+    local generated = ngx._log
+    assert.are.equal(expected, generated)
+  end)
+end)
\ No newline at end of file
diff --git a/api-gateway-config/tests/scripts/lua/lib/redis.lua b/api-gateway-config/tests/scripts/lua/lib/redis.lua
new file mode 100644
index 0000000..b0f2f96
--- /dev/null
+++ b/api-gateway-config/tests/scripts/lua/lib/redis.lua
@@ -0,0 +1,145 @@
+-- Copyright (c) 2016 IBM. All rights reserved.
+--
+--   Permission is hereby granted, free of charge, to any person obtaining a
+--   copy of this software and associated documentation files (the "Software"),
+--   to deal in the Software without restriction, including without limitation
+--   the rights to use, copy, modify, merge, publish, distribute, sublicense,
+--   and/or sell copies of the Software, and to permit persons to whom the
+--   Software is furnished to do so, subject to the following conditions:
+--
+--   The above copyright notice and this permission notice shall be included in
+--   all copies or substantial portions of the Software.
+--
+--   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+--   IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+--   FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+--   AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+--   LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+--   FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+--   DEALINGS IN THE SOFTWARE.
+
+local fakengx = require 'fakengx'
+local fakeredis = require 'fakeredis'
+local cjson = require 'cjson'
+local redis = require 'lib/redis'
+
+describe('Testing Redis module', function()
+  before_each(function()
+    _G.ngx = fakengx.new()
+    red = fakeredis.new()
+    operations = {
+      GET = {
+        backendUrl = 'https://httpbin.org/get',
+        backendMethod = 'GET'
+      }
+    }
+  end)
+
+  it('should generate resource object to store in redis', function()
+    -- Resource object with no policies or security
+    local apiId = 12345
+    local resourceObj = {
+      apiId = apiId,
+      operations = operations
+    }
+    local expected = resourceObj
+    local generated = cjson.decode(redis.generateResourceObj(operations, apiId))
+    assert.are.same(expected, generated)
+
+    -- Resource object with policy added
+    local policyList = [[
+      [{
+          "type":"rateLimit",
+          "value":[{
+              "interval":60,
+              "rate":100,
+              "scope":"api",
+              "subscription": "true"
+          }]
+      }]
+    ]]
+    resourceObj.operations.GET.policies = cjson.decode(policyList)
+    expected = resourceObj
+    generated = cjson.decode(redis.generateResourceObj(operations, apiId))
+    assert.are.same(expected, generated)
+
+    -- Resource object with security added
+    local securityObj = [[
+      {
+        "type":"apiKey",
+        "scope":"api",
+        "header":"myheader"
+      }
+    ]]
+    resourceObj.operations.GET.security = cjson.decode(securityObj)
+    expected = resourceObj
+    generated = cjson.decode(redis.generateResourceObj(operations, apiId))
+    assert.are.same(expected, generated)
+
+    -- Resource object with multiple operations
+    resourceObj.operations.PUT = {
+      backendUrl = 'https://httpbin.org/get',
+      backendMethod = 'PUT',
+      security = {}
+    }
+    expected = resourceObj
+    generated = cjson.decode(redis.generateResourceObj(operations, apiId))
+    assert.are.same(expected, generated)
+  end)
+
+  it('should get a resource from redis', function()
+    local key = 'resources:guest:hello'
+    local field = 'resources'
+    -- resource doesn't exist in redis
+    local generated = redis.getResource(red, key, field)
+    assert.are.same(nil, generated)
+
+    -- resource exists in redis
+    local expected = redis.generateResourceObj(operations, nil)
+    red:hset(key, field, expected)
+    generated = redis.getResource(red, key, field)
+    assert.are.same(expected, generated)
+  end)
+
+  it('should create a resource in redis', function()
+    local key = 'resources:guest:hello'
+    local field = 'resources'
+    local expected = redis.generateResourceObj(operations, nil)
+    redis.createResource(red, key, field, expected)
+    local generated = redis.getResource(red, key, field)
+    assert.are.same(expected, generated)
+  end)
+
+  it('should delete a resource in redis', function()
+    -- Key doesn't exist - throw 404
+    local key = 'resources:guest:hello'
+    local field = 'resources'
+    redis.deleteResource(red, key, field)
+    assert.are.equal(ngx._exit, 404)
+    -- Key exists - deleted properly
+    local resourceObj = redis.generateResourceObj(operations, nil)
+    redis.createResource(red, key, field, resourceObj)
+    local expected = 1
+    local generated = redis.deleteResource(red, key, field)
+    assert.are.same(expected, generated)
+  end)
+
+  it('shoud create an API Key subscription', function()
+    local key = 'subscriptions:test:apikey'
+    redis.createSubscription(red, key)
+    assert.are.same(true, red:exists(key))
+  end)
+
+  it('should delete an API Key subscription', function()
+    -- API key doesn't exist in redis - throw 404
+    local key = 'subscriptions:test:apikey'
+    redis.deleteSubscription(red, key)
+    assert.are.equal(404, ngx._exit)
+
+    -- API key to delete exists in redis
+    red:set(key, '')
+    redis.deleteSubscription(red, key)
+    assert.are.equal(false, red:exists(key))
+  end)
+
+end)
\ No newline at end of file
diff --git a/api-gateway-config/tests/scripts/lua/lib/request.lua b/api-gateway-config/tests/scripts/lua/lib/request.lua
new file mode 100644
index 0000000..c7aadd4
--- /dev/null
+++ b/api-gateway-config/tests/scripts/lua/lib/request.lua
@@ -0,0 +1,44 @@
+-- Copyright (c) 2016 IBM. All rights reserved.
+--
+--   Permission is hereby granted, free of charge, to any person obtaining a
+--   copy of this software and associated documentation files (the "Software"),
+--   to deal in the Software without restriction, including without limitation
+--   the rights to use, copy, modify, merge, publish, distribute, sublicense,
+--   and/or sell copies of the Software, and to permit persons to whom the
+--   Software is furnished to do so, subject to the following conditions:
+--
+--   The above copyright notice and this permission notice shall be included in
+--   all copies or substantial portions of the Software.
+--
+--   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+--   IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+--   FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+--   AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+--   LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+--   FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+--   DEALINGS IN THE SOFTWARE.
+
+local fakengx = require 'fakengx'
+local request = require 'lib/request'
+
+describe('Testing Request module', function()
+  before_each(function()
+    _G.ngx = fakengx.new()
+  end)
+
+  it('should return correct error response', function()
+    local code = 500
+    local msg = 'Internal server error\n'
+    request.err(code, msg)
+    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(msg .. '\n', ngx._body)
+    assert.are.equal(code, ngx._exit)
+  end)
+end)
\ No newline at end of file
diff --git a/api-gateway-config/tests/scripts/lua/lib/utils.lua b/api-gateway-config/tests/scripts/lua/lib/utils.lua
new file mode 100644
index 0000000..2e1bf13
--- /dev/null
+++ b/api-gateway-config/tests/scripts/lua/lib/utils.lua
@@ -0,0 +1,62 @@
+-- Copyright (c) 2016 IBM. All rights reserved.
+--
+--   Permission is hereby granted, free of charge, to any person obtaining a
+--   copy of this software and associated documentation files (the "Software"),
+--   to deal in the Software without restriction, including without limitation
+--   the rights to use, copy, modify, merge, publish, distribute, sublicense,
+--   and/or sell copies of the Software, and to permit persons to whom the
+--   Software is furnished to do so, subject to the following conditions:
+--
+--   The above copyright notice and this permission notice shall be included in
+--   all copies or substantial portions of the Software.
+--
+--   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+--   IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+--   FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+--   AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+--   LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+--   FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+--   DEALINGS IN THE SOFTWARE.
+
+local fakengx = require 'fakengx'
+local utils = require 'lib/utils'
+
+describe('Testing utils module', function()
+  before_each(function()
+    _G.ngx = fakengx.new()
+  end)
+
+  it('should concatenate strings properly', function()
+    local expected = 'hello' .. 'gateway' .. 'world'
+    local generated = utils.concatStrings({'hello', 'gateway', 'world'})
+    assert.are.equal(expected, generated)
+  end)
+
+  it('should serialize a simple lua table', function()
+    local expected = {
+      test = true
+    }
+    local serialized = utils.serializeTable(expected)
+    loadstring('generated = ' .. serialized)() -- convert serialzed string to lua table
+    assert.are.same(expected, generated)
+  end)
+
+  it('should serialize an empty table', function()
+    local expected = {}
+    local serialized = utils.serializeTable(expected)
+    loadstring('generated = ' .. serialized)() -- convert serialzed string to lua table
+    assert.are.same(expected, generated)
+  end)
+
+  it('should serialize complex nested table', function()
+    local expected = {
+      test1 = {
+        nested = 'value'
+      },
+      test2 = true
+    }
+    local serialized = utils.serializeTable(expected)
+    loadstring('generated = ' .. serialized)() -- convert serialzed string to lua table
+    assert.are.same(expected, generated)
+  end)
+end)
\ No newline at end of file
diff --git a/api-gateway-config/tests/scripts/lua/routing.lua b/api-gateway-config/tests/scripts/lua/routing.lua
new file mode 100644
index 0000000..4ca04d4
--- /dev/null
+++ b/api-gateway-config/tests/scripts/lua/routing.lua
@@ -0,0 +1,122 @@
+-- Copyright (c) 2016 IBM. All rights reserved.
+--
+--   Permission is hereby granted, free of charge, to any person obtaining a
+--   copy of this software and associated documentation files (the "Software"),
+--   to deal in the Software without restriction, including without limitation
+--   the rights to use, copy, modify, merge, publish, distribute, sublicense,
+--   and/or sell copies of the Software, and to permit persons to whom the
+--   Software is furnished to do so, subject to the following conditions:
+--
+--   The above copyright notice and this permission notice shall be included in
+--   all copies or substantial portions of the Software.
+--
+--   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+--   IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+--   FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+--   AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+--   LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+--   FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+--   DEALINGS IN THE SOFTWARE.
+
+local fakengx = require 'fakengx'
+local fakeredis = require 'fakeredis'
+local redis = require 'lib/redis'
+local routing = require 'routing'
+
+describe('Testing routing module', function()
+  before_each(function()
+    _G.ngx = fakengx.new()
+    ngx.var.gatewayPath = ''
+    red = fakeredis.new()
+    operations = {
+      GET = {
+        backendUrl = 'https://httpbin.org',
+        backendMethod = 'GET'
+      }
+    }
+    keys = {'resources:guest:bp1/test/hello', 'resources:guest:bp2/hello', 'resources:guest:bp3/testing/test/hi',
+      'resources:guest:bp4/another/hello', 'resources:guest:nobp', 'resources:guest:noresource/'}
+    local field = 'resources'
+    for _, key in pairs(keys) do
+      red:hset(key, field, redis.generateResourceObj(operations, nil))
+    end
+  end)
+
+  it('should find the correct redis key', function()
+    local expected = 'resources:guest:bp1/test/hello'
+    local tenant = 'guest'
+    local path = 'bp1/test/hello'
+    local actual = routing.findRedisKey(keys, tenant, path)
+    assert.are.same(expected, actual)
+    expected = 'bp1/test/hello'
+    actual = ngx.var.gatewayPath
+    assert.are.same(expected, actual)
+  end)
+
+  it('should return nil if redis key doesn\'t exist', function()
+    local expected = nil
+    local tenant = 'guest'
+    local path = 'bp1/bad/path'
+    local actual = routing.findRedisKey(keys, tenant, path)
+    assert.are.same(expected, actual)
+  end)
+
+  it('should find correct key when basePath is "/"', function()
+    local expected = 'resources:guest:nobp'
+    local tenant = 'guest'
+    local path = 'nobp'
+    local actual = routing.findRedisKey(keys, tenant, path)
+    assert.are.same(expected, actual)
+    expected = 'nobp'
+    actual = ngx.var.gatewayPath
+    assert.are.same(expected, actual)
+  end)
+
+  it('should find correct key when resourcePath is "/"', function()
+    local expected = 'resources:guest:noresource/'
+    local tenant = 'guest'
+    local path = 'noresource/'
+    local actual = routing.findRedisKey(keys, tenant, path)
+    assert.are.same(expected, actual)
+    expected = 'noresource/'
+    actual = ngx.var.gatewayPath
+    assert.are.same(expected, actual)
+  end)
+
+  it('should match the correct path parameters', function()
+    local key = 'resources:guest:bp5/{pathVar}'
+    local redisKey = 'resources:guest:bp5/test'
+    local actual = routing.pathParamMatch(key, redisKey)
+    local expected = true
+    assert.are.same(expected, actual)
+    expected = 'test'
+    actual = ngx.ctx.pathVar
+    assert.are.same(expected, actual)
+  end)
+
+  it('should return false if there isn\'t a path parameter match', function()
+    local key = 'resources:guest:bp6/{pathVar}/hey'
+    local redisKey = 'resources:guest:bp6/test/hi'
+    local actual = routing.pathParamMatch(key, redisKey)
+    local expected = false
+    assert.are.same(expected, actual)
+    expected = nil
+    actual = ngx.ctx.pathVar
+    assert.are.same(expected, actual)
+  end)
+
+  it('should match multiple path parameters', function()
+    local key = 'resources:guest:base/{var1}/hello/{var2}'
+    local redisKey = 'resources:guest:base/test/hello/testing'
+    local actual = routing.pathParamMatch(key, redisKey)
+    local expected = true
+    assert.are.same(expected, actual)
+    expected = 'test'
+    actual = ngx.ctx.var1
+    assert.are.same(expected, actual)
+    expected = 'testing'
+    actual = ngx.ctx.var2
+    assert.are.same(expected, actual)
+  end)
+
+end)
\ No newline at end of file
diff --git a/api-gateway-config/tests/set_paths.lua b/api-gateway-config/tests/set_paths.lua
index bdc8afb..c1f2ef8 100644
--- a/api-gateway-config/tests/set_paths.lua
+++ b/api-gateway-config/tests/set_paths.lua
@@ -6,6 +6,7 @@
 package.path = package.path ..
     ';' .. pwd .. '/lua_modules/share/lua/' .. version .. '/?.lua' ..
     ';' .. pwd .. '/lua_modules/share/lua/' .. version .. '/?/init.lua' ..
+    ';' .. pwd .. '/lua_modules/share/lua/' .. version .. '/net/?.lua' ..
     ';' .. pwd .. '/../scripts/lua/?.lua'
 package.cpath = package.cpath ..
     ';' .. pwd .. '/lua_modules/lib/lua/' .. version .. '/?.so'
\ No newline at end of file
diff --git a/api-gateway-config/tests/spec/test.lua b/api-gateway-config/tests/spec/test.lua
deleted file mode 100644
index 5547e61..0000000
--- a/api-gateway-config/tests/spec/test.lua
+++ /dev/null
@@ -1,243 +0,0 @@
--- Copyright (c) 2016 IBM. All rights reserved.
---
---   Permission is hereby granted, free of charge, to any person obtaining a
---   copy of this software and associated documentation files (the "Software"),
---   to deal in the Software without restriction, including without limitation
---   the rights to use, copy, modify, merge, publish, distribute, sublicense,
---   and/or sell copies of the Software, and to permit persons to whom the
---   Software is furnished to do so, subject to the following conditions:
---
---   The above copyright notice and this permission notice shall be included in
---   all copies or substantial portions of the Software.
---
---   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
---   IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
---   FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
---   AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
---   LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
---   FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
---   DEALINGS IN THE SOFTWARE.
-
--- Unit tests for the apigateway using the busted framework.
--- @author Alex Song (songs)
-
-local fakengx = require 'fakengx'
-local fakeredis = require 'fakeredis'
-local cjson = require 'cjson'
-local request = require 'lib/request'
-local utils = require 'lib/utils'
-local logger = require 'lib/logger'
-local redis = require 'lib/redis'
-local mapping = require 'policies/mapping'
-
-
-------------------------------------
----- Unit tests for lib modules ----
-------------------------------------
-
-describe('Testing Request module', function()
-  before_each(function()
-    _G.ngx = fakengx.new()
-  end)
-
-  it('should return correct error response', function()
-    local code = 500
-    local msg = 'Internal server error\n'
-    request.err(code, msg)
-    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(msg .. '\n', ngx._body)
-    assert.are.equal(code, ngx._exit)
-  end)
-end)
-
-
-describe('Testing utils module', function()
-  before_each(function()
-    _G.ngx = fakengx.new()
-  end)
-
-  it('should concatenate strings properly', function()
-    local expected = 'hello' .. 'gateway' .. 'world'
-    local generated = utils.concatStrings({'hello', 'gateway', 'world'})
-    assert.are.equal(expected, generated)
-  end)
-
-  it('should serialize lua table', function()
-    -- Empty table
-    local expected = {}
-    local serialized = utils.serializeTable(expected)
-    loadstring('generated = ' .. serialized)() -- convert serialzed string to lua table
-    assert.are.same(expected, generated)
-
-    -- Simple table
-    expected = {
-      test = true
-    }
-    serialized = utils.serializeTable(expected)
-    loadstring('generated = ' .. serialized)() -- convert serialzed string to lua table
-    assert.are.same(expected, generated)
-
-    -- Complex nested table
-    expected = {
-      test1 = {
-        nested = 'value'
-      },
-      test2 = true
-    }
-    serialized = utils.serializeTable(expected)
-    loadstring('generated = ' .. serialized)() -- convert serialzed string to lua table
-    assert.are.same(expected, generated)
-  end)
-
-  it('should convert templated path parameter', function()
-    -- TODO: Add test cases for convertTemplatedPathParam(m)
-  end)
-end)
-
-
-describe('Testing logger module', function()
-  it('Should handle error stream', function()
-    local msg = 'Error!'
-    logger.err(msg)
-    local expected = 'LOG(4): ' .. msg .. '\n'
-    local generated = ngx._log
-    assert.are.equal(expected, generated)
-  end)
-end)
-
-
-describe('Testing Redis module', function()
-  before_each(function()
-    _G.ngx = fakengx.new()
-    red = fakeredis.new()
-  end)
-
-  it('should generate resource object to store in redis', function()
-    -- Resource object with no policies or security
-    local apiId = 12345
-    local operations = {
-      GET = {
-        backendUrl = 'https://httpbin.org/get',
-        backendMethod = 'GET'
-      }
-    }
-    local resourceObj = {
-      apiId = apiId,
-      operations = operations
-    }
-    local expected = resourceObj
-    local generated = cjson.decode(redis.generateResourceObj(operations, apiId))
-    assert.are.same(expected, generated)
-
-    -- Resource object with policy added
-    local policyList = [[
-      [{
-          "type":"rateLimit",
-          "value":[{
-              "interval":60,
-              "rate":100,
-              "scope":"api",
-              "subscription": "true"
-          }]
-      }]
-    ]]
-    resourceObj.operations.GET.policies = cjson.decode(policyList)
-    expected = resourceObj
-    generated = cjson.decode(redis.generateResourceObj(operations, apiId))
-    assert.are.same(expected, generated)
-
-    -- Resource object with security added
-    local securityObj = [[
-      {
-        "type":"apiKey",
-        "scope":"api",
-        "header":"myheader"
-      }
-    ]]
-    resourceObj.operations.GET.security = cjson.decode(securityObj)
-    expected = resourceObj
-    generated = cjson.decode(redis.generateResourceObj(operations, apiId))
-    assert.are.same(expected, generated)
-
-    -- Resource object with multiple operations
-    resourceObj.operations.PUT = {
-        backendUrl = 'https://httpbin.org/get',
-        backendMethod = 'PUT',
-        security = {}
-    }
-    expected = resourceObj
-    generated = cjson.decode(redis.generateResourceObj(operations, apiId))
-    assert.are.same(expected, generated)
-  end)
-
-  it('should get a resource from redis', function()
-    local key = 'resources:guest:hello'
-    local field = 'resources'
-    -- resource doesn't exist in redis
-    local generated = redis.getResource(red, key, field)
-    assert.are.same(nil, generated)
-
-    -- resource exists in redis
-    local expected = redis.generateResourceObj(red, key, 'GET', 'https://httpbin.org/get', 'GET', '12345', nil, nil)
-    red:hset(key, field, expected)
-    generated = redis.getResource(red, key, field)
-    assert.are.same(expected, generated)
-  end)
-
-  it('should create a resource in redis', function()
-    local key = 'resources:guest:hello'
-    local field = 'resources'
-    local expected = redis.generateResourceObj(red, key, 'GET', 'https://httpbin.org/get', 'GET', '12345', nil, nil)
-    redis.createResource(red, key, field, expected)
-    local generated = redis.getResource(red, key, field)
-    assert.are.same(expected, generated)
-  end)
-
-  it('should delete a resource in redis', function()
-    -- Key doesn't exist - throw 404
-    local key = 'resources:guest:hello'
-    local field = 'resources'
-    redis.deleteResource(red, key, field)
-    assert.are.equal(ngx._exit, 404)
-    -- Key exists - deleted properly
-    local resourceObj = redis.generateResourceObj(red, key, 'GET', 'https://httpbin.org/get', 'GET', '12345', nil, nil)
-    redis.createResource(red, key, field, resourceObj)
-    local expected = 1
-    local generated = redis.deleteResource(red, key, field)
-    assert.are.same(expected, generated)
-  end)
-
-  it('shoud create an API Key subscription', function()
-    local key = 'subscriptions:test:apikey'
-    redis.createSubscription(red, key)
-    assert.are.same(true, red:exists(key))
-  end)
-
-  it('should delete an API Key subscription', function()
-    -- API key doesn't exist in redis - throw 404
-    local key = 'subscriptions:test:apikey'
-    redis.deleteSubscription(red, key)
-    assert.are.equal(404, ngx._exit)
-
-    -- API key to delete exists in redis
-    red:set(key, '')
-    redis.deleteSubscription(red, key)
-    assert.are.equal(false, red:exists(key))
-  end)
-
-end)
-
---TODO: filemgmt
-
----------------------------------------
----- Unit tests for policy modules ----
----------------------------------------
-
---TODO: mapping, rateLimit, security
