diff --git a/bin/dev-server.js b/bin/dev-server.js
index b6cbc07..444bc55 100755
--- a/bin/dev-server.js
+++ b/bin/dev-server.js
@@ -24,7 +24,12 @@
 if (process.env.COUCH_HOST) {
   queryParams.couchHost = process.env.COUCH_HOST;
 }
-
+if (process.env.ADAPTER) {
+  queryParams.adapter = process.env.ADAPTER;
+}
+if (process.env.ITERATIONS) {
+  queryParams.iterations = process.env.ITERATIONS;
+}
 if (process.env.NEXT) {
   queryParams.src = '../../packages/node_modules/pouchdb/dist/pouchdb-next.js';
 }
@@ -35,6 +40,7 @@
   rebuildPromise = rebuildPromise.then(buildPouchDB).then(function () {
     console.log('Rebuilt packages/node_modules/pouchdb');
   }).catch(console.error);
+  return rebuildPromise;
 }
 
 function browserifyPromise(src, dest) {
@@ -52,6 +58,7 @@
   }).then(function () {
     console.log('Rebuilt tests/integration/utils-bundle.js');
   }).catch(console.error);
+  return rebuildPromise;
 }
 
 function rebuildPerf() {
@@ -61,6 +68,7 @@
   }).then(function () {
     console.log('Rebuilt tests/performance-bundle.js');
   }).catch(console.error);
+  return rebuildPromise;
 }
 
 function watchAll() {
@@ -84,6 +92,7 @@
     rebuildPerf()
   ]);
 }).then(function () {
+  console.log('Rebuilt PouchDB/test/perf JS bundles');
   filesWritten = true;
   checkReady();
 });
diff --git a/bin/test-browser.js b/bin/test-browser.js
index c22a2e7..db093e0 100755
--- a/bin/test-browser.js
+++ b/bin/test-browser.js
@@ -77,6 +77,12 @@
 if (process.env.COUCH_HOST) {
   qs.couchHost = process.env.COUCH_HOST;
 }
+if (process.env.ADAPTER) {
+  qs.adapter = process.env.ADAPTER;
+}
+if (process.env.ITERATIONS) {
+  qs.iterations = process.env.ITERATIONS;
+}
 if (process.env.NEXT) {
   qs.NEXT = '1';
 }
@@ -125,7 +131,7 @@
 }
 
 function testComplete(result) {
-  console.log(result);
+  console.log('=>', JSON.stringify(result, null, '  '), '<=');
 
   sauceClient.quit().then(function () {
     if (sauceConnectProcess) {
@@ -204,7 +210,7 @@
           clearInterval(interval);
           testComplete(results);
         } else {
-          console.log('=> ', results);
+          console.log(results);
         }
       });
     }, 10 * 1000);
diff --git a/tests/performance/index.js b/tests/performance/index.js
index 13a1447..e19330d 100644
--- a/tests/performance/index.js
+++ b/tests/performance/index.js
@@ -3,9 +3,7 @@
 
 var opts = {};
 
-var levelAdapter;
 if (typeof process !== 'undefined' && process.env) {
-  levelAdapter = process.env.LEVEL_ADAPTER;
   if (process.env.ADAPTER) {
     opts.adapter = process.env.ADAPTER;
   }
@@ -16,13 +14,22 @@
   function runTestsNow() {
     var reporter = require('./perf.reporter');
     reporter.log('Testing PouchDB version ' + PouchDB.version +
-      ((opts.adapter || levelAdapter) ?
-        (', using adapter: ' + (opts.adapter || levelAdapter)) : '') +
+      (opts.adapter ?
+        (', using adapter: ' + opts.adapter) : '') +
       '\n\n');
 
-    require('./perf.basics')(PouchDB, opts);
-    require('./perf.views')(PouchDB, opts);
-    require('./perf.attachments')(PouchDB, opts);
+    var theAdapterUsed;
+    var count = 0;
+    function checkDone(adapterUsed) {
+      theAdapterUsed = theAdapterUsed || adapterUsed;
+      if (++count === 3) { // number of perf.xxxx.js tests
+        reporter.complete(theAdapterUsed);
+      }
+    }
+
+    require('./perf.basics')(PouchDB, opts, checkDone);
+    require('./perf.views')(PouchDB, opts, checkDone);
+    require('./perf.attachments')(PouchDB, opts, checkDone);
   }
 
   if (typeof process === 'undefined' || process.browser) {
@@ -69,6 +76,8 @@
     // fails in Node 0.11-0.12 due to sqlite3 being incompatible
     PouchDB.plugin(require('../../packages/node_modules/' +
       'pouchdb-adapter-node-websql'));
+    PouchDB.plugin(require('../../packages/node_modules/' +
+      'pouchdb-adapter-memory'));
   }
   runTestSuites(PouchDB);
 }
diff --git a/tests/performance/perf.attachments.js b/tests/performance/perf.attachments.js
index b00c229..307c607 100644
--- a/tests/performance/perf.attachments.js
+++ b/tests/performance/perf.attachments.js
@@ -28,7 +28,7 @@
   }
 }
 
-module.exports = function (PouchDB, opts) {
+module.exports = function (PouchDB, opts, callback) {
 
   require('lie');
   var utils = require('./utils');
@@ -53,6 +53,6 @@
     }
   ];
 
-  utils.runTests(PouchDB, 'views', testCases, opts);
+  utils.runTests(PouchDB, 'views', testCases, opts, callback);
 
 };
diff --git a/tests/performance/perf.basics.js b/tests/performance/perf.basics.js
index a4632c1..46bc2d6 100644
--- a/tests/performance/perf.basics.js
+++ b/tests/performance/perf.basics.js
@@ -1,6 +1,6 @@
 'use strict';
 
-module.exports = function (PouchDB, opts) {
+module.exports = function (PouchDB, opts, callback) {
 
   var Promise = require('lie');
   var utils = require('./utils');
@@ -61,10 +61,10 @@
     {
       name: 'basic-gets',
       assertions: 1,
-      iterations: 10000,
+      iterations: 1000,
       setup: function (db, callback) {
         var docs = [];
-        for (var i = 0; i < 10000; i++) {
+        for (var i = 0; i < 1000; i++) {
           docs.push({_id : commonUtils.createDocId(i),
             foo : 'bar', baz : 'quux'});
         }
@@ -223,5 +223,5 @@
     }
   ];
 
-  utils.runTests(PouchDB, 'basics', testCases, opts);
+  utils.runTests(PouchDB, 'basics', testCases, opts, callback);
 };
diff --git a/tests/performance/perf.reporter.js b/tests/performance/perf.reporter.js
index ae629a3..0c70dc8 100644
--- a/tests/performance/perf.reporter.js
+++ b/tests/performance/perf.reporter.js
@@ -4,7 +4,9 @@
 var ua = !isNode && new UAParser(navigator.userAgent);
 var marky = require('marky');
 var median = require('median');
-global.results = {};
+global.results = {
+  tests: {}
+};
 
 // fix for Firefox max timing entries capped to 150:
 // https://bugzilla.mozilla.org/show_bug.cgi?id=1331135
@@ -33,15 +35,17 @@
   var key = testCase.name;
   log('Starting test: ' + key + ' with ' + testCase.assertions +
     ' assertions and ' + iter + ' iterations... ');
-  global.results[key] = {
+  global.results.tests[key] = {
     iterations: []
   };
 };
 
 exports.end = function (testCase) {
   var key = testCase.name;
-  var obj = global.results[key];
+  var obj = global.results.tests[key];
   obj.median = median(obj.iterations);
+  obj.numIterations = obj.iterations.length;
+  delete obj.iterations; // keep it simple when reporting
   log('median: ' + obj.median + ' ms\n');
 };
 
@@ -51,13 +55,15 @@
 
 exports.endIteration = function (testCase) {
   var entry = marky.stop(testCase.name);
-  global.results[testCase.name].iterations.push(entry.duration);
+  global.results.tests[testCase.name].iterations.push(entry.duration);
 };
 
-exports.complete = function () {
+exports.complete = function (adapter) {
   global.results.completed = true;
   if (isNode) {
-    global.results.client = {node: process.version};
+    global.results.client = {
+      node: process.version
+    };
   } else {
     global.results.client = {
       browser: ua.getBrowser(),
@@ -68,7 +74,8 @@
       userAgent: navigator.userAgent
     };
   }
-  console.log(global.results);
+  global.results.adapter = adapter;
+  console.log('=>', JSON.stringify(global.results, null, '  '), '<=');
   log('\nTests Complete!\n\n');
 };
 
diff --git a/tests/performance/perf.views.js b/tests/performance/perf.views.js
index 206a710..82c9251 100644
--- a/tests/performance/perf.views.js
+++ b/tests/performance/perf.views.js
@@ -1,6 +1,6 @@
 'use strict';
 
-module.exports = function (PouchDB, opts) {
+module.exports = function (PouchDB, opts, callback) {
 
   var Promise = require('lie');
   var utils = require('./utils');
@@ -173,6 +173,6 @@
     }
   ];
 
-  utils.runTests(PouchDB, 'views', testCases, opts);
+  utils.runTests(PouchDB, 'views', testCases, opts, callback);
 
 };
diff --git a/tests/performance/utils.js b/tests/performance/utils.js
index 481777c..d6665d5 100644
--- a/tests/performance/utils.js
+++ b/tests/performance/utils.js
@@ -19,24 +19,28 @@
   iterations = process.env.ITERATIONS && parseInt(process.env.ITERATIONS, 10);
 }
 
-var levelAdapter = typeof process !== 'undefined' && process.env &&
-    process.env.LEVEL_ADAPTER;
+var adapterUsed;
 
-exports.runTests = function (PouchDB, suiteName, testCases, opts) {
-  testCases.forEach(function (testCase, i) {
-    var testName = testCase.name;
+exports.runTests = function (PouchDB, suiteName, testCases, opts, callback) {
+
+  testCases = testCases.filter(function (testCase) {
     if (grep && suiteName.indexOf(grep) === -1 &&
-        testName.indexOf(grep) === -1) {
-      return;
+      testCase.name.indexOf(grep) === -1) {
+      return false;
     }
-
     var iter = typeof iterations === 'number' ? iterations :
       testCase.iterations;
+    return iter !== 0;
+  });
 
-    if (iter === 0) {
-      return;
-    }
+  if (!testCases.length) {
+    return callback();
+  }
 
+  testCases.forEach(function (testCase, i) {
+    var testName = testCase.name;
+    var iter = typeof iterations === 'number' ? iterations :
+      testCase.iterations;
     test('benchmarking', function (t) {
       var db;
       var setupObj;
@@ -45,10 +49,8 @@
 
       t.test('setup', function (t) {
         opts.size = 3000;
-        if (levelAdapter) {
-          opts.db = require(levelAdapter);
-        }
         db = new PouchDB(localDbName, opts);
+        adapterUsed = db.adapter;
         testCase.setup(db, function (err, res) {
           if (err) {
             t.error(err);
@@ -95,14 +97,11 @@
         testCaseTeardown.then(function () {
           reporter.end(testCase);
           var opts = {adapter : db.adapter};
-          if (levelAdapter) {
-            opts.db = require(levelAdapter);
-          }
           return new PouchDB(localDbName, opts).destroy();
         }).then(function () {
           t.end();
           if (i === testCases.length - 1) {
-            reporter.complete(suiteName);
+            callback(adapterUsed);
           }
         });
       });
