(#3921) - avoid extend() in merge.js
diff --git a/lib/merge.js b/lib/merge.js
index ed4f39c..20f225e 100644
--- a/lib/merge.js
+++ b/lib/merge.js
@@ -1,6 +1,4 @@
 'use strict';
-var extend = require('pouchdb-extend');
-
 
 // for a better overview of what this is doing, read:
 // https://github.com/apache/couchdb/blob/master/src/couchdb/couch_key_tree.erl
@@ -211,9 +209,6 @@
 var PouchMerge = {};
 
 PouchMerge.merge = function (tree, path, depth) {
-  // Ugh, nicer way to not modify arguments in place?
-  tree = extend(true, [], tree);
-  path = extend(true, {}, path);
   var newTree = doMerge(tree, path);
   return {
     tree: stem(newTree.tree, depth),
diff --git a/tests/performance/perf.basics.js b/tests/performance/perf.basics.js
index 9792930..9019b05 100644
--- a/tests/performance/perf.basics.js
+++ b/tests/performance/perf.basics.js
@@ -36,6 +36,26 @@
         db.bulkDocs(docs, done);
       }
     }, {
+      name: 'basic-updates',
+      assertions: 1,
+      iterations: 100,
+      setup: function (db, callback) {
+        var docs = [];
+        for (var i = 0; i < 100; i++) {
+          docs.push({});
+        }
+        db.bulkDocs(docs, callback);
+      },
+      test: function (db, itr, _, done) {
+        db.allDocs({include_docs: true}, function (err, res) {
+          if (err) {
+            return done(err);
+          }
+          var docs = res.rows.map(function (x) { return x.doc; });
+          db.bulkDocs(docs, done);
+        });
+      }
+    }, {
       name: 'basic-gets',
       assertions: 1,
       iterations: 10000,
diff --git a/tests/unit/test.merge.js b/tests/unit/test.merge.js
index e42b1bd..0229663 100644
--- a/tests/unit/test.merge.js
+++ b/tests/unit/test.merge.js
@@ -10,45 +10,68 @@
 
 describe('test.merge.js', function () {
 
-  var simple = {pos: 1, ids: ['1', {}, []]};
-  var two0 = {pos: 1, ids: ['1', {}, [['2_0', {}, []]]]};
-  var two1 = {pos: 1, ids: ['1', {}, [['2_1', {}, []]]]};
-  var newleaf = {pos: 2, ids: ['2_0', {}, [['3', {}, []]]]};
-  var withnewleaf = {pos: 1, ids: ['1', {}, [['2_0', {}, [['3', {}, []]]]]]};
-  var newbranch = {pos: 1, ids: ['1', {}, [['2_0', {}, []], ['2_1', {}, []]]]};
-  var newdeepbranch = {pos: 2, ids: ['2_0', {}, [['3_1', {}, []]]]};
+  var simple;
+  var two0;
+  var two1;
+  var newleaf;
+  var withnewleaf;
+  var newbranch;
+  var newdeepbranch;
+  var stemmededit;
+  var stemmedconflicts;
+  var newbranchleaf;
+  var newbranchleafbranch;
+  var stemmed2;
+  var stemmed3;
+  var partialrecover;
 
-  var stemmededit = {pos: 3, ids: ['3', {}, []]};
-  var stemmedconflicts = [simple, stemmededit];
+  /*
+   * Our merge() function actually mutates the input object, because it's
+   * more performant than deep cloning the object every time it's passed
+   * into merge(). So in order for these tests to pass, we need to redefine
+   * these objects every time.
+   */
+  beforeEach(function () {
+    simple = {pos: 1, ids: ['1', {}, []]};
+    two0 = {pos: 1, ids: ['1', {}, [['2_0', {}, []]]]};
+    two1 = {pos: 1, ids: ['1', {}, [['2_1', {}, []]]]};
+    newleaf = {pos: 2, ids: ['2_0', {}, [['3', {}, []]]]};
+    withnewleaf = {pos: 1, ids: ['1', {}, [['2_0', {}, [['3', {}, []]]]]]};
+    newbranch = {pos: 1, ids: ['1', {}, [['2_0', {}, []], ['2_1', {}, []]]]};
+    newdeepbranch = {pos: 2, ids: ['2_0', {}, [['3_1', {}, []]]]};
 
-  var newbranchleaf = {
-    pos: 1,
-    ids: ['1', {}, [['2_0', {}, [['3', {}, []]]], ['2_1', {}, []]]]
-  };
+    stemmededit = {pos: 3, ids: ['3', {}, []]};
+    stemmedconflicts = [simple, stemmededit];
 
-  var newbranchleafbranch = {
-    pos: 1,
-    ids: ['1', {}, [
-      ['2_0', {}, [['3', {}, []], ['3_1', {}, []]]], ['2_1', {}, []]
-    ]]
-  };
+    newbranchleaf = {
+      pos: 1,
+      ids: ['1', {}, [['2_0', {}, [['3', {}, []]]], ['2_1', {}, []]]]
+    };
 
-  var stemmed2 = [
-    {pos: 1, ids: ['1', {}, [['2_1', {}, []]]]},
-    {pos: 2, ids: ['2_0', {}, [['3', {}, []], ['3_1', {}, []]]]}
-  ];
+    newbranchleafbranch = {
+      pos: 1,
+      ids: ['1', {}, [
+        ['2_0', {}, [['3', {}, []], ['3_1', {}, []]]], ['2_1', {}, []]
+      ]]
+    };
 
-  var stemmed3 = [
-    {pos: 2, ids: ['2_1', {}, []]},
-    {pos: 3, ids: ['3', {}, []]},
-    {pos: 3, ids: ['3_1', {}, []]}
-  ];
+    stemmed2 = [
+      {pos: 1, ids: ['1', {}, [['2_1', {}, []]]]},
+      {pos: 2, ids: ['2_0', {}, [['3', {}, []], ['3_1', {}, []]]]}
+    ];
 
-  var partialrecover = [
-    {pos: 1, ids: ['1', {}, [['2_0', {}, [['3', {}, []]]]]]},
-    {pos: 2, ids: ['2_1', {}, []]},
-    {pos: 3, ids: ['3_1', {}, []]}
-  ];
+    stemmed3 = [
+      {pos: 2, ids: ['2_1', {}, []]},
+      {pos: 3, ids: ['3', {}, []]},
+      {pos: 3, ids: ['3_1', {}, []]}
+    ];
+
+    partialrecover = [
+      {pos: 1, ids: ['1', {}, [['2_0', {}, [['3', {}, []]]]]]},
+      {pos: 2, ids: ['2_1', {}, []]},
+      {pos: 3, ids: ['3_1', {}, []]}
+    ];
+  });
 
   it('Merging a path into an empty tree is the path', function () {
     merge([], simple, 10).should.deep.equal({