diff --git a/.gitignore b/.gitignore
index 3c0ac2f..23d4050 100644
--- a/.gitignore
+++ b/.gitignore
@@ -34,4 +34,5 @@
 
 .vscode
 .idea
-.DS_Store
\ No newline at end of file
+.DS_Store
+env.sh
diff --git a/.travis.yml b/.travis.yml
new file mode 100644
index 0000000..e49a3ea
--- /dev/null
+++ b/.travis.yml
@@ -0,0 +1,4 @@
+language: node_js
+node_js:
+- '6.3.1'
+
diff --git a/README.md b/README.md
index 9311c2f..36f5d8b 100644
--- a/README.md
+++ b/README.md
@@ -1,5 +1,7 @@
 #Plugins
 
+Build Status [![Build Status](https://travis-ci.org/apigee/microgateway-plugins.svg?branch=accumulate-request-fixes)](https://travis-ci.org/apigee/microgateway-plugins)
+
 ##Overview
 This repo contains plugins for the [microgateway-core project](https://github.com/apigee/microgateway-core).  
 
@@ -55,4 +57,4 @@
 
 ```javascript 
 next([err])
-```
\ No newline at end of file
+```
diff --git a/accumulate-request/index.js b/accumulate-request/index.js
index b1e7643..d162087 100644
--- a/accumulate-request/index.js
+++ b/accumulate-request/index.js
@@ -14,7 +14,6 @@
  * should only be used when it is known that request/response bodies are small.
  */
 module.exports.init = function(config, logger, stats) {
-
   function accumulate(req, data) {
     if (!req._chunks) req._chunks = [];
     req._chunks.push(data);
@@ -29,11 +28,13 @@
 
     onend_request: function(req, res, data, next) {
       if (data && data.length > 0) accumulate(req, data);
-      var content = Buffer.concat(req._chunks);
+      var content = null;
+      if (req._chunks && req._chunks.length) {
+        content = Buffer.concat(req._chunks);
+      }
       delete req._chunks;
       next(null, content);
     }
-
   };
 
 }
diff --git a/accumulate-response/index.js b/accumulate-response/index.js
index 8be60af..1ff26a2 100644
--- a/accumulate-response/index.js
+++ b/accumulate-response/index.js
@@ -29,7 +29,10 @@
 
     onend_response: function(req, res, data, next) {
       if (data && data.length > 0) accumulate(res, data);
-      var content = Buffer.concat(res._chunks);
+      var content = null;
+      if(res._chunks && res._chunks.length) {
+        content = Buffer.concat(res._chunks);
+      }
       delete res._chunks;
       next(null, content);
     }
diff --git a/cache/index.js b/cache/index.js
deleted file mode 100644
index e7c08b0..0000000
--- a/cache/index.js
+++ /dev/null
@@ -1,67 +0,0 @@
-'use strict';
-
-var cache = require('volos-cache-memory');
-var async = require('async');
-var debug = require('debug')('gateway:cache');
-
-var getKey = function (req) {
-    return req.token.application_name;
-}
-var caches = [];
-
-var middleware = function (req, res, next) {
-    if (!req.token
-        || !req.token.api_product_list
-        || !req.token.api_product_list.length
-    ) {
-        return next();
-    }
-
-    debug('cache checking products', req.token.api_product_list);
-
-    req.originalUrl = req.originalUrl || req.url; // emulate connect
-
-    var found = false;
-    // this is arbitrary, but not sure there's a better way?
-    async.eachSeries(req.token.api_product_list,
-        function (productName, cb) {
-            if(!found) {
-                var cache = caches[productName];
-                executeDefaultCache(cache, req, res, cb);
-                found = true;
-            }else{
-                cb();
-            }
-        },
-        function (err) {
-            next(err);
-        }
-    );
-}
-
-var executeDefaultCache = function (cache, req, res, cb) {
-    cb();
-};
-
-module.exports.init = function (config, logger, stats) {
-    var options = {
-        key: getKey
-    };
-    Object.keys(config).forEach(function (productName) {
-        var product = config[productName];
-        if (!product.ttl) {
-            debug('could not load cache for ' + productName + ' because ttl is missing', product)
-            return; // skip non-cache config
-        }
-        var cacheInstance = cache.create(config[productName]);
-        caches[productName] = cacheInstance;
-        debug('created cache for', productName);
-        debug('caches are ', caches)
-    });
-
-    return {
-        onrequest: function (req, res, next) {
-            middleware(req, res, next);
-        }
-    };
-};
\ No newline at end of file
diff --git a/cache/package.json b/cache/package.json
deleted file mode 100644
index 7516753..0000000
--- a/cache/package.json
+++ /dev/null
@@ -1,19 +0,0 @@
-{
-  "name": "edgemicro-plugin-cache",
-  "version": "1.0.0",
-  "description": "caching plugin for the gateway",
-  "main": "index.js",
-  "scripts": {
-    "test": "mocha tests"
-  },
-  "author": "sfeldman@apigee.com",
-  "dependencies": {
-    "async": "^1.5.2",
-    "debug": "^2.2.0",
-    "volos-cache-memory": "^0.10.0"
-  },
-  "devDependencies": {
-    "mocha": "^2.4.5",
-    "should": "^8.2.1"
-  }
-}
diff --git a/cache/tests/testIndex.js b/cache/tests/testIndex.js
deleted file mode 100644
index a55c654..0000000
--- a/cache/tests/testIndex.js
+++ /dev/null
@@ -1,12 +0,0 @@
-var should = require('should');
-var assert = require('assert');
-var plugin = require('../index');
-describe('construct',function(){
-   it('should work',function(done){
-       var req = plugin.init();
-       req.onrequest(null,null,function(err){
-           should(err).be.null
-           done();
-       })
-   }) ;
-});
\ No newline at end of file
diff --git a/index.js b/index.js
index ca049b7..7e77135 100644
--- a/index.js
+++ b/index.js
@@ -4,11 +4,10 @@
   'accumulate-request':require('./accumulate-request'),
   'accumulate-response':require('./accumulate-response'),
   analytics:require('./analytics'),
-  cache:require('./cache'),
   'header-uppercase':require('./header-uppercase'),
   oauth:require('./oauth'),
   quota:require('./quota'),
   'quota-memory':require('./quota-memory'),
   spikearrest:require('./spikearrest'),
   'transform-uppercase':require('./transform-uppercase')
-}
\ No newline at end of file
+}
diff --git a/oauth/index.js b/oauth/index.js
index 1e4162b..75d4ed0 100644
--- a/oauth/index.js
+++ b/oauth/index.js
@@ -3,7 +3,7 @@
 var debug = require('debug')('plugin:oauth');
 var url = require('url');
 var jwt = require('jsonwebtoken');
-var request = require('request');
+var requestLib = require('request');
 var _ = require('lodash');
 
 const authHeaderRegex = /Bearer (.+)/;
@@ -15,6 +15,7 @@
 module.exports.init = function (config, logger, stats) {
 
   var apiKeyCache = {};
+  var request = config.request ? requestLib.defaults(config.request) : requestLib;
 
   var middleware = function (req, res, next) {
 
diff --git a/package.json b/package.json
index 09aa659..f0fe4b4 100644
--- a/package.json
+++ b/package.json
@@ -1,10 +1,10 @@
 {
   "name": "microgateway-plugins",
-  "version": "2.0.4",
+  "version": "2.3.1",
   "description": "Plugins for Apige Edge Microgateway",
   "main": "index.js",
   "scripts": {
-    "test": "bin/test"
+    "test": "./node_modules/.bin/mocha -R spec"
   },
   "dependencies": {
     "async": "^1.4.2",
diff --git a/quota-memory/index.js b/quota-memory/index.js
index 6d0579d..337bf6e 100644
--- a/quota-memory/index.js
+++ b/quota-memory/index.js
@@ -5,7 +5,6 @@
 var debug = require('debug')('gateway:quota');
 
 module.exports.init = function(config, logger, stats) {
-
   var quotas = {}; // productName -> connectMiddleware
 
   var options = {
@@ -14,7 +13,10 @@
 
   Object.keys(config).forEach(function(productName) {
     var product = config[productName];
-    if (!product.uri && !product.key && !product.secret && !product.allow && !product.interval) return; // skip non-quota config
+    if (!product.uri && !product.key && !product.secret && !product.allow && !product.interval) {
+      return; // skip non-quota config
+    }
+
     var quota = Quota.create(config[productName]);
     quotas[productName] = quota.connectMiddleware().apply(options);
     debug('created quota for', productName);
diff --git a/quota/index.js b/quota/index.js
index 0830ecf..7e377fb 100644
--- a/quota/index.js
+++ b/quota/index.js
@@ -9,12 +9,19 @@
   var quotas = {}; // productName -> connectMiddleware
 
   var options = {
-    key: function(req) { return req.token.application_name; }
+    key: function(req) { 
+           return req.token.application_name; 
+    }
   };
 
   Object.keys(config).forEach(function(productName) {
     var product = config[productName];
-    if (!product.uri && !product.key && !product.secret && !product.allow && !product.interval) return; // skip non-quota config
+    if (!product.uri && !product.key && !product.secret && !product.allow && !product.interval) {
+      // skip non-quota config
+      console.log('Not enough info for configuring quota');
+      return;
+    }     
+
     var quota = Quota.create(config[productName]);
     quotas[productName] = quota.connectMiddleware().apply(options);
     debug('created quota for', productName);
diff --git a/test/accumulate-request-test.js b/test/accumulate-request-test.js
new file mode 100644
index 0000000..1983c25
--- /dev/null
+++ b/test/accumulate-request-test.js
@@ -0,0 +1,107 @@
+const accumulateRequest = require('../accumulate-request/index');
+const assert = require('assert');
+
+describe('accumulate request plugin', () => {
+  var plugin = null;
+
+  beforeEach(() => {
+    var config = {};
+    var logger = {};
+    var stats = {};
+
+    plugin = accumulateRequest.init.apply(null, [config, logger, stats]);
+  });
+
+  it('exposes an ondata_request handler', () => {
+    assert.ok(plugin.ondata_request);
+  });
+
+  it('exposes an onend_request handler', () => {
+    assert.ok(plugin.onend_request);
+  });
+
+  it('calls back with two null function arguments in the ondata_request handler', (done) => {
+    var cb = (err, result) => {
+      assert.equal(err, null);
+      assert.equal(result, null);
+      done();
+    }
+
+
+    plugin.ondata_request.apply(null, [{}, {}, Buffer.alloc(5, 'a'), cb]);
+  });
+
+  it('will collect all buffers provided to ondata_request handler, concatenate them, and return them as a single buffer', (done) => {
+    var desiredResult = 'aaaaaaaaaaaaaaa';
+    
+    var ondata_cb = (err, result) => {
+      assert.equal(err, null);
+      assert.equal(result, null);
+      assert.ok(req._chunks);
+    }
+
+    var onend_cb = (err, result) => {
+      assert.equal(err, null);
+      assert.equal(result.toString(), desiredResult); 
+      done();
+    } 
+
+    var req = {};
+
+    plugin.ondata_request.apply(null, [req, {}, Buffer.alloc(5, 'a'), ondata_cb]);
+    plugin.ondata_request.apply(null, [req, {}, Buffer.alloc(5, 'a'), ondata_cb]);
+    plugin.ondata_request.apply(null, [req, {}, Buffer.alloc(5, 'a'), ondata_cb]);
+    
+    plugin.onend_request.apply(null, [req, {}, null, onend_cb]);  
+  });
+
+  it('will append data included in the end call to the buffer', (done) => {
+    var desiredResult = 'aaaaaaaaaaaaaaaaaaaa';
+    
+    var ondata_cb = (err, result) => {
+      assert.equal(err, null);
+      assert.equal(result, null);
+      assert.ok(req._chunks);
+    }
+
+    var onend_cb = (err, result) => {
+      assert.equal(err, null);
+      assert.equal(result.toString(), desiredResult); 
+      done();
+    } 
+
+    var req = {};
+
+    plugin.ondata_request.apply(null, [req, {}, Buffer.alloc(5, 'a'), ondata_cb]);
+    plugin.ondata_request.apply(null, [req, {}, Buffer.alloc(5, 'a'), ondata_cb]);
+    plugin.ondata_request.apply(null, [req, {}, Buffer.alloc(5, 'a'), ondata_cb]);
+    
+    plugin.onend_request.apply(null, [req, {}, Buffer.alloc(5, 'a'), onend_cb]);  
+  });
+
+  it('will create a req._chunks object on the request object', (done) => {
+    var req = {};
+    var cb = (err, result) => {
+      assert.equal(err, null);
+      assert.equal(result, null);
+      assert.ok(req._chunks);
+      assert.equal(req._chunks.toString(), 'aaaaa');
+      done();
+    }
+
+    plugin.ondata_request.apply(null, [req, {}, Buffer.alloc(5, 'a'), cb]);
+  });
+
+  it('will call the callback with null if no data events are provided.', (done) => {
+    var onend_cb = (err, result) => {
+      assert.equal(err, null);
+      assert.equal(result, null); 
+      done();
+    } 
+
+    var req = {};
+
+    plugin.onend_request.apply(null, [req, {}, null, onend_cb]);  
+
+  });
+})
diff --git a/test/accumulate-response-test.js b/test/accumulate-response-test.js
new file mode 100644
index 0000000..0a13840
--- /dev/null
+++ b/test/accumulate-response-test.js
@@ -0,0 +1,107 @@
+const accumulateResponse = require('../accumulate-response/index');
+const assert = require('assert');
+
+describe('accumulate response plugin', () => {
+  var plugin = null;
+
+  beforeEach(() => {
+    var config = {};
+    var logger = {};
+    var stats = {};
+
+    plugin = accumulateResponse.init.apply(null, [config, logger, stats]);
+  });
+
+  it('exposes an ondata_response handler', () => {
+    assert.ok(plugin.ondata_response);
+  });
+
+  it('exposes an onend_response handler', () => {
+    assert.ok(plugin.onend_response);
+  });
+
+  it('calls back with two null function arguments in the ondata_response handler', (done) => {
+    var cb = (err, result) => {
+      assert.equal(err, null);
+      assert.equal(result, null);
+      done();
+    }
+
+
+    plugin.ondata_response.apply(null, [{}, {}, Buffer.alloc(5, 'a'), cb]);
+  });
+
+  it('will collect all buffers provided to ondata_response handler, concatenate them, and return them as a single buffer', (done) => {
+    var desiredResult = 'aaaaaaaaaaaaaaa';
+    
+    var ondata_cb = (err, result) => {
+      assert.equal(err, null);
+      assert.equal(result, null);
+      assert.ok(res._chunks);
+    }
+
+    var onend_cb = (err, result) => {
+      assert.equal(err, null);
+      assert.equal(result.toString(), desiredResult); 
+      done();
+    } 
+
+    var res = {};
+
+    plugin.ondata_response.apply(null, [{}, res, Buffer.alloc(5, 'a'), ondata_cb]);
+    plugin.ondata_response.apply(null, [{}, res, Buffer.alloc(5, 'a'), ondata_cb]);
+    plugin.ondata_response.apply(null, [{}, res, Buffer.alloc(5, 'a'), ondata_cb]);
+    
+    plugin.onend_response.apply(null, [{}, res, null, onend_cb]);  
+  });
+
+  it('will append data included in the end call to the buffer', (done) => {
+    var desiredResult = 'aaaaaaaaaaaaaaaaaaaa';
+    
+    var ondata_cb = (err, result) => {
+      assert.equal(err, null);
+      assert.equal(result, null);
+      assert.ok(res._chunks);
+    }
+
+    var onend_cb = (err, result) => {
+      assert.equal(err, null);
+      assert.equal(result.toString(), desiredResult); 
+      done();
+    } 
+
+    var res = {};
+
+    plugin.ondata_response.apply(null, [{}, res, Buffer.alloc(5, 'a'), ondata_cb]);
+    plugin.ondata_response.apply(null, [{}, res, Buffer.alloc(5, 'a'), ondata_cb]);
+    plugin.ondata_response.apply(null, [{}, res, Buffer.alloc(5, 'a'), ondata_cb]);
+    
+    plugin.onend_response.apply(null, [{}, res, Buffer.alloc(5, 'a'), onend_cb]);  
+  });
+
+  it('will create a res._chunks object on the request object', (done) => {
+    var res = {};
+    var cb = (err, result) => {
+      assert.equal(err, null);
+      assert.equal(result, null);
+      assert.ok(res._chunks);
+      assert.equal(res._chunks.toString(), 'aaaaa');
+      done();
+    }
+
+    plugin.ondata_response.apply(null, [{}, res, Buffer.alloc(5, 'a'), cb]);
+  });
+
+  it('will callback with null if no response body is present in targetResponse', (done) => {
+    var res = {};
+    var cb = (err, result) => {
+      assert.equal(err, null);
+      assert.equal(result, null);
+      done();
+    }
+
+    plugin.onend_response.apply(null, [{}, res, null, cb]);
+
+  });
+
+})
diff --git a/test/quota-test.js b/test/quota-test.js
new file mode 100644
index 0000000..e8a2a31
--- /dev/null
+++ b/test/quota-test.js
@@ -0,0 +1,93 @@
+const quota = require('../quota/index');
+const assert = require('assert');
+
+var exampleConfig = { 
+  EdgeMicroTestProduct: {
+    allow: process.env.QUOTA_ALLOW,
+    interval: Number(process.env.QUOTA_INTERVAL),
+    timeUnit: process.env.QUOTA_TIMEUNIT,
+    bufferSize: process.env.QUOTA_BUFFERSIZE,
+    uri: process.env.QUOTA_URI,
+    key: process.env.QUOTA_KEY,
+    secret: process.env.QUOTA_SECRET 
+  }
+}
+
+describe('quota plugin', () => {
+  var plugin = null;
+  
+  beforeEach(() => {
+    var logger = {};
+    var stats = {};
+
+    plugin = quota.init.apply(null, [exampleConfig, logger, stats]);
+
+  });
+ 
+  it('exposes an onrequest handler', () => {
+    assert.ok(plugin.onrequest);
+  });
+
+  it('will quota limit after 3 API calls', (done) => {
+    var count = 0;
+    var onrequest_cb = (err) => {
+      count++;
+      if(count == 4) {
+        assert.equal(count, 4);
+        assert.equal(err.message, 'exceeded quota');
+        done();
+      } 
+    };
+
+    var req = {
+      token: {
+        application_name: '0e7762f4-ea67-4cc1-ae4a-21598c35b18f',
+        api_product_list: ['EdgeMicroTestProduct']       
+      }
+    }
+
+    var res = {
+      headers: {},
+      setHeader: (key, val) => {
+        res.headers[key] = val;
+      }
+    }
+
+    plugin.onrequest.apply(null, [req, res, onrequest_cb]);
+    plugin.onrequest.apply(null, [req, res, onrequest_cb]);
+    plugin.onrequest.apply(null, [req, res, onrequest_cb]);
+    plugin.onrequest.apply(null, [req, res, onrequest_cb]);
+  });
+
+  it('will not quota limit before 3 API calls', (done) => {
+    var count = 0;
+    var onrequest_cb = (err) => {
+      count++;
+      if(count == 3) {
+        assert.equal(count, 3);
+        assert.ok(!(err instanceof Error));
+        done();
+      } 
+    };
+
+    var req = {
+      token: {
+        application_name: '0e7762f4-ea67-4cc1-ae4a-21598c35b18f',
+        api_product_list: ['EdgeMicroTestProduct']       
+      }
+    }
+
+    var res = {
+      headers: {},
+      setHeader: (key, val) => {
+        res.headers[key] = val;
+      }
+    }
+
+    plugin.onrequest.apply(null, [req, res, onrequest_cb]);
+    plugin.onrequest.apply(null, [req, res, onrequest_cb]);
+    plugin.onrequest.apply(null, [req, res, onrequest_cb]);
+  });
+});
+
+
diff --git a/test/spike-arrest-test.js b/test/spike-arrest-test.js
new file mode 100644
index 0000000..409eb77
--- /dev/null
+++ b/test/spike-arrest-test.js
@@ -0,0 +1,48 @@
+const spikeArrest = require('../spikearrest/index');
+const assert = require('assert');
+
+describe('spike arrest plugin', () => {
+  var plugin = null;
+
+  beforeEach(() => {
+    var config = {
+      timeUnit: 'minute',
+      bufferSize: 0,
+      allow: 1
+    };
+    var logger = {};
+    var stats = {};
+
+    plugin = spikeArrest.init.apply(null, [config, logger, stats]);
+  });
+
+  it('exposes an onrequest handler', () => {
+    assert.ok(plugin.onrequest);
+  });
+
+  it('will accept a request', (done) => {
+    var onrequest_cb = () => {
+      done();
+    };
+
+    var req = {};
+    var res = {};
+    plugin.onrequest.apply(null, [req, res, onrequest_cb]);
+  });
+
+  it('will reject a requests that come in too fast', (done) => {
+    var onrequest_cb = () => {
+    };
+    
+    var onrequest_cb_second = (req, res, next) => {
+      assert.ok(req instanceof Error);
+      assert.equal(req.message, 'SpikeArrest engaged');
+      done();
+    };
+
+    var req = {};
+    var res = {};
+    plugin.onrequest.apply(null, [req, res, onrequest_cb]);
+    plugin.onrequest.apply(null, [req, res, onrequest_cb_second]);
+  });
+});
