You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@couchdb.apache.org by wo...@apache.org on 2020/10/07 22:01:39 UTC

[couchdb] branch 3.x-remove-js-harness created (now fc617f2)

This is an automated email from the ASF dual-hosted git repository.

wohali pushed a change to branch 3.x-remove-js-harness
in repository https://gitbox.apache.org/repos/asf/couchdb.git.


      at fc617f2  Remove JS tests + support for harness (#3197)

This branch includes the following new commits:

     new fc617f2  Remove JS tests + support for harness (#3197)

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



[couchdb] 01/01: Remove JS tests + support for harness (#3197)

Posted by wo...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

wohali pushed a commit to branch 3.x-remove-js-harness
in repository https://gitbox.apache.org/repos/asf/couchdb.git

commit fc617f204aa8ab6ebf8836e426be12552e20c5c4
Author: Joan Touzet <wo...@users.noreply.github.com>
AuthorDate: Wed Oct 7 17:29:15 2020 +0000

    Remove JS tests + support for harness (#3197)
---
 INSTALL.Unix.md                                    |  27 +-
 INSTALL.Windows.md                                 |   4 +-
 Makefile                                           |  53 +-
 Makefile.win                                       |  29 +-
 build-aux/Jenkinsfile.full                         |   8 +-
 build-aux/Jenkinsfile.pr                           |   4 +-
 configure                                          |  12 +-
 configure.ps1                                      |   4 -
 src/couch/priv/couch_js/1.8.5/help.h               |   7 -
 src/couch/priv/couch_js/1.8.5/http.c               | 701 ------------------
 src/couch/priv/couch_js/1.8.5/http.h               |  27 -
 src/couch/priv/couch_js/1.8.5/main.c               | 182 -----
 src/couch/priv/couch_js/1.8.5/util.c               |   2 -
 src/couch/priv/couch_js/1.8.5/util.h               |   2 -
 src/couch/priv/couch_js/60/help.h                  |   7 -
 src/couch/priv/couch_js/60/http.cpp                | 649 ----------------
 src/couch/priv/couch_js/60/http.h                  |  27 -
 src/couch/priv/couch_js/60/main.cpp                | 193 -----
 src/couch/priv/couch_js/60/util.cpp                |  10 -
 src/couch/priv/couch_js/60/util.h                  |   4 -
 src/couch/priv/couch_js/68/help.h                  |   7 -
 src/couch/priv/couch_js/68/http.cpp                | 650 -----------------
 src/couch/priv/couch_js/68/http.h                  |  27 -
 src/couch/priv/couch_js/68/main.cpp                | 198 -----
 src/couch/priv/couch_js/68/util.cpp                |  10 -
 src/couch/rebar.config.script                      |  31 +-
 test/javascript/cli_runner.js                      |  63 --
 test/javascript/couch.js                           | 557 --------------
 test/javascript/couch_http.js                      |  73 --
 test/javascript/couch_test_runner.js               | 489 -------------
 test/javascript/couchdb.uri                        |   1 -
 test/javascript/json2.js                           | 482 ------------
 test/javascript/replicator_db_inc.js               |  97 ---
 test/javascript/run                                | 284 -------
 test/javascript/sha1.js                            | 202 -----
 test/javascript/test_setup.js                      | 127 ----
 .../tests-cluster/with-quorum/attachments.js       |  37 -
 .../with-quorum/attachments_delete.js              |  33 -
 .../attachments_delete_overridden_quorum.js        |  38 -
 .../with-quorum/attachments_overridden_quorum.js   |  42 --
 .../tests-cluster/with-quorum/db_creation.js       |  28 -
 .../with-quorum/db_creation_overridden_quorum.js   |  30 -
 .../tests-cluster/with-quorum/db_deletion.js       |  31 -
 .../with-quorum/db_deletion_overridden_quorum.js   |  24 -
 .../tests-cluster/with-quorum/doc_bulk.js          |  26 -
 .../with-quorum/doc_bulk_overridden_quorum.js      |  26 -
 .../tests-cluster/with-quorum/doc_copy.js          |  28 -
 .../with-quorum/doc_copy_overridden_quorum.js      |  32 -
 .../tests-cluster/with-quorum/doc_crud.js          |  32 -
 .../with-quorum/doc_crud_overridden_quorum.js      |  32 -
 .../tests-cluster/without-quorum/attachments.js    |  40 -
 .../without-quorum/attachments_delete.js           |  39 -
 .../attachments_delete_overridden_quorum.js        |  38 -
 .../attachments_overridden_quorum.js               |  43 --
 .../tests-cluster/without-quorum/db_creation.js    |  28 -
 .../db_creation_overridden_quorum.js               |  32 -
 .../tests-cluster/without-quorum/db_deletion.js    |  31 -
 .../db_deletion_overridden_quorum.js               |  26 -
 .../tests-cluster/without-quorum/doc_bulk.js       |  29 -
 .../without-quorum/doc_bulk_overridden_quorum.js   |  29 -
 .../tests-cluster/without-quorum/doc_copy.js       |  31 -
 .../without-quorum/doc_copy_overridden_quorum.js   |  35 -
 .../tests-cluster/without-quorum/doc_crud.js       |  36 -
 .../without-quorum/doc_crud_overridden_quorum.js   |  35 -
 test/javascript/tests/all_docs.js                  | 167 -----
 test/javascript/tests/attachment_names.js          |  99 ---
 test/javascript/tests/attachment_paths.js          | 156 ----
 test/javascript/tests/attachment_ranges.js         | 164 -----
 test/javascript/tests/attachment_views.js          | 145 ----
 test/javascript/tests/attachments.js               | 358 ---------
 test/javascript/tests/attachments_multipart.js     | 426 -----------
 test/javascript/tests/auth_cache.js                | 274 -------
 test/javascript/tests/basics.js                    | 302 --------
 test/javascript/tests/batch_save.js                |  52 --
 test/javascript/tests/bulk_docs.js                 | 153 ----
 test/javascript/tests/changes.js                   | 812 ---------------------
 test/javascript/tests/coffee.js                    |  72 --
 test/javascript/tests/compact.js                   |  71 --
 test/javascript/tests/config.js                    | 222 ------
 test/javascript/tests/conflicts.js                 | 123 ----
 test/javascript/tests/cookie_auth.js               | 303 --------
 test/javascript/tests/copy_doc.js                  |  70 --
 test/javascript/tests/design_docs.js               | 447 ------------
 test/javascript/tests/design_docs_query.js         | 156 ----
 test/javascript/tests/design_options.js            |  78 --
 test/javascript/tests/design_paths.js              |  74 --
 test/javascript/tests/erlang_views.js              | 137 ----
 test/javascript/tests/etags_head.js                |  87 ---
 test/javascript/tests/etags_views.js               | 224 ------
 test/javascript/tests/form_submit.js               |  31 -
 test/javascript/tests/http.js                      |  82 ---
 test/javascript/tests/invalid_docids.js            |  82 ---
 test/javascript/tests/jsonp.js                     |  87 ---
 test/javascript/tests/large_docs.js                |  38 -
 test/javascript/tests/lorem.txt                    | 103 ---
 test/javascript/tests/lorem_b64.txt                |   1 -
 test/javascript/tests/lots_of_docs.js              |  60 --
 test/javascript/tests/method_override.js           |  45 --
 test/javascript/tests/multiple_rows.js             |  85 ---
 test/javascript/tests/purge.js                     | 140 ----
 test/javascript/tests/reader_acl.js                | 222 ------
 test/javascript/tests/recreate_doc.js              | 157 ----
 test/javascript/tests/reduce.js                    | 423 -----------
 test/javascript/tests/reduce_builtin.js            | 206 ------
 test/javascript/tests/reduce_false.js              |  50 --
 test/javascript/tests/reduce_false_temp.js         |  41 --
 .../tests/replicator_db_compact_rep_db.js          | 119 ---
 test/javascript/tests/replicator_db_continuous.js  | 137 ----
 .../tests/replicator_db_credential_delegation.js   | 149 ----
 .../tests/replicator_db_field_validation.js        | 178 -----
 test/javascript/tests/replicator_db_filtered.js    | 105 ---
 test/javascript/tests/replicator_db_identical.js   |  87 ---
 .../tests/replicator_db_identical_continuous.js    | 139 ----
 .../tests/replicator_db_invalid_filter.js          | 119 ---
 test/javascript/tests/replicator_db_security.js    | 371 ----------
 test/javascript/tests/replicator_db_simple.js      | 114 ---
 test/javascript/tests/replicator_db_successive.js  | 127 ----
 test/javascript/tests/replicator_db_survives.js    | 126 ----
 test/javascript/tests/replicator_db_swap_rep_db.js | 170 -----
 .../tests/replicator_db_update_security.js         |  92 ---
 test/javascript/tests/replicator_db_user_ctx.js    | 272 -------
 test/javascript/tests/replicator_db_write_auth.js  | 102 ---
 test/javascript/tests/rev_stemming.js              | 124 ----
 test/javascript/tests/stats.js                     | 358 ---------
 test/javascript/tests/update_documents.js          | 236 ------
 test/javascript/tests/users_db.js                  | 222 ------
 test/javascript/tests/utf8.js                      |  46 --
 test/javascript/tests/uuids.js                     | 148 ----
 test/javascript/tests/view_collation.js            | 121 ---
 test/javascript/tests/view_collation_raw.js        | 134 ----
 test/javascript/tests/view_compaction.js           | 112 ---
 test/javascript/tests/view_conflicts.js            |  57 --
 test/javascript/tests/view_errors.js               | 211 ------
 test/javascript/tests/view_include_docs.js         | 196 -----
 test/javascript/tests/view_multi_key_all_docs.js   |  99 ---
 test/javascript/tests/view_multi_key_design.js     | 235 ------
 test/javascript/tests/view_multi_key_temp.js       |  44 --
 test/javascript/tests/view_offsets.js              | 118 ---
 test/javascript/tests/view_pagination.js           | 151 ----
 test/javascript/tests/view_sandboxing.js           | 169 -----
 test/javascript/tests/view_update_seq.js           | 119 ---
 141 files changed, 30 insertions(+), 18463 deletions(-)

diff --git a/INSTALL.Unix.md b/INSTALL.Unix.md
index cb45e9a..0c82628 100644
--- a/INSTALL.Unix.md
+++ b/INSTALL.Unix.md
@@ -45,8 +45,6 @@ You should have the following installed:
    * https://archive.mozilla.org/pub/firefox/releases/60.9.0esr/source/ (src/js)
  * GNU Make                     (http://www.gnu.org/software/make/)
  * GNU Compiler Collection      (http://gcc.gnu.org/)
- * libcurl                      (http://curl.haxx.se/libcurl/)
- * help2man                     (http://www.gnu.org/s/help2man/)
  * Python (>=2.7)               (http://python.org/)
 
 To build Fauxton, you should have the following installed:
@@ -56,12 +54,10 @@ To build Fauxton, you should have the following installed:
 To build the documentation, you should have the following installed:
  * Python Sphinx (>=1.5)        (http://pypi.python.org/pypi/Sphinx)
 
-It is recommended that you install Erlang OTP R16B03-1 or above where
-possible.  You will only need libcurl if you plan to run the
-JavaScript test suite. And help2man is only need if you plan on
-installing the CouchDB man pages.  Python and Sphinx are only required
-for building the online documentation. Documentation build can be disabled
-by adding the `--disable-docs` flag to the `configure` script.
+It is recommended that you install Erlang OTP R16B03-1 or above where possible.
+Python and Sphinx are only required for building the online documentation.
+Documentation build can be disabled by adding the `--disable-docs` flag to the
+`configure` script.
 
 ### Debian-based Systems
 
@@ -69,7 +65,9 @@ You can install the dependencies by running:
 
     sudo apt-get --no-install-recommends -y install \
         build-essential pkg-config erlang erlang-reltool \
-        libicu-dev libmozjs185-dev libcurl4-openssl-dev
+        libicu-dev libmozjs-60-dev
+
+Your distribution may have libmozjs-68-dev instead of 60. Both are supported.
 
 You can install the Node.JS dependencies via [NodeSource](https://github.com/nodesource/distributions#installation-instructions).
 
@@ -89,9 +87,8 @@ packages.
 You can install the dependencies by running:
 
     sudo yum install autoconf autoconf-archive automake \
-        curl-devel erlang-asn1 erlang-erts erlang-eunit \
-        erlang-xmerl help2man \
-        js-devel-1.8.5 libicu-devel libtool perl-Test-Harness
+        erlang-asn1 erlang-erts erlang-eunit erlang-xmerl \
+        libmozjs-60-dev libicu-devel libtool perl-Test-Harness
 
 You can install the Node.JS dependencies via [NodeSource](https://github.com/nodesource/distributions#rpminstall).
 
@@ -111,7 +108,7 @@ the Command Line Tools:
 You can then install the other dependencies by running:
 
     brew install autoconf autoconf-archive automake libtool \
-        erlang icu4c spidermonkey curl pkg-config
+        erlang icu4c spidermonkey pkg-config
 
 You can install the Node.JS dependencies via the
 [official Macintosh installer](https://nodejs.org/en/download/).
@@ -143,8 +140,8 @@ You can install this by running:
 
 You can install the remaining dependencies by running:
 
-    pkg install help2man openssl icu curl git bash \
-        autoconf automake libtool node spidermonkey185 \
+    pkg install openssl icu git bash \
+        autoconf automake libtool node spidermonkey60 \
         erlang node8 npm-node8 lang/python py27-sphinx py27-pip
     pip install --upgrade sphinx_rtd_theme nose requests hypothesis
 
diff --git a/INSTALL.Windows.md b/INSTALL.Windows.md
index 9ba84b7..6cf148c 100644
--- a/INSTALL.Windows.md
+++ b/INSTALL.Windows.md
@@ -13,9 +13,9 @@ Build & Test
 Once all dependencies are built and installed per the documentation in
 couchdb-glazier, these commands will configure and build CouchDB:
 
-    powershell -ExecutionPolicy Bypass .\configure.ps1 -WithCurl
+    powershell -ExecutionPolicy Bypass .\configure.ps1
     make -f Makefile.win check
 
 This will build couchdb, as well as run the eunit and javascript tests.
 
-As of CouchDB 2.0 RC1, all eunit and javascript tests should pass.
+As of CouchDB 2.0 RC1, all tests should pass.
diff --git a/Makefile b/Makefile
index f3d8e7a..184f9b0 100644
--- a/Makefile
+++ b/Makefile
@@ -90,9 +90,6 @@ DIALYZE_OPTS=$(shell echo "\
 	" | sed -e 's/[a-z]\{1,\}= / /g')
 EXUNIT_OPTS=$(subst $(comma),$(space),$(tests))
 
-#ignore javascript tests
-ignore_js_suites=
-
 TEST_OPTS="-c 'startup_jitter=0' -c 'default_security=admin_local'"
 
 ################################################################################
@@ -208,7 +205,7 @@ python-black: .venv/bin/black
 	@python3 -c "import sys; exit(1 if sys.version_info >= (3,6) else 0)" || \
 		LC_ALL=C.UTF-8 LANG=C.UTF-8 .venv/bin/black --check \
 		--exclude="build/|buck-out/|dist/|_build/|\.git/|\.hg/|\.mypy_cache/|\.nox/|\.tox/|\.venv/|src/rebar/pr2relnotes.py|src/fauxton" \
-		build-aux/*.py dev/run test/javascript/run src/mango/test/*.py src/docs/src/conf.py src/docs/ext/*.py .
+		build-aux/*.py dev/run src/mango/test/*.py src/docs/src/conf.py src/docs/ext/*.py .
 
 python-black-update: .venv/bin/black
 	@python3 -c "import sys; exit(1 if sys.version_info < (3,6) else 0)" || \
@@ -216,7 +213,7 @@ python-black-update: .venv/bin/black
 	@python3 -c "import sys; exit(1 if sys.version_info >= (3,6) else 0)" || \
 		LC_ALL=C.UTF-8 LANG=C.UTF-8 .venv/bin/black \
 		--exclude="build/|buck-out/|dist/|_build/|\.git/|\.hg/|\.mypy_cache/|\.nox/|\.tox/|\.venv/|src/rebar/pr2relnotes.py|src/fauxton" \
-		build-aux/*.py dev/run test/javascript/run src/mango/test/*.py src/docs/src/conf.py src/docs/ext/*.py .
+		build-aux/*.py dev/run src/mango/test/*.py src/docs/src/conf.py src/docs/ext/*.py .
 
 .PHONY: elixir
 elixir: export MIX_ENV=integration
@@ -256,44 +253,6 @@ elixir-check-formatted: elixir-init
 elixir-credo: elixir-init
 	@mix credo
 
-.PHONY: javascript
-# target: javascript - Run JavaScript test suites or specific ones defined by suites option
-javascript: export COUCHDB_TEST_ADMIN_PARTY_OVERRIDE=1
-javascript: 
-
-	@$(MAKE) devclean
-	@mkdir -p share/www/script/test
-ifeq ($(IN_RELEASE), true)
-	@cp test/javascript/tests/lorem*.txt share/www/script/test/
-else
-	@mkdir -p src/fauxton/dist/release/test
-	@cp test/javascript/tests/lorem*.txt src/fauxton/dist/release/test/
-endif
-	@dev/run -n 1 -q --with-admin-party-please \
-            --enable-erlang-views \
-            "$(TEST_OPTS)" \
-            'test/javascript/run --suites "$(suites)" \
-            --ignore "$(ignore_js_suites)"'
-
-
-.PHONY: soak-javascript
-soak-javascript: export COUCHDB_TEST_ADMIN_PARTY_OVERRIDE=1
-soak-javascript:
-	@mkdir -p share/www/script/test
-ifeq ($(IN_RELEASE), true)
-	@cp test/javascript/tests/lorem*.txt share/www/script.test/
-else
-	@mkdir -p src/fauxton/dist/release/test
-	@cp test/javascript/tests/lorem*.txt src/fauxton/dist/release/test/
-endif
-	@rm -rf dev/lib
-	while [ $$? -eq 0 ]; do \
-		dev/run -n 1 -q --with-admin-party-please \
-				"$(TEST_OPTS)" \
-				'test/javascript/run --suites "$(suites)" \
-				--ignore "$(ignore_js_suites)"'  \
-	done
-
 .PHONY: build-report
 # target: build-report - Generate and upload a build report
 build-report:
@@ -322,14 +281,6 @@ list-eunit-suites:
 		| sort
 
 
-.PHONY: list-js-suites
-# target: list-js-suites - List JavaScript test suites
-list-js-suites:
-	@find ./test/javascript/tests/ -type f -name *.js -exec basename {} \; \
-		| cut -d '.' -f -1 \
-		| sort
-
-
 .PHONY: build-test
 # target: build-test - Test build script
 build-test:
diff --git a/Makefile.win b/Makefile.win
index dbef9da..f714991 100644
--- a/Makefile.win
+++ b/Makefile.win
@@ -86,9 +86,6 @@ DIALYZE_OPTS=skip_deps=$(skip_deps)
 
 EXUNIT_OPTS=$(subst $(comma),$(space),$(tests))
 
-#ignore javascript tests
-ignore_js_suites=
-
 TEST_OPTS=-c startup_jitter=0 -c default_security=admin_local
 
 ################################################################################
@@ -185,7 +182,7 @@ python-black: .venv/bin/black
 	@python.exe -c "import sys; exit(1 if sys.version_info >= (3,6) else 0)" || \
 		.venv\Scripts\black.exe --check \
 		--exclude="build/|buck-out/|dist/|_build/|\.git/|\.hg/|\.mypy_cache/|\.nox/|\.tox/|\.venv/|src/rebar/pr2relnotes.py|src/fauxton" \
-		build-aux dev\run test\javascript\run src\mango\test src\docs\src\conf.py src\docs\ext .
+		build-aux dev\run src\mango\test src\docs\src\conf.py src\docs\ext .
 
 python-black-update: .venv/bin/black
 	@python.exe -c "import sys; exit(1 if sys.version_info < (3,6) else 0)" || \
@@ -193,7 +190,7 @@ python-black-update: .venv/bin/black
 	@python.exe -c "import sys; exit(1 if sys.version_info >= (3,6) else 0)" || \
 		.venv\Scripts\black.exe \
 		--exclude="build/|buck-out/|dist/|_build/|\.git/|\.hg/|\.mypy_cache/|\.nox/|\.tox/|\.venv/|src/rebar/pr2relnotes.py|src/fauxton" \
-		build-aux dev\run test\javascript\run src\mango\test src\docs\src\conf.py src\docs\ext .
+		build-aux dev\run src\mango\test src\docs\src\conf.py src\docs\ext .
 
 .PHONY: elixir
 elixir: export MIX_ENV=integration
@@ -232,26 +229,6 @@ elixir-check-formatted: elixir-init
 elixir-credo: elixir-init
 	@mix credo
 
-
-.PHONY: javascript
-# target: javascript - Run JavaScript test suites or specific ones defined by suites option
-javascript: export COUCHDB_TEST_ADMIN_PARTY_OVERRIDE=1
-javascript:
-	@$(MAKE) devclean
-	-@mkdir share\www\script\test
-ifeq ($(IN_RELEASE), true)
-	@copy test\javascript\tests\lorem*.txt share\www\script\test
-else
-	-@mkdir src\fauxton\dist\release\test
-	@copy test\javascript\tests\lorem*.txt src\fauxton\dist\release\test
-endif
-	@python dev\run -n 1 -q --with-admin-party-please \
-		    --enable-erlang-views \
-            $(TEST_OPTS) \
-            'python test\javascript\run --suites "$(suites)" \
-            --ignore "$(ignore_js_suites)"'
-
-
 .PHONY: check-qs
 # target: check-qs - Run query server tests (ruby and rspec required!)
 check-qs:
@@ -422,7 +399,7 @@ devclean:
 config.erl:
 	@echo Apache CouchDB has not been configured.
 	@echo Try "powershell -ExecutionPolicy Bypass .\configure.ps1 -?" for help.
-	@echo You probably want "powershell -ExecutionPolicy Bypass .\configure.ps1 -WithCurl".
+	@echo You probably want "powershell -ExecutionPolicy Bypass .\configure.ps1".
 	@echo.
 	@false
 
diff --git a/build-aux/Jenkinsfile.full b/build-aux/Jenkinsfile.full
index d7a7657..5f99da6 100644
--- a/build-aux/Jenkinsfile.full
+++ b/build-aux/Jenkinsfile.full
@@ -21,7 +21,7 @@ mkdir build
 cd build
 tar -xf ${WORKSPACE}/apache-couchdb-*.tar.gz
 cd apache-couchdb-*
-./configure --with-curl --spidermonkey-version ${sm_ver}
+./configure --spidermonkey-version ${sm_ver}
 make check || (make build-report && false)
 '''
 
@@ -93,7 +93,7 @@ pipeline {
         sh '''
           set
           rm -rf apache-couchdb-*
-          ./configure --with-curl
+          ./configure
           make dist
           chmod -R a+w * .
         '''
@@ -140,7 +140,7 @@ pipeline {
                 cd build
                 tar -xf $WORKSPACE/apache-couchdb-*.tar.gz
                 cd apache-couchdb-*
-                ./configure --with-curl
+                ./configure
                 gmake check || (build-aux/logfile-uploader.py && false)
 
                 # No package build for FreeBSD at this time
@@ -177,7 +177,7 @@ pipeline {
                 cd build
                 tar -xzf $WORKSPACE/apache-couchdb-*.tar.gz
                 cd apache-couchdb-*
-                ./configure --with-curl --spidermonkey-version 60
+                ./configure --spidermonkey-version 60
                 make check || (build-aux/logfile-uploader.py && false)
 
                 # No package build for macOS at this time
diff --git a/build-aux/Jenkinsfile.pr b/build-aux/Jenkinsfile.pr
index 8c9cbd9..001fd59 100644
--- a/build-aux/Jenkinsfile.pr
+++ b/build-aux/Jenkinsfile.pr
@@ -21,7 +21,7 @@ cd build
 tar -xf ${WORKSPACE}/apache-couchdb-*.tar.gz
 cd apache-couchdb-*
 . /usr/local/kerl/${KERL_VER}/activate
-./configure --with-curl --spidermonkey-version 60
+./configure --spidermonkey-version 60
 make check || (make build-report && false)
 '''
 
@@ -80,7 +80,7 @@ pipeline {
           set
           rm -rf apache-couchdb-*
           . /usr/local/kerl/${LOW_ERLANG_VER}/activate
-          ./configure --with-curl
+          ./configure
           make dist
           chmod -R a+w * .
         '''
diff --git a/configure b/configure
index 38e62e3..a341259 100755
--- a/configure
+++ b/configure
@@ -22,7 +22,6 @@ basename=`basename $0`
 PACKAGE_AUTHOR_NAME="The Apache Software Foundation"
 
 # TEST=0
-WITH_CURL="false"
 WITH_PROPER="true"
 WITH_FAUXTON=1
 WITH_DOCS=1
@@ -47,11 +46,10 @@ Options:
 
   -h | --help                 display a short help message and exit
   -u | --user USER            set the username to run as (defaults to $COUCHDB_USER)
-  -c | --with-curl            request that couchjs is linked to cURL (default false)
   --disable-fauxton           do not build Fauxton
   --disable-docs              do not build any documentation or manpages
   --erlang-md5                use erlang for md5 hash operations
-  --dev                       alias for --with-curl --disable-docs --disable-fauxton
+  --dev                       alias for --disable-docs --disable-fauxton
   --spidermonkey-version VSN  specify the version of SpiderMonkey to use (defaults to $SM_VSN)
   --skip-deps                 do not update erlang dependencies
   --rebar=PATH                use rebar by specified path (version >=2.6.0 && <3.0 required)
@@ -66,12 +64,6 @@ parse_opts() {
                 exit
                 ;;
 
-            --with-curl|-c)
-                WITH_CURL="true"
-                shift
-                continue
-                ;;
-
             --without-proper)
                 WITH_PROPER="false"
                 shift
@@ -99,7 +91,6 @@ parse_opts() {
             --dev)
                 WITH_DOCS=0
                 WITH_FAUXTON=0
-                WITH_CURL="true"
                 shift
                 continue
                 ;;
@@ -238,7 +229,6 @@ spidermonkey_version = $SM_VSN
 EOF
 
 cat > $rootdir/config.erl << EOF
-{with_curl, $WITH_CURL}.
 {with_proper, $WITH_PROPER}.
 {erlang_md5, $ERLANG_MD5}.
 {spidermonkey_version, "$SM_VSN"}.
diff --git a/configure.ps1 b/configure.ps1
index c74fbcf..f66c0d8 100644
--- a/configure.ps1
+++ b/configure.ps1
@@ -5,7 +5,6 @@
     This command is responsible for generating the build
     system for Apache CouchDB.
 
-  -WithCurl                  request that couchjs is linked to cURL (default false)
   -DisableFauxton            request build process skip building Fauxton (default false)
   -DisableDocs               request build process skip building documentation (default false)
   -SkipDeps                  do not update Erlang dependencies (default false)
@@ -42,7 +41,6 @@
 
 Param(
     [switch]$Test = $false,
-    [switch]$WithCurl = $false, # request that couchjs is linked to cURL (default false)
     [switch]$DisableFauxton = $false, # do not build Fauxton
     [switch]$DisableDocs = $false, # do not build any documentation or manpages
     [switch]$SkipDeps = $false, # do not update erlang dependencies
@@ -183,9 +181,7 @@ spidermonkey_version = $SpiderMonkeyVersion
 "@
 $InstallMk | Out-File "$rootdir\install.mk" -encoding ascii
 
-$lowercurl = "$WithCurl".ToLower()
 $ConfigERL = @"
-{with_curl, $lowercurl}.
 {spidermonkey_version, "$SpiderMonkeyVersion"}.
 "@
 $ConfigERL | Out-File "$rootdir\config.erl" -encoding ascii
diff --git a/src/couch/priv/couch_js/1.8.5/help.h b/src/couch/priv/couch_js/1.8.5/help.h
index 678651f..fa86a1e 100644
--- a/src/couch/priv/couch_js/1.8.5/help.h
+++ b/src/couch/priv/couch_js/1.8.5/help.h
@@ -46,15 +46,9 @@ static const char USAGE_TEMPLATE[] =
     "\n"
     "  -h          display a short help message and exit\n"
     "  -V          display version information and exit\n"
-    "  -H          enable %s cURL bindings (only avaiable\n"
-    "              if package was built with cURL available)\n"
-    "  -T          enable test suite specific functions (these\n"
-    "              should not be enabled for production systems)\n"
     "  -S SIZE     specify that the runtime should allow at\n"
     "              most SIZE bytes of memory to be allocated\n"
     "              default is 64 MiB\n"
-    "  -u FILE     path to a .uri file containing the address\n"
-    "              (or addresses) of one or more servers\n"
     "  --eval      Enable runtime code evaluation (dangerous!)\n"
     "\n"
     "Report bugs at <%s>.\n";
@@ -78,7 +72,6 @@ static const char USAGE_TEMPLATE[] =
             basename,                           \
             basename,                           \
             PACKAGE_NAME,                       \
-            basename,                           \
             PACKAGE_BUGREPORT)
 
 #define DISPLAY_USAGE couch_usage(BASENAME)
diff --git a/src/couch/priv/couch_js/1.8.5/http.c b/src/couch/priv/couch_js/1.8.5/http.c
deleted file mode 100644
index c4b3896..0000000
--- a/src/couch/priv/couch_js/1.8.5/http.c
+++ /dev/null
@@ -1,701 +0,0 @@
-// Licensed under the Apache License, Version 2.0 (the "License"); you may not
-// use this file except in compliance with the License. You may obtain a copy of
-// the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-// License for the specific language governing permissions and limitations under
-// the License.
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <jsapi.h>
-#include "config.h"
-#include "utf8.h"
-#include "util.h"
-
-// Soft dependency on cURL bindings because they're
-// only used when running the JS tests from the
-// command line which is rare.
-#ifndef HAVE_CURL
-
-void
-http_check_enabled()
-{
-    fprintf(stderr, "HTTP API was disabled at compile time.\n");
-    exit(3);
-}
-
-
-JSBool
-http_ctor(JSContext* cx, JSObject* req)
-{
-    return JS_FALSE;
-}
-
-
-JSBool
-http_dtor(JSContext* cx, JSObject* req)
-{
-    return JS_FALSE;
-}
-
-
-JSBool
-http_open(JSContext* cx, JSObject* req, jsval mth, jsval url, jsval snc)
-{
-    return JS_FALSE;
-}
-
-
-JSBool
-http_set_hdr(JSContext* cx, JSObject* req, jsval name, jsval val)
-{
-    return JS_FALSE;
-}
-
-
-JSBool
-http_send(JSContext* cx, JSObject* req, jsval body)
-{
-    return JS_FALSE;
-}
-
-
-int
-http_status(JSContext* cx, JSObject* req, jsval body)
-{
-    return -1;
-}
-
-JSBool
-http_uri(JSContext* cx, JSObject* req, couch_args* args, jsval* uri_val)
-{
-    return JS_FALSE;
-}
-
-
-#else
-#include <curl/curl.h>
-#ifndef XP_WIN
-#include <unistd.h>
-#endif
-
-
-void
-http_check_enabled()
-{
-    return;
-}
-
-
-// Map some of the string function names to things which exist on Windows
-#ifdef XP_WIN
-#define strcasecmp _strcmpi
-#define strncasecmp _strnicmp
-#define snprintf _snprintf
-#endif
-
-
-typedef struct curl_slist CurlHeaders;
-
-
-typedef struct {
-    int             method;
-    char*           url;
-    CurlHeaders*    req_headers;
-    jsint           last_status;
-} HTTPData;
-
-
-char* METHODS[] = {"GET", "HEAD", "POST", "PUT", "DELETE", "COPY", "OPTIONS", NULL};
-
-
-#define GET     0
-#define HEAD    1
-#define POST    2
-#define PUT     3
-#define DELETE  4
-#define COPY    5
-#define OPTIONS 6
-
-
-static JSBool
-go(JSContext* cx, JSObject* obj, HTTPData* http, char* body, size_t blen);
-
-
-static JSString*
-str_from_binary(JSContext* cx, char* data, size_t length);
-
-
-JSBool
-http_ctor(JSContext* cx, JSObject* req)
-{
-    HTTPData* http = NULL;
-    JSBool ret = JS_FALSE;
-
-    http = (HTTPData*) malloc(sizeof(HTTPData));
-    if(!http)
-    {
-        JS_ReportError(cx, "Failed to create CouchHTTP instance.");
-        goto error;
-    }
-
-    http->method = -1;
-    http->url = NULL;
-    http->req_headers = NULL;
-    http->last_status = -1;
-
-    if(!JS_SetPrivate(cx, req, http))
-    {
-        JS_ReportError(cx, "Failed to set private CouchHTTP data.");
-        goto error;
-    }
-
-    ret = JS_TRUE;
-    goto success;
-
-error:
-    if(http) free(http);
-
-success:
-    return ret;
-}
-
-
-void
-http_dtor(JSContext* cx, JSObject* obj)
-{
-    HTTPData* http = (HTTPData*) JS_GetPrivate(cx, obj);
-    if(http) { 
-        if(http->url) free(http->url);
-        if(http->req_headers) curl_slist_free_all(http->req_headers);
-        free(http);
-    }
-}
-
-
-JSBool
-http_open(JSContext* cx, JSObject* req, jsval mth, jsval url, jsval snc)
-{
-    HTTPData* http = (HTTPData*) JS_GetPrivate(cx, req);
-    char* method = NULL;
-    int methid;
-    JSBool ret = JS_FALSE;
-
-    if(!http) {
-        JS_ReportError(cx, "Invalid CouchHTTP instance.");
-        goto done;
-    }
-
-    if(JSVAL_IS_VOID(mth)) {
-        JS_ReportError(cx, "You must specify a method.");
-        goto done;
-    }
-
-    method = enc_string(cx, mth, NULL);
-    if(!method) {
-        JS_ReportError(cx, "Failed to encode method.");
-        goto done;
-    }
-    
-    for(methid = 0; METHODS[methid] != NULL; methid++) {
-        if(strcasecmp(METHODS[methid], method) == 0) break;
-    }
-    
-    if(methid > OPTIONS) {
-        JS_ReportError(cx, "Invalid method specified.");
-        goto done;
-    }
-
-    http->method = methid;
-
-    if(JSVAL_IS_VOID(url)) {
-        JS_ReportError(cx, "You must specify a URL.");
-        goto done;
-    }
-
-    if(http->url != NULL) {
-        free(http->url);
-        http->url = NULL;
-    }
-
-    http->url = enc_string(cx, url, NULL);
-    if(http->url == NULL) {
-        JS_ReportError(cx, "Failed to encode URL.");
-        goto done;
-    }
-    
-    if(JSVAL_IS_BOOLEAN(snc) && JSVAL_TO_BOOLEAN(snc)) {
-        JS_ReportError(cx, "Synchronous flag must be false.");
-        goto done;
-    }
-    
-    if(http->req_headers) {
-        curl_slist_free_all(http->req_headers);
-        http->req_headers = NULL;
-    }
-    
-    // Disable Expect: 100-continue
-    http->req_headers = curl_slist_append(http->req_headers, "Expect:");
-
-    ret = JS_TRUE;
-
-done:
-    if(method) free(method);
-    return ret;
-}
-
-
-JSBool
-http_set_hdr(JSContext* cx, JSObject* req, jsval name, jsval val)
-{
-    HTTPData* http = (HTTPData*) JS_GetPrivate(cx, req);
-    char* keystr = NULL;
-    char* valstr = NULL;
-    char* hdrbuf = NULL;
-    size_t hdrlen = -1;
-    JSBool ret = JS_FALSE;
-
-    if(!http) {
-        JS_ReportError(cx, "Invalid CouchHTTP instance.");
-        goto done;
-    }
-
-    if(JSVAL_IS_VOID(name))
-    {
-        JS_ReportError(cx, "You must speciy a header name.");
-        goto done;
-    }
-
-    keystr = enc_string(cx, name, NULL);
-    if(!keystr)
-    {
-        JS_ReportError(cx, "Failed to encode header name.");
-        goto done;
-    }
-    
-    if(JSVAL_IS_VOID(val))
-    {
-        JS_ReportError(cx, "You must specify a header value.");
-        goto done;
-    }
-    
-    valstr = enc_string(cx, val, NULL);
-    if(!valstr)
-    {
-        JS_ReportError(cx, "Failed to encode header value.");
-        goto done;
-    }
-    
-    hdrlen = strlen(keystr) + strlen(valstr) + 3;
-    hdrbuf = (char*) malloc(hdrlen * sizeof(char));
-    if(!hdrbuf) {
-        JS_ReportError(cx, "Failed to allocate header buffer.");
-        goto done;
-    }
-    
-    snprintf(hdrbuf, hdrlen, "%s: %s", keystr, valstr);
-    http->req_headers = curl_slist_append(http->req_headers, hdrbuf);
-
-    ret = JS_TRUE;
-
-done:
-    if(keystr) free(keystr);
-    if(valstr) free(valstr);
-    if(hdrbuf) free(hdrbuf);
-    return ret;
-}
-
-JSBool
-http_send(JSContext* cx, JSObject* req, jsval body)
-{
-    HTTPData* http = (HTTPData*) JS_GetPrivate(cx, req);
-    char* bodystr = NULL;
-    size_t bodylen = 0;
-    JSBool ret = JS_FALSE;
-    
-    if(!http) {
-        JS_ReportError(cx, "Invalid CouchHTTP instance.");
-        goto done;
-    }
-
-    if(!JSVAL_IS_VOID(body)) {
-        bodystr = enc_string(cx, body, &bodylen);
-        if(!bodystr) {
-            JS_ReportError(cx, "Failed to encode body.");
-            goto done;
-        }
-    }
-
-    ret = go(cx, req, http, bodystr, bodylen);
-
-done:
-    if(bodystr) free(bodystr);
-    return ret;
-}
-
-int
-http_status(JSContext* cx, JSObject* req)
-{
-    HTTPData* http = (HTTPData*) JS_GetPrivate(cx, req);
-    
-    if(!http) {
-        JS_ReportError(cx, "Invalid CouchHTTP instance.");
-        return JS_FALSE;
-    }
-
-    return http->last_status;
-}
-
-JSBool
-http_uri(JSContext* cx, JSObject* req, couch_args* args, jsval* uri_val)
-{
-    FILE* uri_fp = NULL;
-    JSString* uri_str;
-
-    // Default is http://localhost:15986/ when no uri file is specified
-    if (!args->uri_file) {
-        uri_str = JS_InternString(cx, "http://localhost:15986/");
-        *uri_val = STRING_TO_JSVAL(uri_str);
-        JS_SetReservedSlot(cx, req, 0, *uri_val);
-        return JS_TRUE;
-    }
-
-    // Else check to see if the base url is cached in a reserved slot
-    if (JS_GetReservedSlot(cx, req, 0, uri_val) && !JSVAL_IS_VOID(*uri_val)) {
-        return JS_TRUE;
-    }
-
-    // Read the first line of the couch.uri file.
-    if(!((uri_fp = fopen(args->uri_file, "r")) &&
-         (uri_str = couch_readline(cx, uri_fp)))) {
-        JS_ReportError(cx, "Failed to read couch.uri file.");
-        goto error;
-    }
-
-    fclose(uri_fp);
-    *uri_val = STRING_TO_JSVAL(uri_str);
-    JS_SetReservedSlot(cx, req, 0, *uri_val);
-    return JS_TRUE;
-
-error:
-    if(uri_fp) fclose(uri_fp);
-    return JS_FALSE;
-}
-
-
-// Curl Helpers
-
-typedef struct {
-    HTTPData*   http;
-    JSContext*  cx;
-    JSObject*   resp_headers;
-    char*       sendbuf;
-    size_t      sendlen;
-    size_t      sent;
-    int         sent_once;
-    char*       recvbuf;
-    size_t      recvlen;
-    size_t      read;
-} CurlState;
-
-/*
- * I really hate doing this but this doesn't have to be
- * uber awesome, it just has to work.
- */
-CURL*       HTTP_HANDLE = NULL;
-char        ERRBUF[CURL_ERROR_SIZE];
-
-static size_t send_body(void *ptr, size_t size, size_t nmem, void *data);
-static int seek_body(void *ptr, curl_off_t offset, int origin);
-static size_t recv_body(void *ptr, size_t size, size_t nmem, void *data);
-static size_t recv_header(void *ptr, size_t size, size_t nmem, void *data);
-
-static JSBool
-go(JSContext* cx, JSObject* obj, HTTPData* http, char* body, size_t bodylen)
-{
-    CurlState state;
-    char* referer;
-    JSString* jsbody;
-    JSBool ret = JS_FALSE;
-    jsval tmp;
-    
-    state.cx = cx;
-    state.http = http;
-    
-    state.sendbuf = body;
-    state.sendlen = bodylen;
-    state.sent = 0;
-    state.sent_once = 0;
-
-    state.recvbuf = NULL;
-    state.recvlen = 0;
-    state.read = 0;
-
-    if(HTTP_HANDLE == NULL) {
-        HTTP_HANDLE = curl_easy_init();
-        curl_easy_setopt(HTTP_HANDLE, CURLOPT_READFUNCTION, send_body);
-        curl_easy_setopt(HTTP_HANDLE, CURLOPT_SEEKFUNCTION,
-                                        (curl_seek_callback) seek_body);
-        curl_easy_setopt(HTTP_HANDLE, CURLOPT_HEADERFUNCTION, recv_header);
-        curl_easy_setopt(HTTP_HANDLE, CURLOPT_WRITEFUNCTION, recv_body);
-        curl_easy_setopt(HTTP_HANDLE, CURLOPT_NOPROGRESS, 1);
-        curl_easy_setopt(HTTP_HANDLE, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4);
-        curl_easy_setopt(HTTP_HANDLE, CURLOPT_ERRORBUFFER, ERRBUF);
-        curl_easy_setopt(HTTP_HANDLE, CURLOPT_COOKIEFILE, "");
-        curl_easy_setopt(HTTP_HANDLE, CURLOPT_USERAGENT,
-                                            "CouchHTTP Client - Relax");
-    }
-    
-    if(!HTTP_HANDLE) {
-        JS_ReportError(cx, "Failed to initialize cURL handle.");
-        goto done;
-    }
-
-    if(!JS_GetReservedSlot(cx, obj, 0, &tmp)) {
-      JS_ReportError(cx, "Failed to readreserved slot.");
-      goto done;
-    }
-
-    if(!(referer = enc_string(cx, tmp, NULL))) {
-      JS_ReportError(cx, "Failed to encode referer.");
-      goto done;
-    }
-    curl_easy_setopt(HTTP_HANDLE, CURLOPT_REFERER, referer);
-    free(referer);
-
-    if(http->method < 0 || http->method > OPTIONS) {
-        JS_ReportError(cx, "INTERNAL: Unknown method.");
-        goto done;
-    }
-
-    curl_easy_setopt(HTTP_HANDLE, CURLOPT_CUSTOMREQUEST, METHODS[http->method]);
-    curl_easy_setopt(HTTP_HANDLE, CURLOPT_NOBODY, 0);
-    curl_easy_setopt(HTTP_HANDLE, CURLOPT_FOLLOWLOCATION, 1);
-    curl_easy_setopt(HTTP_HANDLE, CURLOPT_UPLOAD, 0);
-    
-    if(http->method == HEAD) {
-        curl_easy_setopt(HTTP_HANDLE, CURLOPT_NOBODY, 1);
-        curl_easy_setopt(HTTP_HANDLE, CURLOPT_FOLLOWLOCATION, 0);
-    } else if(http->method == POST || http->method == PUT) {
-        curl_easy_setopt(HTTP_HANDLE, CURLOPT_UPLOAD, 1);
-        curl_easy_setopt(HTTP_HANDLE, CURLOPT_FOLLOWLOCATION, 0);
-    }
-    
-    if(body && bodylen) {
-        curl_easy_setopt(HTTP_HANDLE, CURLOPT_INFILESIZE, bodylen);        
-    } else {
-        curl_easy_setopt(HTTP_HANDLE, CURLOPT_INFILESIZE, 0);
-    }
-
-    // curl_easy_setopt(HTTP_HANDLE, CURLOPT_VERBOSE, 1);
-
-    curl_easy_setopt(HTTP_HANDLE, CURLOPT_URL, http->url);
-    curl_easy_setopt(HTTP_HANDLE, CURLOPT_HTTPHEADER, http->req_headers);
-    curl_easy_setopt(HTTP_HANDLE, CURLOPT_READDATA, &state);
-    curl_easy_setopt(HTTP_HANDLE, CURLOPT_SEEKDATA, &state);
-    curl_easy_setopt(HTTP_HANDLE, CURLOPT_WRITEHEADER, &state);
-    curl_easy_setopt(HTTP_HANDLE, CURLOPT_WRITEDATA, &state);
-
-    if(curl_easy_perform(HTTP_HANDLE) != 0) {
-        JS_ReportError(cx, "Failed to execute HTTP request: %s", ERRBUF);
-        goto done;
-    }
-    
-    if(!state.resp_headers) {
-        JS_ReportError(cx, "Failed to recieve HTTP headers.");
-        goto done;
-    }
-
-    tmp = OBJECT_TO_JSVAL(state.resp_headers);
-    if(!JS_DefineProperty(
-        cx, obj,
-        "_headers",
-        tmp,
-        NULL, NULL,
-        JSPROP_READONLY
-    )) {
-        JS_ReportError(cx, "INTERNAL: Failed to set response headers.");
-        goto done;
-    }
-    
-    if(state.recvbuf) {
-        state.recvbuf[state.read] = '\0';
-        jsbody = dec_string(cx, state.recvbuf, state.read+1);
-        if(!jsbody) {
-            // If we can't decode the body as UTF-8 we forcefully
-            // convert it to a string by just forcing each byte
-            // to a jschar.
-            jsbody = str_from_binary(cx, state.recvbuf, state.read);
-            if(!jsbody) {
-                if(!JS_IsExceptionPending(cx)) {
-                    JS_ReportError(cx, "INTERNAL: Failed to decode body.");
-                }
-                goto done;
-            }
-        }
-        tmp = STRING_TO_JSVAL(jsbody);
-    } else {
-        tmp = JS_GetEmptyStringValue(cx);
-    }
-    
-    if(!JS_DefineProperty(
-        cx, obj,
-        "responseText",
-        tmp,
-        NULL, NULL,
-        JSPROP_READONLY
-    )) {
-        JS_ReportError(cx, "INTERNAL: Failed to set responseText.");
-        goto done;
-    }
-    
-    ret = JS_TRUE;
-
-done:
-    if(state.recvbuf) JS_free(cx, state.recvbuf);
-    return ret;
-}
-
-static size_t
-send_body(void *ptr, size_t size, size_t nmem, void *data)
-{
-    CurlState* state = (CurlState*) data;
-    size_t length = size * nmem;
-    size_t towrite = state->sendlen - state->sent;
-
-    // Assume this is cURL trying to resend a request that
-    // failed.
-    if(towrite == 0 && state->sent_once == 0) {
-        state->sent_once = 1;
-        return 0;
-    } else if(towrite == 0) {
-        state->sent = 0;
-        state->sent_once = 0;
-        towrite = state->sendlen;
-    }
-
-    if(length < towrite) towrite = length;
-
-    memcpy(ptr, state->sendbuf + state->sent, towrite);
-    state->sent += towrite;
-
-    return towrite;
-}
-
-static int
-seek_body(void* ptr, curl_off_t offset, int origin)
-{
-    CurlState* state = (CurlState*) ptr;
-    if(origin != SEEK_SET) return -1;
-
-    state->sent = (size_t) offset;
-    return (int) state->sent;
-}
-
-static size_t
-recv_header(void *ptr, size_t size, size_t nmem, void *data)
-{
-    CurlState* state = (CurlState*) data;
-    char code[4];
-    char* header = (char*) ptr;
-    size_t length = size * nmem;
-    JSString* hdr = NULL;
-    jsuint hdrlen;
-    jsval hdrval;
-    
-    if(length > 7 && strncasecmp(header, "HTTP/1.", 7) == 0) {
-        if(length < 12) {
-            return CURLE_WRITE_ERROR;
-        }
-
-        memcpy(code, header+9, 3*sizeof(char));
-        code[3] = '\0';
-        state->http->last_status = atoi(code);
-
-        state->resp_headers = JS_NewArrayObject(state->cx, 0, NULL);
-        if(!state->resp_headers) {
-            return CURLE_WRITE_ERROR;
-        }
-
-        return length;
-    }
-
-    // We get a notice at the \r\n\r\n after headers.
-    if(length <= 2) {
-        return length;
-    }
-
-    // Append the new header to our array.
-    hdr = dec_string(state->cx, header, length);
-    if(!hdr) {
-        return CURLE_WRITE_ERROR;
-    }
-
-    if(!JS_GetArrayLength(state->cx, state->resp_headers, &hdrlen)) {
-        return CURLE_WRITE_ERROR;
-    }
-
-    hdrval = STRING_TO_JSVAL(hdr);
-    if(!JS_SetElement(state->cx, state->resp_headers, hdrlen, &hdrval)) {
-        return CURLE_WRITE_ERROR;
-    }
-
-    return length;
-}
-
-static size_t
-recv_body(void *ptr, size_t size, size_t nmem, void *data)
-{
-    CurlState* state = (CurlState*) data;
-    size_t length = size * nmem;
-    char* tmp = NULL;
-    
-    if(!state->recvbuf) {
-        state->recvlen = 4096;
-        state->read = 0;
-        state->recvbuf = JS_malloc(state->cx, state->recvlen);
-    }
-    
-    if(!state->recvbuf) {
-        return CURLE_WRITE_ERROR;
-    }
-
-    // +1 so we can add '\0' back up in the go function.
-    while(length+1 > state->recvlen - state->read) state->recvlen *= 2;
-    tmp = JS_realloc(state->cx, state->recvbuf, state->recvlen);
-    if(!tmp) return CURLE_WRITE_ERROR;
-    state->recvbuf = tmp;
-   
-    memcpy(state->recvbuf + state->read, ptr, length);
-    state->read += length;
-    return length;
-}
-
-JSString*
-str_from_binary(JSContext* cx, char* data, size_t length)
-{
-    jschar* conv = (jschar*) JS_malloc(cx, length * sizeof(jschar));
-    JSString* ret = NULL;
-    size_t i;
-
-    if(!conv) return NULL;
-
-    for(i = 0; i < length; i++) {
-        conv[i] = (jschar) data[i];
-    }
-
-    ret = JS_NewUCString(cx, conv, length);
-    if(!ret) JS_free(cx, conv);
-
-    return ret;
-}
-
-#endif /* HAVE_CURL */
diff --git a/src/couch/priv/couch_js/1.8.5/http.h b/src/couch/priv/couch_js/1.8.5/http.h
deleted file mode 100644
index 63d45bd..0000000
--- a/src/couch/priv/couch_js/1.8.5/http.h
+++ /dev/null
@@ -1,27 +0,0 @@
-// Licensed under the Apache License, Version 2.0 (the "License"); you may not
-// use this file except in compliance with the License. You may obtain a copy of
-// the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-// License for the specific language governing permissions and limitations under
-// the License.
-
-#ifndef COUCH_JS_HTTP_H
-#define COUCH_JS_HTTP_H
-
-#include "util.h"
-
-void http_check_enabled();
-JSBool http_ctor(JSContext* cx, JSObject* req);
-void http_dtor(JSContext* cx, JSObject* req);
-JSBool http_open(JSContext* cx, JSObject* req, jsval mth, jsval url, jsval snc);
-JSBool http_set_hdr(JSContext* cx, JSObject* req, jsval name, jsval val);
-JSBool http_send(JSContext* cx, JSObject* req, jsval body);
-int http_status(JSContext* cx, JSObject* req);
-JSBool http_uri(JSContext* cx, JSObject *req, couch_args* args, jsval* uri);
-
-#endif
diff --git a/src/couch/priv/couch_js/1.8.5/main.c b/src/couch/priv/couch_js/1.8.5/main.c
index 986791c..c8e385c 100644
--- a/src/couch/priv/couch_js/1.8.5/main.c
+++ b/src/couch/priv/couch_js/1.8.5/main.c
@@ -22,7 +22,6 @@
 
 #include <jsapi.h>
 #include "config.h"
-#include "http.h"
 #include "utf8.h"
 #include "util.h"
 
@@ -49,105 +48,6 @@ static JSClass global_class = {
     JSCLASS_NO_OPTIONAL_MEMBERS
 };
 
-
-static JSBool
-req_ctor(JSContext* cx, uintN argc, jsval* vp)
-{
-    JSBool ret;
-    JSObject* obj = JS_NewObjectForConstructor(cx, vp);
-    if(!obj) {
-        JS_ReportError(cx, "Failed to create CouchHTTP instance.\n");
-        return JS_FALSE;
-    }
-    ret = http_ctor(cx, obj);
-    JS_SET_RVAL(cx, vp, OBJECT_TO_JSVAL(obj));
-    return ret;
-}
-
-
-static void 
-req_dtor(JSContext* cx, JSObject* obj)
-{
-    http_dtor(cx, obj);
-}
-
-
-static JSBool
-req_open(JSContext* cx, uintN argc, jsval* vp)
-{
-    JSObject* obj = JS_THIS_OBJECT(cx, vp);
-    jsval* argv = JS_ARGV(cx, vp);
-    JSBool ret = JS_FALSE;
-
-    if(argc == 2) {
-        ret = http_open(cx, obj, argv[0], argv[1], JSVAL_FALSE);
-    } else if(argc == 3) {
-        ret = http_open(cx, obj, argv[0], argv[1], argv[2]);
-    } else {
-        JS_ReportError(cx, "Invalid call to CouchHTTP.open");
-    }
-
-    JS_SET_RVAL(cx, vp, JSVAL_VOID);
-    return ret;
-}
-
-
-static JSBool
-req_set_hdr(JSContext* cx, uintN argc, jsval* vp)
-{
-    JSObject* obj = JS_THIS_OBJECT(cx, vp);
-    jsval* argv = JS_ARGV(cx, vp);
-    JSBool ret = JS_FALSE;
-
-    if(argc == 2) {
-        ret = http_set_hdr(cx, obj, argv[0], argv[1]);
-    } else {
-        JS_ReportError(cx, "Invalid call to CouchHTTP.set_header");
-    }
-
-    JS_SET_RVAL(cx, vp, JSVAL_VOID);
-    return ret;
-}
-
-
-static JSBool
-req_send(JSContext* cx, uintN argc, jsval* vp)
-{
-    JSObject* obj = JS_THIS_OBJECT(cx, vp);
-    jsval* argv = JS_ARGV(cx, vp);
-    JSBool ret = JS_FALSE;
-
-    if(argc == 1) {
-        ret = http_send(cx, obj, argv[0]);
-    } else {
-        JS_ReportError(cx, "Invalid call to CouchHTTP.send");
-    }
-
-    JS_SET_RVAL(cx, vp, JSVAL_VOID);
-    return ret;
-}
-
-
-static JSBool
-req_status(JSContext* cx, JSObject* obj, jsid pid, jsval* vp)
-{
-    int status = http_status(cx, obj);
-    if(status < 0)
-        return JS_FALSE;
-
-    JS_SET_RVAL(cx, vp, INT_TO_JSVAL(status));
-    return JS_TRUE;
-}
-
-
-static JSBool
-base_url(JSContext *cx, JSObject* obj, jsid pid, jsval* vp)
-{
-    couch_args *args = (couch_args*)JS_GetContextPrivate(cx);
-    return http_uri(cx, obj, args, &JS_RVAL(cx, vp));
-}
-
-
 static JSBool
 evalcx(JSContext *cx, uintN argc, jsval* vp)
 {
@@ -281,63 +181,6 @@ seal(JSContext* cx, uintN argc, jsval* vp)
 }
 
 
-static JSBool
-js_sleep(JSContext* cx, uintN argc, jsval* vp)
-{
-    jsval* argv = JS_ARGV(cx, vp);
-    int duration = 0;
-    if(!JS_ConvertArguments(cx, argc, argv, "/i", &duration)) {
-        return JS_FALSE;
-    }
-
-#ifdef XP_WIN
-    Sleep(duration);
-#else
-    usleep(duration * 1000);
-#endif
-
-    return JS_TRUE;
-}
-
-
-JSClass CouchHTTPClass = {
-    "CouchHTTP",
-    JSCLASS_HAS_PRIVATE
-        | JSCLASS_CONSTRUCT_PROTOTYPE
-        | JSCLASS_HAS_RESERVED_SLOTS(2),
-    JS_PropertyStub,
-    JS_PropertyStub,
-    JS_PropertyStub,
-    JS_StrictPropertyStub,
-    JS_EnumerateStub,
-    JS_ResolveStub,
-    JS_ConvertStub,
-    req_dtor,
-    JSCLASS_NO_OPTIONAL_MEMBERS
-};
-
-
-JSPropertySpec CouchHTTPProperties[] = {
-    {"status", 0, JSPROP_READONLY, req_status, NULL},
-    {"base_url", 0, JSPROP_READONLY | JSPROP_SHARED, base_url, NULL},
-    {0, 0, 0, 0, 0}
-};
-
-
-JSFunctionSpec CouchHTTPFunctions[] = {
-    JS_FS("_open", req_open, 3, 0),
-    JS_FS("_setRequestHeader", req_set_hdr, 2, 0),
-    JS_FS("_send", req_send, 1, 0),
-    JS_FS_END
-};
-
-
-JSFunctionSpec TestSuiteFunctions[] = {
-    JS_FS("sleep", js_sleep, 1, 0),
-    JS_FS_END
-};
-
-
 static JSFunctionSpec global_functions[] = {
     JS_FS("evalcx", evalcx, 0, 0),
     JS_FS("gc", gc, 0, 0),
@@ -376,7 +219,6 @@ main(int argc, const char* argv[])
     JSContext* cx = NULL;
     JSObject* global = NULL;
     JSCrossCompartmentCall *call = NULL;
-    JSObject* klass = NULL;
     JSSCRIPT_TYPE script;
     JSString* scriptsrc;
     const jschar* schars;
@@ -420,30 +262,6 @@ main(int argc, const char* argv[])
     if(couch_load_funcs(cx, global, global_functions) != JS_TRUE)
         return 1;
  
-    if(args->use_http) {
-        http_check_enabled();
-
-        klass = JS_InitClass(
-            cx, global,
-            NULL,
-            &CouchHTTPClass, req_ctor,
-            0,
-            CouchHTTPProperties, CouchHTTPFunctions,
-            NULL, NULL
-        );
-
-        if(!klass)
-        {
-            fprintf(stderr, "Failed to initialize CouchHTTP class.\n");
-            exit(2);
-        }
-    } 
-
-    if(args->use_test_funs) {
-        if(couch_load_funcs(cx, global, TestSuiteFunctions) != JS_TRUE)
-            return 1;
-    }
-
     for(i = 0 ; args->scripts[i] ; i++) {
         // Convert script source to jschars.
         scriptsrc = couch_readfile(cx, args->scripts[i]);
diff --git a/src/couch/priv/couch_js/1.8.5/util.c b/src/couch/priv/couch_js/1.8.5/util.c
index cf676ea..5cf94b6 100644
--- a/src/couch/priv/couch_js/1.8.5/util.c
+++ b/src/couch/priv/couch_js/1.8.5/util.c
@@ -96,8 +96,6 @@ couch_parse_args(int argc, const char* argv[])
                 fprintf(stderr, "Invalid stack size.\n");
                 exit(2);
             }
-        } else if(strcmp("-u", argv[i]) == 0) {
-            args->uri_file = argv[++i];
         } else if(strcmp("--eval", argv[i]) == 0) {
             args->eval = 1;
         } else if(strcmp("--", argv[i]) == 0) {
diff --git a/src/couch/priv/couch_js/1.8.5/util.h b/src/couch/priv/couch_js/1.8.5/util.h
index b24d7f7..9dd290a 100644
--- a/src/couch/priv/couch_js/1.8.5/util.h
+++ b/src/couch/priv/couch_js/1.8.5/util.h
@@ -21,8 +21,6 @@ typedef struct {
     int          use_test_funs;
     int          stack_size;
     const char** scripts;
-    const char*  uri_file;
-    JSString*    uri;
 } couch_args;
 
 couch_args* couch_parse_args(int argc, const char* argv[]);
diff --git a/src/couch/priv/couch_js/60/help.h b/src/couch/priv/couch_js/60/help.h
index 678651f..fa86a1e 100644
--- a/src/couch/priv/couch_js/60/help.h
+++ b/src/couch/priv/couch_js/60/help.h
@@ -46,15 +46,9 @@ static const char USAGE_TEMPLATE[] =
     "\n"
     "  -h          display a short help message and exit\n"
     "  -V          display version information and exit\n"
-    "  -H          enable %s cURL bindings (only avaiable\n"
-    "              if package was built with cURL available)\n"
-    "  -T          enable test suite specific functions (these\n"
-    "              should not be enabled for production systems)\n"
     "  -S SIZE     specify that the runtime should allow at\n"
     "              most SIZE bytes of memory to be allocated\n"
     "              default is 64 MiB\n"
-    "  -u FILE     path to a .uri file containing the address\n"
-    "              (or addresses) of one or more servers\n"
     "  --eval      Enable runtime code evaluation (dangerous!)\n"
     "\n"
     "Report bugs at <%s>.\n";
@@ -78,7 +72,6 @@ static const char USAGE_TEMPLATE[] =
             basename,                           \
             basename,                           \
             PACKAGE_NAME,                       \
-            basename,                           \
             PACKAGE_BUGREPORT)
 
 #define DISPLAY_USAGE couch_usage(BASENAME)
diff --git a/src/couch/priv/couch_js/60/http.cpp b/src/couch/priv/couch_js/60/http.cpp
deleted file mode 100644
index e1e44d6..0000000
--- a/src/couch/priv/couch_js/60/http.cpp
+++ /dev/null
@@ -1,649 +0,0 @@
-// Licensed under the Apache License, Version 2.0 (the "License"); you may not
-// use this file except in compliance with the License. You may obtain a copy of
-// the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-// License for the specific language governing permissions and limitations under
-// the License.
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <jsapi.h>
-#include <js/Initialization.h>
-#include "config.h"
-#include "util.h"
-
-// Soft dependency on cURL bindings because they're
-// only used when running the JS tests from the
-// command line which is rare.
-#ifndef HAVE_CURL
-
-void
-http_check_enabled()
-{
-    fprintf(stderr, "HTTP API was disabled at compile time.\n");
-    exit(3);
-}
-
-
-bool
-http_ctor(JSContext* cx, JSObject* req)
-{
-    return false;
-}
-
-
-void
-http_dtor(JSFreeOp* fop, JSObject* req)
-{
-    return;
-}
-
-
-bool
-http_open(JSContext* cx, JSObject* req, JS::Value mth, JS::Value url, JS::Value snc)
-{
-    return false;
-}
-
-
-bool
-http_set_hdr(JSContext* cx, JSObject* req, JS::Value name, JS::Value val)
-{
-    return false;
-}
-
-
-bool
-http_send(JSContext* cx, JSObject* req, JS::Value body)
-{
-    return false;
-}
-
-
-int
-http_status(JSContext* cx, JSObject* req)
-{
-    return -1;
-}
-
-bool
-http_uri(JSContext* cx, JSObject* req, couch_args* args, JS::Value* uri_val)
-{
-    return false;
-}
-
-
-#else
-#include <curl/curl.h>
-#ifndef XP_WIN
-#include <unistd.h>
-#endif
-
-
-void
-http_check_enabled()
-{
-    return;
-}
-
-
-// Map some of the string function names to things which exist on Windows
-#ifdef XP_WIN
-#define strcasecmp _strcmpi
-#define strncasecmp _strnicmp
-#endif
-
-
-typedef struct curl_slist CurlHeaders;
-
-
-typedef struct {
-    int             method;
-    std::string     url;
-    CurlHeaders*    req_headers;
-    int16_t          last_status;
-} HTTPData;
-
-
-const char* METHODS[] = {"GET", "HEAD", "POST", "PUT", "DELETE", "COPY", "OPTIONS", NULL};
-
-
-#define GET     0
-#define HEAD    1
-#define POST    2
-#define PUT     3
-#define DELETE  4
-#define COPY    5
-#define OPTIONS 6
-
-
-static bool go(JSContext* cx, JSObject* obj, HTTPData* http, std::string& body);
-
-
-bool
-http_ctor(JSContext* cx, JSObject* req)
-{
-    HTTPData* http = new HTTPData();
-    bool ret = false;
-
-    if(!http)
-    {
-        JS_ReportErrorUTF8(cx, "Failed to create CouchHTTP instance.");
-        goto error;
-    }
-
-    http->method = -1;
-    http->req_headers = NULL;
-    http->last_status = -1;
-
-    JS_SetPrivate(req, http);
-
-    ret = true;
-    goto success;
-
-error:
-    if(http) delete http;
-
-success:
-    return ret;
-}
-
-
-void
-http_dtor(JSFreeOp* fop, JSObject* obj)
-{
-    HTTPData* http = (HTTPData*) JS_GetPrivate(obj);
-    if(http) {
-        if(http->req_headers) curl_slist_free_all(http->req_headers);
-        delete http;
-    }
-}
-
-
-bool
-http_open(JSContext* cx, JSObject* req, JS::Value mth, JS::Value url, JS::Value snc)
-{
-    HTTPData* http = (HTTPData*) JS_GetPrivate(req);
-    int methid;
-
-    if(!http) {
-        JS_ReportErrorUTF8(cx, "Invalid CouchHTTP instance.");
-        return false;
-    }
-
-    if(!mth.isString()) {
-        JS_ReportErrorUTF8(cx, "Method must be a string.");
-        return false;
-    }
-
-    std::string method;
-    if(!js_to_string(cx, JS::RootedValue(cx, mth), method)) {
-        JS_ReportErrorUTF8(cx, "Failed to encode method.");
-        return false;
-    }
-
-    for(methid = 0; METHODS[methid] != NULL; methid++) {
-        if(strcasecmp(METHODS[methid], method.c_str()) == 0) break;
-    }
-
-    if(methid > OPTIONS) {
-        JS_ReportErrorUTF8(cx, "Invalid method specified.");
-        return false;
-    }
-
-    http->method = methid;
-
-    if(!url.isString()) {
-        JS_ReportErrorUTF8(cx, "URL must be a string");
-        return false;
-    }
-
-    std::string urlstr;
-    if(!js_to_string(cx, JS::RootedValue(cx, url), urlstr)) {
-        JS_ReportErrorUTF8(cx, "Failed to encode URL.");
-        return false;
-    }
-    http->url = urlstr;
-
-    if(snc.isBoolean() && snc.isTrue()) {
-        JS_ReportErrorUTF8(cx, "Synchronous flag must be false.");
-        return false;
-    }
-
-    if(http->req_headers) {
-        curl_slist_free_all(http->req_headers);
-        http->req_headers = NULL;
-    }
-
-    // Disable Expect: 100-continue
-    http->req_headers = curl_slist_append(http->req_headers, "Expect:");
-
-    return true;
-}
-
-
-bool
-http_set_hdr(JSContext* cx, JSObject* req, JS::Value name, JS::Value val)
-{
-    HTTPData* http = (HTTPData*) JS_GetPrivate(req);
-
-    if(!http) {
-        JS_ReportErrorUTF8(cx, "Invalid CouchHTTP instance.");
-        return false;
-    }
-
-    if(!name.isString())
-    {
-        JS_ReportErrorUTF8(cx, "Header names must be strings.");
-        return false;
-    }
-
-    std::string keystr;
-    if(!js_to_string(cx, JS::RootedValue(cx, name), keystr))
-    {
-        JS_ReportErrorUTF8(cx, "Failed to encode header name.");
-        return false;
-    }
-
-    if(!val.isString())
-    {
-        JS_ReportErrorUTF8(cx, "Header values must be strings.");
-        return false;
-    }
-
-    std::string valstr;
-    if(!js_to_string(cx, JS::RootedValue(cx, val), valstr)) {
-        JS_ReportErrorUTF8(cx, "Failed to encode header value.");
-        return false;
-    }
-
-    std::string header = keystr + ": " + valstr;
-    http->req_headers = curl_slist_append(http->req_headers, header.c_str());
-
-    return true;
-}
-
-bool
-http_send(JSContext* cx, JSObject* req, JS::Value body)
-{
-    HTTPData* http = (HTTPData*) JS_GetPrivate(req);
-
-    if(!http) {
-        JS_ReportErrorUTF8(cx, "Invalid CouchHTTP instance.");
-        return false;
-    }
-
-    std::string bodystr;
-    if(!js_to_string(cx, JS::RootedValue(cx, body), bodystr)) {
-        JS_ReportErrorUTF8(cx, "Failed to encode body.");
-        return false;
-    }
-
-    return go(cx, req, http, bodystr);
-}
-
-int
-http_status(JSContext* cx, JSObject* req)
-{
-    HTTPData* http = (HTTPData*) JS_GetPrivate(req);
-
-    if(!http) {
-        JS_ReportErrorUTF8(cx, "Invalid CouchHTTP instance.");
-        return false;
-    }
-
-    return http->last_status;
-}
-
-bool
-http_uri(JSContext* cx, JSObject* req, couch_args* args, JS::Value* uri_val)
-{
-    FILE* uri_fp = NULL;
-    JSString* uri_str;
-
-    // Default is http://localhost:15986/ when no uri file is specified
-    if (!args->uri_file) {
-        uri_str = JS_NewStringCopyZ(cx, "http://localhost:15986/");
-        *uri_val = JS::StringValue(uri_str);
-        JS_SetReservedSlot(req, 0, *uri_val);
-        return true;
-    }
-
-    // Else check to see if the base url is cached in a reserved slot
-    *uri_val = JS_GetReservedSlot(req, 0);
-    if (!(*uri_val).isUndefined()) {
-        return true;
-    }
-
-    // Read the first line of the couch.uri file.
-    if(!((uri_fp = fopen(args->uri_file, "r")) &&
-         (uri_str = couch_readline(cx, uri_fp)))) {
-        JS_ReportErrorUTF8(cx, "Failed to read couch.uri file.");
-        goto error;
-    }
-
-    fclose(uri_fp);
-    *uri_val = JS::StringValue(uri_str);
-    JS_SetReservedSlot(req, 0, *uri_val);
-    return true;
-
-error:
-    if(uri_fp) fclose(uri_fp);
-    return false;
-}
-
-
-// Curl Helpers
-
-typedef struct {
-    HTTPData*   http;
-    JSContext*  cx;
-    JSObject*   resp_headers;
-    const char* sendbuf;
-    size_t      sendlen;
-    size_t      sent;
-    int         sent_once;
-    char*       recvbuf;
-    size_t      recvlen;
-    size_t      read;
-} CurlState;
-
-/*
- * I really hate doing this but this doesn't have to be
- * uber awesome, it just has to work.
- */
-CURL*       HTTP_HANDLE = NULL;
-char        ERRBUF[CURL_ERROR_SIZE];
-
-static size_t send_body(void *ptr, size_t size, size_t nmem, void *data);
-static int seek_body(void *ptr, curl_off_t offset, int origin);
-static size_t recv_body(void *ptr, size_t size, size_t nmem, void *data);
-static size_t recv_header(void *ptr, size_t size, size_t nmem, void *data);
-
-static bool
-go(JSContext* cx, JSObject* obj, HTTPData* http, std::string& body)
-{
-    CurlState state;
-    JSString* jsbody;
-    bool ret = false;
-    JS::Value tmp;
-    JS::RootedObject robj(cx, obj);
-    JS::RootedValue vobj(cx);
-
-
-    state.cx = cx;
-    state.http = http;
-
-    state.sendbuf = body.c_str();
-    state.sendlen = body.size();
-    state.sent = 0;
-    state.sent_once = 0;
-
-    state.recvbuf = NULL;
-    state.recvlen = 0;
-    state.read = 0;
-
-    if(HTTP_HANDLE == NULL) {
-        HTTP_HANDLE = curl_easy_init();
-        curl_easy_setopt(HTTP_HANDLE, CURLOPT_READFUNCTION, send_body);
-        curl_easy_setopt(HTTP_HANDLE, CURLOPT_SEEKFUNCTION,
-                                        (curl_seek_callback) seek_body);
-        curl_easy_setopt(HTTP_HANDLE, CURLOPT_HEADERFUNCTION, recv_header);
-        curl_easy_setopt(HTTP_HANDLE, CURLOPT_WRITEFUNCTION, recv_body);
-        curl_easy_setopt(HTTP_HANDLE, CURLOPT_NOPROGRESS, 1);
-        curl_easy_setopt(HTTP_HANDLE, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4);
-        curl_easy_setopt(HTTP_HANDLE, CURLOPT_ERRORBUFFER, ERRBUF);
-        curl_easy_setopt(HTTP_HANDLE, CURLOPT_COOKIEFILE, "");
-        curl_easy_setopt(HTTP_HANDLE, CURLOPT_USERAGENT,
-                                            "CouchHTTP Client - Relax");
-    }
-
-    if(!HTTP_HANDLE) {
-        JS_ReportErrorUTF8(cx, "Failed to initialize cURL handle.");
-        if(state.recvbuf) JS_free(cx, state.recvbuf);
-        return ret;
-    }
-
-    tmp = JS_GetReservedSlot(obj, 0);
-
-    std::string referer;
-    if(!js_to_string(cx, JS::RootedValue(cx, tmp), referer)) {
-        JS_ReportErrorUTF8(cx, "Failed to encode referer.");
-        if(state.recvbuf) JS_free(cx, state.recvbuf);
-        return ret;
-    }
-    curl_easy_setopt(HTTP_HANDLE, CURLOPT_REFERER, referer.c_str());
-
-    if(http->method < 0 || http->method > OPTIONS) {
-        JS_ReportErrorUTF8(cx, "INTERNAL: Unknown method.");
-        if(state.recvbuf) JS_free(cx, state.recvbuf);
-          return ret;
-    }
-
-    curl_easy_setopt(HTTP_HANDLE, CURLOPT_CUSTOMREQUEST, METHODS[http->method]);
-    curl_easy_setopt(HTTP_HANDLE, CURLOPT_NOBODY, 0);
-    curl_easy_setopt(HTTP_HANDLE, CURLOPT_FOLLOWLOCATION, 1);
-    curl_easy_setopt(HTTP_HANDLE, CURLOPT_UPLOAD, 0);
-
-    if(http->method == HEAD) {
-        curl_easy_setopt(HTTP_HANDLE, CURLOPT_NOBODY, 1);
-        curl_easy_setopt(HTTP_HANDLE, CURLOPT_FOLLOWLOCATION, 0);
-    } else if(http->method == POST || http->method == PUT) {
-        curl_easy_setopt(HTTP_HANDLE, CURLOPT_UPLOAD, 1);
-        curl_easy_setopt(HTTP_HANDLE, CURLOPT_FOLLOWLOCATION, 0);
-    }
-
-    if(body.size() > 0) {
-        curl_easy_setopt(HTTP_HANDLE, CURLOPT_INFILESIZE, body.size());
-    } else {
-        curl_easy_setopt(HTTP_HANDLE, CURLOPT_INFILESIZE, 0);
-    }
-
-    // curl_easy_setopt(HTTP_HANDLE, CURLOPT_VERBOSE, 1);
-
-    curl_easy_setopt(HTTP_HANDLE, CURLOPT_URL, http->url.c_str());
-    curl_easy_setopt(HTTP_HANDLE, CURLOPT_HTTPHEADER, http->req_headers);
-    curl_easy_setopt(HTTP_HANDLE, CURLOPT_READDATA, &state);
-    curl_easy_setopt(HTTP_HANDLE, CURLOPT_SEEKDATA, &state);
-    curl_easy_setopt(HTTP_HANDLE, CURLOPT_WRITEHEADER, &state);
-    curl_easy_setopt(HTTP_HANDLE, CURLOPT_WRITEDATA, &state);
-
-    if(curl_easy_perform(HTTP_HANDLE) != 0) {
-        JS_ReportErrorUTF8(cx, "Failed to execute HTTP request: %s", ERRBUF);
-        if(state.recvbuf) JS_free(cx, state.recvbuf);
-        return ret;
-    }
-
-    if(!state.resp_headers) {
-        JS_ReportErrorUTF8(cx, "Failed to recieve HTTP headers.");
-        if(state.recvbuf) JS_free(cx, state.recvbuf);
-        return ret;
-    }
-    tmp = JS::ObjectValue(*state.resp_headers);
-    JS::RootedValue rtmp(cx, tmp);
-
-    if(!JS_DefineProperty(
-        cx, robj,
-        "_headers",
-        rtmp,
-        JSPROP_READONLY
-    )) {
-        JS_ReportErrorUTF8(cx, "INTERNAL: Failed to set response headers.");
-        if(state.recvbuf) JS_free(cx, state.recvbuf);
-        return ret;;
-    }
-
-    if(state.recvbuf) {
-        state.recvbuf[state.read] = '\0';
-        std::string bodystr(state.recvbuf, state.read);
-        jsbody = string_to_js(cx, bodystr);
-        if(!jsbody) {
-            // If we can't decode the body as UTF-8 we forcefully
-            // convert it to a string by just forcing each byte
-            // to a char16_t.
-            jsbody = JS_NewStringCopyN(cx, state.recvbuf, state.read);
-            if(!jsbody) {
-                if(!JS_IsExceptionPending(cx)) {
-                    JS_ReportErrorUTF8(cx, "INTERNAL: Failed to decode body.");
-                }
-                if(state.recvbuf) JS_free(cx, state.recvbuf);
-                return ret;
-            }
-        }
-        tmp = JS::StringValue(jsbody);
-    } else {
-        tmp = JS_GetEmptyStringValue(cx);
-    }
-
-    JS::RootedValue rtmp2(cx, tmp);
-
-    if(!JS_DefineProperty(
-        cx, robj,
-        "responseText",
-        rtmp2,
-        JSPROP_READONLY
-    )) {
-        JS_ReportErrorUTF8(cx, "INTERNAL: Failed to set responseText.");
-        if(state.recvbuf) JS_free(cx, state.recvbuf);
-        return ret;
-    }
-
-    ret = true;
-    if(state.recvbuf) JS_free(cx, state.recvbuf);
-    return ret;
-}
-
-static size_t
-send_body(void *ptr, size_t size, size_t nmem, void *data)
-{
-    CurlState* state = static_cast<CurlState*>(data);
-    size_t length = size * nmem;
-    size_t towrite = state->sendlen - state->sent;
-
-    // Assume this is cURL trying to resend a request that
-    // failed.
-    if(towrite == 0 && state->sent_once == 0) {
-        state->sent_once = 1;
-        return 0;
-    } else if(towrite == 0) {
-        state->sent = 0;
-        state->sent_once = 0;
-        towrite = state->sendlen;
-    }
-
-    if(length < towrite) towrite = length;
-
-    memcpy(ptr, state->sendbuf + state->sent, towrite);
-    state->sent += towrite;
-
-    return towrite;
-}
-
-static int
-seek_body(void* ptr, curl_off_t offset, int origin)
-{
-    CurlState* state = static_cast<CurlState*>(ptr);
-    if(origin != SEEK_SET) return -1;
-
-    state->sent = static_cast<size_t>(offset);
-    return static_cast<int>(state->sent);
-}
-
-static size_t
-recv_header(void *ptr, size_t size, size_t nmem, void *data)
-{
-    CurlState* state = static_cast<CurlState*>(data);
-    char code[4];
-    char* header = static_cast<char*>(ptr);
-    size_t length = size * nmem;
-    JSString* hdr = NULL;
-    uint32_t hdrlen;
-
-    if(length > 7 && strncasecmp(header, "HTTP/1.", 7) == 0) {
-        if(length < 12) {
-            return CURLE_WRITE_ERROR;
-        }
-
-        memcpy(code, header+9, 3*sizeof(char));
-        code[3] = '\0';
-        state->http->last_status = atoi(code);
-
-        state->resp_headers = JS_NewArrayObject(state->cx, 0);
-        if(!state->resp_headers) {
-            return CURLE_WRITE_ERROR;
-        }
-
-        return length;
-    }
-
-    // We get a notice at the \r\n\r\n after headers.
-    if(length <= 2) {
-        return length;
-    }
-
-    // Append the new header to our array.
-    std::string hdrstr(header, length);
-    hdr = string_to_js(state->cx, hdrstr);
-    if(!hdr) {
-        return CURLE_WRITE_ERROR;
-    }
-
-    JS::RootedObject obj(state->cx, state->resp_headers);
-    if(!JS_GetArrayLength(state->cx, obj, &hdrlen)) {
-        return CURLE_WRITE_ERROR;
-    }
-
-    JS::RootedString hdrval(state->cx, hdr);
-    if(!JS_SetElement(state->cx, obj, hdrlen, hdrval)) {
-        return CURLE_WRITE_ERROR;
-    }
-
-    return length;
-}
-
-static size_t
-recv_body(void *ptr, size_t size, size_t nmem, void *data)
-{
-    CurlState* state = static_cast<CurlState*>(data);
-    size_t length = size * nmem;
-    char* tmp = NULL;
-
-    if(!state->recvbuf) {
-        state->recvlen = 4096;
-        state->read = 0;
-        state->recvbuf = static_cast<char*>(JS_malloc(
-                state->cx,
-                state->recvlen
-            ));
-    }
-
-    if(!state->recvbuf) {
-        return CURLE_WRITE_ERROR;
-    }
-
-    // +1 so we can add '\0' back up in the go function.
-    size_t oldlen = state->recvlen;
-    while(length+1 > state->recvlen - state->read) state->recvlen *= 2;
-    tmp = static_cast<char*>(JS_realloc(
-            state->cx,
-            state->recvbuf,
-            oldlen,
-            state->recvlen
-        ));
-    if(!tmp) return CURLE_WRITE_ERROR;
-    state->recvbuf = tmp;
-
-    memcpy(state->recvbuf + state->read, ptr, length);
-    state->read += length;
-    return length;
-}
-
-#endif /* HAVE_CURL */
diff --git a/src/couch/priv/couch_js/60/http.h b/src/couch/priv/couch_js/60/http.h
deleted file mode 100644
index 797b3c0..0000000
--- a/src/couch/priv/couch_js/60/http.h
+++ /dev/null
@@ -1,27 +0,0 @@
-// Licensed under the Apache License, Version 2.0 (the "License"); you may not
-// use this file except in compliance with the License. You may obtain a copy of
-// the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-// License for the specific language governing permissions and limitations under
-// the License.
-
-#ifndef COUCH_JS_HTTP_H
-#define COUCH_JS_HTTP_H
-
-#include "util.h"
-
-void http_check_enabled();
-bool http_ctor(JSContext* cx, JSObject* req);
-void http_dtor(JSFreeOp* fop, JSObject* req);
-bool http_open(JSContext* cx, JSObject* req, JS::Value mth, JS::Value url, JS::Value snc);
-bool http_set_hdr(JSContext* cx, JSObject* req, JS::Value name, JS::Value val);
-bool http_send(JSContext* cx, JSObject* req, JS::Value body);
-int http_status(JSContext* cx, JSObject* req);
-bool http_uri(JSContext* cx, JSObject *req, couch_args* args, JS::Value* uri);
-
-#endif
diff --git a/src/couch/priv/couch_js/60/main.cpp b/src/couch/priv/couch_js/60/main.cpp
index 828b9da..5169b05 100644
--- a/src/couch/priv/couch_js/60/main.cpp
+++ b/src/couch/priv/couch_js/60/main.cpp
@@ -27,7 +27,6 @@
 #include <js/Wrapper.h>
 
 #include "config.h"
-#include "http.h"
 #include "util.h"
 
 static bool enableSharedMemory = true;
@@ -53,136 +52,6 @@ static JSClass global_class = {
     &global_ops
 };
 
-
-static void
-req_dtor(JSFreeOp* fop, JSObject* obj)
-{
-    http_dtor(fop, obj);
-}
-
-// With JSClass.construct.
-static const JSClassOps clsOps = {
-    nullptr,
-    nullptr,
-    nullptr,
-    nullptr,
-    nullptr,
-    nullptr,
-    req_dtor,
-    nullptr,
-    nullptr,
-    nullptr
-};
-
-static const JSClass CouchHTTPClass = {
-    "CouchHTTP",  /* name */
-    JSCLASS_HAS_PRIVATE | JSCLASS_HAS_RESERVED_SLOTS(2),        /* flags */
-    &clsOps
-};
-
-static bool
-req_ctor(JSContext* cx, unsigned int argc, JS::Value* vp)
-{
-    bool ret;
-    JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
-    JSObject* obj = JS_NewObjectForConstructor(cx, &CouchHTTPClass, args);
-    if(!obj) {
-        JS_ReportErrorUTF8(cx, "Failed to create CouchHTTP instance");
-        return false;
-    }
-    ret = http_ctor(cx, obj);
-    args.rval().setObject(*obj);
-    return ret;
-}
-
-static bool
-req_open(JSContext* cx, unsigned int argc, JS::Value* vp)
-{
-    JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
-    JS::Value vobj = args.computeThis(cx);
-    JSObject* obj = vobj.toObjectOrNull();
-    bool ret = false;
-
-    if(argc == 2) {
-        ret = http_open(cx, obj, args[0], args[1], JS::BooleanValue(false));
-    } else if(argc == 3) {
-        ret = http_open(cx, obj, args[0], args[1], args[2]);
-    } else {
-        JS_ReportErrorUTF8(cx, "Invalid call to CouchHTTP.open");
-    }
-
-    args.rval().setUndefined();
-    return ret;
-}
-
-
-static bool
-req_set_hdr(JSContext* cx, unsigned int argc, JS::Value* vp)
-{
-    JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
-    JS::Value vobj = args.computeThis(cx);
-    JSObject* obj = vobj.toObjectOrNull();
-    bool ret = false;
-
-    if(argc == 2) {
-        ret = http_set_hdr(cx, obj, args[0], args[1]);
-    } else {
-        JS_ReportErrorUTF8(cx, "Invalid call to CouchHTTP.set_header");
-    }
-
-    args.rval().setUndefined();
-    return ret;
-}
-
-
-static bool
-req_send(JSContext* cx, unsigned int argc, JS::Value* vp)
-{
-    JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
-    JS::Value vobj = args.computeThis(cx);
-    JSObject* obj = vobj.toObjectOrNull();
-    bool ret = false;
-
-    if(argc == 1) {
-        ret = http_send(cx, obj, args[0]);
-    } else {
-        JS_ReportErrorUTF8(cx, "Invalid call to CouchHTTP.send");
-    }
-
-    args.rval().setUndefined();
-    return ret;
-}
-
-static bool
-req_status(JSContext* cx, unsigned int argc, JS::Value* vp)
-{
-    JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
-    JS::Value vobj = args.computeThis(cx);
-    JSObject* obj = vobj.toObjectOrNull();
-
-    int status = http_status(cx, obj);
-
-    if(status < 0)
-        return false;
-
-    args.rval().set(JS::Int32Value(status));
-    return true;
-}
-
-static bool
-base_url(JSContext *cx, unsigned int argc, JS::Value* vp)
-{
-    JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
-    JS::Value vobj = args.computeThis(cx);
-    JSObject* obj = vobj.toObjectOrNull();
-
-    couch_args *cargs = static_cast<couch_args*>(JS_GetContextPrivate(cx));
-    JS::Value uri_val;
-    bool rc = http_uri(cx, obj, cargs, &uri_val);
-    args.rval().set(uri_val);
-    return rc;
-}
-
 static void
 SetStandardCompartmentOptions(JS::CompartmentOptions& options)
 {
@@ -353,43 +222,6 @@ seal(JSContext* cx, unsigned int argc, JS::Value* vp)
 }
 
 
-static bool
-js_sleep(JSContext* cx, unsigned int argc, JS::Value* vp)
-{
-    JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
-
-    int duration = args[0].toInt32();
-
-#ifdef XP_WIN
-    Sleep(duration);
-#else
-    usleep(duration * 1000);
-#endif
-
-    return true;
-}
-
-JSPropertySpec CouchHTTPProperties[] = {
-    JS_PSG("status", req_status, 0),
-    JS_PSG("base_url", base_url, 0),
-    JS_PS_END
-};
-
-
-JSFunctionSpec CouchHTTPFunctions[] = {
-    JS_FN("_open", req_open, 3, 0),
-    JS_FN("_setRequestHeader", req_set_hdr, 2, 0),
-    JS_FN("_send", req_send, 1, 0),
-    JS_FS_END
-};
-
-
-JSFunctionSpec TestSuiteFunctions[] = {
-    JS_FN("sleep", js_sleep, 1, 0),
-    JS_FS_END
-};
-
-
 static JSFunctionSpec global_functions[] = {
     JS_FN("evalcx", evalcx, 0, 0),
     JS_FN("gc", gc, 0, 0),
@@ -423,7 +255,6 @@ int
 main(int argc, const char* argv[])
 {
     JSContext* cx = NULL;
-    JSObject* klass = NULL;
     char* scriptsrc;
     size_t slen;
     int i;
@@ -461,30 +292,6 @@ main(int argc, const char* argv[])
     if(couch_load_funcs(cx, global, global_functions) != true)
         return 1;
 
-    if(args->use_http) {
-        http_check_enabled();
-
-        klass = JS_InitClass(
-            cx, global,
-            NULL,
-            &CouchHTTPClass, req_ctor,
-            0,
-            CouchHTTPProperties, CouchHTTPFunctions,
-            NULL, NULL
-        );
-
-        if(!klass)
-        {
-            fprintf(stderr, "Failed to initialize CouchHTTP class.\n");
-            exit(2);
-        }
-    }
-
-    if(args->use_test_funs) {
-        if(couch_load_funcs(cx, global, TestSuiteFunctions) != true)
-            return 1;
-    }
-
     for(i = 0 ; args->scripts[i] ; i++) {
         slen = couch_readfile(args->scripts[i], &scriptsrc);
 
diff --git a/src/couch/priv/couch_js/60/util.cpp b/src/couch/priv/couch_js/60/util.cpp
index c37c41f..3bc58a9 100644
--- a/src/couch/priv/couch_js/60/util.cpp
+++ b/src/couch/priv/couch_js/60/util.cpp
@@ -142,12 +142,8 @@ couch_parse_args(int argc, const char* argv[])
         return NULL;
 
     args->eval = 0;
-    args->use_http = 0;
-    args->use_test_funs = 0;
     args->stack_size = 64L * 1024L * 1024L;
     args->scripts = nullptr;
-    args->uri_file = nullptr;
-    args->uri = nullptr;
 
     while(i < argc) {
         if(strcmp("-h", argv[i]) == 0) {
@@ -156,18 +152,12 @@ couch_parse_args(int argc, const char* argv[])
         } else if(strcmp("-V", argv[i]) == 0) {
             DISPLAY_VERSION;
             exit(0);
-        } else if(strcmp("-H", argv[i]) == 0) {
-            args->use_http = 1;
-        } else if(strcmp("-T", argv[i]) == 0) {
-            args->use_test_funs = 1;
         } else if(strcmp("-S", argv[i]) == 0) {
             args->stack_size = atoi(argv[++i]);
             if(args->stack_size <= 0) {
                 fprintf(stderr, "Invalid stack size.\n");
                 exit(2);
             }
-        } else if(strcmp("-u", argv[i]) == 0) {
-            args->uri_file = argv[++i];
         } else if(strcmp("--eval", argv[i]) == 0) {
             args->eval = 1;
         } else if(strcmp("--", argv[i]) == 0) {
diff --git a/src/couch/priv/couch_js/60/util.h b/src/couch/priv/couch_js/60/util.h
index 4c27f0f..35882a6 100644
--- a/src/couch/priv/couch_js/60/util.h
+++ b/src/couch/priv/couch_js/60/util.h
@@ -17,12 +17,8 @@
 
 typedef struct {
     int          eval;
-    int          use_http;
-    int          use_test_funs;
     int          stack_size;
     const char** scripts;
-    const char*  uri_file;
-    JSString*    uri;
 } couch_args;
 
 std::string js_to_string(JSContext* cx, JS::HandleValue val);
diff --git a/src/couch/priv/couch_js/68/help.h b/src/couch/priv/couch_js/68/help.h
index 678651f..fa86a1e 100644
--- a/src/couch/priv/couch_js/68/help.h
+++ b/src/couch/priv/couch_js/68/help.h
@@ -46,15 +46,9 @@ static const char USAGE_TEMPLATE[] =
     "\n"
     "  -h          display a short help message and exit\n"
     "  -V          display version information and exit\n"
-    "  -H          enable %s cURL bindings (only avaiable\n"
-    "              if package was built with cURL available)\n"
-    "  -T          enable test suite specific functions (these\n"
-    "              should not be enabled for production systems)\n"
     "  -S SIZE     specify that the runtime should allow at\n"
     "              most SIZE bytes of memory to be allocated\n"
     "              default is 64 MiB\n"
-    "  -u FILE     path to a .uri file containing the address\n"
-    "              (or addresses) of one or more servers\n"
     "  --eval      Enable runtime code evaluation (dangerous!)\n"
     "\n"
     "Report bugs at <%s>.\n";
@@ -78,7 +72,6 @@ static const char USAGE_TEMPLATE[] =
             basename,                           \
             basename,                           \
             PACKAGE_NAME,                       \
-            basename,                           \
             PACKAGE_BUGREPORT)
 
 #define DISPLAY_USAGE couch_usage(BASENAME)
diff --git a/src/couch/priv/couch_js/68/http.cpp b/src/couch/priv/couch_js/68/http.cpp
deleted file mode 100644
index 20a6097..0000000
--- a/src/couch/priv/couch_js/68/http.cpp
+++ /dev/null
@@ -1,650 +0,0 @@
-// Licensed under the Apache License, Version 2.0 (the "License"); you may not
-// use this file except in compliance with the License. You may obtain a copy of
-// the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-// License for the specific language governing permissions and limitations under
-// the License.
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <jsapi.h>
-#include <js/Initialization.h>
-#include <js/MemoryFunctions.h>
-#include "config.h"
-#include "util.h"
-
-// Soft dependency on cURL bindings because they're
-// only used when running the JS tests from the
-// command line which is rare.
-#ifndef HAVE_CURL
-
-void
-http_check_enabled()
-{
-    fprintf(stderr, "HTTP API was disabled at compile time.\n");
-    exit(3);
-}
-
-
-bool
-http_ctor(JSContext* cx, JSObject* req)
-{
-    return false;
-}
-
-
-void
-http_dtor(JSFreeOp* fop, JSObject* req)
-{
-    return;
-}
-
-
-bool
-http_open(JSContext* cx, JSObject* req, JS::Value mth, JS::Value url, JS::Value snc)
-{
-    return false;
-}
-
-
-bool
-http_set_hdr(JSContext* cx, JSObject* req, JS::Value name, JS::Value val)
-{
-    return false;
-}
-
-
-bool
-http_send(JSContext* cx, JSObject* req, JS::Value body)
-{
-    return false;
-}
-
-
-int
-http_status(JSContext* cx, JSObject* req)
-{
-    return -1;
-}
-
-bool
-http_uri(JSContext* cx, JSObject* req, couch_args* args, JS::Value* uri_val)
-{
-    return false;
-}
-
-
-#else
-#include <curl/curl.h>
-#ifndef XP_WIN
-#include <unistd.h>
-#endif
-
-
-void
-http_check_enabled()
-{
-    return;
-}
-
-
-// Map some of the string function names to things which exist on Windows
-#ifdef XP_WIN
-#define strcasecmp _strcmpi
-#define strncasecmp _strnicmp
-#endif
-
-
-typedef struct curl_slist CurlHeaders;
-
-
-typedef struct {
-    int             method;
-    std::string     url;
-    CurlHeaders*    req_headers;
-    int16_t          last_status;
-} HTTPData;
-
-
-const char* METHODS[] = {"GET", "HEAD", "POST", "PUT", "DELETE", "COPY", "OPTIONS", NULL};
-
-
-#define GET     0
-#define HEAD    1
-#define POST    2
-#define PUT     3
-#define DELETE  4
-#define COPY    5
-#define OPTIONS 6
-
-
-static bool go(JSContext* cx, JSObject* obj, HTTPData* http, std::string& body);
-
-
-bool
-http_ctor(JSContext* cx, JSObject* req)
-{
-    HTTPData* http = new HTTPData();
-    bool ret = false;
-
-    if(!http)
-    {
-        JS_ReportErrorUTF8(cx, "Failed to create CouchHTTP instance.");
-        goto error;
-    }
-
-    http->method = -1;
-    http->req_headers = NULL;
-    http->last_status = -1;
-
-    JS_SetPrivate(req, http);
-
-    ret = true;
-    goto success;
-
-error:
-    if(http) delete http;
-
-success:
-    return ret;
-}
-
-
-void
-http_dtor(JSFreeOp* fop, JSObject* obj)
-{
-    HTTPData* http = (HTTPData*) JS_GetPrivate(obj);
-    if(http) {
-        if(http->req_headers) curl_slist_free_all(http->req_headers);
-        delete http;
-    }
-}
-
-
-bool
-http_open(JSContext* cx, JSObject* req, JS::Value mth, JS::Value url, JS::Value snc)
-{
-    HTTPData* http = (HTTPData*) JS_GetPrivate(req);
-    int methid;
-
-    if(!http) {
-        JS_ReportErrorUTF8(cx, "Invalid CouchHTTP instance.");
-        return false;
-    }
-
-    if(!mth.isString()) {
-        JS_ReportErrorUTF8(cx, "Method must be a string.");
-        return false;
-    }
-
-    std::string method;
-    if(!js_to_string(cx, JS::RootedValue(cx, mth), method)) {
-        JS_ReportErrorUTF8(cx, "Failed to encode method.");
-        return false;
-    }
-
-    for(methid = 0; METHODS[methid] != NULL; methid++) {
-        if(strcasecmp(METHODS[methid], method.c_str()) == 0) break;
-    }
-
-    if(methid > OPTIONS) {
-        JS_ReportErrorUTF8(cx, "Invalid method specified.");
-        return false;
-    }
-
-    http->method = methid;
-
-    if(!url.isString()) {
-        JS_ReportErrorUTF8(cx, "URL must be a string");
-        return false;
-    }
-
-    std::string urlstr;
-    if(!js_to_string(cx, JS::RootedValue(cx, url), urlstr)) {
-        JS_ReportErrorUTF8(cx, "Failed to encode URL.");
-        return false;
-    }
-    http->url = urlstr;
-
-    if(snc.isBoolean() && snc.isTrue()) {
-        JS_ReportErrorUTF8(cx, "Synchronous flag must be false.");
-        return false;
-    }
-
-    if(http->req_headers) {
-        curl_slist_free_all(http->req_headers);
-        http->req_headers = NULL;
-    }
-
-    // Disable Expect: 100-continue
-    http->req_headers = curl_slist_append(http->req_headers, "Expect:");
-
-    return true;
-}
-
-
-bool
-http_set_hdr(JSContext* cx, JSObject* req, JS::Value name, JS::Value val)
-{
-    HTTPData* http = (HTTPData*) JS_GetPrivate(req);
-
-    if(!http) {
-        JS_ReportErrorUTF8(cx, "Invalid CouchHTTP instance.");
-        return false;
-    }
-
-    if(!name.isString())
-    {
-        JS_ReportErrorUTF8(cx, "Header names must be strings.");
-        return false;
-    }
-
-    std::string keystr;
-    if(!js_to_string(cx, JS::RootedValue(cx, name), keystr))
-    {
-        JS_ReportErrorUTF8(cx, "Failed to encode header name.");
-        return false;
-    }
-
-    if(!val.isString())
-    {
-        JS_ReportErrorUTF8(cx, "Header values must be strings.");
-        return false;
-    }
-
-    std::string valstr;
-    if(!js_to_string(cx, JS::RootedValue(cx, val), valstr)) {
-        JS_ReportErrorUTF8(cx, "Failed to encode header value.");
-        return false;
-    }
-
-    std::string header = keystr + ": " + valstr;
-    http->req_headers = curl_slist_append(http->req_headers, header.c_str());
-
-    return true;
-}
-
-bool
-http_send(JSContext* cx, JSObject* req, JS::Value body)
-{
-    HTTPData* http = (HTTPData*) JS_GetPrivate(req);
-
-    if(!http) {
-        JS_ReportErrorUTF8(cx, "Invalid CouchHTTP instance.");
-        return false;
-    }
-
-    std::string bodystr;
-    if(!js_to_string(cx, JS::RootedValue(cx, body), bodystr)) {
-        JS_ReportErrorUTF8(cx, "Failed to encode body.");
-        return false;
-    }
-
-    return go(cx, req, http, bodystr);
-}
-
-int
-http_status(JSContext* cx, JSObject* req)
-{
-    HTTPData* http = (HTTPData*) JS_GetPrivate(req);
-
-    if(!http) {
-        JS_ReportErrorUTF8(cx, "Invalid CouchHTTP instance.");
-        return false;
-    }
-
-    return http->last_status;
-}
-
-bool
-http_uri(JSContext* cx, JSObject* req, couch_args* args, JS::Value* uri_val)
-{
-    FILE* uri_fp = NULL;
-    JSString* uri_str;
-
-    // Default is http://localhost:15986/ when no uri file is specified
-    if (!args->uri_file) {
-        uri_str = JS_NewStringCopyZ(cx, "http://localhost:15986/");
-        *uri_val = JS::StringValue(uri_str);
-        JS_SetReservedSlot(req, 0, *uri_val);
-        return true;
-    }
-
-    // Else check to see if the base url is cached in a reserved slot
-    *uri_val = JS_GetReservedSlot(req, 0);
-    if (!(*uri_val).isUndefined()) {
-        return true;
-    }
-
-    // Read the first line of the couch.uri file.
-    if(!((uri_fp = fopen(args->uri_file, "r")) &&
-         (uri_str = couch_readline(cx, uri_fp)))) {
-        JS_ReportErrorUTF8(cx, "Failed to read couch.uri file.");
-        goto error;
-    }
-
-    fclose(uri_fp);
-    *uri_val = JS::StringValue(uri_str);
-    JS_SetReservedSlot(req, 0, *uri_val);
-    return true;
-
-error:
-    if(uri_fp) fclose(uri_fp);
-    return false;
-}
-
-
-// Curl Helpers
-
-typedef struct {
-    HTTPData*   http;
-    JSContext*  cx;
-    JSObject*   resp_headers;
-    const char* sendbuf;
-    size_t      sendlen;
-    size_t      sent;
-    int         sent_once;
-    char*       recvbuf;
-    size_t      recvlen;
-    size_t      read;
-} CurlState;
-
-/*
- * I really hate doing this but this doesn't have to be
- * uber awesome, it just has to work.
- */
-CURL*       HTTP_HANDLE = NULL;
-char        ERRBUF[CURL_ERROR_SIZE];
-
-static size_t send_body(void *ptr, size_t size, size_t nmem, void *data);
-static int seek_body(void *ptr, curl_off_t offset, int origin);
-static size_t recv_body(void *ptr, size_t size, size_t nmem, void *data);
-static size_t recv_header(void *ptr, size_t size, size_t nmem, void *data);
-
-static bool
-go(JSContext* cx, JSObject* obj, HTTPData* http, std::string& body)
-{
-    CurlState state;
-    JSString* jsbody;
-    bool ret = false;
-    JS::Value tmp;
-    JS::RootedObject robj(cx, obj);
-    JS::RootedValue vobj(cx);
-
-
-    state.cx = cx;
-    state.http = http;
-
-    state.sendbuf = body.c_str();;
-    state.sendlen = body.size();
-    state.sent = 0;
-    state.sent_once = 0;
-
-    state.recvbuf = NULL;
-    state.recvlen = 0;
-    state.read = 0;
-
-    if(HTTP_HANDLE == NULL) {
-        HTTP_HANDLE = curl_easy_init();
-        curl_easy_setopt(HTTP_HANDLE, CURLOPT_READFUNCTION, send_body);
-        curl_easy_setopt(HTTP_HANDLE, CURLOPT_SEEKFUNCTION,
-                                        (curl_seek_callback) seek_body);
-        curl_easy_setopt(HTTP_HANDLE, CURLOPT_HEADERFUNCTION, recv_header);
-        curl_easy_setopt(HTTP_HANDLE, CURLOPT_WRITEFUNCTION, recv_body);
-        curl_easy_setopt(HTTP_HANDLE, CURLOPT_NOPROGRESS, 1);
-        curl_easy_setopt(HTTP_HANDLE, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4);
-        curl_easy_setopt(HTTP_HANDLE, CURLOPT_ERRORBUFFER, ERRBUF);
-        curl_easy_setopt(HTTP_HANDLE, CURLOPT_COOKIEFILE, "");
-        curl_easy_setopt(HTTP_HANDLE, CURLOPT_USERAGENT,
-                                            "CouchHTTP Client - Relax");
-    }
-
-    if(!HTTP_HANDLE) {
-        JS_ReportErrorUTF8(cx, "Failed to initialize cURL handle.");
-        if(state.recvbuf) JS_free(cx, state.recvbuf);
-        return ret;
-    }
-
-    tmp = JS_GetReservedSlot(obj, 0);
-
-    std::string referer;
-    if(!js_to_string(cx, JS::RootedValue(cx, tmp), referer)) {
-        JS_ReportErrorUTF8(cx, "Failed to encode referer.");
-        if(state.recvbuf) JS_free(cx, state.recvbuf);
-        return ret;
-    }
-    curl_easy_setopt(HTTP_HANDLE, CURLOPT_REFERER, referer.c_str());
-
-    if(http->method < 0 || http->method > OPTIONS) {
-        JS_ReportErrorUTF8(cx, "INTERNAL: Unknown method.");
-        if(state.recvbuf) JS_free(cx, state.recvbuf);
-          return ret;
-    }
-
-    curl_easy_setopt(HTTP_HANDLE, CURLOPT_CUSTOMREQUEST, METHODS[http->method]);
-    curl_easy_setopt(HTTP_HANDLE, CURLOPT_NOBODY, 0);
-    curl_easy_setopt(HTTP_HANDLE, CURLOPT_FOLLOWLOCATION, 1);
-    curl_easy_setopt(HTTP_HANDLE, CURLOPT_UPLOAD, 0);
-
-    if(http->method == HEAD) {
-        curl_easy_setopt(HTTP_HANDLE, CURLOPT_NOBODY, 1);
-        curl_easy_setopt(HTTP_HANDLE, CURLOPT_FOLLOWLOCATION, 0);
-    } else if(http->method == POST || http->method == PUT) {
-        curl_easy_setopt(HTTP_HANDLE, CURLOPT_UPLOAD, 1);
-        curl_easy_setopt(HTTP_HANDLE, CURLOPT_FOLLOWLOCATION, 0);
-    }
-
-    if(body.size() > 0) {
-        curl_easy_setopt(HTTP_HANDLE, CURLOPT_INFILESIZE, body.size());
-    } else {
-        curl_easy_setopt(HTTP_HANDLE, CURLOPT_INFILESIZE, 0);
-    }
-
-    // curl_easy_setopt(HTTP_HANDLE, CURLOPT_VERBOSE, 1);
-
-    curl_easy_setopt(HTTP_HANDLE, CURLOPT_URL, http->url.c_str());
-    curl_easy_setopt(HTTP_HANDLE, CURLOPT_HTTPHEADER, http->req_headers);
-    curl_easy_setopt(HTTP_HANDLE, CURLOPT_READDATA, &state);
-    curl_easy_setopt(HTTP_HANDLE, CURLOPT_SEEKDATA, &state);
-    curl_easy_setopt(HTTP_HANDLE, CURLOPT_WRITEHEADER, &state);
-    curl_easy_setopt(HTTP_HANDLE, CURLOPT_WRITEDATA, &state);
-
-    if(curl_easy_perform(HTTP_HANDLE) != 0) {
-        JS_ReportErrorUTF8(cx, "Failed to execute HTTP request: %s", ERRBUF);
-        if(state.recvbuf) JS_free(cx, state.recvbuf);
-        return ret;
-    }
-
-    if(!state.resp_headers) {
-        JS_ReportErrorUTF8(cx, "Failed to recieve HTTP headers.");
-        if(state.recvbuf) JS_free(cx, state.recvbuf);
-        return ret;
-    }
-    tmp = JS::ObjectValue(*state.resp_headers);
-    JS::RootedValue rtmp(cx, tmp);
-
-    if(!JS_DefineProperty(
-        cx, robj,
-        "_headers",
-        rtmp,
-        JSPROP_READONLY
-    )) {
-        JS_ReportErrorUTF8(cx, "INTERNAL: Failed to set response headers.");
-        if(state.recvbuf) JS_free(cx, state.recvbuf);
-        return ret;;
-    }
-
-    if(state.recvbuf) {
-        state.recvbuf[state.read] = '\0';
-        std::string bodystr(state.recvbuf, state.read);
-        jsbody = string_to_js(cx, bodystr);
-        if(!jsbody) {
-            // If we can't decode the body as UTF-8 we forcefully
-            // convert it to a string by just forcing each byte
-            // to a char16_t.
-            jsbody = JS_NewStringCopyN(cx, state.recvbuf, state.read);
-            if(!jsbody) {
-                if(!JS_IsExceptionPending(cx)) {
-                    JS_ReportErrorUTF8(cx, "INTERNAL: Failed to decode body.");
-                }
-                if(state.recvbuf) JS_free(cx, state.recvbuf);
-                return ret;
-            }
-        }
-        tmp = JS::StringValue(jsbody);
-    } else {
-        tmp = JS_GetEmptyStringValue(cx);
-    }
-
-    JS::RootedValue rtmp2(cx, tmp);
-
-    if(!JS_DefineProperty(
-        cx, robj,
-        "responseText",
-        rtmp2,
-        JSPROP_READONLY
-    )) {
-        JS_ReportErrorUTF8(cx, "INTERNAL: Failed to set responseText.");
-        if(state.recvbuf) JS_free(cx, state.recvbuf);
-        return ret;
-    }
-
-    ret = true;
-    if(state.recvbuf) JS_free(cx, state.recvbuf);
-    return ret;
-}
-
-static size_t
-send_body(void *ptr, size_t size, size_t nmem, void *data)
-{
-    CurlState* state = static_cast<CurlState*>(data);
-    size_t length = size * nmem;
-    size_t towrite = state->sendlen - state->sent;
-
-    // Assume this is cURL trying to resend a request that
-    // failed.
-    if(towrite == 0 && state->sent_once == 0) {
-        state->sent_once = 1;
-        return 0;
-    } else if(towrite == 0) {
-        state->sent = 0;
-        state->sent_once = 0;
-        towrite = state->sendlen;
-    }
-
-    if(length < towrite) towrite = length;
-
-    memcpy(ptr, state->sendbuf + state->sent, towrite);
-    state->sent += towrite;
-
-    return towrite;
-}
-
-static int
-seek_body(void* ptr, curl_off_t offset, int origin)
-{
-    CurlState* state = static_cast<CurlState*>(ptr);
-    if(origin != SEEK_SET) return -1;
-
-    state->sent = static_cast<size_t>(offset);
-    return static_cast<int>(state->sent);
-}
-
-static size_t
-recv_header(void *ptr, size_t size, size_t nmem, void *data)
-{
-    CurlState* state = static_cast<CurlState*>(data);
-    char code[4];
-    char* header = static_cast<char*>(ptr);
-    size_t length = size * nmem;
-    JSString* hdr = NULL;
-    uint32_t hdrlen;
-
-    if(length > 7 && strncasecmp(header, "HTTP/1.", 7) == 0) {
-        if(length < 12) {
-            return CURLE_WRITE_ERROR;
-        }
-
-        memcpy(code, header+9, 3*sizeof(char));
-        code[3] = '\0';
-        state->http->last_status = atoi(code);
-
-        state->resp_headers = JS_NewArrayObject(state->cx, 0);
-        if(!state->resp_headers) {
-            return CURLE_WRITE_ERROR;
-        }
-
-        return length;
-    }
-
-    // We get a notice at the \r\n\r\n after headers.
-    if(length <= 2) {
-        return length;
-    }
-
-    // Append the new header to our array.
-    std::string hdrstr(header, length);
-    hdr = string_to_js(state->cx, hdrstr);
-    if(!hdr) {
-        return CURLE_WRITE_ERROR;
-    }
-
-    JS::RootedObject obj(state->cx, state->resp_headers);
-    if(!JS_GetArrayLength(state->cx, obj, &hdrlen)) {
-        return CURLE_WRITE_ERROR;
-    }
-
-    JS::RootedString hdrval(state->cx, hdr);
-    if(!JS_SetElement(state->cx, obj, hdrlen, hdrval)) {
-        return CURLE_WRITE_ERROR;
-    }
-
-    return length;
-}
-
-static size_t
-recv_body(void *ptr, size_t size, size_t nmem, void *data)
-{
-    CurlState* state = static_cast<CurlState*>(data);
-    size_t length = size * nmem;
-    char* tmp = NULL;
-
-    if(!state->recvbuf) {
-        state->recvlen = 4096;
-        state->read = 0;
-        state->recvbuf = static_cast<char*>(JS_malloc(
-                state->cx,
-                state->recvlen
-            ));
-    }
-
-    if(!state->recvbuf) {
-        return CURLE_WRITE_ERROR;
-    }
-
-    // +1 so we can add '\0' back up in the go function.
-    size_t oldlen = state->recvlen;
-    while(length+1 > state->recvlen - state->read) state->recvlen *= 2;
-    tmp = static_cast<char*>(JS_realloc(
-            state->cx,
-            state->recvbuf,
-            oldlen,
-            state->recvlen
-        ));
-    if(!tmp) return CURLE_WRITE_ERROR;
-    state->recvbuf = tmp;
-
-    memcpy(state->recvbuf + state->read, ptr, length);
-    state->read += length;
-    return length;
-}
-
-#endif /* HAVE_CURL */
diff --git a/src/couch/priv/couch_js/68/http.h b/src/couch/priv/couch_js/68/http.h
deleted file mode 100644
index 797b3c0..0000000
--- a/src/couch/priv/couch_js/68/http.h
+++ /dev/null
@@ -1,27 +0,0 @@
-// Licensed under the Apache License, Version 2.0 (the "License"); you may not
-// use this file except in compliance with the License. You may obtain a copy of
-// the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-// License for the specific language governing permissions and limitations under
-// the License.
-
-#ifndef COUCH_JS_HTTP_H
-#define COUCH_JS_HTTP_H
-
-#include "util.h"
-
-void http_check_enabled();
-bool http_ctor(JSContext* cx, JSObject* req);
-void http_dtor(JSFreeOp* fop, JSObject* req);
-bool http_open(JSContext* cx, JSObject* req, JS::Value mth, JS::Value url, JS::Value snc);
-bool http_set_hdr(JSContext* cx, JSObject* req, JS::Value name, JS::Value val);
-bool http_send(JSContext* cx, JSObject* req, JS::Value body);
-int http_status(JSContext* cx, JSObject* req);
-bool http_uri(JSContext* cx, JSObject *req, couch_args* args, JS::Value* uri);
-
-#endif
diff --git a/src/couch/priv/couch_js/68/main.cpp b/src/couch/priv/couch_js/68/main.cpp
index 2c95f61..bb62d16 100644
--- a/src/couch/priv/couch_js/68/main.cpp
+++ b/src/couch/priv/couch_js/68/main.cpp
@@ -30,7 +30,6 @@
 #include <js/Wrapper.h>
 
 #include "config.h"
-#include "http.h"
 #include "util.h"
 
 static bool enableSharedMemory = true;
@@ -56,141 +55,6 @@ static JSClass global_class = {
     &global_ops
 };
 
-
-static void
-req_dtor(JSFreeOp* fop, JSObject* obj)
-{
-    http_dtor(fop, obj);
-}
-
-// With JSClass.construct.
-static const JSClassOps clsOps = {
-    nullptr,
-    nullptr,
-    nullptr,
-    nullptr,
-    nullptr,
-    nullptr,
-    req_dtor,
-    nullptr,
-    nullptr,
-    nullptr
-};
-
-static const JSClass CouchHTTPClass = {
-    "CouchHTTP",  /* name */
-    JSCLASS_HAS_PRIVATE | JSCLASS_HAS_RESERVED_SLOTS(2),        /* flags */
-    &clsOps
-};
-
-static bool
-req_ctor(JSContext* cx, unsigned int argc, JS::Value* vp)
-{
-    bool ret;
-    JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
-    JSObject* obj = JS_NewObjectForConstructor(cx, &CouchHTTPClass, args);
-    if(!obj) {
-        JS_ReportErrorUTF8(cx, "Failed to create CouchHTTP instance");
-        return false;
-    }
-    ret = http_ctor(cx, obj);
-    args.rval().setObject(*obj);
-    return ret;
-}
-
-static bool
-req_open(JSContext* cx, unsigned int argc, JS::Value* vp)
-{
-    JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
-    JS::RootedObject obj(cx);
-    if (!args.computeThis(cx, &obj))
-        return false;
-    bool ret = false;
-
-    if(argc == 2) {
-        ret = http_open(cx, obj, args[0], args[1], JS::BooleanValue(false));
-    } else if(argc == 3) {
-        ret = http_open(cx, obj, args[0], args[1], args[2]);
-    } else {
-        JS_ReportErrorUTF8(cx, "Invalid call to CouchHTTP.open");
-    }
-
-    args.rval().setUndefined();
-    return ret;
-}
-
-
-static bool
-req_set_hdr(JSContext* cx, unsigned int argc, JS::Value* vp)
-{
-    JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
-    JS::RootedObject obj(cx);
-    if (!args.computeThis(cx, &obj))
-        return false;
-    bool ret = false;
-
-    if(argc == 2) {
-        ret = http_set_hdr(cx, obj, args[0], args[1]);
-    } else {
-        JS_ReportErrorUTF8(cx, "Invalid call to CouchHTTP.set_header");
-    }
-
-    args.rval().setUndefined();
-    return ret;
-}
-
-
-static bool
-req_send(JSContext* cx, unsigned int argc, JS::Value* vp)
-{
-    JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
-    JS::RootedObject obj(cx);
-    if (!args.computeThis(cx, &obj))
-        return false;
-    bool ret = false;
-
-    if(argc == 1) {
-        ret = http_send(cx, obj, args[0]);
-    } else {
-        JS_ReportErrorUTF8(cx, "Invalid call to CouchHTTP.send");
-    }
-
-    args.rval().setUndefined();
-    return ret;
-}
-
-static bool
-req_status(JSContext* cx, unsigned int argc, JS::Value* vp)
-{
-    JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
-    JS::RootedObject obj(cx);
-    if (!args.computeThis(cx, &obj))
-        return false;
-
-    int status = http_status(cx, obj);
-
-    if(status < 0)
-        return false;
-
-    args.rval().set(JS::Int32Value(status));
-    return true;
-}
-
-static bool
-base_url(JSContext *cx, unsigned int argc, JS::Value* vp)
-{
-    JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
-    JS::RootedObject obj(cx);
-    if (!args.computeThis(cx, &obj))
-        return false;
-
-    couch_args *cargs = static_cast<couch_args*>(JS_GetContextPrivate(cx));
-    JS::Value uri_val;
-    bool rc = http_uri(cx, obj, cargs, &uri_val);
-    args.rval().set(uri_val);
-    return rc;
-}
-
 static JSObject*
 NewSandbox(JSContext* cx, bool lazy)
 {
@@ -358,43 +222,6 @@ seal(JSContext* cx, unsigned int argc, JS::Value* vp)
 }
 
 
-static bool
-js_sleep(JSContext* cx, unsigned int argc, JS::Value* vp)
-{
-    JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
-
-    int duration = args[0].toInt32();
-
-#ifdef XP_WIN
-    Sleep(duration);
-#else
-    usleep(duration * 1000);
-#endif
-
-    return true;
-}
-
-JSPropertySpec CouchHTTPProperties[] = {
-    JS_PSG("status", req_status, 0),
-    JS_PSG("base_url", base_url, 0),
-    JS_PS_END
-};
-
-
-JSFunctionSpec CouchHTTPFunctions[] = {
-    JS_FN("_open", req_open, 3, 0),
-    JS_FN("_setRequestHeader", req_set_hdr, 2, 0),
-    JS_FN("_send", req_send, 1, 0),
-    JS_FS_END
-};
-
-
-JSFunctionSpec TestSuiteFunctions[] = {
-    JS_FN("sleep", js_sleep, 1, 0),
-    JS_FS_END
-};
-
-
 static JSFunctionSpec global_functions[] = {
     JS_FN("evalcx", evalcx, 0, 0),
     JS_FN("gc", gc, 0, 0),
@@ -428,7 +255,6 @@ int
 main(int argc, const char* argv[])
 {
     JSContext* cx = NULL;
-    JSObject* klass = NULL;
     int i;
 
     couch_args* args = couch_parse_args(argc, argv);
@@ -463,30 +289,6 @@ main(int argc, const char* argv[])
     if(couch_load_funcs(cx, global, global_functions) != true)
         return 1;
 
-    if(args->use_http) {
-        http_check_enabled();
-
-        klass = JS_InitClass(
-            cx, global,
-            NULL,
-            &CouchHTTPClass, req_ctor,
-            0,
-            CouchHTTPProperties, CouchHTTPFunctions,
-            NULL, NULL
-        );
-
-        if(!klass)
-        {
-            fprintf(stderr, "Failed to initialize CouchHTTP class.\n");
-            exit(2);
-        }
-    }
-
-    if(args->use_test_funs) {
-        if(couch_load_funcs(cx, global, TestSuiteFunctions) != true)
-            return 1;
-    }
-
     for(i = 0 ; args->scripts[i] ; i++) {
         const char* filename = args->scripts[i];
 
diff --git a/src/couch/priv/couch_js/68/util.cpp b/src/couch/priv/couch_js/68/util.cpp
index 7717f11..6e6105d 100644
--- a/src/couch/priv/couch_js/68/util.cpp
+++ b/src/couch/priv/couch_js/68/util.cpp
@@ -135,12 +135,8 @@ couch_parse_args(int argc, const char* argv[])
         return NULL;
 
     args->eval = 0;
-    args->use_http = 0;
-    args->use_test_funs = 0;
     args->stack_size = 64L * 1024L * 1024L;
     args->scripts = nullptr;
-    args->uri_file = nullptr;
-    args->uri = nullptr;
 
     while(i < argc) {
         if(strcmp("-h", argv[i]) == 0) {
@@ -149,18 +145,12 @@ couch_parse_args(int argc, const char* argv[])
         } else if(strcmp("-V", argv[i]) == 0) {
             DISPLAY_VERSION;
             exit(0);
-        } else if(strcmp("-H", argv[i]) == 0) {
-            args->use_http = 1;
-        } else if(strcmp("-T", argv[i]) == 0) {
-            args->use_test_funs = 1;
         } else if(strcmp("-S", argv[i]) == 0) {
             args->stack_size = atoi(argv[++i]);
             if(args->stack_size <= 0) {
                 fprintf(stderr, "Invalid stack size.\n");
                 exit(2);
             }
-        } else if(strcmp("-u", argv[i]) == 0) {
-            args->uri_file = argv[++i];
         } else if(strcmp("--eval", argv[i]) == 0) {
             args->eval = 1;
         } else if(strcmp("--", argv[i]) == 0) {
diff --git a/src/couch/rebar.config.script b/src/couch/rebar.config.script
index 320584b..e749e40 100644
--- a/src/couch/rebar.config.script
+++ b/src/couch/rebar.config.script
@@ -132,29 +132,6 @@ end.
         }
 end.
 
-{CURL_CFLAGS, CURL_LDFLAGS} = case lists:keyfind(with_curl, 1, CouchConfig) of
-    {with_curl, true} ->
-        case os:type() of
-            {win32, _} ->
-                {
-                    "/DHAVE_CURL",
-                    "/DHAVE_CURL libcurl.lib"
-                };
-            {unix, freebsd} ->
-                {
-                    "-DHAVE_CURL -I/usr/local/include",
-                    "-DHAVE_CURL -lcurl"
-                };
-            _ ->
-                {
-                    "-DHAVE_CURL",
-                    "-DHAVE_CURL -lcurl"
-                }
-        end;
-    _ ->
-        {"", ""}
-end.
-
 CouchJSSrc = case SMVsn of
     "1.8.5" -> ["priv/couch_js/1.8.5/*.c"];
     "60" -> ["priv/couch_js/60/*.cpp"];
@@ -164,13 +141,13 @@ end.
 CouchJSEnv = case SMVsn of
     "1.8.5" ->
         [
-            {"CFLAGS", JS_CFLAGS ++ " " ++ CURL_CFLAGS},
-            {"LDFLAGS", JS_LDFLAGS ++ " " ++ CURL_LDFLAGS}
+            {"CFLAGS", JS_CFLAGS},
+            {"LDFLAGS", JS_LDFLAGS}
         ];
     _ ->
         [
-            {"CXXFLAGS", JS_CFLAGS ++ " " ++ CURL_CFLAGS},
-            {"LDFLAGS", JS_LDFLAGS ++ " " ++ CURL_LDFLAGS}
+            {"CXXFLAGS", JS_CFLAGS},
+            {"LDFLAGS", JS_LDFLAGS}
         ]
 end.
 
diff --git a/test/javascript/cli_runner.js b/test/javascript/cli_runner.js
deleted file mode 100644
index a35348f..0000000
--- a/test/javascript/cli_runner.js
+++ /dev/null
@@ -1,63 +0,0 @@
-// Licensed under the Apache License, Version 2.0 (the "License"); you may not
-// use this file except in compliance with the License. You may obtain a copy of
-// the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-// License for the specific language governing permissions and limitations under
-// the License.
-//
-
-/*
- * Quit current test execution if it is tagged as skipped or ported to elixir
- */
-function quitIfSkippedOrPorted() {
-  if(couchTests.skip) {
-    quit(2);
-  }
-
-  if(couchTests.elixir) {
-    quit(3);
-  }
-}
-
-/*
- * Futon test suite was designed to be able to run all tests populated into
- * couchTests. Here we should only be loading one test, so we'll pop the first
- * test off the list and run the test. If more than one item is loaded in the
- * test object, return an error.
- */
-function runTest() {
-  CouchDB.reloadConfig();
-  var count = 0;
-  var start = new Date().getTime();
-
-  for(var name in couchTests) {
-      count++;
-  }
-
-  if (count !== 1) {
-      console.log('Only one test per file is allowed.');
-      quit(1);
-  }
-
-  try {
-    // Add artificial wait for each test of 1 sec
-    while (new Date().getTime() < start + 1200);
-    couchTests[name]();
-    quit(0);
-  } catch(e) {
-    console.log("\nError: " + e.message);
-    fmtStack(e.stack);
-    quit(1)
-  }
-}
-
-quitIfSkippedOrPorted();
-
-waitForSuccess(CouchDB.isRunning, 'isRunning');
-
-runTest();
diff --git a/test/javascript/couch.js b/test/javascript/couch.js
deleted file mode 100644
index c325d68..0000000
--- a/test/javascript/couch.js
+++ /dev/null
@@ -1,557 +0,0 @@
-// Licensed under the Apache License, Version 2.0 (the "License"); you may not
-// use this file except in compliance with the License. You may obtain a copy of
-// the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-// License for the specific language governing permissions and limitations under
-// the License.
-
-// A simple class to represent a database. Uses XMLHttpRequest to interface with
-// the CouchDB server.
-
-function CouchDB(name, httpHeaders, globalRequestOptions) {
-  this.globalRequestOptions = globalRequestOptions || {}
-  this.name = name;
-  this.uri = "/" + encodeURIComponent(name) + "/";
-
-  // The XMLHttpRequest object from the most recent request. Callers can
-  // use this to check result http status and headers.
-  this.last_req = null;
-
-  this.request = function(method, uri, requestOptions) {
-    requestOptions = requestOptions || {};
-    requestOptions.headers = combine(requestOptions.headers, httpHeaders);
-    requestOptions.url = globalRequestOptions;
-    return CouchDB.request(method, uri, requestOptions);
-  };
-
-  // Creates the database on the server
-  this.createDb = function() {
-    this.last_req = this.request("PUT", this.uri);
-    CouchDB.maybeThrowError(this.last_req);
-    return JSON.parse(this.last_req.responseText);
-  };
-
-  // Deletes the database on the server
-  this.deleteDb = function() {
-    this.last_req = this.request("DELETE", this.uri + "?sync=true");
-    if (this.last_req.status == 404) {
-      return false;
-    }
-    CouchDB.maybeThrowError(this.last_req);
-    return JSON.parse(this.last_req.responseText);
-  };
-
-  // Save a document to the database
-  this.save = function(doc, options, http_headers) {
-    if (doc._id == undefined) {
-      doc._id = CouchDB.newUuids(1)[0];
-    }
-    http_headers = http_headers || {};
-    this.last_req = this.request("PUT", this.uri  +
-        encodeURIComponent(doc._id) + encodeOptions(options),
-        {body: JSON.stringify(doc), headers: http_headers});
-    CouchDB.maybeThrowError(this.last_req);
-    var result = JSON.parse(this.last_req.responseText);
-    doc._rev = result.rev;
-    return result;
-  };
-
-  // Open a document from the database
-  this.open = function(docId, url_params, http_headers) {
-    this.last_req = this.request("GET", this.uri + encodeURIComponent(docId)
-      + encodeOptions(url_params), {headers:http_headers});
-    if (this.last_req.status == 404) {
-      return null;
-    }
-    CouchDB.maybeThrowError(this.last_req);
-    return JSON.parse(this.last_req.responseText);
-  };
-
-  // Deletes a document from the database
-  this.deleteDoc = function(doc) {
-    this.last_req = this.request("DELETE", this.uri + encodeURIComponent(doc._id)
-      + "?rev=" + doc._rev);
-    CouchDB.maybeThrowError(this.last_req);
-    var result = JSON.parse(this.last_req.responseText);
-    doc._rev = result.rev; //record rev in input document
-    doc._deleted = true;
-    return result;
-  };
-
-  // Deletes an attachment from a document
-  this.deleteDocAttachment = function(doc, attachment_name) {
-    this.last_req = this.request("DELETE", this.uri + encodeURIComponent(doc._id)
-      + "/" + attachment_name + "?rev=" + doc._rev);
-    CouchDB.maybeThrowError(this.last_req);
-    var result = JSON.parse(this.last_req.responseText);
-    doc._rev = result.rev; //record rev in input document
-    return result;
-  };
-
-  this.bulkSave = function(docs, options) {
-    // first prepoulate the UUIDs for new documents
-    var newCount = 0;
-    for (var i=0; i<docs.length; i++) {
-      if (docs[i]._id == undefined) {
-        newCount++;
-      }
-    }
-    var newUuids = CouchDB.newUuids(newCount);
-    var newCount = 0;
-    for (var i=0; i<docs.length; i++) {
-      if (docs[i]._id == undefined) {
-        docs[i]._id = newUuids.pop();
-      }
-    }
-    var json = {"docs": docs};
-    // put any options in the json
-    for (var option in options) {
-      json[option] = options[option];
-    }
-    this.last_req = this.request("POST", this.uri + "_bulk_docs", {
-      body: JSON.stringify(json)
-    });
-    if (this.last_req.status == 417) {
-      return {errors: JSON.parse(this.last_req.responseText)};
-    }
-    else {
-      CouchDB.maybeThrowError(this.last_req);
-      var results = JSON.parse(this.last_req.responseText);
-      for (var i = 0; i < docs.length; i++) {
-        if(results[i] && results[i].rev && results[i].ok) {
-          docs[i]._rev = results[i].rev;
-        }
-      }
-      return results;
-    }
-  };
-
-  this.ensureFullCommit = function() {
-    this.last_req = this.request("POST", this.uri + "_ensure_full_commit");
-    CouchDB.maybeThrowError(this.last_req);
-    return JSON.parse(this.last_req.responseText);
-  };
-
-  // Applies the map function to the contents of database and returns the results.
-  this.query = function(mapFun, reduceFun, options, keys, language) {
-    //var body = {language: language || "javascript"};
-    var body = {}
-    if(keys) {
-      options.keys = keys ;
-    }
-    if (typeof(mapFun) != "string") {
-      mapFun = mapFun.toSource ? mapFun.toSource() : "(" + mapFun.toString() + ")";
-    }
-    if ((!language) || language.toLowerCase() == "javascript") {
-      mapFun = mapFun + "/" + "* avoid race cond " + (new Date().getTime()) + " *" + "/";
-    }
-    body.map = mapFun;
-    if (reduceFun != null) {
-      if (typeof(reduceFun) != "string") {
-        reduceFun = reduceFun.toSource ?
-          reduceFun.toSource() : "(" + reduceFun.toString() + ")";
-      }
-      body.reduce = reduceFun;
-    }
-    if (options && options.options != undefined) {
-        body.options = options.options;
-        delete options.options;
-    }
-    var ddoc = {
-      language: language || "javascript",
-      views: {
-        view: body
-      }
-    };
-    var ddoc_name = "_design/temp_" + get_random_string();
-    this.last_req = this.request("PUT", this.uri + ddoc_name, {
-      headers: {"Content-Type": "application/json"},
-      body: JSON.stringify(ddoc)
-    });
-    CouchDB.maybeThrowError(this.last_req);
-    var ddoc_result = JSON.parse(this.last_req.responseText)
-    this.last_req = this.request("GET", this.uri + ddoc_name + "/_view/view"
-      + encodeOptions(options));
-    CouchDB.maybeThrowError(this.last_req);
-    var query_result = JSON.parse(this.last_req.responseText);
-    var res = this.request("DELETE", this.uri + ddoc_name + '?rev=' + ddoc_result.rev);
-
-    return query_result;
-  };
-
-  this.view = function(viewname, options, keys) {
-    var viewParts = viewname.split('/');
-    var viewPath = this.uri + "_design/" + viewParts[0] + "/_view/"
-        + viewParts[1] + encodeOptions(options);
-    if(!keys) {
-      this.last_req = this.request("GET", viewPath);
-    } else {
-      this.last_req = this.request("POST", viewPath, {
-        headers: {"Content-Type": "application/json"},
-        body: JSON.stringify({keys:keys})
-      });
-    }
-    if (this.last_req.status == 404) {
-      return null;
-    }
-    CouchDB.maybeThrowError(this.last_req);
-    return JSON.parse(this.last_req.responseText);
-  };
-
-  // gets information about the database
-  this.info = function() {
-    this.last_req = this.request("GET", this.uri);
-    CouchDB.maybeThrowError(this.last_req);
-    return JSON.parse(this.last_req.responseText);
-  };
-
-  // gets information about a design doc
-  this.designInfo = function(docid) {
-    this.last_req = this.request("GET", this.uri + docid + "/_info");
-    CouchDB.maybeThrowError(this.last_req);
-    return JSON.parse(this.last_req.responseText);
-  };
-
-  this.allDocs = function(options,keys) {
-    if(!keys) {
-      this.last_req = this.request("GET", this.uri + "_all_docs"
-        + encodeOptions(options));
-    } else {
-      this.last_req = this.request("POST", this.uri + "_all_docs"
-        + encodeOptions(options), {
-        headers: {"Content-Type": "application/json"},
-        body: JSON.stringify({keys:keys})
-      });
-    }
-    CouchDB.maybeThrowError(this.last_req);
-    return JSON.parse(this.last_req.responseText);
-  };
-
-  this.designDocs = function() {
-    return this.allDocs({startkey:"_design", endkey:"_design0"});
-  };
-
-  this.changes = function(options) {
-    this.last_req = this.request("GET", this.uri + "_changes"
-      + encodeOptions(options));
-    CouchDB.maybeThrowError(this.last_req);
-    return JSON.parse(this.last_req.responseText);
-  };
-
-  this.compact = function() {
-    this.last_req = this.request("POST", this.uri + "_compact");
-    CouchDB.maybeThrowError(this.last_req);
-    return JSON.parse(this.last_req.responseText);
-  };
-
-  this.viewCleanup = function() {
-    this.last_req = this.request("POST", this.uri + "_view_cleanup");
-    CouchDB.maybeThrowError(this.last_req);
-    return JSON.parse(this.last_req.responseText);
-  };
-
-  this.setDbProperty = function(propId, propValue) {
-    this.last_req = this.request("PUT", this.uri + propId,{
-      body:JSON.stringify(propValue)
-    });
-    CouchDB.maybeThrowError(this.last_req);
-    return JSON.parse(this.last_req.responseText);
-  };
-
-  this.getDbProperty = function(propId) {
-    this.last_req = this.request("GET", this.uri + propId);
-    CouchDB.maybeThrowError(this.last_req);
-    return JSON.parse(this.last_req.responseText);
-  };
-
-  this.setSecObj = function(secObj) {
-    this.last_req = this.request("PUT", this.uri + "_security",{
-      body:JSON.stringify(secObj)
-    });
-    CouchDB.maybeThrowError(this.last_req);
-    return JSON.parse(this.last_req.responseText);
-  };
-
-  this.getSecObj = function() {
-    this.last_req = this.request("GET", this.uri + "_security");
-    CouchDB.maybeThrowError(this.last_req);
-    return JSON.parse(this.last_req.responseText);
-  };
-
-  // Convert a options object to an url query string.
-  // ex: {key:'value',key2:'value2'} becomes '?key="value"&key2="value2"'
-  function encodeOptions(options) {
-    var buf = [];
-    if (typeof(options) == "object" && options !== null) {
-      for (var name in options) {
-        if (!options.hasOwnProperty(name)) { continue; };
-        var value = options[name];
-        if (name == "key" || name == "keys" || name == "startkey" || name == "endkey" || (name == "open_revs" && value !== "all")) {
-          value = toJSON(value);
-        }
-        buf.push(encodeURIComponent(name) + "=" + encodeURIComponent(value));
-      }
-    }
-    if (!buf.length) {
-      return "";
-    }
-    return "?" + buf.join("&");
-  }
-
-  function toJSON(obj) {
-    return obj !== null ? JSON.stringify(obj) : null;
-  }
-
-  function combine(object1, object2) {
-    if (!object2) {
-      return object1;
-    }
-    if (!object1) {
-      return object2;
-    }
-
-    for (var name in object2) {
-      object1[name] = object2[name];
-    }
-    return object1;
-  }
-
-}
-
-// this is the XMLHttpRequest object from last request made by the following
-// CouchDB.* functions (except for calls to request itself).
-// Use this from callers to check HTTP status or header values of requests.
-CouchDB.last_req = null;
-CouchDB.urlPrefix = '';
-
-CouchDB.login = function(name, password) {
-  CouchDB.last_req = CouchDB.request("POST", "/_session", {
-    headers: {"Content-Type": "application/x-www-form-urlencoded",
-      "X-CouchDB-WWW-Authenticate": "Cookie"},
-    body: "name=" + encodeURIComponent(name) + "&password="
-      + encodeURIComponent(password)
-  });
-  return JSON.parse(CouchDB.last_req.responseText);
-}
-
-CouchDB.logout = function() {
-  CouchDB.last_req = CouchDB.request("DELETE", "/_session", {
-    headers: {"Content-Type": "application/x-www-form-urlencoded",
-      "X-CouchDB-WWW-Authenticate": "Cookie"}
-  });
-  return JSON.parse(CouchDB.last_req.responseText);
-};
-
-CouchDB.session = function(options) {
-  options = options || {};
-  CouchDB.last_req = CouchDB.request("GET", "/_session", options);
-  CouchDB.maybeThrowError(CouchDB.last_req);
-  return JSON.parse(CouchDB.last_req.responseText);
-};
-
-CouchDB.allDbs = function() {
-  CouchDB.last_req = CouchDB.request("GET", "/_all_dbs");
-  CouchDB.maybeThrowError(CouchDB.last_req);
-  return JSON.parse(CouchDB.last_req.responseText);
-};
-
-CouchDB.allDesignDocs = function() {
-  var ddocs = {}, dbs = CouchDB.allDbs();
-  for (var i=0; i < dbs.length; i++) {
-    var db = new CouchDB(dbs[i]);
-    ddocs[dbs[i]] = db.designDocs();
-  };
-  return ddocs;
-};
-
-CouchDB.getVersion = function() {
-  CouchDB.last_req = CouchDB.request("GET", "/");
-  CouchDB.maybeThrowError(CouchDB.last_req);
-  return JSON.parse(CouchDB.last_req.responseText).version;
-};
-
-CouchDB.reloadConfig = function() {
-  // diabled until cluser port gets /_config
-  return {};
-  CouchDB.last_req = CouchDB.request("POST", "/_config/_reload");
-  CouchDB.maybeThrowError(CouchDB.last_req);
-  return JSON.parse(CouchDB.last_req.responseText);
-};
-
-CouchDB.replicate = function(source, target, rep_options) {
-  rep_options = rep_options || {};
-  var headers = rep_options.headers || {};
-  var body = rep_options.body || {};
-  body.source = source;
-  body.target = target;
-  CouchDB.last_req = CouchDB.request("POST", "/_replicate", {
-    headers: headers,
-    body: JSON.stringify(body)
-  });
-  CouchDB.maybeThrowError(CouchDB.last_req);
-  return JSON.parse(CouchDB.last_req.responseText);
-};
-
-CouchDB.newXhr = function() {
-  if (typeof(XMLHttpRequest) != "undefined") {
-    return new XMLHttpRequest();
-  } else if (typeof(ActiveXObject) != "undefined") {
-    return new ActiveXObject("Microsoft.XMLHTTP");
-  } else {
-    throw new Error("No XMLHTTPRequest support detected");
-  }
-};
-
-CouchDB.xhrbody = function(xhr) {
-  if (xhr.responseText) {
-    return xhr.responseText;
-  } else if (xhr.body) {
-    return xhr.body
-  } else {
-    throw new Error("No XMLHTTPRequest support detected");
-  }
-}
-
-CouchDB.xhrheader = function(xhr, header) {
-  if(xhr.getResponseHeader) {
-    return xhr.getResponseHeader(header);
-  } else if(xhr.headers) {
-    return xhr.headers[header] || null;
-  } else {
-    throw new Error("No XMLHTTPRequest support detected");
-  }
-}
-
-CouchDB.proxyUrl = function(uri) {
-  if(uri.substr(0, CouchDB.protocol.length) != CouchDB.protocol) {
-    uri = CouchDB.urlPrefix + uri;
-  }
-  return uri;
-}
-
-CouchDB.request = function(method, uri, options) {
-  options = typeof(options) == 'object' ? options : {};
-  options.headers = typeof(options.headers) == 'object' ? options.headers : {};
-  options.headers["Content-Type"] = options.headers["Content-Type"] || options.headers["content-type"] || "application/json";
-  options.headers["Accept"] = options.headers["Accept"] || options.headers["accept"] || "application/json";
-  var req = CouchDB.newXhr();
-  uri = CouchDB.proxyUrl(uri);
-
-  if (options.url) {
-    var params = '';
-    for (var key in options.url) {
-      var value = options.url[key]
-      params += key + '=' + value + '&'
-    }
-    // if uri already has a ? append with &
-    if (uri.indexOf('?') === -1) {
-      uri += '?' + params;
-    } else {
-      uri += '&' + params;
-    }
-  }
-  // console.log(uri);
-  // console.log(JSON.stringify(options, null, 2));
-  req.open(method, uri, false);
-  if (options.headers) {
-    var headers = options.headers;
-    for (var headerName in headers) {
-      if (!headers.hasOwnProperty(headerName)) { continue; }
-      req.setRequestHeader(headerName, headers[headerName]);
-    }
-  }
-  req.send(options.body || "");
-  return req;
-};
-
-CouchDB.requestStats = function(path, test) {
-  var query_arg = "";
-  if(test !== null) {
-    query_arg = "?flush=true";
-  }
-
-  var url = "/_node/_local/_stats/" + path.join("/") + query_arg;
-  var stat = CouchDB.request("GET", url).responseText;
-  return JSON.parse(stat);
-};
-
-CouchDB.uuids_cache = [];
-
-CouchDB.newUuids = function(n, buf) {
-  buf = buf || 100;
-  if (CouchDB.uuids_cache.length >= n) {
-    var uuids = CouchDB.uuids_cache.slice(CouchDB.uuids_cache.length - n);
-    if(CouchDB.uuids_cache.length - n == 0) {
-      CouchDB.uuids_cache = [];
-    } else {
-      CouchDB.uuids_cache =
-          CouchDB.uuids_cache.slice(0, CouchDB.uuids_cache.length - n);
-    }
-    return uuids;
-  } else {
-    CouchDB.last_req = CouchDB.request("GET", "/_uuids?count=" + (buf + n));
-    CouchDB.maybeThrowError(CouchDB.last_req);
-    var result = JSON.parse(CouchDB.last_req.responseText);
-    CouchDB.uuids_cache =
-        CouchDB.uuids_cache.concat(result.uuids.slice(0, buf));
-    return result.uuids.slice(buf);
-  }
-};
-
-CouchDB.maybeThrowError = function(req) {
-  if (req.status >= 400) {
-    try {
-      var result = JSON.parse(req.responseText);
-    } catch (ParseError) {
-      var result = {error:"unknown", reason:req.responseText};
-    }
-
-    throw (new CouchError(result));
-  }
-}
-
-CouchDB.params = function(options) {
-  options = options || {};
-  var returnArray = [];
-  for(var key in options) {
-    var value = options[key];
-    returnArray.push(key + "=" + value);
-  }
-  return returnArray.join("&");
-};
-// Used by replication test
-if (typeof window == 'undefined' || !window) {
-  var hostRE = RegExp("https?://([^\/]+)");
-  var getter = function () {
-    return (new CouchHTTP).base_url.match(hostRE)[1];
-  };
-  if(Object.defineProperty) {
-    Object.defineProperty(CouchDB, "host", {
-      get : getter,
-      enumerable : true
-    });
-  } else {
-    CouchDB.__defineGetter__("host", getter);
-  }
-  CouchDB.protocol = "http://";
-  CouchDB.inBrowser = false;
-} else {
-  CouchDB.host = window.location.host;
-  CouchDB.inBrowser = true;
-  CouchDB.protocol = window.location.protocol + "//";
-}
-
-// Turns an {error: ..., reason: ...} response into an Error instance
-function CouchError(error) {
-  var inst = new Error(error.reason);
-  inst.name = 'CouchError';
-  inst.error = error.error;
-  inst.reason = error.reason;
-  return inst;
-}
-CouchError.prototype.constructor = CouchError;
diff --git a/test/javascript/couch_http.js b/test/javascript/couch_http.js
deleted file mode 100644
index c44ce28..0000000
--- a/test/javascript/couch_http.js
+++ /dev/null
@@ -1,73 +0,0 @@
-// Licensed under the Apache License, Version 2.0 (the "License"); you may not
-// use this file except in compliance with the License. You may obtain a copy of
-// the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-// License for the specific language governing permissions and limitations under
-// the License.
-
-(function() {
-  if(typeof(CouchHTTP) != "undefined") {
-    CouchHTTP.prototype.open = function(method, url, async) {
-      if(!/^\s*http:\/\//.test(url)) {
-        if(/^\//.test(url)) {
-          // The couch.uri file (base_url) has a trailing slash
-          url = this.base_url + url.slice(1);
-        } else {
-          url = this.base_url + url;
-        }
-      }
-      
-      return this._open(method, url, async);
-    };
-    
-    CouchHTTP.prototype.setRequestHeader = function(name, value) {
-      // Drop content-length headers because cURL will set it for us
-      // based on body length
-      if(name.toLowerCase().replace(/^\s+|\s+$/g, '') != "content-length") {
-        this._setRequestHeader(name, value);
-      }
-    }
-    
-    CouchHTTP.prototype.send = function(body) {
-      this._send(body || "");
-      var headers = {};
-      this._headers.forEach(function(hdr) {
-          var pair = hdr.split(":");
-          var name = pair.shift();
-          headers[name] = pair.join(":").replace(/^\s+|\s+$/g, "");
-      });
-      this.headers = headers;
-    };
-
-    CouchHTTP.prototype.getResponseHeader = function(name) {
-      for(var hdr in this.headers) {
-        if(hdr.toLowerCase() == name.toLowerCase()) {
-          return this.headers[hdr];
-        }
-      }
-      return null;
-    };
-  }
-})();
-
-CouchDB.urlPrefix = "";
-CouchDB.newXhr = function() {
-  return new CouchHTTP();
-};
-
-CouchDB.xhrheader = function(xhr, header) {
-  if(typeof(xhr) == "CouchHTTP") {
-    return xhr.getResponseHeader(header);
-  } else {
-    return xhr.headers[header];
-  }
-}
-
-CouchDB.xhrbody = function(xhr) {
-  return xhr.responseText || xhr.body;
-}
diff --git a/test/javascript/couch_test_runner.js b/test/javascript/couch_test_runner.js
deleted file mode 100644
index 7fe8ed3..0000000
--- a/test/javascript/couch_test_runner.js
+++ /dev/null
@@ -1,489 +0,0 @@
-// Licensed under the Apache License, Version 2.0 (the "License"); you may not
-// use this file except in compliance with the License. You may obtain a copy of
-// the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-// License for the specific language governing permissions and limitations under
-// the License.
-
-// *********************** Test Framework of Sorts ************************* //
-
-
-function loadScript(url) {
-  // disallow loading remote URLs
-  var re = /^[a-z0-9_]+(\/[a-z0-9_]+)*\.js#?$/;
-  if (!re.test(url)) {
-      throw "Not loading remote test scripts";
-  }
-  if (typeof document != "undefined") document.write('<script src="'+url+'"></script>');
-};
-
-function patchTest(fun) {
-  var source = fun.toString();
-  var output = "";
-  var i = 0;
-  var testMarker = "T(";
-  while (i < source.length) {
-    var testStart = source.indexOf(testMarker, i);
-    if (testStart == -1) {
-      output = output + source.substring(i, source.length);
-      break;
-    }
-    var testEnd = source.indexOf(");", testStart);
-    var testCode = source.substring(testStart + testMarker.length, testEnd);
-    output += source.substring(i, testStart) + "T(" + testCode + "," + JSON.stringify(testCode);
-    i = testEnd;
-  }
-  try {
-    return eval("(" + output + ")");
-  } catch (e) {
-    return null;
-  }
-}
-
-function runAllTests() {
-  var rows = $("#tests tbody.content tr");
-  $("td", rows).text("");
-  $("td.status", rows).removeClass("error").removeClass("failure").removeClass("success").text("not run");
-  var offset = 0;
-  function runNext() {
-    if (offset < rows.length) {
-      var row = rows.get(offset);
-      runTest($("th button", row).get(0), function() {
-        offset += 1;
-        setTimeout(runNext, 100);
-      }, false, true);
-    } else {
-      saveTestReport();
-    }
-  }
-  runNext();
-}
-
-var numFailures = 0;
-var currentRow = null;
-
-function runTest(button, callback, debug, noSave) {
-
-  // offer to save admins
-  if (currentRow != null) {
-    alert("Can not run multiple tests simultaneously.");
-    return;
-  }
-  var row = currentRow = $(button).parents("tr").get(0);
-  $("td.status", row).removeClass("error").removeClass("failure").removeClass("success");
-  $("td", row).text("");
-  $("#toolbar li.current").text("Running: "+row.id);
-  var testFun = couchTests[row.id];
-  function run() {
-    numFailures = 0;
-    var start = new Date().getTime();
-    try {
-      if (debug == undefined || !debug) {
-        testFun = patchTest(testFun) || testFun;
-      }
-      testFun(debug);
-      var status = numFailures > 0 ? "failure" : "success";
-    } catch (e) {
-      var status = "error";
-      if ($("td.details ol", row).length == 0) {
-        $("<ol></ol>").appendTo($("td.details", row));
-      }
-      $("<li><b>Exception raised:</b> <code class='error'></code></li>")
-        .find("code").text(JSON.stringify(e)).end()
-        .appendTo($("td.details ol", row));
-      if (debug) {
-        currentRow = null;
-        throw e;
-      }
-    }
-    if ($("td.details ol", row).length) {
-      $("<a href='#'>Run with debugger</a>").click(function() {
-        runTest(this, undefined, true);
-      }).prependTo($("td.details ol", row));
-    }
-    var duration = new Date().getTime() - start;
-    $("td.status", row).removeClass("running").addClass(status).text(status);
-    $("td.duration", row).text(duration + "ms");
-    $("#toolbar li.current").text("Finished: "+row.id);
-    updateTestsFooter();
-    currentRow = null;
-    if (callback) callback();
-    if (!noSave) saveTestReport();
-  }
-  $("td.status", row).addClass("running").text("running…");
-  setTimeout(run, 100);
-}
-
-function showSource(cell) {
-  var name = $(cell).text();
-  var win = window.open("", name, "width=700,height=500,resizable=yes,scrollbars=yes");
-  win.document.location = "script/test/" + name + ".js";
-}
-
-var readyToRun;
-function setupAdminParty(fun) {
-  if (readyToRun) {
-    fun();
-  } else {
-    function removeAdmins(confs, doneFun) {
-      // iterate through the config and remove current user last
-      // current user is at front of list
-      var remove = confs.pop();
-      if (remove) {
-        $.couch.config({
-          success : function() {
-            removeAdmins(confs, doneFun);
-          }
-        }, "admins", remove[0], null);
-      } else {
-        doneFun();
-      }
-    };
-    $.couch.session({
-      success : function(resp) {
-        var userCtx = resp.userCtx;
-        if (userCtx.name && userCtx.roles.indexOf("_admin") != -1) {
-          // admin but not admin party. dialog offering to make admin party
-          $.showDialog("dialog/_admin_party.html", {
-            submit: function(data, callback) {
-              $.couch.config({
-                success : function(conf) {
-                  var meAdmin, adminConfs = [];
-                  for (var name in conf) {
-                    if (name == userCtx.name) {
-                      meAdmin = [name, conf[name]];
-                    } else {
-                      adminConfs.push([name, conf[name]]);
-                    }
-                  }
-                  adminConfs.unshift(meAdmin);
-                  removeAdmins(adminConfs, function() {
-                    callback();
-                    $.futon.session.sidebar();
-                    readyToRun = true;
-                    setTimeout(fun, 500);
-                  });
-                }
-              }, "admins");
-            }
-          });
-        } else if (userCtx.roles.indexOf("_admin") != -1) {
-          // admin party!
-          readyToRun = true;
-          fun();
-        } else {
-          // not an admin
-          alert("Error: You need to be an admin to run the tests.");
-        };
-      }
-    });
-  }
-};
-
-function updateTestsListing() {
-  for (var name in couchTests) {
-    var testFunction = couchTests[name];
-    var row = $("<tr><th></th><td></td><td></td><td></td></tr>")
-      .find("th").text(name).attr("title", "Show source").click(function() {
-        showSource(this);
-      }).end()
-      .find("td:nth(0)").addClass("status").text("not run").end()
-      .find("td:nth(1)").addClass("duration").end()
-      .find("td:nth(2)").addClass("details").end();
-    $("<button type='button' class='run' title='Run test'></button>").click(function() {
-      this.blur();
-      var self = this;
-      // check for admin party
-      setupAdminParty(function() {
-        runTest(self);
-      });
-      return false;
-    }).prependTo(row.find("th"));
-    row.attr("id", name).appendTo("#tests tbody.content");
-  }
-  $("#tests tr").removeClass("odd").filter(":odd").addClass("odd");
-  updateTestsFooter();
-}
-
-function updateTestsFooter() {
-  var tests = $("#tests tbody.content tr td.status");
-  var testsRun = tests.filter(".success, .error, .failure");
-  var testsFailed = testsRun.not(".success");
-  var totalDuration = 0;
-  $("#tests tbody.content tr td.duration:contains('ms')").each(function() {
-    var text = $(this).text();
-    totalDuration += parseInt(text.substr(0, text.length - 2), 10);
-  });
-  $("#tests tbody.footer td").html("<span>"+testsRun.length + " of " + tests.length +
-    " test(s) run, " + testsFailed.length + " failures (" +
-    totalDuration + " ms)</span> ");
-}
-
-// make report and save to local db
-// display how many reports need replicating to the mothership
-// have button to replicate them
-
-function saveTestReport(report) {
-  var report = makeTestReport();
-  if (report) {
-    var db = $.couch.db("test_suite_reports");
-    var saveReport = function(db_info) {
-      report.db = db_info;
-      $.couch.info({success : function(node_info) {
-        report.node = node_info;
-        db.saveDoc(report);
-      }});
-    };
-    var createDb = function() {
-      db.create({success: function() {
-        db.info({success:saveReport});
-      }});
-    };
-    db.info({error: createDb, success:saveReport});
-  }
-};
-
-function makeTestReport() {
-  var report = {};
-  report.summary = $("#tests tbody.footer td").text();
-  report.platform = testPlatform();
-  var date = new Date();
-  report.timestamp = date.getTime();
-  report.timezone = date.getTimezoneOffset();
-  report.tests = [];
-  $("#tests tbody.content tr").each(function() {
-    var status = $("td.status", this).text();
-    if (status != "not run") {
-      var test = {};
-      test.name = this.id;
-      test.status = status;
-      test.duration = parseInt($("td.duration", this).text());
-      test.details = [];
-      $("td.details li", this).each(function() {
-        test.details.push($(this).text());
-      });
-      if (test.details.length == 0) {
-        delete test.details;
-      }
-      report.tests.push(test);
-    }
-  });
-  if (report.tests.length > 0) return report;
-};
-
-function testPlatform() {
-  var b = $.browser;
-  var bs = ["mozilla", "msie", "opera", "safari"];
-  for (var i=0; i < bs.length; i++) {
-    if (b[bs[i]]) {
-      return {"browser" : bs[i], "version" : b.version};
-    }
-  };
-  return {"browser" : "undetected"};
-}
-
-
-function reportTests() {
-  // replicate the database to couchdb.couchdb.org
-}
-
-// Use T to perform a test that returns false on failure and if the test fails,
-// display the line that failed.
-// Example:
-// T(MyValue==1);
-function T(arg1, arg2, testName) {
-  if (!arg1) {
-    if (currentRow) {
-      if ($("td.details ol", currentRow).length == 0) {
-        $("<ol></ol>").appendTo($("td.details", currentRow));
-      }
-      var message = (arg2 != null ? arg2 : arg1).toString();
-      $("<li><b>Assertion " + (testName ? "'" + testName + "'" : "") + " failed:</b> <code class='failure'></code></li>")
-        .find("code").text(message).end()
-        .appendTo($("td.details ol", currentRow));
-    }
-    numFailures += 1;
-  }
-}
-
-function TIsnull(actual, testName) {
-  T(actual === null, "expected 'null', got '"
-    + repr(actual) + "'", testName);
-}
-
-function TEquals(expected, actual, testName) {
-  T(equals(expected, actual), "expected '" + repr(expected) +
-    "', got '" + repr(actual) + "'", testName);
-}
-
-function TNotEquals(expected, actual, testName) {
-  T(notEquals(expected, actual), "expected != '" + repr(expected) +
-    "', got '" + repr(actual) + "'", testName);
-}
-
-function TEqualsIgnoreCase(expected, actual, testName) {
-  T(equals(expected.toUpperCase(), actual.toUpperCase()), "expected '" + repr(expected) +
-    "', got '" + repr(actual) + "'", testName);
-}
-
-function equals(a,b) {
-  if (a === b) return true;
-  try {
-    return repr(a) === repr(b);
-  } catch (e) {
-    return false;
-  }
-}
-
-function notEquals(a,b) {
-  if (a != b) return true;
-  return false;
-}
-
-function repr(val) {
-  if (val === undefined) {
-    return null;
-  } else if (val === null) {
-    return "null";
-  } else {
-    return JSON.stringify(val);
-  }
-}
-
-function makeDocs(start, end, templateDoc) {
-  var templateDocSrc = templateDoc ? JSON.stringify(templateDoc) : "{}";
-  if (end === undefined) {
-    end = start;
-    start = 0;
-  }
-  var docs = [];
-  for (var i = start; i < end; i++) {
-    var newDoc = eval("(" + templateDocSrc + ")");
-    newDoc._id = (i).toString();
-    newDoc.integer = i;
-    newDoc.string = (i).toString();
-    docs.push(newDoc);
-  }
-  return docs;
-}
-
-function run_on_modified_server(settings, fun) {
-  var xhr = CouchDB.request("GET", "/_membership");
-  var nodes = JSON.parse(xhr.responseText).all_nodes;
-  try {
-    // set the settings
-    for(var i=0; i < settings.length; i++) {
-      var s = settings[i];
-      for (var n in nodes) {
-        xhr = CouchDB.request("PUT", "/_node/" + nodes[n] + "/_config/" + s.section + "/" + s.key, {
-          body: JSON.stringify(s.value),
-          headers: {"X-Couch-Persist": "false"}
-        });
-        CouchDB.maybeThrowError(xhr);
-        if (typeof s[nodes[n]] === 'undefined') {
-          s[nodes[n]] = {};
-        }
-        s[nodes[n]] = xhr.responseText;
-      }
-    }
-    // run the thing
-    fun();
-  } finally {
-    // unset the settings
-    for(var j=0; j < i; j++) {
-      for (var n in nodes) {
-        var s = settings[j];
-        if(s[nodes[n]] == "\"\"\n") { // unset value
-          CouchDB.request("DELETE", "/_node/" + nodes[n] + "/_config/" + s.section + "/" + s.key, {
-            headers: {"X-Couch-Persist": "false"}
-          });
-        } else {
-          CouchDB.request("PUT", "/_node/" + nodes[n] + "/_config/" + s.section + "/" + s.key, {
-            body: s[nodes[n]],
-            headers: {"X-Couch-Persist": "false"}
-          });
-        }
-      }
-    }
-  }
-}
-
-function stringFun(fun) {
-  var string = fun.toSource ? fun.toSource() : "(" + fun.toString() + ")";
-  return string;
-}
-
-function waitForSuccess(fun, tag) {
-  var start = new Date();
-  while(true) {
-    if (new Date() - start > 5000) {
-      throw("timeout: "+tag);
-    } else {
-      try {
-        fun();
-        break;
-      } catch (e) {
-        log(e)
-      }
-      // sync http req allow async req to happen
-      try {
-        CouchDB.request("GET", "/test_suite_db/?tag="+encodeURIComponent(tag));
-      } catch (e) {}
-    }
-  }
-}
-
-// legacy functions for CouchDB < 1.2.0
-// we keep them to make sure we keep BC
-CouchDB.user_prefix = "org.couchdb.user:";
-
-CouchDB.prepareUserDoc = function(user_doc, new_password) {
-  user_doc._id = user_doc._id || CouchDB.user_prefix + user_doc.name;
-  if (new_password) {
-    user_doc.password = new_password;
-  }
-  user_doc.type = "user";
-  if (!user_doc.roles) {
-    user_doc.roles = [];
-  }
-  return user_doc;
-};
-
-function get_random_string() {
-  return Math.random()
-    .toString(36)
-    .replace(/[^a-z]+/g, '')
-    .substr(0, 8);
-}
-
-function get_random_db_name() {
-  return "test_suite_db_" + get_random_string()
-}
-
-// for Heisenbug-prone spots: retry n times (e.g. quora not met immediately)
-// if the problem still persists afterwards, we need sth else (similar to e.g. webdriver)
-function retry_part(fct, n, duration) {
-  n = n || 3;
-  duration = (duration == undefined ? 100 : duration);
-  for(var i=1; i<=n; i++){
-    try {
-      return fct();
-    }catch(e){
-      if(i<n){
-        // wait
-        sleep(duration);
-      }else{
-        throw e;
-      }
-    }
-  }
-}
-
-function wait(ms) {
-  sleep(ms);
-}
diff --git a/test/javascript/couchdb.uri b/test/javascript/couchdb.uri
deleted file mode 100644
index 99c8819..0000000
--- a/test/javascript/couchdb.uri
+++ /dev/null
@@ -1 +0,0 @@
-http://127.0.0.1:15984/
diff --git a/test/javascript/json2.js b/test/javascript/json2.js
deleted file mode 100644
index a1a3b17..0000000
--- a/test/javascript/json2.js
+++ /dev/null
@@ -1,482 +0,0 @@
-/*
-    http://www.JSON.org/json2.js
-    2010-03-20
-
-    Public Domain.
-
-    NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.
-
-    See http://www.JSON.org/js.html
-
-
-    This code should be minified before deployment.
-    See http://javascript.crockford.com/jsmin.html
-
-    USE YOUR OWN COPY. IT IS EXTREMELY UNWISE TO LOAD CODE FROM SERVERS YOU DO
-    NOT CONTROL.
-
-
-    This file creates a global JSON object containing two methods: stringify
-    and parse.
-
-        JSON.stringify(value, replacer, space)
-            value       any JavaScript value, usually an object or array.
-
-            replacer    an optional parameter that determines how object
-                        values are stringified for objects. It can be a
-                        function or an array of strings.
-
-            space       an optional parameter that specifies the indentation
-                        of nested structures. If it is omitted, the text will
-                        be packed without extra whitespace. If it is a number,
-                        it will specify the number of spaces to indent at each
-                        level. If it is a string (such as '\t' or '&nbsp;'),
-                        it contains the characters used to indent at each level.
-
-            This method produces a JSON text from a JavaScript value.
-
-            When an object value is found, if the object contains a toJSON
-            method, its toJSON method will be called and the result will be
-            stringified. A toJSON method does not serialize: it returns the
-            value represented by the name/value pair that should be serialized,
-            or undefined if nothing should be serialized. The toJSON method
-            will be passed the key associated with the value, and this will be
-            bound to the value
-
-            For example, this would serialize Dates as ISO strings.
-
-                Date.prototype.toJSON = function (key) {
-                    function f(n) {
-                        // Format integers to have at least two digits.
-                        return n < 10 ? '0' + n : n;
-                    }
-
-                    return this.getUTCFullYear()   + '-' +
-                         f(this.getUTCMonth() + 1) + '-' +
-                         f(this.getUTCDate())      + 'T' +
-                         f(this.getUTCHours())     + ':' +
-                         f(this.getUTCMinutes())   + ':' +
-                         f(this.getUTCSeconds())   + 'Z';
-                };
-
-            You can provide an optional replacer method. It will be passed the
-            key and value of each member, with this bound to the containing
-            object. The value that is returned from your method will be
-            serialized. If your method returns undefined, then the member will
-            be excluded from the serialization.
-
-            If the replacer parameter is an array of strings, then it will be
-            used to select the members to be serialized. It filters the results
-            such that only members with keys listed in the replacer array are
-            stringified.
-
-            Values that do not have JSON representations, such as undefined or
-            functions, will not be serialized. Such values in objects will be
-            dropped; in arrays they will be replaced with null. You can use
-            a replacer function to replace those with JSON values.
-            JSON.stringify(undefined) returns undefined.
-
-            The optional space parameter produces a stringification of the
-            value that is filled with line breaks and indentation to make it
-            easier to read.
-
-            If the space parameter is a non-empty string, then that string will
-            be used for indentation. If the space parameter is a number, then
-            the indentation will be that many spaces.
-
-            Example:
-
-            text = JSON.stringify(['e', {pluribus: 'unum'}]);
-            // text is '["e",{"pluribus":"unum"}]'
-
-
-            text = JSON.stringify(['e', {pluribus: 'unum'}], null, '\t');
-            // text is '[\n\t"e",\n\t{\n\t\t"pluribus": "unum"\n\t}\n]'
-
-            text = JSON.stringify([new Date()], function (key, value) {
-                return this[key] instanceof Date ?
-                    'Date(' + this[key] + ')' : value;
-            });
-            // text is '["Date(---current time---)"]'
-
-
-        JSON.parse(text, reviver)
-            This method parses a JSON text to produce an object or array.
-            It can throw a SyntaxError exception.
-
-            The optional reviver parameter is a function that can filter and
-            transform the results. It receives each of the keys and values,
-            and its return value is used instead of the original value.
-            If it returns what it received, then the structure is not modified.
-            If it returns undefined then the member is deleted.
-
-            Example:
-
-            // Parse the text. Values that look like ISO date strings will
-            // be converted to Date objects.
-
-            myData = JSON.parse(text, function (key, value) {
-                var a;
-                if (typeof value === 'string') {
-                    a =
-/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/.exec(value);
-                    if (a) {
-                        return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4],
-                            +a[5], +a[6]));
-                    }
-                }
-                return value;
-            });
-
-            myData = JSON.parse('["Date(09/09/2001)"]', function (key, value) {
-                var d;
-                if (typeof value === 'string' &&
-                        value.slice(0, 5) === 'Date(' &&
-                        value.slice(-1) === ')') {
-                    d = new Date(value.slice(5, -1));
-                    if (d) {
-                        return d;
-                    }
-                }
-                return value;
-            });
-
-
-    This is a reference implementation. You are free to copy, modify, or
-    redistribute.
-*/
-
-/*jslint evil: true, strict: false */
-
-/*members "", "\b", "\t", "\n", "\f", "\r", "\"", JSON, "\\", apply,
-    call, charCodeAt, getUTCDate, getUTCFullYear, getUTCHours,
-    getUTCMinutes, getUTCMonth, getUTCSeconds, hasOwnProperty, join,
-    lastIndex, length, parse, prototype, push, replace, slice, stringify,
-    test, toJSON, toString, valueOf
-*/
-
-
-// Create a JSON object only if one does not already exist. We create the
-// methods in a closure to avoid creating global variables.
-
-if (!this.JSON) {
-    this.JSON = {};
-}
-
-(function () {
-
-    function f(n) {
-        // Format integers to have at least two digits.
-        return n < 10 ? '0' + n : n;
-    }
-
-    if (typeof Date.prototype.toJSON !== 'function') {
-
-        Date.prototype.toJSON = function (key) {
-
-            return isFinite(this.valueOf()) ?
-                   this.getUTCFullYear()   + '-' +
-                 f(this.getUTCMonth() + 1) + '-' +
-                 f(this.getUTCDate())      + 'T' +
-                 f(this.getUTCHours())     + ':' +
-                 f(this.getUTCMinutes())   + ':' +
-                 f(this.getUTCSeconds())   + 'Z' : null;
-        };
-
-        String.prototype.toJSON =
-        Number.prototype.toJSON =
-        Boolean.prototype.toJSON = function (key) {
-            return this.valueOf();
-        };
-    }
-
-    var cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
-        escapable = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
-        gap,
-        indent,
-        meta = {    // table of character substitutions
-            '\b': '\\b',
-            '\t': '\\t',
-            '\n': '\\n',
-            '\f': '\\f',
-            '\r': '\\r',
-            '"' : '\\"',
-            '\\': '\\\\'
-        },
-        rep;
-
-
-    function quote(string) {
-
-// If the string contains no control characters, no quote characters, and no
-// backslash characters, then we can safely slap some quotes around it.
-// Otherwise we must also replace the offending characters with safe escape
-// sequences.
-
-        escapable.lastIndex = 0;
-        return escapable.test(string) ?
-            '"' + string.replace(escapable, function (a) {
-                var c = meta[a];
-                return typeof c === 'string' ? c :
-                    '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4);
-            }) + '"' :
-            '"' + string + '"';
-    }
-
-
-    function str(key, holder) {
-
-// Produce a string from holder[key].
-
-        var i,          // The loop counter.
-            k,          // The member key.
-            v,          // The member value.
-            length,
-            mind = gap,
-            partial,
-            value = holder[key];
-
-// If the value has a toJSON method, call it to obtain a replacement value.
-
-        if (value && typeof value === 'object' &&
-                typeof value.toJSON === 'function') {
-            value = value.toJSON(key);
-        }
-
-// If we were called with a replacer function, then call the replacer to
-// obtain a replacement value.
-
-        if (typeof rep === 'function') {
-            value = rep.call(holder, key, value);
-        }
-
-// What happens next depends on the value's type.
-
-        switch (typeof value) {
-        case 'string':
-            return quote(value);
-
-        case 'number':
-
-// JSON numbers must be finite. Encode non-finite numbers as null.
-
-            return isFinite(value) ? String(value) : 'null';
-
-        case 'boolean':
-        case 'null':
-
-// If the value is a boolean or null, convert it to a string. Note:
-// typeof null does not produce 'null'. The case is included here in
-// the remote chance that this gets fixed someday.
-
-            return String(value);
-
-// If the type is 'object', we might be dealing with an object or an array or
-// null.
-
-        case 'object':
-
-// Due to a specification blunder in ECMAScript, typeof null is 'object',
-// so watch out for that case.
-
-            if (!value) {
-                return 'null';
-            }
-
-// Make an array to hold the partial results of stringifying this object value.
-
-            gap += indent;
-            partial = [];
-
-// Is the value an array?
-
-            if (Object.prototype.toString.apply(value) === '[object Array]') {
-
-// The value is an array. Stringify every element. Use null as a placeholder
-// for non-JSON values.
-
-                length = value.length;
-                for (i = 0; i < length; i += 1) {
-                    partial[i] = str(i, value) || 'null';
-                }
-
-// Join all of the elements together, separated with commas, and wrap them in
-// brackets.
-
-                v = partial.length === 0 ? '[]' :
-                    gap ? '[\n' + gap +
-                            partial.join(',\n' + gap) + '\n' +
-                                mind + ']' :
-                          '[' + partial.join(',') + ']';
-                gap = mind;
-                return v;
-            }
-
-// If the replacer is an array, use it to select the members to be stringified.
-
-            if (rep && typeof rep === 'object') {
-                length = rep.length;
-                for (i = 0; i < length; i += 1) {
-                    k = rep[i];
-                    if (typeof k === 'string') {
-                        v = str(k, value);
-                        if (v) {
-                            partial.push(quote(k) + (gap ? ': ' : ':') + v);
-                        }
-                    }
-                }
-            } else {
-
-// Otherwise, iterate through all of the keys in the object.
-
-                for (k in value) {
-                    if (Object.hasOwnProperty.call(value, k)) {
-                        v = str(k, value);
-                        if (v) {
-                            partial.push(quote(k) + (gap ? ': ' : ':') + v);
-                        }
-                    }
-                }
-            }
-
-// Join all of the member texts together, separated with commas,
-// and wrap them in braces.
-
-            v = partial.length === 0 ? '{}' :
-                gap ? '{\n' + gap + partial.join(',\n' + gap) + '\n' +
-                        mind + '}' : '{' + partial.join(',') + '}';
-            gap = mind;
-            return v;
-        }
-    }
-
-// If the JSON object does not yet have a stringify method, give it one.
-
-    if (typeof JSON.stringify !== 'function') {
-        JSON.stringify = function (value, replacer, space) {
-
-// The stringify method takes a value and an optional replacer, and an optional
-// space parameter, and returns a JSON text. The replacer can be a function
-// that can replace values, or an array of strings that will select the keys.
-// A default replacer method can be provided. Use of the space parameter can
-// produce text that is more easily readable.
-
-            var i;
-            gap = '';
-            indent = '';
-
-// If the space parameter is a number, make an indent string containing that
-// many spaces.
-
-            if (typeof space === 'number') {
-                for (i = 0; i < space; i += 1) {
-                    indent += ' ';
-                }
-
-// If the space parameter is a string, it will be used as the indent string.
-
-            } else if (typeof space === 'string') {
-                indent = space;
-            }
-
-// If there is a replacer, it must be a function or an array.
-// Otherwise, throw an error.
-
-            rep = replacer;
-            if (replacer && typeof replacer !== 'function' &&
-                    (typeof replacer !== 'object' ||
-                     typeof replacer.length !== 'number')) {
-                throw new Error('JSON.stringify');
-            }
-
-// Make a fake root object containing our value under the key of ''.
-// Return the result of stringifying the value.
-
-            return str('', {'': value});
-        };
-    }
-
-
-// If the JSON object does not yet have a parse method, give it one.
-
-    if (typeof JSON.parse !== 'function') {
-        JSON.parse = function (text, reviver) {
-
-// The parse method takes a text and an optional reviver function, and returns
-// a JavaScript value if the text is a valid JSON text.
-
-            var j;
-
-            function walk(holder, key) {
-
-// The walk method is used to recursively walk the resulting structure so
-// that modifications can be made.
-
-                var k, v, value = holder[key];
-                if (value && typeof value === 'object') {
-                    for (k in value) {
-                        if (Object.hasOwnProperty.call(value, k)) {
-                            v = walk(value, k);
-                            if (v !== undefined) {
-                                value[k] = v;
-                            } else {
-                                delete value[k];
-                            }
-                        }
-                    }
-                }
-                return reviver.call(holder, key, value);
-            }
-
-
-// Parsing happens in four stages. In the first stage, we replace certain
-// Unicode characters with escape sequences. JavaScript handles many characters
-// incorrectly, either silently deleting them, or treating them as line endings.
-
-            text = String(text);
-            cx.lastIndex = 0;
-            if (cx.test(text)) {
-                text = text.replace(cx, function (a) {
-                    return '\\u' +
-                        ('0000' + a.charCodeAt(0).toString(16)).slice(-4);
-                });
-            }
-
-// In the second stage, we run the text against regular expressions that look
-// for non-JSON patterns. We are especially concerned with '()' and 'new'
-// because they can cause invocation, and '=' because it can cause mutation.
-// But just to be safe, we want to reject all unexpected forms.
-
-// We split the second stage into 4 regexp operations in order to work around
-// crippling inefficiencies in IE's and Safari's regexp engines. First we
-// replace the JSON backslash pairs with '@' (a non-JSON character). Second, we
-// replace all simple value tokens with ']' characters. Third, we delete all
-// open brackets that follow a colon or comma or that begin the text. Finally,
-// we look to see that the remaining characters are only whitespace or ']' or
-// ',' or ':' or '{' or '}'. If that is so, then the text is safe for eval.
-
-            if (/^[\],:{}\s]*$/.
-test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@').
-replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']').
-replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) {
-
-// In the third stage we use the eval function to compile the text into a
-// JavaScript structure. The '{' operator is subject to a syntactic ambiguity
-// in JavaScript: it can begin a block or an object literal. We wrap the text
-// in parens to eliminate the ambiguity.
-
-                j = eval('(' + text + ')');
-
-// In the optional fourth stage, we recursively walk the new structure, passing
-// each name/value pair to a reviver function for possible transformation.
-
-                return typeof reviver === 'function' ?
-                    walk({'': j}, '') : j;
-            }
-
-// If the text is not JSON parseable, then a SyntaxError is thrown.
-
-            throw new SyntaxError('JSON.parse');
-        };
-    }
-}());
diff --git a/test/javascript/replicator_db_inc.js b/test/javascript/replicator_db_inc.js
deleted file mode 100644
index 46dcdd7..0000000
--- a/test/javascript/replicator_db_inc.js
+++ /dev/null
@@ -1,97 +0,0 @@
-// Licensed under the Apache License, Version 2.0 (the "License"); you may not
-// use this file except in compliance with the License. You may obtain a copy of
-// the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-// License for the specific language governing permissions and limitations under
-// the License.
-
-var replicator_db = {};
-replicator_db.wait_rep_doc = 500; // number of millisecs to wait after saving a Rep Doc
-replicator_db.dbA = new CouchDB("test_suite_rep_db_a", {"X-Couch-Full-Commit":"false"});
-replicator_db.dbB = new CouchDB("test_suite_rep_db_b", {"X-Couch-Full-Commit":"false"});
-replicator_db.repDb = new CouchDB("test_suite_rep_db", {"X-Couch-Full-Commit":"false"});
-replicator_db.usersDb = new CouchDB("test_suite_auth", {"X-Couch-Full-Commit":"false"});
-
-replicator_db.docs1 = [
-  {
-    _id: "foo1",
-    value: 11
-  },
-  {
-    _id: "foo2",
-    value: 22
-  },
-  {
-    _id: "foo3",
-    value: 33
-  }
-];
-
-replicator_db.waitForRep = function waitForSeq(repDb, repDoc, state, errorState) {
-  var newRep,
-      t0 = new Date(),
-      t1,
-      ms = 3000;
-
-  do {
-    newRep = repDb.open(repDoc._id);
-    t1 = new Date();
-  } while (((t1 - t0) <= ms) && newRep._replication_state !== state && (!errorState || newRep._replication_state !== errorState));
-  return newRep ? newRep._replication_state : null;
-}
-
-replicator_db.waitForSeq = function waitForSeq(sourceDb, targetDb) {
-  var targetSeq,
-      sourceSeq = sourceDb.info().update_seq,
-      t0 = new Date(),
-      t1,
-      ms = 3000;
-
-  do {
-    targetSeq = targetDb.info().update_seq;
-    t1 = new Date();
-  } while (((t1 - t0) <= ms) && targetSeq < sourceSeq);
-}
-
-replicator_db.waitForDocPos = function waitForDocPos(db, docId, pos) {
-  var doc, curPos, t0, t1,
-      maxWait = 3000;
-
-  doc = db.open(docId);
-  curPos = Number(doc._rev.split("-", 1));
-  t0 = t1 = new Date();
-
-  while ((curPos < pos) && ((t1 - t0) <= maxWait)) {
-     doc = db.open(docId);
-     curPos = Number(doc._rev.split("-", 1));
-     t1 = new Date();
-  }
-
-  return doc;
-}
-
-replicator_db.wait = function wait(ms) {
-  var t0 = new Date(), t1;
-  do {
-    CouchDB.request("GET", "/");
-    t1 = new Date();
-  } while ((t1 - t0) <= ms);
-}
-
-
-replicator_db.populate_db = function populate_db(db, docs) {
-  if (db.name !== replicator_db.usersDb.name) {
-    db.deleteDb();
-    db.createDb();
-  }
-  for (var i = 0; i < docs.length; i++) {
-    var d = docs[i];
-    delete d._rev;
-    T(db.save(d).ok);
-  }
-}
diff --git a/test/javascript/run b/test/javascript/run
deleted file mode 100755
index d60179e..0000000
--- a/test/javascript/run
+++ /dev/null
@@ -1,284 +0,0 @@
-#!/usr/bin/env python3
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may not
-# use this file except in compliance with the License. You may obtain a copy of
-# the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations under
-# the License.
-
-import glob
-import optparse as op
-import os
-import subprocess as sp
-import sys
-import time
-import re
-import xml.dom.minidom as md
-
-
-USAGE = "%prog [options] [command to run...]"
-TEST_PATH = os.path.dirname(os.path.abspath(__file__))
-ROOT_PATH = os.path.dirname(os.path.dirname(TEST_PATH))
-N = 3
-
-COUCHJS = "src/couch/priv/couchjs"
-
-SCRIPTS = """
-    test/javascript/json2.js
-    test/javascript/sha1.js
-    test/javascript/couch.js
-    test/javascript/replicator_db_inc.js
-    test/javascript/couch_test_runner.js
-    test/javascript/couch_http.js
-    test/javascript/test_setup.js
-    share/server/util.js
-""".split()
-
-RUNNER = "test/javascript/cli_runner.js"
-
-
-def mkformatter(tests):
-    longest = max([len(x) for x in tests])
-    green = "\033[32m"
-    orange = "\033[33m"
-    red = "\033[31m"
-    clear = "\033[0m"
-    if not sys.stderr.isatty():
-        green, orange, red, clear = "", "", "", ""
-
-    def _colorized(rval):
-        if rval == 0:
-            return green + "pass" + clear
-        elif rval == 2:
-            return orange + "skipped" + clear
-        elif rval == 3:
-            return green + "ported to elixir" + clear
-        else:
-            return red + ("fail: %d" % rval) + clear
-
-    def _fmt(test):
-        if isinstance(test, str):
-            padding = (longest - len(test)) * " "
-            sys.stderr.write(test + "   " + padding)
-            sys.stderr.flush()
-        elif isinstance(test, int):
-            if test:
-                sys.stderr.write(_colorized(test) + os.linesep)
-            else:
-                sys.stderr.write(_colorized(test) + os.linesep)
-            sys.stderr.flush()
-
-    return _fmt
-
-
-def run_couchjs(test, fmt):
-    fmt(test)
-    cmd = (
-        [COUCHJS, "--eval", "-H", "-T"]
-        + ["-u", "test/javascript/couchdb.uri"]
-        + SCRIPTS
-        + [test, RUNNER]
-    )
-    p = sp.Popen(cmd, stdin=sp.PIPE, stdout=sp.PIPE, stderr=sp.STDOUT)
-    output = []
-    while True:
-        line = p.stdout.readline()
-        if not line:
-            break
-        line = line.decode()
-        output.append(line)
-        sys.stderr.write(line)
-    p.wait()
-    fmt(p.returncode)
-    return (p.returncode, "".join(output))
-
-
-def write_junit(filename, total_time, results):
-    failures = 0
-    skipped = 0
-    for (_, rc, _, _) in results:
-        if rc == 2 or rc == 3:
-            skipped += 1
-        else:
-            failures += 1
-
-    doc = md.Document()
-    root = doc.createElement("testsuite")
-    root.setAttribute("name", "JavaScript tests")
-    root.setAttribute("time", "%0.3f" % total_time)
-    root.setAttribute("tests", str(len(results)))
-    root.setAttribute("failures", str(failures))
-    root.setAttribute("errors", "0")
-    root.setAttribute("skipped", str(skipped))
-    doc.appendChild(root)
-
-    for (path, rc, output, test_time) in results:
-        name = os.path.split(path)[-1]
-        tc = doc.createElement("testcase")
-        tc.setAttribute("name", name)
-        tc.setAttribute("time", "%0.3f" % test_time)
-        if rc == 0:
-            pass
-        elif rc == 2:
-            skipped = doc.createElement("skipped")
-            skipped.setAttribute("message", "disabled")
-            tc.appendChild(skipped)
-        elif rc == 3:
-            skipped = doc.createElement("skipped")
-            skipped.setAttribute("message", "ported to elixir")
-            tc.appendChild(skipped)
-        else:
-            failure = doc.createElement("failure")
-            failure.setAttribute("message", "failed: %d" % rc)
-            failure_text = "Exit Code: %d" % rc + "\n\n" + output
-            message = doc.createTextNode(failure_text)
-            failure.appendChild(message)
-            tc.appendChild(failure)
-        root.appendChild(tc)
-
-    with open(filename, "w") as handle:
-        doc.writexml(handle, addindent="  ", newl=os.linesep)
-
-
-def options():
-    return [
-        op.make_option(
-            "-s",
-            "--start",
-            metavar="FILENAME",
-            default=None,
-            help="Start from the given filename if multiple files are passed",
-        ),
-        op.make_option(
-            "-a",
-            "--all",
-            action="store_true",
-            dest="all",
-            help="Run all tests, even if one or more fail",
-        ),
-        op.make_option(
-            "-i",
-            "--ignore",
-            type="string",
-            action="callback",
-            default=None,
-            callback=get_delimited_list,
-            dest="ignore",
-            help="Ignore test suites",
-        ),
-        op.make_option(
-            "-u",
-            "--suites",
-            type="string",
-            action="callback",
-            default=None,
-            callback=get_delimited_list,
-            dest="suites",
-            help="Run specific suites",
-        ),
-        op.make_option(
-            "-p",
-            "--path",
-            type="string",
-            default="test/javascript/tests",
-            dest="test_path",
-            help="Path where the tests are located",
-        ),
-        op.make_option(
-            "-j",
-            "--junit-report",
-            type="string",
-            default="test/javascript/junit.xml",
-            dest="junit_report",
-            help="Write a JUnit compatible test report",
-        ),
-    ]
-
-
-def main():
-    parser = op.OptionParser(usage=USAGE, option_list=options())
-    opts, args = parser.parse_args()
-
-    run_list = []
-    ignore_list = []
-    tests = []
-    run_list = [opts.test_path] if not opts.suites else opts.suites
-    run_list = build_test_case_paths(opts.test_path, run_list)
-    ignore_list = build_test_case_paths(opts.test_path, opts.ignore)
-    # sort is needed because certain tests fail if executed out of order
-    tests = sorted(list(set(run_list) - set(ignore_list)))
-
-    if opts.start is not None:
-        tmp = []
-        for name in tests:
-            if name >= opts.start:
-                tmp.append(name)
-        tests = tmp
-
-    results = []
-    begin = time.time()
-    passed = 0
-    failed = 0
-    if len(tests) > 0:
-        fmt = mkformatter(tests)
-        for test in tests:
-            tbefore = time.time()
-            (result, output) = run_couchjs(test, fmt)
-            results.append((test, result, output, time.time() - tbefore))
-            if result == 0 or result == 2 or result == 3:
-                passed += 1
-            else:
-                failed += 1
-                if not opts.all:
-                    break
-
-    total_time = time.time() - begin
-    if opts.junit_report:
-        write_junit(opts.junit_report, total_time, results)
-
-    sys.stderr.write(
-        "=======================================================" + os.linesep
-    )
-    sys.stderr.write("JavaScript tests complete." + os.linesep)
-    sys.stderr.write(
-        "  Failed: {0}.  Skipped or passed: {1}.".format(failed, passed) + os.linesep
-    )
-    exit(failed > 0)
-
-
-def build_test_case_paths(path, args=None):
-    tests = []
-    if args is None:
-        args = []
-    for name in args:
-        if os.path.isdir(name):
-            tests.extend(sorted(glob.glob(os.path.join(name, "*.js"))))
-        elif os.path.isfile(name):
-            check = tests.append(name)
-        else:
-            pname = os.path.join(path, name)
-            if os.path.isfile(pname):
-                tests.append(pname)
-            elif os.path.isfile(pname + ".js"):
-                tests.append(pname + ".js")
-            else:
-                sys.stderr.write("Waring - Unknown test: " + name + os.linesep)
-    return tests
-
-
-def get_delimited_list(option, opt, value, parser):
-    delimited = [i for i in re.split(r",|\s", value.strip()) if i]
-    setattr(parser.values, option.dest, delimited)
-
-
-if __name__ == "__main__":
-    try:
-        main()
-    except KeyboardInterrupt:
-        pass
diff --git a/test/javascript/sha1.js b/test/javascript/sha1.js
deleted file mode 100644
index ee73a63..0000000
--- a/test/javascript/sha1.js
+++ /dev/null
@@ -1,202 +0,0 @@
-/*
- * A JavaScript implementation of the Secure Hash Algorithm, SHA-1, as defined
- * in FIPS PUB 180-1
- * Version 2.1a Copyright Paul Johnston 2000 - 2002.
- * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
- * Distributed under the BSD License
- * See http://pajhome.org.uk/crypt/md5 for details.
- */
-
-/*
- * Configurable variables. You may need to tweak these to be compatible with
- * the server-side, but the defaults work in most cases.
- */
-var hexcase = 0;  /* hex output format. 0 - lowercase; 1 - uppercase        */
-var b64pad  = "="; /* base-64 pad character. "=" for strict RFC compliance   */
-var chrsz   = 8;  /* bits per input character. 8 - ASCII; 16 - Unicode      */
-
-/*
- * These are the functions you'll usually want to call
- * They take string arguments and return either hex or base-64 encoded strings
- */
-function hex_sha1(s){return binb2hex(core_sha1(str2binb(s),s.length * chrsz));}
-function b64_sha1(s){return binb2b64(core_sha1(str2binb(s),s.length * chrsz));}
-function str_sha1(s){return binb2str(core_sha1(str2binb(s),s.length * chrsz));}
-function hex_hmac_sha1(key, data){ return binb2hex(core_hmac_sha1(key, data));}
-function b64_hmac_sha1(key, data){ return binb2b64(core_hmac_sha1(key, data));}
-function str_hmac_sha1(key, data){ return binb2str(core_hmac_sha1(key, data));}
-
-/*
- * Perform a simple self-test to see if the VM is working
- */
-function sha1_vm_test()
-{
-  return hex_sha1("abc") == "a9993e364706816aba3e25717850c26c9cd0d89d";
-}
-
-/*
- * Calculate the SHA-1 of an array of big-endian words, and a bit length
- */
-function core_sha1(x, len)
-{
-  /* append padding */
-  x[len >> 5] |= 0x80 << (24 - len % 32);
-  x[((len + 64 >> 9) << 4) + 15] = len;
-
-  var w = Array(80);
-  var a =  1732584193;
-  var b = -271733879;
-  var c = -1732584194;
-  var d =  271733878;
-  var e = -1009589776;
-
-  for(var i = 0; i < x.length; i += 16)
-  {
-    var olda = a;
-    var oldb = b;
-    var oldc = c;
-    var oldd = d;
-    var olde = e;
-
-    for(var j = 0; j < 80; j++)
-    {
-      if(j < 16) w[j] = x[i + j];
-      else w[j] = rol(w[j-3] ^ w[j-8] ^ w[j-14] ^ w[j-16], 1);
-      var t = safe_add(safe_add(rol(a, 5), sha1_ft(j, b, c, d)),
-                       safe_add(safe_add(e, w[j]), sha1_kt(j)));
-      e = d;
-      d = c;
-      c = rol(b, 30);
-      b = a;
-      a = t;
-    }
-
-    a = safe_add(a, olda);
-    b = safe_add(b, oldb);
-    c = safe_add(c, oldc);
-    d = safe_add(d, oldd);
-    e = safe_add(e, olde);
-  }
-  return Array(a, b, c, d, e);
-
-}
-
-/*
- * Perform the appropriate triplet combination function for the current
- * iteration
- */
-function sha1_ft(t, b, c, d)
-{
-  if(t < 20) return (b & c) | ((~b) & d);
-  if(t < 40) return b ^ c ^ d;
-  if(t < 60) return (b & c) | (b & d) | (c & d);
-  return b ^ c ^ d;
-}
-
-/*
- * Determine the appropriate additive constant for the current iteration
- */
-function sha1_kt(t)
-{
-  return (t < 20) ?  1518500249 : (t < 40) ?  1859775393 :
-         (t < 60) ? -1894007588 : -899497514;
-}
-
-/*
- * Calculate the HMAC-SHA1 of a key and some data
- */
-function core_hmac_sha1(key, data)
-{
-  var bkey = str2binb(key);
-  if(bkey.length > 16) bkey = core_sha1(bkey, key.length * chrsz);
-
-  var ipad = Array(16), opad = Array(16);
-  for(var i = 0; i < 16; i++)
-  {
-    ipad[i] = bkey[i] ^ 0x36363636;
-    opad[i] = bkey[i] ^ 0x5C5C5C5C;
-  }
-
-  var hash = core_sha1(ipad.concat(str2binb(data)), 512 + data.length * chrsz);
-  return core_sha1(opad.concat(hash), 512 + 160);
-}
-
-/*
- * Add integers, wrapping at 2^32. This uses 16-bit operations internally
- * to work around bugs in some JS interpreters.
- */
-function safe_add(x, y)
-{
-  var lsw = (x & 0xFFFF) + (y & 0xFFFF);
-  var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
-  return (msw << 16) | (lsw & 0xFFFF);
-}
-
-/*
- * Bitwise rotate a 32-bit number to the left.
- */
-function rol(num, cnt)
-{
-  return (num << cnt) | (num >>> (32 - cnt));
-}
-
-/*
- * Convert an 8-bit or 16-bit string to an array of big-endian words
- * In 8-bit function, characters >255 have their hi-byte silently ignored.
- */
-function str2binb(str)
-{
-  var bin = Array();
-  var mask = (1 << chrsz) - 1;
-  for(var i = 0; i < str.length * chrsz; i += chrsz)
-    bin[i>>5] |= (str.charCodeAt(i / chrsz) & mask) << (32 - chrsz - i%32);
-  return bin;
-}
-
-/*
- * Convert an array of big-endian words to a string
- */
-function binb2str(bin)
-{
-  var str = "";
-  var mask = (1 << chrsz) - 1;
-  for(var i = 0; i < bin.length * 32; i += chrsz)
-    str += String.fromCharCode((bin[i>>5] >>> (32 - chrsz - i%32)) & mask);
-  return str;
-}
-
-/*
- * Convert an array of big-endian words to a hex string.
- */
-function binb2hex(binarray)
-{
-  var hex_tab = hexcase ? "0123456789ABCDEF" : "0123456789abcdef";
-  var str = "";
-  for(var i = 0; i < binarray.length * 4; i++)
-  {
-    str += hex_tab.charAt((binarray[i>>2] >> ((3 - i%4)*8+4)) & 0xF) +
-           hex_tab.charAt((binarray[i>>2] >> ((3 - i%4)*8  )) & 0xF);
-  }
-  return str;
-}
-
-/*
- * Convert an array of big-endian words to a base-64 string
- */
-function binb2b64(binarray)
-{
-  var tab = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
-  var str = "";
-  for(var i = 0; i < binarray.length * 4; i += 3)
-  {
-    var triplet = (((binarray[i   >> 2] >> 8 * (3 -  i   %4)) & 0xFF) << 16)
-                | (((binarray[i+1 >> 2] >> 8 * (3 - (i+1)%4)) & 0xFF) << 8 )
-                |  ((binarray[i+2 >> 2] >> 8 * (3 - (i+2)%4)) & 0xFF);
-    for(var j = 0; j < 4; j++)
-    {
-      if(i * 8 + j * 6 > binarray.length * 32) str += b64pad;
-      else str += tab.charAt((triplet >> 6*(3-j)) & 0x3F);
-    }
-  }
-  return str;
-}
diff --git a/test/javascript/test_setup.js b/test/javascript/test_setup.js
deleted file mode 100644
index 6140c0e..0000000
--- a/test/javascript/test_setup.js
+++ /dev/null
@@ -1,127 +0,0 @@
-// Licensed under the Apache License, Version 2.0 (the "License"); you may not
-// use this file except in compliance with the License. You may obtain a copy of
-// the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-// License for the specific language governing permissions and limitations under
-// the License.
-
-/*
- * Add global couchTests object required for existing tests.
- */
-var couchTests = {}; 
-
-var console = { 
-  log: function(arg) {
-    var msg = (arg.toString()).replace(/\n/g, "\n    ");
-    print(msg, true);
-  }
-};
-
-var fmtStack = function(stack) {
-  if(!stack) {
-    console.log("No stack information");
-    return;
-  }
-  console.log("Trace back (most recent call first):\n");
-  var re = new RegExp("(.*?)@([^:]*):(.*)$");
-  var lines = stack.split("\n");
-  for(var i = 0; i < lines.length; i++) {
-    var line = lines[i];
-    if(!line.length) continue;
-    var match = re.exec(line);
-    if(!match) continue
-    var match = re.exec(line);
-    if(!match) continue
-    var source = match[1].substr(0, 70);
-    var file = match[2];
-    var lnum = match[3];
-    while(lnum.length < 3) lnum = " " + lnum;
-    console.log(" " + lnum + ": " + file);
-    console.log("      " + source);
-  }
-} 
-
-function T(arg1, arg2) {
-  if(!arg1) {
-    var result = (arg2 ? arg2 : arg1);
-    throw((result instanceof Error ? result : Error(result)));
-  }
-} 
-
-function waitForSuccess(fun, tag) {
-  var start = new Date().getTime();
-  var complete = false;
-  
-  while (!complete) {
-    var now = new Date().getTime();
-    if (now > start + 10000) {
-      complete = true;
-      throw(Error('\nFAIL ' + tag));
-    }
-    try {
-      while (new Date().getTime() < now + 500);
-      complete = fun();
-    } catch (e) {}
-  }
-}
-
-function getUptime() {
-  var url = "/_node/node1@127.0.0.1/_system"
-  var stats = JSON.parse(CouchDB.request("GET", url).responseText);
-  return stats['uptime'];
-}
-
-function restartNodeRequest(node) {
-    var url = "/_node/" + node +"/_restart"
-    var result = JSON.parse(CouchDB.request("POST", url).responseText);
-    if (result.ok != true) {
-        throw(Error('FAILED to restart: ' + node));
-    }
-}
-
-function restartServer() {
-  var olduptime = getUptime();
-  if (olduptime < 15) {
-    // handle quick-restarts, though this slows things down
-    sleep(15000);
-    olduptime = getUptime();
-  }
-
-  restartNodeRequest('node1@127.0.0.1');
-
-  /* Wait up to 15s for server to restart */
-  var start = new Date().getTime();
-  var complete = false;
-  while (1) {
-    sleep(500);
-    try {
-      if (getUptime() < olduptime) {
-        return;
-      }
-    } catch (e) {}
-
-    var now = new Date().getTime();
-    if (now > start + 30000) {
-      try {
-        uptime = getUptime();
-        throw(Error('FAILED to restart: ' + uptime + ' not < ' + olduptime));
-      } catch (e) {
-        throw(Error('FAILED to restart: server is unresponsive, waited 30s'));
-      }
-    }
-  }
-}
-
-/*
- * If last_req is an object, we got something back. This might be an error, but
- * CouchDB is up and running!
- */
-CouchDB.isRunning = function() {
-  CouchDB.last_req = CouchDB.request("GET", "/");
-  return typeof CouchDB.last_req == 'object';
-};
diff --git a/test/javascript/tests-cluster/with-quorum/attachments.js b/test/javascript/tests-cluster/with-quorum/attachments.js
deleted file mode 100644
index 8186d75..0000000
--- a/test/javascript/tests-cluster/with-quorum/attachments.js
+++ /dev/null
@@ -1,37 +0,0 @@
-// Licensed under the Apache License, Version 2.0 (the "License"); you may not
-// use this file except in compliance with the License. You may obtain a copy of
-// the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-// License for the specific language governing permissions and limitations under
-// the License.
-
-couchTests.attachments= function(debug) {
-  return console.log('done in test/elixir/test/cluster_with_quorum_test.exs');
-  var db_name = get_random_db_name();
-  var db = new CouchDB(db_name, {"X-Couch-Full-Commit":"false"});
-  db.createDb();
-  if (debug) debugger;
-
-  var doc = db.save({_id:"dummy"});
-  T(doc.ok);
-
-  var xhr = CouchDB.request("PUT", "/" + db_name + "/dummy/foo.txt?rev=" + doc.rev, {
-    body:"This is no base64 encoded text",
-    headers:{"Content-Type": "text/plain;charset=utf-8"}
-  });
-  T(xhr.status == 201,"Should return 201");
-  var rev = JSON.parse(xhr.responseText).rev;
-
-  xhr = CouchDB.request("PUT", "/" + db_name + "/dummy/foo.txt?rev=" + rev, {
-    body:"This is no base64 encoded text-2",
-    headers:{"Content-Type": "text/plain;charset=utf-8"}
-  });
-  T(xhr.status == 201,"Should return 201");
-  
-  db.deleteDb();
-}
diff --git a/test/javascript/tests-cluster/with-quorum/attachments_delete.js b/test/javascript/tests-cluster/with-quorum/attachments_delete.js
deleted file mode 100644
index 1980c11..0000000
--- a/test/javascript/tests-cluster/with-quorum/attachments_delete.js
+++ /dev/null
@@ -1,33 +0,0 @@
-// Licensed under the Apache License, Version 2.0 (the "License"); you may not
-// use this file except in compliance with the License. You may obtain a copy of
-// the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-// License for the specific language governing permissions and limitations under
-// the License.
-
-couchTests.attachments_delete= function(debug) {
-  return console.log('done in test/elixir/test/cluster_with_quorum_test.exs');
-  var db_name = get_random_db_name();
-  var db = new CouchDB(db_name, {"X-Couch-Full-Commit":"false"});
-  db.createDb();
-  if (debug) debugger;
-
-  var doc = db.save({_id:"dummy"});
-  T(doc.ok);
-  var xhr = CouchDB.request("PUT", "/" + db_name + "/dummy/foo.txt?rev=" + doc.rev, {
-    body:"This is no base64 encoded text",
-    headers:{"Content-Type": "text/plain;charset=utf-8"}
-  });
-  T(xhr.status == 201,"Should return 201 Accepted");
-  var rev = JSON.parse(xhr.responseText).rev;
-
-  xhr = CouchDB.request("DELETE", "/" + db_name + "/dummy/foo.txt?rev=" + rev);
-  T(xhr.status == 200,"Should return 200 Ok but returns "+xhr.status);
-
-  db.deleteDb();
-}
diff --git a/test/javascript/tests-cluster/with-quorum/attachments_delete_overridden_quorum.js b/test/javascript/tests-cluster/with-quorum/attachments_delete_overridden_quorum.js
deleted file mode 100644
index 48c1f34..0000000
--- a/test/javascript/tests-cluster/with-quorum/attachments_delete_overridden_quorum.js
+++ /dev/null
@@ -1,38 +0,0 @@
-// Licensed under the Apache License, Version 2.0 (the "License"); you may not
-// use this file except in compliance with the License. You may obtain a copy of
-// the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-// License for the specific language governing permissions and limitations under
-// the License.
-
-couchTests.skip = true;
-couchTests.attachments_delete_overridden_quorum= function(debug) {
-  return console.log('done in test/elixir/test/cluster_with_quorum_test.exs');
-  var db_name = get_random_db_name();
-  var db = new CouchDB(db_name, {"X-Couch-Full-Commit":"false"},{"w":3});
-  db.createDb();
-  if (debug) debugger;
-
-  var doc = db.save({_id:"dummy"});
-  T(doc.ok);
-  var xhr = CouchDB.request("PUT", "/" + db_name + "/dummy/foo.txt?rev=" + doc.rev, {
-    body:"This is no base64 encoded text",
-    headers:{"Content-Type": "text/plain;charset=utf-8"}
-  });
-  var rev = JSON.parse(xhr.responseText).rev;
-
-  xhr = CouchDB.request("DELETE", "/" + db_name + "/dummy/foo.txt?rev=" + rev);
-  console.log("TODO: Clarify correct behaviour. Is not considering overridden quorum. 202->"+xhr.status);
-  // TODO: Define correct behaviour
-  //T(xhr.status == 202,"Should return 202 but returns "+xhr.status);
-
- //db.deleteDb();
- // cleanup
- // TODO DB deletions fails if the quorum is not met.
- xhr = CouchDB.request("DELETE", "/" + db_name + "/");
-}
diff --git a/test/javascript/tests-cluster/with-quorum/attachments_overridden_quorum.js b/test/javascript/tests-cluster/with-quorum/attachments_overridden_quorum.js
deleted file mode 100644
index cbeb985..0000000
--- a/test/javascript/tests-cluster/with-quorum/attachments_overridden_quorum.js
+++ /dev/null
@@ -1,42 +0,0 @@
-// Licensed under the Apache License, Version 2.0 (the "License"); you may not
-// use this file except in compliance with the License. You may obtain a copy of
-// the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-// License for the specific language governing permissions and limitations under
-// the License.
-
-//Test attachments operations with an overridden quorum parameter
-couchTests.skip = true;
-couchTests.attachments_overriden_quorum= function(debug) {
-  return console.log('done in test/elixir/test/cluster_with_quorum_test.exs');
-  var db_name = get_random_db_name();
-  var db = new CouchDB(db_name, {"X-Couch-Full-Commit":"false"},{"w":3});
-  db.createDb();
-  if (debug) debugger;
-
-  var doc = db.save({_id:"dummy"});
-  T(doc.ok);
-
-  var xhr = CouchDB.request("PUT", "/" + db_name + "/dummy/foo.txt?rev=" + doc.rev, {
-    body:"This is no base64 encoded text",
-    headers:{"Content-Type": "text/plain;charset=utf-8"}
-  });
-  //TODO: Define correct behaviour
-  //T(xhr.status == 202,"Should return 202");
-  var rev = JSON.parse(xhr.responseText).rev;
-
-  xhr = CouchDB.request("PUT", "/" + db_name + "/dummy/foo.txt?rev=" + rev, {
-    body:"This is no base64 encoded text-2",
-    headers:{"Content-Type": "text/plain;charset=utf-8"}
-  });
-  console.log("TODO: Clarify correct behaviour. Is not considering overridden quorum. 202->"+xhr.status);
-  //TODO: Define correct behaviour
-  //T(xhr.status == 202,"Should return 202");
-
-  db.deleteDb();
-}
diff --git a/test/javascript/tests-cluster/with-quorum/db_creation.js b/test/javascript/tests-cluster/with-quorum/db_creation.js
deleted file mode 100644
index c8a416d..0000000
--- a/test/javascript/tests-cluster/with-quorum/db_creation.js
+++ /dev/null
@@ -1,28 +0,0 @@
-// Licensed under the Apache License, Version 2.0 (the "License"); you may not
-// use this file except in compliance with the License. You may obtain a copy of
-// the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-// License for the specific language governing permissions and limitations under
-// the License.
-
-// Do DB creation under cluster with quorum conditions.
-couchTests.db_creation = function(debug) {
-  return console.log('done in test/elixir/test/cluster_with_quorum_test.exs');
-
-  if (debug) debugger;
-
-  var db_name = get_random_db_name()
-  var db = new CouchDB(db_name, {"X-Couch-Full-Commit":"false"});
-
-  // DB Creation should return 201 - Created
-  xhr = CouchDB.request("PUT", "/" + db_name + "/");
-  T(xhr.status == 201);
-
-  // cleanup
-  db.deleteDb();
-};
diff --git a/test/javascript/tests-cluster/with-quorum/db_creation_overridden_quorum.js b/test/javascript/tests-cluster/with-quorum/db_creation_overridden_quorum.js
deleted file mode 100644
index af27f95..0000000
--- a/test/javascript/tests-cluster/with-quorum/db_creation_overridden_quorum.js
+++ /dev/null
@@ -1,30 +0,0 @@
-// Licensed under the Apache License, Version 2.0 (the "License"); you may not
-// use this file except in compliance with the License. You may obtain a copy of
-// the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-// License for the specific language governing permissions and limitations under
-// the License.
-
-// Do DB creation under cluster with quorum conditions but overriding write quorum.
-couchTests.skip = true;
-couchTests.db_creation_overridden_quorum = function(debug) {
-  return console.log('done in test/elixir/test/cluster_with_quorum_test.exs');
-
-  if (debug) debugger;
-
-  var db_name = get_random_db_name()
-  var db = new CouchDB(db_name, {"X-Couch-Full-Commit":"false"},{"w":3});
-
-  // DB Creation should return 202 - Accepted
-  xhr = CouchDB.request("PUT", "/" + db_name + "/");
-  console.log("TODO: Clarify correct behaviour. Is not considering overridden quorum. 202->"+xhr.status)
-  //T(xhr.status == 202,"Should return 202");
-
-  // cleanup
-  db.deleteDb();
-};
diff --git a/test/javascript/tests-cluster/with-quorum/db_deletion.js b/test/javascript/tests-cluster/with-quorum/db_deletion.js
deleted file mode 100644
index 70e7034..0000000
--- a/test/javascript/tests-cluster/with-quorum/db_deletion.js
+++ /dev/null
@@ -1,31 +0,0 @@
-// Licensed under the Apache License, Version 2.0 (the "License"); you may not
-// use this file except in compliance with the License. You may obtain a copy of
-// the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-// License for the specific language governing permissions and limitations under
-// the License.
-
-// Do DB deletion under cluster with quorum conditions.
-couchTests.db_deletion = function(debug) {
-  return console.log('done in test/elixir/test/cluster_with_quorum_test.exs');
-
-  if (debug) debugger;
-
-  var db_name = get_random_db_name()
-  var db = new CouchDB(db_name, {"X-Couch-Full-Commit":"false"});
-
-  db.createDb();
-
-  // DB Deletion should return 202 - Acceted as the custer is not complete
-  xhr = CouchDB.request("DELETE", "/" + db_name + "/");
-  T(xhr.status == 202);
-
-// DB Deletion should return 404 - Not found
-  xhr = CouchDB.request("DELETE", "/not-existing-db/");
-  T(xhr.status == 404);
-};
diff --git a/test/javascript/tests-cluster/with-quorum/db_deletion_overridden_quorum.js b/test/javascript/tests-cluster/with-quorum/db_deletion_overridden_quorum.js
deleted file mode 100644
index 8e9c65e..0000000
--- a/test/javascript/tests-cluster/with-quorum/db_deletion_overridden_quorum.js
+++ /dev/null
@@ -1,24 +0,0 @@
-// Licensed under the Apache License, Version 2.0 (the "License"); you may not
-// use this file except in compliance with the License. You may obtain a copy of
-// the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-// License for the specific language governing permissions and limitations under
-// the License.
-
-// Do DB deletion in a cluster with quorum conditions.
-couchTests.db_deletion_overridden_quorum = function(debug) {
-  return console.log('done in test/elixir/test/cluster_with_quorum_test.exs');
-
-  if (debug) debugger;
-
-  var db_name = get_random_db_name()
-  var db = new CouchDB(db_name, {"X-Couch-Full-Commit":"false"},{"w":3});
-  db.createDb();
-  db.deleteDb();
-  T(db.last_req.status="202","Should return 202");
-};
diff --git a/test/javascript/tests-cluster/with-quorum/doc_bulk.js b/test/javascript/tests-cluster/with-quorum/doc_bulk.js
deleted file mode 100644
index 1cb8574..0000000
--- a/test/javascript/tests-cluster/with-quorum/doc_bulk.js
+++ /dev/null
@@ -1,26 +0,0 @@
-// Licensed under the Apache License, Version 2.0 (the "License"); you may not
-// use this file except in compliance with the License. You may obtain a copy of
-// the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-// License for the specific language governing permissions and limitations under
-// the License.
-
-couchTests.doc_bulk = function(debug) {
-  return console.log('done in test/elixir/test/cluster_with_quorum_test.exs');
-  var db_name = get_random_db_name();
-  var db = new CouchDB(db_name, {"X-Couch-Full-Commit":"false"});
-  db.createDb();
-  if (debug) debugger;
-
-  var docs = makeDocs(5);
-  // Create the docs
-  var results = db.bulkSave(docs);
-  T(db.last_req.status="201","Should return 201")
-
-  db.deleteDb();
-}
diff --git a/test/javascript/tests-cluster/with-quorum/doc_bulk_overridden_quorum.js b/test/javascript/tests-cluster/with-quorum/doc_bulk_overridden_quorum.js
deleted file mode 100644
index 2a3be06..0000000
--- a/test/javascript/tests-cluster/with-quorum/doc_bulk_overridden_quorum.js
+++ /dev/null
@@ -1,26 +0,0 @@
-// Licensed under the Apache License, Version 2.0 (the "License"); you may not
-// use this file except in compliance with the License. You may obtain a copy of
-// the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-// License for the specific language governing permissions and limitations under
-// the License.
-
-couchTests.doc_bulk_overridden_quorum = function(debug) {
-  return console.log('done in test/elixir/test/cluster_with_quorum_test.exs');
-  var db_name = get_random_db_name();
-  var db = new CouchDB(db_name, {"X-Couch-Full-Commit":"false"},{"w":3});
-  db.createDb();
-  if (debug) debugger;
-
-  var docs = makeDocs(5);
-  // Create the docs
-  var results = db.bulkSave(docs);
-  T(db.last_req.status="202","Should return 202")
-
-  db.deleteDb();
-}
diff --git a/test/javascript/tests-cluster/with-quorum/doc_copy.js b/test/javascript/tests-cluster/with-quorum/doc_copy.js
deleted file mode 100644
index e79d38c..0000000
--- a/test/javascript/tests-cluster/with-quorum/doc_copy.js
+++ /dev/null
@@ -1,28 +0,0 @@
-// Licensed under the Apache License, Version 2.0 (the "License"); you may not
-// use this file except in compliance with the License. You may obtain a copy of
-// the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-// License for the specific language governing permissions and limitations under
-// the License.
-
-couchTests.doc_copy = function(debug) {
-  return console.log('done in test/elixir/test/cluster_with_quorum_test.exs');
-  var db_name = get_random_db_name();
-  var db = new CouchDB(db_name, {"X-Couch-Full-Commit":"false"});
-  db.createDb();
-  if (debug) debugger;
-
-  db.save({_id:"dummy"});
-
-  var xhr = CouchDB.request("COPY", "/" + db_name + "/dummy", {
-    headers: {"Destination":"dummy2"}
-  });
-  T(xhr.status=="201","Should return 201 ");
-
-  db.deleteDb();
-}
diff --git a/test/javascript/tests-cluster/with-quorum/doc_copy_overridden_quorum.js b/test/javascript/tests-cluster/with-quorum/doc_copy_overridden_quorum.js
deleted file mode 100644
index a816817..0000000
--- a/test/javascript/tests-cluster/with-quorum/doc_copy_overridden_quorum.js
+++ /dev/null
@@ -1,32 +0,0 @@
-// Licensed under the Apache License, Version 2.0 (the "License"); you may not
-// use this file except in compliance with the License. You may obtain a copy of
-// the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-// License for the specific language governing permissions and limitations under
-// the License.
-
-couchTests.skip = true;
-couchTests.doc_copy_overriden_quorum = function(debug) {
-  return console.log('done in test/elixir/test/cluster_with_quorum_test.exs');
-  var db_name = get_random_db_name();
-  var db = new CouchDB(db_name, {"X-Couch-Full-Commit":"false"},{"w":3});
-  db.createDb();
-  if (debug) debugger;
-
-  db.save({_id:"dummy"});
-
-  var xhr = CouchDB.request("COPY", "/" + db_name + "/dummy", {
-    headers: {"Destination":"dummy2"}
-  });
-  //TODO: Define correct behaviour
-  //T(xhr.status=="202","Should return 202");
-  console.log("TODO: Clarify correct behaviour. Is not considering overridden quorum. 202->"+xhr.status);
-
-  db.deleteDb();
-
-}
diff --git a/test/javascript/tests-cluster/with-quorum/doc_crud.js b/test/javascript/tests-cluster/with-quorum/doc_crud.js
deleted file mode 100644
index ab90e60..0000000
--- a/test/javascript/tests-cluster/with-quorum/doc_crud.js
+++ /dev/null
@@ -1,32 +0,0 @@
-// Licensed under the Apache License, Version 2.0 (the "License"); you may not
-// use this file except in compliance with the License. You may obtain a copy of
-// the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-// License for the specific language governing permissions and limitations under
-// the License.
-
-couchTests.doc_crud = function(debug) {
-  return console.log('done in test/elixir/test/cluster_with_quorum_test.exs');
-  var db_name = get_random_db_name();
-  var db = new CouchDB(db_name, {"X-Couch-Full-Commit":"false"});
-  db.createDb();
-  if (debug) debugger;
-
-  db.save({_id:"0",a:1});
-  T(db.last_req.status=="201");
-
-  var doc = db.open("0");
-  db.save(doc);
-  T(db.last_req.status=="201");
-
-  doc = db.open("0");
-  db.deleteDoc(doc);
-  T(db.last_req.status="200");
-  db.deleteDb();
-
-}
diff --git a/test/javascript/tests-cluster/with-quorum/doc_crud_overridden_quorum.js b/test/javascript/tests-cluster/with-quorum/doc_crud_overridden_quorum.js
deleted file mode 100644
index a351378..0000000
--- a/test/javascript/tests-cluster/with-quorum/doc_crud_overridden_quorum.js
+++ /dev/null
@@ -1,32 +0,0 @@
-// Licensed under the Apache License, Version 2.0 (the "License"); you may not
-// use this file except in compliance with the License. You may obtain a copy of
-// the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-// License for the specific language governing permissions and limitations under
-// the License.
-
-couchTests.doc_crud_overridden_quorum = function(debug) {
-  return console.log('done in test/elixir/test/cluster_with_quorum_test.exs');
-  var db_name = get_random_db_name();
-  var db = new CouchDB(db_name, {"X-Couch-Full-Commit":"false"},{"w":3});
-  db.createDb();
-  if (debug) debugger;
-
-  db.save({_id:"0",a:1});
-  T(db.last_req.status=="202","Should return 202 status");
-
-  var doc = db.open("0");
-  db.save(doc);
-  T(db.last_req.status=="202","Should return 202 status");
-
-  doc = db.open("0");
-  db.deleteDoc(doc);
-  T(db.last_req.status="202","Should return 202 status");
-
-  db.deleteDb();
-}
diff --git a/test/javascript/tests-cluster/without-quorum/attachments.js b/test/javascript/tests-cluster/without-quorum/attachments.js
deleted file mode 100644
index 349cc88..0000000
--- a/test/javascript/tests-cluster/without-quorum/attachments.js
+++ /dev/null
@@ -1,40 +0,0 @@
-// Licensed under the Apache License, Version 2.0 (the "License"); you may not
-// use this file except in compliance with the License. You may obtain a copy of
-// the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-// License for the specific language governing permissions and limitations under
-// the License.
-
-couchTests.attachments= function(debug) {
-  return console.log('done in test/elixir/test/cluster_without_quorum_test.exs');
-  var db_name = get_random_db_name();
-  var db = new CouchDB(db_name, {"X-Couch-Full-Commit":"false"});
-  db.createDb();
-  if (debug) debugger;
-
-  var doc = db.save({_id:"dummy"});
-  T(doc.ok);
-  var xhr = CouchDB.request("PUT", "/" + db_name + "/dummy/foo.txt?rev=" + doc.rev, {
-    body:"This is no base64 encoded text",
-    headers:{"Content-Type": "text/plain;charset=utf-8"}
-  });
-  T(xhr.status == 202,"Should return 202 Accepted");
-  var rev = JSON.parse(xhr.responseText).rev;
-
-  xhr = CouchDB.request("PUT", "/" + db_name + "/dummy/foo.txt?rev=" + rev, {
-    body:"This is no base64 encoded text-2",
-    headers:{"Content-Type": "text/plain;charset=utf-8"}
-  });
-  T(xhr.status == 202,"Should return 202 Accepted");
-  rev = JSON.parse(xhr.responseText).rev;
-
- //db.deleteDb();
- // cleanup
- // TODO DB deletions fails if the quorum is not met.
- xhr = CouchDB.request("DELETE", "/" + db_name + "/");
-}
diff --git a/test/javascript/tests-cluster/without-quorum/attachments_delete.js b/test/javascript/tests-cluster/without-quorum/attachments_delete.js
deleted file mode 100644
index 8b8a2db..0000000
--- a/test/javascript/tests-cluster/without-quorum/attachments_delete.js
+++ /dev/null
@@ -1,39 +0,0 @@
-// Licensed under the Apache License, Version 2.0 (the "License"); you may not
-// use this file except in compliance with the License. You may obtain a copy of
-// the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-// License for the specific language governing permissions and limitations under
-// the License.
-
-couchTests.skip = true;
-couchTests.attachments_delete= function(debug) {
-  return console.log('done in test/elixir/test/cluster_without_quorum_test.exs');
-  var db_name = get_random_db_name();
-  var db = new CouchDB(db_name, {"X-Couch-Full-Commit":"false"});
-  db.createDb();
-  if (debug) debugger;
-
-  var doc = db.save({_id:"dummy"});
-  T(doc.ok);
-  var xhr = CouchDB.request("PUT", "/" + db_name + "/dummy/foo.txt?rev=" + doc.rev, {
-    body:"This is no base64 encoded text",
-    headers:{"Content-Type": "text/plain;charset=utf-8"}
-  });
-  T(xhr.status == 202,"Should return 202 Accepted");
-  var rev = JSON.parse(xhr.responseText).rev;
-
-  xhr = CouchDB.request("DELETE", "/" + db_name + "/dummy/foo.txt?rev=" + rev);
-  console.log("TODO: Clarify correct behaviour. Is not considering quorum. 202->"+xhr.status);
-  //TODO: Define correct behaviour
-  //T(xhr.status == 202,"Should return 202 Accepted but returns "+xhr.status);
-
- //db.deleteDb();
- // cleanup
- // TODO DB deletions fails if the quorum is not met.
- xhr = CouchDB.request("DELETE", "/" + db_name + "/");
-}
diff --git a/test/javascript/tests-cluster/without-quorum/attachments_delete_overridden_quorum.js b/test/javascript/tests-cluster/without-quorum/attachments_delete_overridden_quorum.js
deleted file mode 100644
index 48247e0..0000000
--- a/test/javascript/tests-cluster/without-quorum/attachments_delete_overridden_quorum.js
+++ /dev/null
@@ -1,38 +0,0 @@
-// Licensed under the Apache License, Version 2.0 (the "License"); you may not
-// use this file except in compliance with the License. You may obtain a copy of
-// the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-// License for the specific language governing permissions and limitations under
-// the License.
-
-couchTests.skip = true;
-couchTests.attachments_delete_overridden_quorum= function(debug) {
-  return console.log('done in test/elixir/test/cluster_without_quorum_test.exs');
-  var db_name = get_random_db_name();
-  var db = new CouchDB(db_name, {"X-Couch-Full-Commit":"false"},{"w":1});
-  db.createDb();
-  if (debug) debugger;
-
-  var doc = db.save({_id:"dummy"});
-  T(doc.ok);
-  var xhr = CouchDB.request("PUT", "/" + db_name + "/dummy/foo.txt?rev=" + doc.rev, {
-    body:"This is no base64 encoded text",
-    headers:{"Content-Type": "text/plain;charset=utf-8"}
-  });
-  var rev = JSON.parse(xhr.responseText).rev;
-
-  xhr = CouchDB.request("DELETE", "/" + db_name + "/dummy/foo.txt?rev=" + rev);
-  console.log("TODO: Clarify correct behaviour. Is not considering quorum. 202->"+xhr.status);
-  //TODO: Define correct behaviour
-  //T(xhr.status == 200,"Should return 200 but returns "+xhr.status);
-
- //db.deleteDb();
- // cleanup
- // TODO DB deletions fails if the quorum is not met.
- xhr = CouchDB.request("DELETE", "/" + db_name + "/");
-}
diff --git a/test/javascript/tests-cluster/without-quorum/attachments_overridden_quorum.js b/test/javascript/tests-cluster/without-quorum/attachments_overridden_quorum.js
deleted file mode 100644
index 2b8e75f..0000000
--- a/test/javascript/tests-cluster/without-quorum/attachments_overridden_quorum.js
+++ /dev/null
@@ -1,43 +0,0 @@
-// Licensed under the Apache License, Version 2.0 (the "License"); you may not
-// use this file except in compliance with the License. You may obtain a copy of
-// the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-// License for the specific language governing permissions and limitations under
-// the License.
-
-//Test attachments operations with an overridden quorum parameter
-couchTests.attachments_overriden_quorum= function(debug) {
-  return console.log('done in test/elixir/test/cluster_without_quorum_test.exs');
-  var db_name = get_random_db_name();
-  var db = new CouchDB(db_name, {"X-Couch-Full-Commit":"false"},{"w":1});
-  db.createDb();
-  if (debug) debugger;
-
-  var doc = db.save({_id:"dummy"});
-  T(doc.ok);
-
-  var xhr = CouchDB.request("PUT", "/" + db_name + "/dummy/foo.txt?rev=" + doc.rev, {
-    body:"This is no base64 encoded text",
-    headers:{"Content-Type": "text/plain;charset=utf-8"}
-  });
-  //TODO: Define correct behaviour
-  //T(xhr.status == 201,"Should return 201");
-  var rev = JSON.parse(xhr.responseText).rev;
-
-  xhr = CouchDB.request("PUT", "/" + db_name + "/dummy/foo.txt?rev=" + rev, {
-    body:"This is no base64 encoded text-2",
-    headers:{"Content-Type": "text/plain;charset=utf-8"}
-  });
-  //TODO: Define correct behaviour
-  //T(xhr.status == 201,"Should return 201");
-
-  //db.deleteDb();
-  // cleanup
-  // TODO DB deletions fails if the quorum is not met.
-  xhr = CouchDB.request("DELETE", "/" + db_name + "/");
-}
diff --git a/test/javascript/tests-cluster/without-quorum/db_creation.js b/test/javascript/tests-cluster/without-quorum/db_creation.js
deleted file mode 100644
index dd9b294..0000000
--- a/test/javascript/tests-cluster/without-quorum/db_creation.js
+++ /dev/null
@@ -1,28 +0,0 @@
-// Licensed under the Apache License, Version 2.0 (the "License"); you may not
-// use this file except in compliance with the License. You may obtain a copy of
-// the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-// License for the specific language governing permissions and limitations under
-// the License.
-
-// Do DB creation under cluster without quorum conditions.
-couchTests.db_creation = function(debug) {
-  return console.log('done in test/elixir/test/cluster_without_quorum_test.exs');
-
-  if (debug) debugger;
-
-  var db_name = get_random_db_name()
-  var db = new CouchDB(db_name, {"X-Couch-Full-Commit":"false"});
-
-  // DB Creation should return 202- Accepted
-  xhr = CouchDB.request("PUT", "/" + db_name + "/");
-  T(xhr.status == 202);
-
-  // cleanup
-  db.deleteDb();
-};
diff --git a/test/javascript/tests-cluster/without-quorum/db_creation_overridden_quorum.js b/test/javascript/tests-cluster/without-quorum/db_creation_overridden_quorum.js
deleted file mode 100644
index 8ed9b44..0000000
--- a/test/javascript/tests-cluster/without-quorum/db_creation_overridden_quorum.js
+++ /dev/null
@@ -1,32 +0,0 @@
-// Licensed under the Apache License, Version 2.0 (the "License"); you may not
-// use this file except in compliance with the License. You may obtain a copy of
-// the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-// License for the specific language governing permissions and limitations under
-// the License.
-
-// Do DB creation under cluster with quorum conditions but overriding write quorum.
-couchTests.skip = true;
-couchTests.db_creation_overridden_quorum = function(debug) {
-  return console.log('done in test/elixir/test/cluster_without_quorum_test.exs');
-
-  if (debug) debugger;
-
-  var db_name = get_random_db_name()
-  var db = new CouchDB(db_name, {"X-Couch-Full-Commit":"false"},{"w":1});
-
-  // DB Creation should return 201 - Created
-  xhr = CouchDB.request("PUT", "/" + db_name + "/");
-  console.log("TODO: Clarify correct behaviour. Is not considering overridden quorum. 201->"+xhr.status)
-  //T(xhr.status == 201,"Should return 201");
-
-  //db.deleteDb();
-  // cleanup
-  // TODO DB deletions fails if the quorum is not met.
-  xhr = CouchDB.request("DELETE", "/" + db_name + "/");
-};
diff --git a/test/javascript/tests-cluster/without-quorum/db_deletion.js b/test/javascript/tests-cluster/without-quorum/db_deletion.js
deleted file mode 100644
index f156b0e..0000000
--- a/test/javascript/tests-cluster/without-quorum/db_deletion.js
+++ /dev/null
@@ -1,31 +0,0 @@
-// Licensed under the Apache License, Version 2.0 (the "License"); you may not
-// use this file except in compliance with the License. You may obtain a copy of
-// the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-// License for the specific language governing permissions and limitations under
-// the License.
-
-// Do DB creation under cluster with quorum conditions.
-couchTests.db_deletion = function(debug) {
-  return console.log('done in test/elixir/test/cluster_without_quorum_test.exs');
-
-  if (debug) debugger;
-
-  var db_name = get_random_db_name()
-  var db = new CouchDB(db_name, {"X-Couch-Full-Commit":"false"});
-
-  db.createDb();
-  
-  // DB Deletion should return 202 - Acepted
-  xhr = CouchDB.request("DELETE", "/" + db_name + "/");
-  T(xhr.status == 202);
-  
-  // DB Deletion should return 404 - Not found
-  xhr = CouchDB.request("DELETE", "/not-existing-db/");
-  T(xhr.status == 404);
-};
diff --git a/test/javascript/tests-cluster/without-quorum/db_deletion_overridden_quorum.js b/test/javascript/tests-cluster/without-quorum/db_deletion_overridden_quorum.js
deleted file mode 100644
index 86dea83..0000000
--- a/test/javascript/tests-cluster/without-quorum/db_deletion_overridden_quorum.js
+++ /dev/null
@@ -1,26 +0,0 @@
-// Licensed under the Apache License, Version 2.0 (the "License"); you may not
-// use this file except in compliance with the License. You may obtain a copy of
-// the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-// License for the specific language governing permissions and limitations under
-// the License.
-
-// Do DB deletion in a cluster with quorum conditions.
-couchTests.db_deletion_overridden_quorum = function(debug) {
-  return console.log('done in test/elixir/test/cluster_without_quorum_test.exs');
-
-  if (debug) debugger;
-
-  var db_name = get_random_db_name()
-  var db = new CouchDB(db_name, {"X-Couch-Full-Commit":"false"},{"w":1});
-  db.createDb();
-
-  // DB deletions does not consider overriden quorum param.
-  xhr = CouchDB.request("DELETE", "/" + db_name + "/");
-  T(db.last_req.status="202","Should return 202");
-};
diff --git a/test/javascript/tests-cluster/without-quorum/doc_bulk.js b/test/javascript/tests-cluster/without-quorum/doc_bulk.js
deleted file mode 100644
index 37f67ec..0000000
--- a/test/javascript/tests-cluster/without-quorum/doc_bulk.js
+++ /dev/null
@@ -1,29 +0,0 @@
-// Licensed under the Apache License, Version 2.0 (the "License"); you may not
-// use this file except in compliance with the License. You may obtain a copy of
-// the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-// License for the specific language governing permissions and limitations under
-// the License.
-
-couchTests.doc_bulk = function(debug) {
-  return console.log('done in test/elixir/test/cluster_without_quorum_test.exs');
-  var db_name = get_random_db_name();
-  var db = new CouchDB(db_name, {"X-Couch-Full-Commit":"false"});
-  db.createDb();
-  if (debug) debugger;
-
-  var docs = makeDocs(5);
-  // Create the docs
-  var results = db.bulkSave(docs);
-  T(db.last_req.status="202","Should return 202")
-
-  //db.deleteDb();
-  // cleanup
-  // TODO DB deletions fails if the quorum is not met.
-  xhr = CouchDB.request("DELETE", "/" + db_name + "/");
-}
diff --git a/test/javascript/tests-cluster/without-quorum/doc_bulk_overridden_quorum.js b/test/javascript/tests-cluster/without-quorum/doc_bulk_overridden_quorum.js
deleted file mode 100644
index 0f2f364..0000000
--- a/test/javascript/tests-cluster/without-quorum/doc_bulk_overridden_quorum.js
+++ /dev/null
@@ -1,29 +0,0 @@
-// Licensed under the Apache License, Version 2.0 (the "License"); you may not
-// use this file except in compliance with the License. You may obtain a copy of
-// the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-// License for the specific language governing permissions and limitations under
-// the License.
-
-couchTests.doc_bulk_overridden_quorum = function(debug) {
-  return console.log('done in test/elixir/test/cluster_without_quorum_test.exs');
-  var db_name = get_random_db_name();
-  var db = new CouchDB(db_name, {"X-Couch-Full-Commit":"false"},{"w":1});
-  db.createDb();
-  if (debug) debugger;
-
-  var docs = makeDocs(5);
-  // Create the docs
-  var results = db.bulkSave(docs);
-  T(db.last_req.status="201","Should return 201")
-
-  //db.deleteDb();
-  // cleanup
-  // TODO DB deletions fails if the quorum is not met.
-  xhr = CouchDB.request("DELETE", "/" + db_name + "/");
-}
diff --git a/test/javascript/tests-cluster/without-quorum/doc_copy.js b/test/javascript/tests-cluster/without-quorum/doc_copy.js
deleted file mode 100644
index 6e7ae45..0000000
--- a/test/javascript/tests-cluster/without-quorum/doc_copy.js
+++ /dev/null
@@ -1,31 +0,0 @@
-// Licensed under the Apache License, Version 2.0 (the "License"); you may not
-// use this file except in compliance with the License. You may obtain a copy of
-// the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-// License for the specific language governing permissions and limitations under
-// the License.
-
-couchTests.doc_copy = function(debug) {
-  return console.log('done in test/elixir/test/cluster_without_quorum_test.exs');
-  var db_name = get_random_db_name();
-  var db = new CouchDB(db_name, {"X-Couch-Full-Commit":"false"});
-  db.createDb();
-  if (debug) debugger;
-
-  db.save({_id:"dummy"});
-
-  var xhr = CouchDB.request("COPY", "/" + db_name + "/dummy", {
-    headers: {"Destination":"dummy2"}
-  });
-  T(xhr.status=="202","Should return 202 ");
-
-  //db.deleteDb();
-  // cleanup
-  // TODO DB deletions fails if the quorum is not met.
-  xhr = CouchDB.request("DELETE", "/" + db_name + "/");
-}
diff --git a/test/javascript/tests-cluster/without-quorum/doc_copy_overridden_quorum.js b/test/javascript/tests-cluster/without-quorum/doc_copy_overridden_quorum.js
deleted file mode 100644
index 301240e..0000000
--- a/test/javascript/tests-cluster/without-quorum/doc_copy_overridden_quorum.js
+++ /dev/null
@@ -1,35 +0,0 @@
-// Licensed under the Apache License, Version 2.0 (the "License"); you may not
-// use this file except in compliance with the License. You may obtain a copy of
-// the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-// License for the specific language governing permissions and limitations under
-// the License.
-
-couchTests.skip = true;
-couchTests.doc_copy_overriden_quorum = function(debug) {
-  return console.log('done in test/elixir/test/cluster_without_quorum_test.exs');
-  var db_name = get_random_db_name();
-  var db = new CouchDB(db_name, {"X-Couch-Full-Commit":"false"},{"w":1});
-  db.createDb();
-  if (debug) debugger;
-
-  db.save({_id:"dummy"});
-
-  var xhr = CouchDB.request("COPY", "/" + db_name + "/dummy", {
-    headers: {"Destination":"dummy2"}
-  });
-  console.log("TODO: Clarify correct behaviour. Is not considering overridden quorum. 201->"+xhr.status);
-  //TODO Defie correct behaviour
-  //T(xhr.status=="201","Should return 201");
-
-  //db.deleteDb();
-  // cleanup
-  // TODO DB deletions fails if the quorum is not met.
-  xhr = CouchDB.request("DELETE", "/" + db_name + "/");
-
-}
diff --git a/test/javascript/tests-cluster/without-quorum/doc_crud.js b/test/javascript/tests-cluster/without-quorum/doc_crud.js
deleted file mode 100644
index 0a009d5..0000000
--- a/test/javascript/tests-cluster/without-quorum/doc_crud.js
+++ /dev/null
@@ -1,36 +0,0 @@
-// Licensed under the Apache License, Version 2.0 (the "License"); you may not
-// use this file except in compliance with the License. You may obtain a copy of
-// the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-// License for the specific language governing permissions and limitations under
-// the License.
-
-couchTests.doc_crud = function(debug) {
-  return console.log('done in test/elixir/test/cluster_without_quorum_test.exs');
-  var db_name = get_random_db_name();
-  var db = new CouchDB(db_name, {"X-Couch-Full-Commit":"false"});
-  db.createDb();
-  if (debug) debugger;
-
-  db.save({_id:"0",a:1});
-  T(db.last_req.status=="202","Should return 202 status");
-
-  var doc = db.open("0");
-  db.save(doc);
-  T(db.last_req.status=="202","Should return 202 status");
-
-  doc = db.open("0");
-  db.deleteDoc(doc);
-  T(db.last_req.status="202","Should return 202 status");
-
-  //db.deleteDb();
-  // cleanup
-  // TODO DB deletions fails if the quorum is not met.
-  xhr = CouchDB.request("DELETE", "/" + db_name + "/");
-
-}
diff --git a/test/javascript/tests-cluster/without-quorum/doc_crud_overridden_quorum.js b/test/javascript/tests-cluster/without-quorum/doc_crud_overridden_quorum.js
deleted file mode 100644
index 9eb83bd..0000000
--- a/test/javascript/tests-cluster/without-quorum/doc_crud_overridden_quorum.js
+++ /dev/null
@@ -1,35 +0,0 @@
-// Licensed under the Apache License, Version 2.0 (the "License"); you may not
-// use this file except in compliance with the License. You may obtain a copy of
-// the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-// License for the specific language governing permissions and limitations under
-// the License.
-
-couchTests.doc_crud_overridden_quorum = function(debug) {
-  return console.log('done in test/elixir/test/cluster_without_quorum_test.exs');
-  var db_name = get_random_db_name();
-  var db = new CouchDB(db_name, {"X-Couch-Full-Commit":"false"},{"w":1});
-  db.createDb();
-  if (debug) debugger;
-
-  db.save({_id:"0",a:1});
-  T(db.last_req.status=="201","Should return 201 status");
-
-  var doc = db.open("0");
-  db.save(doc);
-  T(db.last_req.status=="201","Should return 201 status");
-
-  doc = db.open("0");
-  db.deleteDoc(doc);
-  T(db.last_req.status="200","Should return 200 status");
-
-  //db.deleteDb();
-  // cleanup
-  // TODO DB deletions fails if the quorum is not met.
-  xhr = CouchDB.request("DELETE", "/" + db_name + "/");
-}
diff --git a/test/javascript/tests/all_docs.js b/test/javascript/tests/all_docs.js
deleted file mode 100644
index 0eb382f..0000000
--- a/test/javascript/tests/all_docs.js
+++ /dev/null
@@ -1,167 +0,0 @@
-// Licensed under the Apache License, Version 2.0 (the "License"); you may not
-// use this file except in compliance with the License. You may obtain a copy of
-// the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-// License for the specific language governing permissions and limitations under
-// the License.
-
-couchTests.elixir = true;
-couchTests.all_docs = function(debug) {
-  return console.log('done in test/elixir/test/all_docs_test.exs');
-  var db_name = get_random_db_name();
-  var db = new CouchDB(db_name, {"X-Couch-Full-Commit":"false"}, {w: 3});
-  db.createDb();
-  if (debug) debugger;
-
-  // Create some more documents.
-  // Notice the use of the ok member on the return result.
-
-  var doc1 = db.save({_id:"0",a:1,b:1});
-  var doc2 = db.save({_id:"3",a:4,b:16});
-  var doc3 = db.save({_id:"1",a:2,b:4});
-  var doc4 = db.save({_id:"2",a:3,b:9});
-
-  T(doc1.ok);
-  T(doc2.ok);
-  T(doc3.ok);
-  T(doc4.ok);
-
-  var revs = [];
-  revs.push(doc1.rev);
-  revs.push(doc2.rev);
-  revs.push(doc3.rev);
-  revs.push(doc4.rev);
-
-  // Check the all docs
-  var results = db.allDocs();
-  var rows = results.rows;
-
-  T(results.total_rows == results.rows.length);
-
-  for(var i=0; i < rows.length; i++) {
-    T(rows[i].id >= "0" && rows[i].id <= "4");
-  }
-
-  // Check _all_docs with descending=true
-  var desc = db.allDocs({descending:true});
-  T(desc.total_rows == desc.rows.length);
-
-  // Check _all_docs offset
-  var all = db.allDocs({startkey:"2"});
-  T(all.offset == 2);
-
-  // Confirm that queries may assume raw collation.
-  var raw = db.allDocs({ startkey: "org.couchdb.user:",
-                         endkey  : "org.couchdb.user;"
-                       });
-  TEquals(0, raw.rows.length);
-
-
-  // check that all docs show up in the changes feed
-  // the order can vary
-  var changes = db.changes();
-  changes.results.forEach(function(row, idx) {
-    var rev = row.changes[0].rev;
-    TEquals(true, revs.indexOf(rev) !== -1, "doc " + i + " should be in changes");
-  });
-
-  // check that deletions also show up right
-  var doc1 = db.open("1");
-  var deleted = db.deleteDoc(doc1);
-  T(deleted.ok);
-  changes = db.changes();
-  T(changes.results.length == 4);
-  var deleted_doc = changes.results.filter(function(row) {
-    return row.deleted == true;
-  })[0];
-  TEquals("1", deleted_doc.id, "deletes");
-
-  // (remember old seq)
-  var orig_doc = changes.results.filter(function(row) {
-    return row.id == "3"
-  })[0];
-  // do an update
-  var doc3 = db.open("3");
-  doc3.updated = "totally";
-  doc3 = db.save(doc3);
-  changes = db.changes();
-
-  // the update should make doc id 3 have another seq num (not nec. higher or the last though)
-  T(changes.results.length == 4);
-  var updated_doc = changes.results.filter(function(row) {
-    return row.id == "3"
-  })[0];
-  T(orig_doc.seq != updated_doc.seq, "seq num should be different");
-
-  // ok now lets see what happens with include docs
-  changes = db.changes({include_docs: true});
-  T(changes.results.length == 4);
-
-  var updated_doc = changes.results.filter(function(row) {
-    return row.id == doc3.id
-  })[0];
-  T(updated_doc.doc.updated == "totally");
-
-  var deleted_doc = changes.results.filter(function(row) {
-    return row.deleted == true;
-  })[0];
-  TEquals(true, deleted_doc.doc._deleted, "deletes");
-
-  rows = db.allDocs({include_docs: true}, ["1"]).rows;
-  TEquals(1, rows.length);
-  TEquals("1", rows[0].key);
-  TEquals("1", rows[0].id);
-  TEquals(true, rows[0].value.deleted);
-  TEquals(null, rows[0].doc);
-
-  // add conflicts
-  var conflictDoc1 = {
-    _id: "3", _rev: "2-aa01552213fafa022e6167113ed01087", value: "X"
-  };
-  var conflictDoc2 = {
-    _id: "3", _rev: "2-ff01552213fafa022e6167113ed01087", value: "Z"
-  };
-  T(db.save(conflictDoc1, {new_edits: false}));
-  T(db.save(conflictDoc2, {new_edits: false}));
-
-  var winRev = db.open("3");
-
-  changes = db.changes({include_docs: true, conflicts: true, style: "all_docs"});
-
-  var doc3 = changes.results.filter(function(row) {
-    return row.id == "3";
-  })[0];
-
-  TEquals("3", doc3.id);
-  TEquals(3, doc3.changes.length);
-  TEquals(winRev._rev, doc3.changes[0].rev);
-  TEquals("3", doc3.doc._id);
-  TEquals(winRev._rev, doc3.doc._rev);
-  TEquals(true, doc3.doc._conflicts instanceof Array);
-  TEquals(2, doc3.doc._conflicts.length);
-
-  rows = db.allDocs({include_docs: true, conflicts: true}).rows;
-  TEquals(3, rows.length);
-  TEquals("3", rows[2].key);
-  TEquals("3", rows[2].id);
-  TEquals(winRev._rev, rows[2].value.rev);
-  TEquals(winRev._rev, rows[2].doc._rev);
-  TEquals("3", rows[2].doc._id);
-  TEquals(true, rows[2].doc._conflicts instanceof Array);
-  TEquals(2, rows[2].doc._conflicts.length);
-
-  // test the all docs collates sanely
-  db.save({_id: "Z", foo: "Z"});
-  db.save({_id: "a", foo: "a"});
-
-  var rows = db.allDocs({startkey: "Z", endkey: "Z"}).rows;
-  T(rows.length == 1);
-
-  // cleanup
-  db.deleteDb();
-};
diff --git a/test/javascript/tests/attachment_names.js b/test/javascript/tests/attachment_names.js
deleted file mode 100644
index 16a23ac..0000000
--- a/test/javascript/tests/attachment_names.js
+++ /dev/null
@@ -1,99 +0,0 @@
-// Licensed under the Apache License, Version 2.0 (the "License"); you may not
-// use this file except in compliance with the License. You may obtain a copy of
-// the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-// License for the specific language governing permissions and limitations under
-// the License.
-
-couchTests.elixir = true;
-couchTests.attachment_names = function(debug) {
-  return console.log('done in test/elixir/test/attachment_names_test.exs');
-  var db_name = get_random_db_name();
-  var db = new CouchDB(db_name, {"X-Couch-Full-Commit":"false"}, {w: 3});
-  db.createDb();
-  if (debug) debugger;
-
-  var goodDoc = {
-    _id: "good_doc",
-    _attachments: {
-      "Колян.txt": {
-       content_type:"application/octet-stream",
-       data: "VGhpcyBpcyBhIGJhc2U2NCBlbmNvZGVkIHRleHQ="
-      }
-    }
-  };
-
-  var save_response = db.save(goodDoc);
-  T(save_response.ok);
-
-  var xhr = CouchDB.request("GET", "/" + db_name + "/good_doc/Колян.txt");
-  T(xhr.responseText == "This is a base64 encoded text");
-  T(xhr.getResponseHeader("Content-Type") == "application/octet-stream");
-  TEquals("\"aEI7pOYCRBLTRQvvqYrrJQ==\"", xhr.getResponseHeader("Etag"));
-
-  var binAttDoc = {
-    _id: "bin_doc",
-    _attachments:{
-      "footxt": {
-        content_type:"text/plain",
-        data: "VGhpcyBpcyBhIGJhc2U2NCBlbmNvZGVkIHRleHQ="
-      }
-    }
-  };
-
-  // inline attachments
-  resp = db.save(binAttDoc);
-  TEquals(true, resp.ok, "attachment_name: inline attachment");
-
-
-  // standalone docs
-  var bin_data = "JHAPDO*AU£PN ){(3u[d 93DQ9¡€])}    ææøo'∂ƒæ≤çæππ•¥∫¶®#†π¶®¥π€ª®˙π8np";
-
-
-  var xhr = (CouchDB.request("PUT", "/" + db_name + "/bin_doc3/attachmenttxt", {
-    headers:{"Content-Type":"text/plain;charset=utf-8"},
-    body:bin_data
-  }));
-
-  var resp = JSON.parse(xhr.responseText);
-  TEquals(201, xhr.status, "attachment_name: standalone API");
-  TEquals(true, resp.ok, "attachment_name: standalone API");
-
-  // bulk docs
-  var docs = { docs: [binAttDoc] };
-  var xhr = CouchDB.request("POST", "/" + db_name + "/_bulk_docs", {
-    body: JSON.stringify(docs)
-  });
-
-  TEquals(201, xhr.status, "attachment_name: bulk docs");
-
-
-  // leading underscores
-  var binAttDoc = {
-    _id: "bin_doc2",
-    _attachments:{
-      "_foo.txt": {
-        content_type:"text/plain",
-        data: "VGhpcyBpcyBhIGJhc2U2NCBlbmNvZGVkIHRleHQ="
-      }
-    }
-  };
-
-  try {
-    db.save(binAttDoc);
-    TEquals(1, 2, "Attachment name with leading underscore saved. Should never show!");
-  } catch (e) {
-    TEquals("bad_request", e.error, "attachment_name: leading underscore");
-    TEquals("Attachment name '_foo.txt' starts with prohibited character '_'", e.reason, "attachment_name: leading underscore");
-  }
-
-  // todo: form uploads, waiting for cmlenz' test case for form uploads
-  // cleanup
-  db.deleteDb();
-
-};
diff --git a/test/javascript/tests/attachment_paths.js b/test/javascript/tests/attachment_paths.js
deleted file mode 100644
index b8c6a79..0000000
--- a/test/javascript/tests/attachment_paths.js
+++ /dev/null
@@ -1,156 +0,0 @@
-// Licensed under the Apache License, Version 2.0 (the "License"); you may not
-// use this file except in compliance with the License. You may obtain a copy of
-// the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-// License for the specific language governing permissions and limitations under
-// the License.
-
-couchTests.elixir = true;
-couchTests.attachment_paths = function(debug) {
-  return console.log('done in test/elixir/test/attachment_paths_test.exs');
-  if (debug) debugger;
-  var r_db_name = get_random_db_name()
-  var dbNames = [r_db_name, r_db_name + "/with_slashes"];
-  for (var i=0; i < dbNames.length; i++) {
-    var db = new CouchDB(dbNames[i]);
-    var dbName = encodeURIComponent(dbNames[i]);
-    db.createDb();
-
-    // first just save a regular doc with an attachment that has a slash in the url.
-    // (also gonna run an encoding check case)
-    var binAttDoc = {
-      _id: "bin_doc",
-      _attachments:{
-        "foo/bar.txt": {
-          content_type:"text/plain",
-          data: "VGhpcyBpcyBhIGJhc2U2NCBlbmNvZGVkIHRleHQ="
-        },
-        "foo%2Fbaz.txt": {
-          content_type:"text/plain",
-          data: "V2UgbGlrZSBwZXJjZW50IHR3byBGLg=="
-        }
-      }
-    };
-
-    T(db.save(binAttDoc).ok);
-
-    var xhr = CouchDB.request("GET", "/"+dbName+"/bin_doc/foo/bar.txt");
-    T(xhr.responseText == "This is a base64 encoded text");
-    T(xhr.getResponseHeader("Content-Type") == "text/plain");
-
-    // lets try it with an escaped attachment id...
-    // weird that it's at two urls
-    var xhr = CouchDB.request("GET", "/"+dbName+"/bin_doc/foo%2Fbar.txt");
-    T(xhr.status == 200);
-    // xhr.responseText == "This is a base64 encoded text"
-
-    var xhr = CouchDB.request("GET", "/"+dbName+"/bin_doc/foo/baz.txt");
-    T(xhr.status == 404);
-
-    var xhr = CouchDB.request("GET", "/"+dbName+"/bin_doc/foo%252Fbaz.txt");
-    T(xhr.status == 200);
-    T(xhr.responseText == "We like percent two F.");
-
-    // require a _rev to PUT
-    var xhr = CouchDB.request("PUT", "/"+dbName+"/bin_doc/foo/attachment.txt", {
-      headers:{"Content-Type":"text/plain;charset=utf-8"},
-      body:"Just some text"
-    });
-    T(xhr.status == 409);
-
-    var xhr = CouchDB.request("PUT", "/"+dbName+"/bin_doc/foo/bar2.txt?rev=" + binAttDoc._rev, {
-      body:"This is no base64 encoded text",
-      headers:{"Content-Type": "text/plain;charset=utf-8"}
-    });
-    T(xhr.status == 201);
-    var rev = JSON.parse(xhr.responseText).rev;
-
-    binAttDoc = db.open("bin_doc");
-
-    T(binAttDoc._attachments["foo/bar.txt"] !== undefined);
-    T(binAttDoc._attachments["foo%2Fbaz.txt"] !== undefined);
-    T(binAttDoc._attachments["foo/bar2.txt"] !== undefined);
-    TEquals("text/plain;charset=utf-8",                   // thank you Safari
-      binAttDoc._attachments["foo/bar2.txt"].content_type.toLowerCase(),
-      "correct content-type"
-    );
-    T(binAttDoc._attachments["foo/bar2.txt"].length == 30);
-
-    //// now repeat the while thing with a design doc
-
-    // first just save a regular doc with an attachment that has a slash in the url.
-    // (also gonna run an encoding check case)
-    var binAttDoc = {
-      _id: "_design/bin_doc",
-      _attachments:{
-        "foo/bar.txt": {
-          content_type:"text/plain",
-          data: "VGhpcyBpcyBhIGJhc2U2NCBlbmNvZGVkIHRleHQ="
-        },
-        "foo%2Fbaz.txt": {
-          content_type:"text/plain",
-          data: "V2UgbGlrZSBwZXJjZW50IHR3byBGLg=="
-        }
-      }
-    };
-
-    T(db.save(binAttDoc).ok);
-
-    var xhr = CouchDB.request("GET", "/"+dbName+"/_design%2Fbin_doc/foo/bar.txt");
-    T(xhr.responseText == "This is a base64 encoded text");
-    T(xhr.getResponseHeader("Content-Type") == "text/plain");
-
-    // lets try it with an escaped attachment id...
-    // weird that it's at two urls
-    var xhr = CouchDB.request("GET", "/"+dbName+"/_design%2Fbin_doc/foo%2Fbar.txt");
-    T(xhr.responseText == "This is a base64 encoded text");
-    T(xhr.status == 200);
-
-    // err, 3 urls
-    var xhr = CouchDB.request("GET", "/"+dbName+"/_design/bin_doc/foo%2Fbar.txt");
-    T(xhr.responseText == "This is a base64 encoded text");
-    T(xhr.status == 200);
-
-    // I mean um, 4 urls
-    var xhr = CouchDB.request("GET", "/"+dbName+"/_design/bin_doc/foo/bar.txt");
-    T(xhr.responseText == "This is a base64 encoded text");
-    T(xhr.status == 200);
-
-    var xhr = CouchDB.request("GET", "/"+dbName+"/_design%2Fbin_doc/foo/baz.txt");
-    T(xhr.status == 404);
-
-    var xhr = CouchDB.request("GET", "/"+dbName+"/_design%2Fbin_doc/foo%252Fbaz.txt");
-    T(xhr.status == 200);
-    T(xhr.responseText == "We like percent two F.");
-
-    // require a _rev to PUT
-    var xhr = CouchDB.request("PUT", "/"+dbName+"/_design%2Fbin_doc/foo/attachment.txt", {
-      headers:{"Content-Type":"text/plain;charset=utf-8"},
-      body:"Just some text"
-    });
-    T(xhr.status == 409);
-
-    var xhr = CouchDB.request("PUT", "/"+dbName+"/_design%2Fbin_doc/foo/bar2.txt?rev=" + binAttDoc._rev, {
-      body:"This is no base64 encoded text",
-      headers:{"Content-Type": "text/plain;charset=utf-8"}
-    });
-    T(xhr.status == 201);
-    var rev = JSON.parse(xhr.responseText).rev;
-
-    binAttDoc = db.open("_design/bin_doc");
-
-    T(binAttDoc._attachments["foo/bar.txt"] !== undefined);
-    T(binAttDoc._attachments["foo/bar2.txt"] !== undefined);
-    TEquals("text/plain;charset=utf-8",                   // thank you Safari
-      binAttDoc._attachments["foo/bar2.txt"].content_type.toLowerCase(),
-      "correct content-type"
-    );
-    T(binAttDoc._attachments["foo/bar2.txt"].length == 30);
-    db.deleteDb();
-  }
-};
diff --git a/test/javascript/tests/attachment_ranges.js b/test/javascript/tests/attachment_ranges.js
deleted file mode 100644
index 564885c..0000000
--- a/test/javascript/tests/attachment_ranges.js
+++ /dev/null
@@ -1,164 +0,0 @@
-// Licensed under the Apache License, Version 2.0 (the "License"); you may not
-// use this file except in compliance with the License. You may obtain a copy of
-// the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-// License for the specific language governing permissions and limitations under
-// the License.
-
-function cacheBust() {
-    return "?anti-cache=" + String(Math.round(Math.random() * 1000000));
-};
-
-couchTests.elixir = true;
-couchTests.attachment_ranges = function(debug) {
-    return console.log('done in test/elixir/test/attachment_ranges_test.exs');
-    var db_name = get_random_db_name();
-    var db = new CouchDB(db_name, {
-        "X-Couch-Full-Commit": "false"
-    });
-    db.createDb();
-
-    if (debug) debugger;
-
-    if((typeof window != "undefined") && window.navigator.userAgent.match(/Chrome/)) {
-        // Chrome is broken.
-        return;
-    }
-
-    var binAttDoc = {
-        _id: "bin_doc",
-        _attachments: {
-            "foo.txt": {
-                content_type: "application/octet-stream",
-                data: "VGhpcyBpcyBhIGJhc2U2NCBlbmNvZGVkIHRleHQ="
-            }
-        }
-    };
-
-    var save_response = db.save(binAttDoc);
-    T(save_response.ok);
-
-    // Fetching the whole entity is a 206.
-    var xhr = CouchDB.request("GET", "/" + db_name + "/bin_doc/foo.txt" + cacheBust(), {
-        headers: {
-            "Range": "bytes=0-28"
-        }
-    });
-    TEquals(206, xhr.status, "fetch 0-28");
-    TEquals("This is a base64 encoded text", xhr.responseText);
-    TEquals("bytes 0-28/29", xhr.getResponseHeader("Content-Range"));
-    TEquals("29", xhr.getResponseHeader("Content-Length"));
-
-    // Fetch the whole entity without an end offset is a 200.
-    var xhr = CouchDB.request("GET", "/" + db_name + "/bin_doc/foo.txt" + cacheBust(), {
-        headers: {
-            "Range": "bytes=0-"
-        }
-    });
-    TEquals(200, xhr.status, "fetch 0-");
-    TEquals("This is a base64 encoded text", xhr.responseText);
-    TEquals(null, xhr.getResponseHeader("Content-Range"));
-    TEquals("29", xhr.getResponseHeader("Content-Length"));
-
-    // Even if you ask multiple times.
-    var xhr = CouchDB.request("GET", "/" + db_name + "/bin_doc/foo.txt" + cacheBust(), {
-        headers: {
-            "Range": "bytes=0-,0-,0-"
-        }
-    });
-    TEquals(200, xhr.status, "multiple 0-'s");
-
-    // Badly formed range header is a 200.
-    var xhr = CouchDB.request("GET", "/" + db_name + "/bin_doc/foo.txt" + cacheBust(), {
-        headers: {
-            "Range": "bytes:0-"
-        }
-    });
-    TEquals(200, xhr.status, "fetch with bad range header");
-
-    // Fetch the end of an entity without an end offset is a 206.
-    var xhr = CouchDB.request("GET", "/" + db_name + "/bin_doc/foo.txt"  + cacheBust(), {
-        headers: {
-            "Range": "bytes=2-"
-        }
-    });
-    TEquals(206, xhr.status, "fetch 2-");
-    TEquals("is is a base64 encoded text", xhr.responseText);
-    TEquals("bytes 2-28/29", xhr.getResponseHeader("Content-Range"));
-    TEquals("27", xhr.getResponseHeader("Content-Length"));
-
-    // Fetch past the end of the entity is a 206
-    var xhr = CouchDB.request("GET", "/" + db_name + "/bin_doc/foo.txt"  + cacheBust(), {
-        headers: {
-            "Range": "bytes=0-29"
-        }
-    });
-    TEquals(206, xhr.status, "fetch 0-29");
-    TEquals("bytes 0-28/29", xhr.getResponseHeader("Content-Range"));
-    TEquals("29", xhr.getResponseHeader("Content-Length"));
-
-    // Fetch first part of entity is a 206
-    var xhr = CouchDB.request("GET", "/" + db_name + "/bin_doc/foo.txt" + cacheBust(), {
-        headers: {
-            "Range": "bytes=0-3"
-        }
-    });
-    TEquals(206, xhr.status, "fetch 0-3");
-    TEquals("This", xhr.responseText);
-    TEquals("4", xhr.getResponseHeader("Content-Length"));
-    TEquals("bytes 0-3/29", xhr.getResponseHeader("Content-Range"));
-
-    // Fetch middle of entity is also a 206
-    var xhr = CouchDB.request("GET", "/" + db_name + "/bin_doc/foo.txt" + cacheBust(), {
-        headers: {
-            "Range": "bytes=10-15"
-        }
-    });
-    TEquals(206, xhr.status, "fetch 10-15");
-    TEquals("base64", xhr.responseText);
-    TEquals("6", xhr.getResponseHeader("Content-Length"));
-    TEquals("bytes 10-15/29", xhr.getResponseHeader("Content-Range"));
-
-    // Fetch end of entity is also a 206
-    var xhr = CouchDB.request("GET", "/" + db_name + "/bin_doc/foo.txt" + cacheBust(), {
-        headers: {
-            "Range": "bytes=-3"
-        }
-    });
-    TEquals(206, xhr.status, "fetch -3");
-    TEquals("ext", xhr.responseText);
-    TEquals("3", xhr.getResponseHeader("Content-Length"));
-    TEquals("bytes 26-28/29", xhr.getResponseHeader("Content-Range"));
-
-    // backward range is 416
-    var xhr = CouchDB.request("GET", "/" + db_name + "/bin_doc/foo.txt" + cacheBust(), {
-       headers: {
-           "Range": "bytes=5-3"
-       }
-    });
-    TEquals(416, xhr.status, "fetch 5-3");
-
-    // range completely outside of entity is 416
-    var xhr = CouchDB.request("GET", "/" + db_name + "/bin_doc/foo.txt" + cacheBust(), {
-        headers: {
-            "Range": "bytes=300-310"
-        }
-    });
-    TEquals(416, xhr.status, "fetch 300-310");
-
-    // We ignore a Range header with too many ranges
-    var xhr = CouchDB.request("GET", "/" + db_name + "/bin_doc/foo.txt" + cacheBust(), {
-        headers: {
-            "Range": "bytes=0-1,0-1,0-1,0-1,0-1,0-1,0-1,0-1,0-1,0-1"
-        }
-    });
-    TEquals(200, xhr.status, "too many ranges");
-    // cleanup
-    db.deleteDb();
-
-};
diff --git a/test/javascript/tests/attachment_views.js b/test/javascript/tests/attachment_views.js
deleted file mode 100644
index c6c4b18..0000000
--- a/test/javascript/tests/attachment_views.js
+++ /dev/null
@@ -1,145 +0,0 @@
-// Licensed under the Apache License, Version 2.0 (the "License"); you may not
-// use this file except in compliance with the License. You may obtain a copy of
-// the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-// License for the specific language governing permissions and limitations under
-// the License.
-
-couchTests.elixir = true;
-couchTests.attachment_views= function(debug) {
-  return console.log('done in test/elixir/test/attachment_views_test.exs');
-
-  var db_name = get_random_db_name()
-  var db = new CouchDB(db_name, {"X-Couch-Full-Commit":"false"});
-  db.createDb();
-  if (debug) debugger;
-
-  // count attachments in a view
-
-  var attachmentData = "VGhpcyBpcyBhIGJhc2U2NCBlbmNvZGVkIHRleHQ=";
-
-  db.bulkSave(makeDocs(0, 10));
-
-  db.bulkSave(makeDocs(10, 20, {
-    _attachments:{
-      "foo.txt": {
-        content_type:"text/plain",
-        data: attachmentData
-      }
-    }
-  }));
-
-  db.bulkSave(makeDocs(20, 30, {
-    _attachments:{
-      "foo.txt": {
-        content_type:"text/plain",
-        data: attachmentData
-      },
-      "bar.txt": {
-        content_type:"text/plain",
-        data: attachmentData
-      }
-    }
-  }));
-
-  db.bulkSave(makeDocs(30, 40, {
-    _attachments:{
-      "foo.txt": {
-        content_type:"text/plain",
-        data: attachmentData
-      },
-      "bar.txt": {
-        content_type:"text/plain",
-        data: attachmentData
-      },
-      "baz.txt": {
-        content_type:"text/plain",
-        data: attachmentData
-      }
-    }
-  }));
-
-  var mapFunction = function(doc) {
-    var count = 0;
-
-    for(var idx in doc._attachments) {
-      count = count + 1;
-    }
-
-    emit(parseInt(doc._id), count);
-  };
-
-  var reduceFunction = function(key, values) {
-    return sum(values);
-  };
-
-  var result = db.query(mapFunction, reduceFunction);
-
-  T(result.rows.length == 1);
-  T(result.rows[0].value == 60);
-
-  var result = db.query(mapFunction, reduceFunction, {
-    startkey:10,
-    endkey:19
-  });
-
-  T(result.rows.length == 1);
-  T(result.rows[0].value == 10);
-
-  var result = db.query(mapFunction, reduceFunction, {
-    startkey:20,
-    endkey:29
-  });
-
-  T(result.rows.length == 1);
-  T(result.rows[0].value == 20);
-
-  var result = db.query(mapFunction, null, {
-    startkey: 30,
-    endkey: 39,
-    include_docs: true
-  });
-
-  T(result.rows.length == 10);
-  T(result.rows[0].value == 3);
-  T(result.rows[0].doc._attachments['baz.txt'].stub === true);
-  T(result.rows[0].doc._attachments['baz.txt'].data === undefined);
-  T(result.rows[0].doc._attachments['baz.txt'].encoding === undefined);
-  T(result.rows[0].doc._attachments['baz.txt'].encoded_length === undefined);
-
-  var result = db.query(mapFunction, null, {
-    startkey: 30,
-    endkey: 39,
-    include_docs: true,
-    attachments: true
-  });
-
-  T(result.rows.length == 10);
-  T(result.rows[0].value == 3);
-  T(result.rows[0].doc._attachments['baz.txt'].data === attachmentData);
-  T(result.rows[0].doc._attachments['baz.txt'].stub === undefined);
-  T(result.rows[0].doc._attachments['baz.txt'].encoding === undefined);
-  T(result.rows[0].doc._attachments['baz.txt'].encoded_length === undefined);
-
-  var result = db.query(mapFunction, null, {
-    startkey: 30,
-    endkey: 39,
-    include_docs: true,
-    att_encoding_info: true
-  });
-
-  T(result.rows.length == 10);
-  T(result.rows[0].value == 3);
-  T(result.rows[0].doc._attachments['baz.txt'].data === undefined);
-  T(result.rows[0].doc._attachments['baz.txt'].stub === true);
-  T(result.rows[0].doc._attachments['baz.txt'].encoding === "gzip");
-  T(result.rows[0].doc._attachments['baz.txt'].encoded_length === 47);
-
-  // cleanup
-  db.deleteDb();
-};
diff --git a/test/javascript/tests/attachments.js b/test/javascript/tests/attachments.js
deleted file mode 100644
index 61fe8b9..0000000
--- a/test/javascript/tests/attachments.js
+++ /dev/null
@@ -1,358 +0,0 @@
-// Licensed under the Apache License, Version 2.0 (the "License"); you may not
-// use this file except in compliance with the License. You may obtain a copy of
-// the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-// License for the specific language governing permissions and limitations under
-// the License.
-
-couchTests.elixir = true;
-couchTests.attachments= function(debug) {
-  return console.log('done in test/elixir/test/attachment_test.exs');
-  var db_name = get_random_db_name();
-  var db = new CouchDB(db_name, {"X-Couch-Full-Commit":"false"});
-  db.createDb();
-  if (debug) debugger;
-
-
-  // MD5 Digests of compressible attachments and therefore Etags
-  // will vary depending on platform gzip implementation.
-  // These MIME types are defined in [attachments] compressible_types
-  var binAttDoc = {
-    _id: "bin_doc",
-    _attachments:{
-      "foo.txt": {
-        content_type:"application/octet-stream",
-        data: "VGhpcyBpcyBhIGJhc2U2NCBlbmNvZGVkIHRleHQ="
-      }
-    }
-  };
-
-  var save_response = db.save(binAttDoc);
-  T(save_response.ok);
-
-  var badAttDoc = {
-    _id: "bad_doc",
-    _attachments: {
-      "foo.txt": {
-        content_type: "text/plain",
-        data: "notBase64Encoded="
-      }
-    }
-  };
-
-  try {
-    db.save(badAttDoc);
-    T(false && "Shouldn't get here!");
-  } catch (e) {
-    TEquals("bad_request", e.error);
-    TEquals("Invalid attachment data for foo.txt", e.message);
-  }
-
-  var xhr = CouchDB.request("GET", "/" + db_name + "/bin_doc/foo.txt");
-  T(xhr.responseText == "This is a base64 encoded text");
-  T(xhr.getResponseHeader("Content-Type") == "application/octet-stream");
-  TEquals("\"aEI7pOYCRBLTRQvvqYrrJQ==\"", xhr.getResponseHeader("Etag"));
-
-  // empty attachment
-  var binAttDoc2 = {
-    _id: "bin_doc2",
-    _attachments:{
-      "foo.txt": {
-        content_type:"text/plain",
-        data: ""
-      }
-    }
-  }
-
-  T(db.save(binAttDoc2).ok);
-
-  var xhr = CouchDB.request("GET", "/" + db_name + "/bin_doc2/foo.txt");
-  T(xhr.responseText.length == 0);
-  T(xhr.getResponseHeader("Content-Type") == "text/plain");
-
-  // test RESTful doc API
-
-  var xhr = CouchDB.request("PUT", "/" + db_name + "/bin_doc2/foo2.txt?rev=" + binAttDoc2._rev, {
-    body:"This is no base64 encoded text",
-    headers:{"Content-Type": "text/plain;charset=utf-8"}
-  });
-  T(xhr.status == 201);
-  TEquals("/bin_doc2/foo2.txt",
-    xhr.getResponseHeader("Location").substr(-18),
-    "should return Location header to newly created or updated attachment");
-
-  var rev = JSON.parse(xhr.responseText).rev;
-
-  binAttDoc2 = db.open("bin_doc2");
-
-  T(binAttDoc2._attachments["foo.txt"] !== undefined);
-  T(binAttDoc2._attachments["foo2.txt"] !== undefined);
-  TEqualsIgnoreCase("text/plain;charset=utf-8", binAttDoc2._attachments["foo2.txt"].content_type);
-  T(binAttDoc2._attachments["foo2.txt"].length == 30);
-
-  var xhr = CouchDB.request("GET", "/" + db_name + "/bin_doc2/foo2.txt");
-  T(xhr.responseText == "This is no base64 encoded text");
-  TEqualsIgnoreCase("text/plain;charset=utf-8", xhr.getResponseHeader("Content-Type"));
-
-  // test without rev, should fail
-  var xhr = CouchDB.request("DELETE", "/" + db_name + "/bin_doc2/foo2.txt");
-  T(xhr.status == 409);
-
-  // test with rev, should not fail
-  var xhr = CouchDB.request("DELETE", "/" + db_name + "/bin_doc2/foo2.txt?rev=" + rev);
-  T(xhr.status == 200);
-  TEquals(null, xhr.getResponseHeader("Location"),
-    "should not return Location header on DELETE request");
-
-  // test binary data
-  var bin_data = "JHAPDO*AU£PN ){(3u[d 93DQ9¡€])}    ææøo'∂ƒæ≤çæππ•¥∫¶®#†π¶®¥π€ª®˙π8np";
-  var xhr = CouchDB.request("PUT", "/" + db_name + "/bin_doc3/attachment.txt", {
-    headers:{"Content-Type":"text/plain;charset=utf-8"},
-    body:bin_data
-  });
-  T(xhr.status == 201);
-  var rev = JSON.parse(xhr.responseText).rev;
-// TODO: revisit Etags (missing on doc write)
-//  TEquals('"' + rev + '"', xhr.getResponseHeader("Etag"));
-
-  var xhr = CouchDB.request("GET", "/" + db_name + "/bin_doc3/attachment.txt");
-  T(xhr.responseText == bin_data);
-  TEqualsIgnoreCase("text/plain;charset=utf-8", xhr.getResponseHeader("Content-Type"));
-
-  // without rev
-  var xhr = CouchDB.request("PUT", "/" + db_name + "/bin_doc3/attachment.txt", {
-    headers:{"Content-Type":"text/plain;charset=utf-8"},
-    body:bin_data
-  });
-  T(xhr.status == 409);
-
-  // with nonexistent rev
-  var xhr = CouchDB.request("PUT", "/" + db_name + "/bin_doc3/attachment.txt"  + "?rev=1-adae8575ecea588919bd08eb020c708e", {
-    headers:{"Content-Type":"text/plain;charset=utf-8"},
-    body:bin_data
-  });
-  T(xhr.status == 409);
-
-  // with current rev
-  var xhr = CouchDB.request("PUT", "/" + db_name + "/bin_doc3/attachment.txt?rev=" + rev, {
-    headers:{"Content-Type":"text/plain;charset=utf-8"},
-    body:bin_data
-  });
-  T(xhr.status == 201);
-  var rev = JSON.parse(xhr.responseText).rev;
-// TODO: revisit Etags (missing on doc write)
-//  TEquals('"' + rev + '"', xhr.getResponseHeader("Etag"));
-
-  var xhr = CouchDB.request("GET", "/" + db_name + "/bin_doc3/attachment.txt");
-  T(xhr.responseText == bin_data);
-  TEqualsIgnoreCase("text/plain;charset=utf-8", xhr.getResponseHeader("Content-Type"));
-
-  var xhr = CouchDB.request("GET", "/" + db_name + "/bin_doc3/attachment.txt?rev=" + rev);
-  T(xhr.responseText == bin_data);
-  TEqualsIgnoreCase("text/plain;charset=utf-8", xhr.getResponseHeader("Content-Type"));
-
-  var xhr = CouchDB.request("DELETE", "/" + db_name + "/bin_doc3/attachment.txt?rev=" + rev);
-  T(xhr.status == 200);
-
-  var xhr = CouchDB.request("GET", "/" + db_name + "/bin_doc3/attachment.txt");
-  T(xhr.status == 404);
-
-  // deleted attachment is still accessible with revision
-  var xhr = CouchDB.request("GET", "/" + db_name + "/bin_doc3/attachment.txt?rev=" + rev);
-  T(xhr.status == 200);
-  T(xhr.responseText == bin_data);
-  TEqualsIgnoreCase("text/plain;charset=utf-8", xhr.getResponseHeader("Content-Type"));
-
-  // empty attachments
-  var xhr = CouchDB.request("PUT", "/" + db_name + "/bin_doc4/attachment.txt", {
-    headers:{"Content-Type":"text/plain;charset=utf-8"},
-    body:""
-  });
-  T(xhr.status == 201);
-  var rev = JSON.parse(xhr.responseText).rev;
-
-  var xhr = CouchDB.request("GET", "/" + db_name + "/bin_doc4/attachment.txt");
-  T(xhr.status == 200);
-  T(xhr.responseText.length == 0);
-
-  // overwrite previsously empty attachment
-  var xhr = CouchDB.request("PUT", "/" + db_name + "/bin_doc4/attachment.txt?rev=" + rev, {
-    headers:{"Content-Type":"text/plain;charset=utf-8"},
-    body:"This is a string"
-  });
-  T(xhr.status == 201);
-
-  var xhr = CouchDB.request("GET", "/" + db_name + "/bin_doc4/attachment.txt");
-  T(xhr.status == 200);
-  T(xhr.responseText == "This is a string");
-
-  // Attachment sparseness COUCHDB-220
-
-  var docs = [];
-  for (var i = 0; i < 5; i++) {
-    var doc = {
-      _id: (i).toString(),
-      _attachments:{
-        "foo.txt": {
-          content_type:"text/plain",
-          data: "VGhpcyBpcyBhIGJhc2U2NCBlbmNvZGVkIHRleHQ="
-        }
-      }
-    };
-    docs.push(doc);
-  }
-
-  var saved = db.bulkSave(docs);
-  // now delete the docs, and while we are looping over them, remove the
-  // '_rev' field so we can re-create after deletion.
-  var to_up = [];
-  for (i=0;i<saved.length;i++) {
-    to_up.push({'_id': saved[i]['id'], '_rev': saved[i]['rev'], '_deleted': true});
-    delete docs[i]._rev;
-  }
-  // delete them.
-  var saved2 = db.bulkSave(to_up);
-  // re-create them
-  var saved3 = db.bulkSave(docs);
-
-  var before = db.info().sizes.file;
-
-  // Compact it.
-  /*T(db.compact().ok);
-  T(db.last_req.status == 202);
-  // compaction isn't instantaneous, loop until done
-  while (db.info().compact_running) {};
-
-  var after = db.info().sizes.file;
-
-  // Compaction should reduce the database slightly, but not
-  // orders of magnitude (unless attachments introduce sparseness)
-  T(after > before * 0.1, "before: " + before + " after: " + after);
-*/
-
-  // test large attachments - COUCHDB-366
-  var lorem = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. '
-  for (var i=0; i<10; i++) {
-    lorem = lorem + lorem;
-  }
-  var xhr = CouchDB.request("PUT", "/" + db_name + "/bin_doc5/lorem.txt", {
-    headers:{"Content-Type":"text/plain;charset=utf-8"},
-    body:lorem
-  });
-  T(xhr.status == 201);
-  var rev = JSON.parse(xhr.responseText).rev;
-
-  var xhr = CouchDB.request("GET", "/" + db_name + "/bin_doc5/lorem.txt");
-  T(xhr.responseText == lorem);
-  TEqualsIgnoreCase("text/plain;charset=utf-8", xhr.getResponseHeader("Content-Type"));
-
-  // test large inline attachment too
-  var lorem_b64 = 'TG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNlY3RldHVyIGFkaXBpc2NpbmcgZWxpdC4g'
-  for (var i=0; i<10; i++) {
-    lorem_b64 = lorem_b64 + lorem_b64;
-  }
-  var doc = db.open("bin_doc5", {attachments:true});
-  TEquals(lorem_b64, doc._attachments["lorem.txt"].data, 'binary attachment data should match');
-
-  // test etags for attachments.
-  var xhr = CouchDB.request("GET", "/" + db_name + "/bin_doc5/lorem.txt");
-  T(xhr.status == 200);
-  var etag = xhr.getResponseHeader("etag");
-  xhr = CouchDB.request("GET", "/" + db_name + "/bin_doc5/lorem.txt", {
-    headers: {"if-none-match": etag}
-  });
-  T(xhr.status == 304);
-
-  // test COUCHDB-497 - empty attachments
-  var xhr = CouchDB.request("PUT", "/" + db_name + "/bin_doc5/empty.txt?rev="+rev, {
-    headers:{"Content-Type":"text/plain;charset=utf-8", "Content-Length": "0"},
-    body:""
-  });
-  TEquals(201, xhr.status, "should send 201 Accepted");
-  var rev = JSON.parse(xhr.responseText).rev;
-  var xhr = CouchDB.request("PUT", "/" + db_name + "/bin_doc5/empty.txt?rev="+rev, {
-    headers:{"Content-Type":"text/plain;charset=utf-8"}
-  });
-  TEquals(201, xhr.status, "should send 201 Accepted");
-
-  // implicit doc creation allows creating docs with a reserved id. COUCHDB-565
-  var xhr = CouchDB.request("PUT", "/" + db_name + "/_nonexistant/attachment.txt", {
-    headers: {"Content-Type":"text/plain;charset=utf-8"},
-    body: "THIS IS AN ATTACHMENT. BOOYA!"
-  });
-  TEquals(400, xhr.status, "should return error code 400 Bad Request");
-
-  // test COUCHDB-809 - stubs should only require the 'stub' field
-  var bin_doc6 = {
-    _id: "bin_doc6",
-    _attachments:{
-      "foo.txt": {
-        content_type:"text/plain",
-        data: "VGhpcyBpcyBhIGJhc2U2NCBlbmNvZGVkIHRleHQ="
-      }
-    }
-  };
-  T(db.save(bin_doc6).ok);
-  // stub out the attachment
-  bin_doc6._attachments["foo.txt"] = { stub: true };
-  T(db.save(bin_doc6).ok == true);
-
-  // wrong rev pos specified
-
-  // stub out the attachment with the wrong revpos
-  bin_doc6._attachments["foo.txt"] = { stub: true, revpos: 10};
-  try {
-      T(db.save(bin_doc6).ok == true);
-      T(false && "Shouldn't get here!");
-  } catch (e) {
-      T(e.error == "missing_stub");
-  }
-
-  // test MD5 header
-  var bin_data = "foo bar"
-  var xhr = CouchDB.request("PUT", "/" + db_name + "/bin_doc7/attachment.txt", {
-    headers:{"Content-Type":"application/octet-stream",
-             "Content-MD5":"MntvB0NYESObxH4VRDUycw=="},
-    body:bin_data
-  });
-  TEquals(201, xhr.status);
-
-  var xhr = CouchDB.request("GET", "/" + db_name + "/bin_doc7/attachment.txt");
-  TEquals('MntvB0NYESObxH4VRDUycw==', xhr.getResponseHeader("Content-MD5"));
-
-  // test attachment via multipart/form-data
-  var bin_doc8 = {
-    _id: "bin_doc8"
-  };
-  T(db.save(bin_doc8).ok);
-  var doc = db.open("bin_doc8");
-  var body = "------TF\r\n" +
-    "Content-Disposition: form-data; name=\"_rev\"\r\n\r\n" +
-    doc._rev + "\r\n" +
-    "------TF\r\n" +
-    "Content-Disposition: form-data; name=\"_attachments\"; filename=\"file.txt\"\r\n" +
-    "Content-Type: text/plain\r\n\r\n" +
-    "contents of file.txt\r\n\r\n" +
-    "------TF--"
-  xhr = CouchDB.request("POST", "/" + db_name + "/bin_doc8", {
-    headers: {
-      "Content-Type": "multipart/form-data; boundary=----TF",
-      "Content-Length": body.length
-    },
-    body: body
-  });
-  TEquals(201, xhr.status);
-  TEquals(true, JSON.parse(xhr.responseText).ok);
-  var doc = db.open("bin_doc8");
-  T(doc._attachments);
-  T(doc._attachments['file.txt']);
-
-  // cleanup
-  db.deleteDb();
-
-};
diff --git a/test/javascript/tests/attachments_multipart.js b/test/javascript/tests/attachments_multipart.js
deleted file mode 100644
index 793c8c9..0000000
--- a/test/javascript/tests/attachments_multipart.js
+++ /dev/null
@@ -1,426 +0,0 @@
-// Licensed under the Apache License, Version 2.0 (the "License"); you may not
-// use this file except in compliance with the License. You may obtain a copy of
-// the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-// License for the specific language governing permissions and limitations under
-// the License.
-
-couchTests.elixir = true;
-couchTests.attachments_multipart= function(debug) {
-  return console.log('done in test/elixir/test/attachment_multipart_test.exs');
-  var db_name = get_random_db_name()
-  var db = new CouchDB(db_name, {"X-Couch-Full-Commit":"false"});
-  db.createDb();
-  if (debug) debugger;
-
-  // mime multipart
-
-  var xhr = CouchDB.request("PUT", "/" + db_name + "/multipart", {
-    headers: {"Content-Type": "multipart/related;boundary=\"abc123\""},
-    body:
-      "--abc123\r\n" +
-      "content-type: application/json\r\n" +
-      "\r\n" +
-      JSON.stringify({
-        "body":"This is a body.",
-        "_attachments":{
-          "foo.txt": {
-            "follows":true,
-            "content_type":"application/test",
-            "length":21
-            },
-          "bar.txt": {
-            "follows":true,
-            "content_type":"application/test",
-            "length":20
-            },
-          "baz.txt": {
-            "follows":true,
-            "content_type":"text/plain",
-            "length":19
-            }
-          }
-        }) +
-      "\r\n--abc123\r\n" +
-      "\r\n" +
-      "this is 21 chars long" +
-      "\r\n--abc123\r\n" +
-      "\r\n" +
-      "this is 20 chars lon" +
-      "\r\n--abc123\r\n" +
-      "\r\n" +
-      "this is 19 chars lo" +
-      "\r\n--abc123--epilogue"
-    });
-
-  var result = JSON.parse(xhr.responseText);
-
-  T(result.ok);
-
-
-
-  TEquals(201, xhr.status, "should send 201 Accepted");
-
-  xhr = CouchDB.request("GET", "/" + db_name + "/multipart/foo.txt");
-
-  T(xhr.responseText == "this is 21 chars long");
-
-  xhr = CouchDB.request("GET", "/" + db_name + "/multipart/bar.txt");
-
-  T(xhr.responseText == "this is 20 chars lon");
-
-  xhr = CouchDB.request("GET", "/" + db_name + "/multipart/baz.txt");
-
-  T(xhr.responseText == "this is 19 chars lo");
-
-  // now edit an attachment
-
-  var doc = db.open("multipart", {att_encoding_info: true});
-  var firstrev = doc._rev;
-
-  T(doc._attachments["foo.txt"].stub == true);
-  T(doc._attachments["bar.txt"].stub == true);
-  T(doc._attachments["baz.txt"].stub == true);
-  TEquals("undefined", typeof doc._attachments["foo.txt"].encoding);
-  TEquals("undefined", typeof doc._attachments["bar.txt"].encoding);
-  TEquals("gzip", doc._attachments["baz.txt"].encoding);
-
-  //lets change attachment bar
-  delete doc._attachments["bar.txt"].stub; // remove stub member (or could set to false)
-  delete doc._attachments["bar.txt"].digest; // remove the digest (it's for the gzip form)
-  doc._attachments["bar.txt"].length = 18;
-  doc._attachments["bar.txt"].follows = true;
-  //lets delete attachment baz:
-  delete doc._attachments["baz.txt"];
-
-  var xhr = CouchDB.request("PUT", "/" + db_name + "/multipart", {
-    headers: {"Content-Type": "multipart/related;boundary=\"abc123\""},
-    body:
-      "--abc123\r\n" +
-      "content-type: application/json\r\n" +
-      "\r\n" +
-      JSON.stringify(doc) +
-      "\r\n--abc123\r\n" +
-      "\r\n" +
-      "this is 18 chars l" +
-      "\r\n--abc123--"
-    });
-  TEquals(201, xhr.status);
-
-  xhr = CouchDB.request("GET", "/" + db_name + "/multipart/bar.txt");
-
-  T(xhr.responseText == "this is 18 chars l");
-
-  xhr = CouchDB.request("GET", "/" + db_name + "/multipart/baz.txt");
-  T(xhr.status == 404);
-
-  // now test receiving multipart docs
-
-  function getBoundary(xhr) {
-    var ctype = CouchDB.xhrheader(xhr, "Content-Type");
-    var ctypeArgs = ctype.split("; ").slice(1);
-    var boundary = null;
-    for(var i=0; i<ctypeArgs.length; i++) {
-      if (ctypeArgs[i].indexOf("boundary=") == 0) {
-        boundary = ctypeArgs[i].split("=")[1];
-        if (boundary.charAt(0) == '"') {
-          // stringified boundary, parse as json
-          // (will maybe not if there are escape quotes)
-          boundary = JSON.parse(boundary);
-        }
-      }
-    }
-    return boundary;
-  }
-
-  function parseMultipart(xhr) {
-    var boundary = getBoundary(xhr);
-    var mimetext = CouchDB.xhrbody(xhr);
-    // strip off leading boundary
-    var leading = "--" + boundary + "\r\n";
-    var last = "\r\n--" + boundary + "--";
-
-    // strip off leading and trailing boundary
-    var leadingIdx = mimetext.indexOf(leading) + leading.length;
-    var trailingIdx = mimetext.indexOf(last);
-    mimetext = mimetext.slice(leadingIdx, trailingIdx);
-
-    // now split the sections
-    var sections = mimetext.split(new RegExp("\\r\\n--" + boundary));
-
-    // spilt out the headers for each section
-    for(var i=0; i < sections.length; i++) {
-      var section = sections[i];
-      var headerEndIdx = section.indexOf("\r\n\r\n");
-      var headersraw = section.slice(0, headerEndIdx).split(/\r\n/);
-      var body = section.slice(headerEndIdx + 4);
-      var headers = {};
-      for(var j=0; j<headersraw.length; j++) {
-        var tmp = headersraw[j].split(": ");
-        headers[tmp[0]] = tmp[1];
-      }
-      sections[i] = {"headers":headers, "body":body};
-    }
-
-    return sections;
-  }
-
-
-  xhr = CouchDB.request("GET", "/" + db_name + "/multipart?attachments=true",
-    {headers:{"accept": "multipart/related,*/*;"}});
-
-  T(xhr.status == 200);
-
-  // parse out the multipart
-  var sections = parseMultipart(xhr);
-  TEquals("790", xhr.getResponseHeader("Content-Length"),
-    "Content-Length should be correct");
-  T(sections.length == 3);
-  // The first section is the json doc. Check it's content-type.
-  // Each part carries their own meta data.
-  TEquals("application/json", sections[0].headers['Content-Type'],
-    "Content-Type should be application/json for section[0]");
-  TEquals("application/test", sections[1].headers['Content-Type'],
-    "Content-Type should be application/test for section[1]");
-  TEquals("application/test", sections[2].headers['Content-Type'],
-    "Content-Type should be application/test for section[2]");
-
-  TEquals("21", sections[1].headers['Content-Length'],
-    "Content-Length should be 21 section[1]");
-  TEquals("18", sections[2].headers['Content-Length'],
-    "Content-Length should be 18 section[2]");
-
-  TEquals('attachment; filename="foo.txt"', sections[1].headers['Content-Disposition'],
-    "Content-Disposition should be foo.txt section[1]");
-  TEquals('attachment; filename="bar.txt"', sections[2].headers['Content-Disposition'],
-    "Content-Disposition should be bar.txt section[2]");
-
-  var doc = JSON.parse(sections[0].body);
-
-  T(doc._attachments['foo.txt'].follows == true);
-  T(doc._attachments['bar.txt'].follows == true);
-
-  T(sections[1].body == "this is 21 chars long");
-  TEquals("this is 18 chars l", sections[2].body, "should be 18 chars long");
-
-  // now get attachments incrementally (only the attachments changes since
-  // a certain rev).
-
-  xhr = CouchDB.request("GET", "/" + db_name + "/multipart?atts_since=[\"" + firstrev + "\"]",
-    {headers:{"accept": "multipart/related, */*"}});
-
-  T(xhr.status == 200);
-
-  var sections = parseMultipart(xhr);
-
-  T(sections.length == 2);
-
-  var doc = JSON.parse(sections[0].body);
-
-  T(doc._attachments['foo.txt'].stub == true);
-  T(doc._attachments['bar.txt'].follows == true);
-
-  TEquals("this is 18 chars l", sections[1].body, "should be 18 chars long 2");
-
-  // try the atts_since parameter together with the open_revs parameter
-  xhr = CouchDB.request(
-    "GET",
-    "/" + db_name + "/multipart?open_revs=[" +
-      '"' + doc._rev + '"]&atts_since=["' + firstrev + '"]',
-    {headers: {"accept": "multipart/mixed"}}
-  );
-
-  T(xhr.status === 200);
-
-  sections = parseMultipart(xhr);
-  // 1 section, with a multipart/related Content-Type
-  T(sections.length === 1);
-  T(sections[0].headers['Content-Type'].indexOf('multipart/related;') === 0);
-
-  var innerSections = parseMultipart(sections[0]);
-  // 2 inner sections: a document body section plus an attachment data section
-// TODO: why does atts_since not work?
-//  T(innerSections.length === 2);
-  T(innerSections.length === 3);
-  T(innerSections[0].headers['Content-Type'] === 'application/json');
-
-  doc = JSON.parse(innerSections[0].body);
-
-// TODO: why does atts_since not work?
-//  T(doc._attachments['foo.txt'].stub === true);
-  T(doc._attachments['foo.txt'].follows === true);
-  T(doc._attachments['bar.txt'].follows === true);
-
-// TODO: why does atts_since not work?
-  T(innerSections[1].body === "this is 21 chars long");
-  T(innerSections[2].body === "this is 18 chars l");
-
-  // try it with a rev that doesn't exist (should get all attachments)
-
-  xhr = CouchDB.request("GET", "/" + db_name + "/multipart?atts_since=[\"1-2897589\"]",
-    {headers:{"accept": "multipart/related,*/*;"}});
-
-  T(xhr.status == 200);
-
-  var sections = parseMultipart(xhr);
-
-  T(sections.length == 3);
-
-  var doc = JSON.parse(sections[0].body);
-
-  T(doc._attachments['foo.txt'].follows == true);
-  T(doc._attachments['bar.txt'].follows == true);
-
-  T(sections[1].body == "this is 21 chars long");
-  TEquals("this is 18 chars l", sections[2].body, "should be 18 chars long 3");
-  // try it with a rev that doesn't exist, and one that does
-
-  xhr = CouchDB.request("GET", "/" + db_name + "/multipart?atts_since=[\"1-2897589\",\"" + firstrev + "\"]",
-    {headers:{"accept": "multipart/related,*/*;"}});
-
-  T(xhr.status == 200);
-
-  var sections = parseMultipart(xhr);
-
-  T(sections.length == 2);
-
-  var doc = JSON.parse(sections[0].body);
-
-  T(doc._attachments['foo.txt'].stub == true);
-  T(doc._attachments['bar.txt'].follows == true);
-
-  TEquals("this is 18 chars l", sections[1].body, "should be 18 chars long 4");
-
-  // check that with the document multipart/mixed API it's possible to receive
-  // attachments in compressed form (if they're stored in compressed form)
-
-  var server_config = [
-    {
-      section: "attachments",
-      key: "compression_level",
-      value: "8"
-    },
-    {
-      section: "attachments",
-      key: "compressible_types",
-      value: "text/plain"
-    }
-  ];
-
-  function testMultipartAttCompression() {
-    var doc = { _id: "foobar" };
-    var lorem =
-      CouchDB.request("GET", "/_utils/script/test/lorem.txt").responseText;
-    var helloData = "hello world";
-
-    TEquals(true, db.save(doc).ok);
-
-    var firstRev = doc._rev;
-    var xhr = CouchDB.request(
-      "PUT",
-      "/" + db.name + "/" + doc._id + "/data.bin?rev=" + firstRev,
-      {
-        body: helloData,
-        headers: {"Content-Type": "application/binary"}
-      }
-    );
-    TEquals(201, xhr.status);
-
-    var secondRev = db.open(doc._id)._rev;
-    xhr = CouchDB.request(
-      "PUT",
-      "/" + db.name + "/" + doc._id + "/lorem.txt?rev=" + secondRev,
-      {
-        body: lorem,
-        headers: {"Content-Type": "text/plain"}
-      }
-    );
-    TEquals(201, xhr.status);
-
-    var thirdRev = db.open(doc._id)._rev;
-
-    xhr = CouchDB.request(
-      "GET",
-      '/' + db.name + '/' + doc._id + '?open_revs=["' + thirdRev + '"]',
-      {
-        headers: {
-          "Accept": "multipart/mixed",
-          "X-CouchDB-Send-Encoded-Atts": "true"
-        }
-      }
-    );
-    TEquals(200, xhr.status);
-
-    var sections = parseMultipart(xhr);
-    // 1 section, with a multipart/related Content-Type
-    TEquals(1, sections.length);
-    TEquals(0,
-      sections[0].headers['Content-Type'].indexOf('multipart/related;'));
-
-    var innerSections = parseMultipart(sections[0]);
-    // 3 inner sections: a document body section plus 2 attachment data sections
-    TEquals(3, innerSections.length);
-    TEquals('application/json', innerSections[0].headers['Content-Type']);
-
-    doc = JSON.parse(innerSections[0].body);
-
-    TEquals(true, doc._attachments['lorem.txt'].follows);
-    TEquals("gzip", doc._attachments['lorem.txt'].encoding);
-    TEquals(true, doc._attachments['data.bin'].follows);
-    T(doc._attachments['data.bin'] !== "gzip");
-
-    if (innerSections[1].body === helloData) {
-      T(innerSections[2].body !== lorem);
-    } else if (innerSections[2].body === helloData) {
-      T(innerSections[1].body !== lorem);
-    } else {
-      T(false, "Could not found data.bin attachment data");
-    }
-
-    // now test that it works together with the atts_since parameter
-
-    xhr = CouchDB.request(
-      "GET",
-      '/' + db.name + '/' + doc._id + '?open_revs=["' + thirdRev + '"]' +
-        '&atts_since=["' + secondRev + '"]',
-      {
-        headers: {
-          "Accept": "multipart/mixed",
-          "X-CouchDB-Send-Encoded-Atts": "true"
-        }
-      }
-    );
-    TEquals(200, xhr.status);
-
-    sections = parseMultipart(xhr);
-    // 1 section, with a multipart/related Content-Type
-    TEquals(1, sections.length);
-    TEquals(0,
-      sections[0].headers['Content-Type'].indexOf('multipart/related;'));
-
-    innerSections = parseMultipart(sections[0]);
-    // 2 inner sections: a document body section plus 1 attachment data section
-// TODO: why does atts_since not work?
-//    TEquals(2, innerSections.length);
-    TEquals('application/json', innerSections[0].headers['Content-Type']);
-
-    doc = JSON.parse(innerSections[0].body);
-
-    TEquals(true, doc._attachments['lorem.txt'].follows);
-    TEquals("gzip", doc._attachments['lorem.txt'].encoding);
-// TODO: why does atts_since not work?
-//    TEquals("undefined", typeof doc._attachments['data.bin'].follows);
-//    TEquals(true, doc._attachments['data.bin'].stub);
-    T(innerSections[1].body !== lorem);
-  }
-
-  run_on_modified_server(server_config, testMultipartAttCompression);
-
-//  // cleanup
-  db.deleteDb();
-};
diff --git a/test/javascript/tests/auth_cache.js b/test/javascript/tests/auth_cache.js
deleted file mode 100644
index 73fec35..0000000
--- a/test/javascript/tests/auth_cache.js
+++ /dev/null
@@ -1,274 +0,0 @@
-// Licensed under the Apache License, Version 2.0 (the "License"); you may not
-// use this file except in compliance with the License.  You may obtain a copy
-// of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
-// License for the specific language governing permissions and limitations under
-// the License.
-
-couchTests.elixir = true;
-couchTests.auth_cache = function(debug) {
-  if (debug) debugger;
-
-  // Simple secret key generator
-  function generateSecret(length) {
-    var tab = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" +
-              "0123456789+/";
-    var secret = '';
-    for (var i = 0; i < length; i++) {
-      secret += tab.charAt(Math.floor(Math.random() * 64));
-    }
-    return secret;
-  }
-
-  var db_name = get_random_db_name();
-  var authDb = new CouchDB(db_name, {"X-Couch-Full-Commit":"false"}, {w: 3});
-  authDb.createDb();
-  var server_config = [
-    {
-      section: "chttpd_auth",
-      key: "authentication_db",
-      value: authDb.name
-    },
-    {
-      section: "chttpd_auth",
-      key: "auth_cache_size",
-      value: "3"
-    },
-    {
-      section: "httpd",
-      key: "authentication_handlers",
-      value: "{couch_httpd_auth, default_authentication_handler}"
-    },
-    {
-      section: "chttpd_auth",
-      key: "secret",
-      value: generateSecret(64)
-    }
-  ];
-
-
-  function hits() {
-    var hits = CouchDB.requestStats(["couchdb", "auth_cache_hits"], true);
-    return hits.value || 0;
-  }
-
-
-  function misses() {
-    var misses = CouchDB.requestStats(["couchdb", "auth_cache_misses"], true);
-    return misses.value || 0;
-  }
-
-
-  function testFun() {
-    var hits_before,
-        misses_before,
-        hits_after,
-        misses_after;
-
-    var fdmanana = CouchDB.prepareUserDoc({
-      name: "fdmanana",
-      roles: ["dev"]
-    }, "qwerty");
-
-    T(authDb.save(fdmanana).ok);
-
-    var chris = CouchDB.prepareUserDoc({
-      name: "chris",
-      roles: ["dev", "mafia", "white_costume"]
-    }, "the_god_father");
-
-    T(authDb.save(chris).ok);
-
-    var joe = CouchDB.prepareUserDoc({
-      name: "joe",
-      roles: ["erlnager"]
-    }, "functional");
-
-    T(authDb.save(joe).ok);
-
-    var johndoe = CouchDB.prepareUserDoc({
-      name: "johndoe",
-      roles: ["user"]
-    }, "123456");
-
-    T(authDb.save(johndoe).ok);
-
-    hits_before = hits();
-    misses_before = misses();
-
-    T(CouchDB.login("fdmanana", "qwerty").ok);
-    T(CouchDB.logout().ok);
-
-    hits_after = hits();
-    misses_after = misses();
-
-    T(misses_after === (misses_before + 1));
-    // XXX BUGGED T(hits_after === hits_before);
-
-    hits_before = hits_after;
-    misses_before = misses_after;
-
-    T(CouchDB.login("fdmanana", "qwerty").ok);
-    T(CouchDB.logout().ok);
-
-    hits_after = hits();
-    misses_after = misses();
-
-    T(misses_after === misses_before);
-    // XXX BUGGED T(hits_after === (hits_before + 1));
-
-    hits_before = hits_after;
-    misses_before = misses_after;
-
-    T(CouchDB.login("chris", "the_god_father").ok);
-    T(CouchDB.logout().ok);
-
-    hits_after = hits();
-    misses_after = misses();
-
-    T(misses_after === (misses_before + 1));
-    // XXX BUGGED T(hits_after === hits_before);
-
-    hits_before = hits_after;
-    misses_before = misses_after;
-
-    T(CouchDB.login("joe", "functional").ok);
-    T(CouchDB.logout().ok);
-
-    hits_after = hits();
-    misses_after = misses();
-
-    T(misses_after === (misses_before + 1));
-    // XXX BUGGED T(hits_after === hits_before);
-
-    hits_before = hits_after;
-    misses_before = misses_after;
-
-    T(CouchDB.login("johndoe", "123456").ok);
-    T(CouchDB.logout().ok);
-
-    hits_after = hits();
-    misses_after = misses();
-
-    T(misses_after === (misses_before + 1));
-    // XXX BUGGED T(hits_after === hits_before);
-
-    hits_before = hits_after;
-    misses_before = misses_after;
-
-    T(CouchDB.login("joe", "functional").ok);
-    T(CouchDB.logout().ok);
-
-    hits_after = hits();
-    misses_after = misses();
-
-    // it's an MRU cache, joe was removed from cache to add johndoe
-    // XXX BUGGED T(misses_after === (misses_before + 1));
-    // XXX BUGGED T(hits_after === hits_before);
-
-    hits_before = hits_after;
-    misses_before = misses_after;
-
-    T(CouchDB.login("fdmanana", "qwerty").ok);
-    T(CouchDB.logout().ok);
-
-    hits_after = hits();
-    misses_after = misses();
-
-    T(misses_after === misses_before);
-    // XXX BUGGED T(hits_after === (hits_before + 1));
-
-    hits_before = hits_after;
-    misses_before = misses_after;
-
-    fdmanana.password = "foobar";
-    T(authDb.save(fdmanana).ok);
-
-    // cache was refreshed
-/*  // XXX BUGGED
-    T(CouchDB.login("fdmanana", "qwerty").error === "unauthorized");
-    T(CouchDB.login("fdmanana", "foobar").ok);
-    T(CouchDB.logout().ok);
-*/
-
-    hits_after = hits();
-    misses_after = misses();
-
-    T(misses_after === misses_before);
-    // XXX BUGGED T(hits_after === (hits_before + 2));
-
-    hits_before = hits_after;
-    misses_before = misses_after;
-
-    // and yet another update
-    fdmanana.password = "javascript";
-    T(authDb.save(fdmanana).ok);
-
-    // cache was refreshed
-/*  // XXX BUGGED
-    T(CouchDB.login("fdmanana", "foobar").error === "unauthorized");
-    T(CouchDB.login("fdmanana", "javascript").ok);
-    T(CouchDB.logout().ok);
-*/
-
-    hits_after = hits();
-    misses_after = misses();
-
-    T(misses_after === misses_before);
-    // XXX BUGGED T(hits_after === (hits_before + 2));
-
-    T(authDb.deleteDoc(fdmanana).ok);
-
-    hits_before = hits_after;
-    misses_before = misses_after;
-
-    T(CouchDB.login("fdmanana", "javascript").error === "unauthorized");
-
-    hits_after = hits();
-    misses_after = misses();
-
-    T(misses_after === misses_before);
-    T(hits_after === (hits_before + 1));
-
-    // login, compact authentication DB, login again and verify that
-    // there was a cache hit
-    hits_before = hits_after;
-    misses_before = misses_after;
-
-    T(CouchDB.login("johndoe", "123456").ok);
-    T(CouchDB.logout().ok);
-
-    hits_after = hits();
-    misses_after = misses();
-
-    // XXX BUGGED T(misses_after === (misses_before + 1));
-    // XXX BUGGED T(hits_after === hits_before);
-
-    T(authDb.compact().ok);
-
-    while (authDb.info().compact_running);
-
-    hits_before = hits_after;
-    misses_before = misses_after;
-
-    T(CouchDB.login("johndoe", "123456").ok);
-    T(CouchDB.logout().ok);
-
-    hits_after = hits();
-    misses_after = misses();
-
-    // XXX BUGGED T(misses_after === misses_before);
-    // XXX BUGGED T(hits_after === (hits_before + 1));
-  }
-
-
-  run_on_modified_server(server_config, testFun);
-
-  // cleanup
-  authDb.deleteDb();
-}
diff --git a/test/javascript/tests/basics.js b/test/javascript/tests/basics.js
deleted file mode 100644
index 51abb40..0000000
--- a/test/javascript/tests/basics.js
+++ /dev/null
@@ -1,302 +0,0 @@
-// Licensed under the Apache License, Version 2.0 (the "License"); you may not
-// use this file except in compliance with the License. You may obtain a copy of
-// the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-// License for the specific language governing permissions and limitations under
-// the License.
-
-// Do some basic tests.
-couchTests.elixir = true;
-couchTests.basics = function(debug) {
-  return console.log('done in test/elixir/test/basics_test.exs');
-  if (debug) debugger;
-
-  var result = JSON.parse(CouchDB.request("GET", "/").responseText);
-  T(result.couchdb == "Welcome");
-
-  var db_name = get_random_db_name()
-  var db = new CouchDB(db_name, {"X-Couch-Full-Commit":"false"});
-
-  //TODO bug COUCHDB-100: DELETE on non-existent DB returns 500 instead of 404
-  //TODO db.deleteDb();
-
-  db.createDb();
-
-  // PUT on existing DB should return 412 instead of 500
-  xhr = CouchDB.request("PUT", "/" + db_name + "/");
-  T(xhr.status == 412);
-
-  // creating a new DB should return Location header
-  // and it should work for dbs with slashes (COUCHDB-411)
-  var db_name2 = get_random_db_name();
-  var dbnames = [db_name2, db_name2 + "%2Fwith_slashes"];
-  dbnames.forEach(function(dbname) {
-    xhr = CouchDB.request("DELETE", "/" + dbname);
-    xhr = CouchDB.request("PUT", "/" + dbname);
-    TEquals(dbname,
-      xhr.getResponseHeader("Location").substr(-dbname.length),
-      "should return Location header to newly created document");
-    TEquals(CouchDB.protocol,
-      xhr.getResponseHeader("Location").substr(0, CouchDB.protocol.length),
-      "should return absolute Location header to newly created document");
-    CouchDB.request("DELETE", "/" + dbname);
-  });
-
-  // Get the database info, check the db_name
-  TEquals(db.info().db_name, db_name, "get correct database name");
-  T(CouchDB.allDbs().indexOf("" + db_name + "") != -1);
-
-  // Get the database info, check the doc_count
-  T(db.info().doc_count == 0);
-
-  // create a document and save it to the database
-  var doc = {_id:"0",a:1,b:1};
-  var result = db.save(doc);
-
-  T(result.ok==true); // return object has an ok member with a value true
-  T(result.id); // the _id of the document is set.
-  T(result.rev); // the revision id of the document is set.
-
-  // Verify the input doc is now set with the doc id and rev
-  // (for caller convenience).
-  T(doc._id == result.id && doc._rev == result.rev);
-
-  var id = result.id; // save off the id for later
-
-  // make sure the revs_info status is good
-  var doc = db.open(id, {revs_info:true});
-  T(doc._revs_info[0].status == "available");
-
-  // make sure you can do a seq=true option
-  var doc = db.open(id, {local_seq:true});
-  T(doc._local_seq == 1);
-
-
-  // Create some more documents.
-  // Notice the use of the ok member on the return result.
-  T(db.save({_id:"1",a:2,b:4}).ok);
-  T(db.save({_id:"2",a:3,b:9}).ok);
-  T(db.save({_id:"3",a:4,b:16}).ok);
-
-  // with n=3 and w=r=2, it SHOULD be reliable in clusters - execute often 2 see...
-
-  // Check the database doc count
-  T(db.info().doc_count == 4);
-
-  // COUCHDB-954
-  var oldRev = db.save({_id:"COUCHDB-954", a:1}).rev;
-  var newRev = db.save({_id:"COUCHDB-954", _rev:oldRev}).rev;
-
-  // test behavior of open_revs with explicit revision list
-  var result = db.open("COUCHDB-954", {open_revs:[oldRev,newRev]});
-  T(result.length == 2, "should get two revisions back");
-  T(result[0].ok);
-  T(result[1].ok);
-
-  // latest=true suppresses non-leaf revisions
-// TODO: does no more work on cluster - function_clause error fabric_doc_open_revs:handle_message/3
-//  var result = db.open("COUCHDB-954", {open_revs:[oldRev,newRev], latest:true});
-//  T(result.length == 1, "should only get the child revision with latest=true");
-//  T(result[0].ok._rev == newRev, "should get the child and not the parent");
-
-  // latest=true returns a child when you ask for a parent
-  var result = db.open("COUCHDB-954", {open_revs:[oldRev], latest:true});
-  T(result[0].ok._rev == newRev, "should get child when we requested parent");
-
-  // clean up after ourselves
-  db.save({_id:"COUCHDB-954", _rev:newRev, _deleted:true});
-
-  // Test a simple map functions
-
-  // create a map function that selects all documents whose "a" member
-  // has a value of 4, and then returns the document's b value.
-  var mapFunction = function(doc){
-    if (doc.a==4)
-      emit(null, doc.b);
-  };
-
-  var results = db.query(mapFunction);
-
-  // verify only one document found and the result value (doc.b).
-  T(results.total_rows == 1 && results.rows[0].value == 16);
-
-  // reopen document we saved earlier
-  var existingDoc = db.open(id);
-
-  T(existingDoc.a==1);
-
-  //modify and save
-  existingDoc.a=4;
-  db.save(existingDoc);
-
-  // redo the map query
-  results = db.query(mapFunction);
-
-  // the modified document should now be in the results.
-  T(results.total_rows == 2);
-
-  // write 2 more documents
-  T(db.save({a:3,b:9}).ok);
-  T(db.save({a:4,b:16}).ok);
-
-  results = db.query(mapFunction);
-
-  // 1 more document should now be in the result.
-  T(results.total_rows == 3);
-  TEquals(6, db.info().doc_count, 'number of docs in db');
-
-  var reduceFunction = function(keys, values){
-    return sum(values);
-  };
-
-  results = db.query(mapFunction, reduceFunction);
-
-  T(results.rows[0].value == 33);
-
-  // delete a document
-  T(db.deleteDoc(existingDoc).ok);
-
-  // make sure we can't open the doc
-  T(db.open(existingDoc._id) == null);
-
-  results = db.query(mapFunction);
-
-  // 1 less document should now be in the results.
-  T(results.total_rows == 2);
-  T(db.info().doc_count == (5));
-
-  // make sure we can still open the old rev of the deleted doc
-  T(db.open(existingDoc._id, {rev: existingDoc._rev}) != null);
-  // make sure restart works
-// TODO: investigate why it won't work
-//  T(db.ensureFullCommit().ok);
-//  restartServer();
-
-  // make sure we can still open
-  T(db.open(existingDoc._id, {rev: existingDoc._rev}) != null);
-
-  // test that the POST response has a Location header
-  var xhr = CouchDB.request("POST", "/" + db_name + "", {
-    body: JSON.stringify({"foo":"bar"}),
-    headers: {"Content-Type": "application/json"}
-  });
-  var resp = JSON.parse(xhr.responseText);
-  T(resp.ok);
-  var loc = xhr.getResponseHeader("Location");
-  T(loc, "should have a Location header");
-  var locs = loc.split('/');
-  T(locs[locs.length-1] == resp.id);
-  T(locs[locs.length-2] == "" + db_name + "");
-
-  // test that that POST's with an _id aren't overriden with a UUID.
-  var xhr = CouchDB.request("POST", "/" + db_name + "", {
-    headers: {"Content-Type": "application/json"},
-    body: JSON.stringify({"_id": "oppossum", "yar": "matey"})
-  });
-  var resp = JSON.parse(xhr.responseText);
-  T(resp.ok);
-  T(resp.id == "oppossum");
-  var doc = db.open("oppossum");
-  T(doc.yar == "matey");
-
-  // document put's should return a Location header
-  var xhr = CouchDB.request("PUT", "/" + db_name + "/newdoc", {
-    body: JSON.stringify({"a":1})
-  });
-  TEquals("/" + db_name + "/newdoc",
-    xhr.getResponseHeader("Location").substr(-(db_name.length + 1 + 7)),
-    "should return Location header to newly created document");
-  TEquals(CouchDB.protocol,
-    xhr.getResponseHeader("Location").substr(0, CouchDB.protocol.length),
-    "should return absolute Location header to newly created document");
-
-  // deleting a non-existent doc should be 404
-  xhr = CouchDB.request("DELETE", "/" + db_name + "/doc-does-not-exist");
-  T(xhr.status == 404);
-
-  // Check for invalid document members
-  var bad_docs = [
-    ["goldfish", {"_zing": 4}],
-    ["zebrafish", {"_zoom": "hello"}],
-    ["mudfish", {"zane": "goldfish", "_fan": "something smells delicious"}],
-    ["tastyfish", {"_bing": {"wha?": "soda can"}}]
-  ];
-  var test_doc = function(info) {
-  var data = JSON.stringify(info[1]);
-    xhr = CouchDB.request("PUT", "/" + db_name + "/" + info[0], {body: data});
-    T(xhr.status == 400);
-    result = JSON.parse(xhr.responseText);
-    T(result.error == "doc_validation");
-
-    xhr = CouchDB.request("POST", "/" + db_name + "/", {
-      headers: {"Content-Type": "application/json"},
-      body: data
-    });
-    T(xhr.status == 400);
-    result = JSON.parse(xhr.responseText);
-    T(result.error == "doc_validation");
-  };
-  bad_docs.forEach(test_doc);
-
-  // Check some common error responses.
-  // PUT body not an object
-  xhr = CouchDB.request("PUT", "/" + db_name + "/bar", {body: "[]"});
-  T(xhr.status == 400);
-  result = JSON.parse(xhr.responseText);
-  T(result.error == "bad_request");
-  T(result.reason == "Document must be a JSON object");
-
-  // Body of a _bulk_docs is not an object
-  xhr = CouchDB.request("POST", "/" + db_name + "/_bulk_docs", {body: "[]"});
-  T(xhr.status == 400);
-  result = JSON.parse(xhr.responseText);
-  T(result.error == "bad_request");
-  T(result.reason == "Request body must be a JSON object");
-
-  // Body of an _all_docs  multi-get is not a {"key": [...]} structure.
-  xhr = CouchDB.request("POST", "/" + db_name + "/_all_docs", {body: "[]"});
-  T(xhr.status == 400);
-  result = JSON.parse(xhr.responseText);
-  T(result.error == "bad_request");
-  T(result.reason == "Request body must be a JSON object");
-  var data = "{\"keys\": 1}";
-  xhr = CouchDB.request("POST", "/" + db_name + "/_all_docs", {body:data});
-  T(xhr.status == 400);
-  result = JSON.parse(xhr.responseText);
-  T(result.error == "bad_request");
-  T(result.reason == "`keys` body member must be an array.");
-
-  // oops, the doc id got lost in code nirwana
-  xhr = CouchDB.request("DELETE", "/" + db_name + "/?rev=foobarbaz");
-  TEquals(400, xhr.status, "should return a bad request");
-  result = JSON.parse(xhr.responseText);
-  TEquals("bad_request", result.error);
-  TEquals("You tried to DELETE a database with a ?=rev parameter. Did you mean to DELETE a document instead?", result.reason);
-
-  // On restart, a request for creating a database that already exists can
-  // not override the existing database file
-  // TODO
-  // db = new CouchDB(db_name);
-  // xhr = CouchDB.request("PUT", "/" + db.name);
-  // TEquals(201, xhr.status);
-  //
-  // TEquals(true, db.save({"_id": "doc1"}).ok);
-  // TEquals(true, db.ensureFullCommit().ok);
-  //
-  // TEquals(1, db.info().doc_count);
-  //
-  // restartServer();
-  //
-  // xhr = CouchDB.request("PUT", "/" + db.name);
-  // TEquals(412, xhr.status);
-  //
-  // TEquals(1, db.info().doc_count);
-
-  // cleanup
-  db.deleteDb();
-};
diff --git a/test/javascript/tests/batch_save.js b/test/javascript/tests/batch_save.js
deleted file mode 100644
index bbfb2ed..0000000
--- a/test/javascript/tests/batch_save.js
+++ /dev/null
@@ -1,52 +0,0 @@
-// Licensed under the Apache License, Version 2.0 (the "License"); you may not
-// use this file except in compliance with the License. You may obtain a copy of
-// the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-// License for the specific language governing permissions and limitations under
-// the License.
-
-couchTests.elixir = true;
-couchTests.batch_save = function(debug) {
-  return console.log('done in test/elixir/test/batch_save_test.exs');
-  var db_name = get_random_db_name()
-  var db = new CouchDB(db_name, {"X-Couch-Full-Commit":"false"});
-  db.createDb();
-  if (debug) debugger;
-
-  var i
-  for(i=0; i < 100; i++) {
-    T(db.save({_id:i.toString(),a:i,b:i},  {batch : "ok"}).ok);
-
-    // test that response is 202 Accepted
-    T(db.last_req.status == 202);
-  }
-
-  for(i=0; i < 100; i++) {
-    // attempt to save the same document a bunch of times
-    T(db.save({_id:"foo",a:i,b:i},  {batch : "ok"}).ok);
-
-    // test that response is 202 Accepted
-    T(db.last_req.status == 202);
-  }
-
-  while(db.allDocs().total_rows != 101){};
-
-  // repeat the tests for POST
-  for(i=0; i < 100; i++) {
-    var resp = db.request("POST", db.uri + "?batch=ok", {
-      headers: {"Content-Type": "application/json"},
-      body: JSON.stringify({a:1})
-    });
-    T(JSON.parse(resp.responseText).ok);
-  }
-
-  while(db.allDocs().total_rows != 201){};
-
-  // cleanup
-  db.deleteDb();
-};
diff --git a/test/javascript/tests/bulk_docs.js b/test/javascript/tests/bulk_docs.js
deleted file mode 100644
index 767a543..0000000
--- a/test/javascript/tests/bulk_docs.js
+++ /dev/null
@@ -1,153 +0,0 @@
-// Licensed under the Apache License, Version 2.0 (the "License"); you may not
-// use this file except in compliance with the License. You may obtain a copy of
-// the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-// License for the specific language governing permissions and limitations under
-// the License.
-
-couchTests.elixir = true;
-couchTests.bulk_docs = function(debug) {
-  return console.log('done in test/elixir/test/basics_test.exs');
-  var db_name = get_random_db_name();
-  var db = new CouchDB(db_name, {"X-Couch-Full-Commit":"false"});
-  db.createDb();
-  if (debug) debugger;
-
-  var docs = makeDocs(5);
-
-  // Create the docs
-  var results = db.bulkSave(docs);
-
-  T(results.length == 5);
-  for (var i = 0; i < 5; i++) {
-    T(results[i].id == docs[i]._id);
-    T(results[i].rev);
-    // Update the doc
-    docs[i].string = docs[i].string + ".00";
-  }
-
-  // Save the docs
-  results = db.bulkSave(docs);
-  T(results.length == 5);
-  for (i = 0; i < 5; i++) {
-    T(results[i].id == i.toString());
-
-    // set the delete flag to delete the docs in the next step
-    docs[i]._deleted = true;
-  }
-
-  // now test a bulk update with a conflict
-  // open and save
-  var doc = db.open("0");
-  db.save(doc);
-
-  // Now bulk delete the docs
-  results = db.bulkSave(docs);
-
-  // doc "0" should be a conflict
-  T(results.length == 5);
-  T(results[0].id == "0");
-  T(results[0].error == "conflict");
-  T(typeof results[0].rev === "undefined"); // no rev member when a conflict
-
-  // but the rest are not
-  for (i = 1; i < 5; i++) {
-    T(results[i].id == i.toString());
-    T(results[i].rev);
-    T(db.open(docs[i]._id) == null);
-  }
-
-  // now force a conflict to to save
-
-  // save doc 0, this will cause a conflict when we save docs[0]
-  var doc = db.open("0");
-  docs[0] = db.open("0");
-  db.save(doc);
-
-  docs[0].shooby = "dooby";
-
-  // Now save the bulk docs, When we use all_or_nothing, we don't get conflict
-  // checking, all docs are saved regardless of conflict status, or none are
-  // saved.
-// TODO: all_or_nothing is not yet supported on clusters
-//  results = db.bulkSave(docs,{all_or_nothing:true});
-//  T(results.error === undefined);
-//
-//  var doc = db.open("0", {conflicts:true});
-//  var docConflict = db.open("0", {rev:doc._conflicts[0]});
-//
-//  T(doc.shooby == "dooby" || docConflict.shooby == "dooby");
-
-  // verify creating a document with no id returns a new id
-  var req = CouchDB.request("POST", "/" + db_name + "/_bulk_docs", {
-    body: JSON.stringify({"docs": [{"foo":"bar"}]})
-  });
-  results = JSON.parse(req.responseText);
-
-  T(results[0].id != "");
-  T(results[0].rev != "");
-
-
-  // Regression test for failure on update/delete
-  var newdoc = {"_id": "foobar", "body": "baz"};
-  T(db.save(newdoc).ok);
-  var update = {"_id": newdoc._id, "_rev": newdoc._rev, "body": "blam"};
-  var torem = {"_id": newdoc._id, "_rev": newdoc._rev, "_deleted": true};
-  results = db.bulkSave([update, torem]);
-  T(results[0].error == "conflict" || results[1].error == "conflict");
-
-
-  // verify that sending a request with no docs causes error thrown
-  var req = CouchDB.request("POST", "/" + db_name + "/_bulk_docs", {
-    body: JSON.stringify({"doc": [{"foo":"bar"}]})
-  });
-
-  T(req.status == 400 );
-  result = JSON.parse(req.responseText);
-  T(result.error == "bad_request");
-  T(result.reason == "POST body must include `docs` parameter.");
-
-  // verify that sending a request with invalid `docs` causes error
-  var req = CouchDB.request("POST", "/" + db_name + "/_bulk_docs", {
-    body: JSON.stringify({"docs": "foo"})
-  });
-
-  T(req.status == 400);
-  result = JSON.parse(req.responseText);
-  T(result.error == "bad_request");
-  T(result.reason == "`docs` parameter must be an array.");
-
-  // verify that sending a request with invalid `new_edits` causes error
-  var req = CouchDB.request("POST", "/" + db_name + "/_bulk_docs", {
-    body: JSON.stringify({"docs": [], "new_edits": 0})
-  });
-
-  T(req.status == 400);
-  result = JSON.parse(req.responseText);
-  T(result.error == "bad_request");
-  T(result.reason == "`new_edits` parameter must be a boolean.");
-
-  // jira-911
-  db.deleteDb();
-  // avoid Heisenbugs w/ files remaining - create a new name
-  db_name = get_random_db_name();
-  db = new CouchDB(db_name, {"X-Couch-Full-Commit":"false"});
-  db.createDb();
-  docs = [];
-  docs.push({"_id":"0", "a" : 0});
-  docs.push({"_id":"1", "a" : 1});
-  docs.push({"_id":"1", "a" : 2});
-  docs.push({"_id":"3", "a" : 3});
-  results = db.bulkSave(docs);
-  T(results[1].id == "1");
-  T(results[1].error == undefined);
-  T(results[2].error == "conflict");
-
-  // cleanup
-  db.deleteDb();
-};
diff --git a/test/javascript/tests/changes.js b/test/javascript/tests/changes.js
deleted file mode 100644
index 338c157..0000000
--- a/test/javascript/tests/changes.js
+++ /dev/null
@@ -1,812 +0,0 @@
-// Licensed under the Apache License, Version 2.0 (the "License"); you may not
-// use this file except in compliance with the License. You may obtain a copy of
-// the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-// License for the specific language governing permissions and limitations under
-// the License.
-couchTests.elixir = true;
- 
-function jsonp(obj) {
-  T(jsonp_flag == 0);
-  T(obj.results.length == 1 && obj.last_seq == 1, "jsonp");
-  jsonp_flag = 1;
-}
-
-couchTests.changes = function(debug) {
-  return console.log('done in test/elixir/test/changes_test.exs and changes_async_test.exs');
-  
-  var db;
-  if (debug) debugger;
-
-  // poor man's browser detection
-  var is_safari = false;
-  if (typeof (navigator) == "undefined") {
-    is_safari = true; // For CouchHTTP based runners
-  } else if (navigator.userAgent.match(/AppleWebKit/)) {
-    is_safari = true;
-  }
-
-  testChanges("live");
-  testChanges("continuous");
-  function testChanges(feed) {
-    var db_name = get_random_db_name();
-    // (write-quorums help keep a consistent feed)
-    db = new CouchDB(db_name, {"X-Couch-Full-Commit":"true"}, {"w": 3});
-    db.createDb();
-
-    var req = CouchDB.request("GET", "/" + db_name + "/_changes");
-    var resp = JSON.parse(req.responseText);
-
-    TEquals(0, resp.results.length, "db must be empty")
-    TEquals("0", resp.last_seq.substr(0, 1), "seq must start with 0")
-    var docFoo = {_id:"foo", bar:1};
-    T(db.save(docFoo).ok);
-    T(db.ensureFullCommit().ok);
-    T(db.open(docFoo._id)._id == docFoo._id);
-
-    retry_part(function(){ // avoid Heisenbugs
-      req = CouchDB.request("GET", "/" + db_name + "/_changes");
-      var resp = JSON.parse(req.responseText);
-      TEquals("1", resp.last_seq.substr(0, 1), "seq must start with 1");
-      T(resp.results.length == 1, "one doc db");
-      T(resp.results[0].changes[0].rev == docFoo._rev);
-    });
-
-    // test with callback
-// TODO: either allow jsonp in the default global config or implement a config chg mechanism analogouts 2 sebastianrothbucher:clustertest - or leave out
-//    run_on_modified_server(
-//      [{section: "httpd",
-//        key: "allow_jsonp",
-//        value: "true"}],
-//    function() {
-//      var xhr = CouchDB.request("GET", "/" + db_name + "/_changes?callback=jsonp");
-//      T(xhr.status == 200);
-//      jsonp_flag = 0;
-//      eval(xhr.responseText);
-//      T(jsonp_flag == 1);
-//    });
-
-    // increase timeout to 100 to have enough time 2 assemble (seems like too little timeouts kill
-    req = CouchDB.request("GET", "/" + db_name + "/_changes?feed=" + feed + "&timeout=100");
-    var lines = req.responseText.split("\n");
-    T(JSON.parse(lines[0]).changes[0].rev == docFoo._rev);
-    // the sequence is not fully ordered and a complex structure now
-    T(JSON.parse(lines[1]).last_seq[0] == 1);
-
-    var xhr;
-
-    try {
-      xhr = CouchDB.newXhr();
-    } catch (err) {
-    }
-
-    // these will NEVER run as we're always in navigator == undefined
-    if (!is_safari && xhr) {
-      // Only test the continuous stuff if we have a real XHR object
-      // with real async support.
-
-      // WebKit (last checked on nightly #47686) does fail on processing
-      // the async-request properly while javascript is executed.
-
-      xhr.open("GET", CouchDB.proxyUrl("/" + db_name + "/_changes?feed=" + feed + "&timeout=500"), true);
-      xhr.send("");
-
-      var docBar = {_id:"bar", bar:1};
-      db.save(docBar);
-
-      var lines, change1, change2;
-      waitForSuccess(function() {
-        lines = xhr.responseText.split("\n");
-        change1 = JSON.parse(lines[0]);
-        change2 = JSON.parse(lines[1]);
-        if (change2.seq != 2) {
-            throw "bad seq, try again";
-        }
-        return true;
-      }, "bar-only");
-
-      T(change1.seq == 1);
-      T(change1.id == "foo");
-
-      T(change2.seq == 2);
-      T(change2.id == "bar");
-      T(change2.changes[0].rev == docBar._rev);
-
-
-      var docBaz = {_id:"baz", baz:1};
-      db.save(docBaz);
-
-      var change3;
-      waitForSuccess(function() {
-        lines = xhr.responseText.split("\n");
-        change3 = JSON.parse(lines[2]);
-        if (change3.seq != 3) {
-          throw "bad seq, try again";
-        }
-        return true;
-      });
-
-      T(change3.seq == 3);
-      T(change3.id == "baz");
-      T(change3.changes[0].rev == docBaz._rev);
-
-
-      xhr = CouchDB.newXhr();
-
-      //verify the heartbeat newlines are sent
-      xhr.open("GET", CouchDB.proxyUrl("/" + db_name + "/_changes?feed=" + feed + "&heartbeat=10&timeout=500"), true);
-      xhr.send("");
-
-      var str;
-      waitForSuccess(function() {
-        str = xhr.responseText;
-        if (str.charAt(str.length - 1) != "\n" || str.charAt(str.length - 2) != "\n") {
-          throw("keep waiting");
-        }
-        return true;
-      }, "heartbeat");
-
-      T(str.charAt(str.length - 1) == "\n");
-      T(str.charAt(str.length - 2) == "\n");
-
-      // otherwise we'll continue to receive heartbeats forever
-      xhr.abort();
-    }
-    db.deleteDb();
-  }
-
-  // these will NEVER run as we're always in navigator == undefined
-  if (!is_safari && xhr) {
-    // test Server Sent Event (eventsource)
-    if (!!window.EventSource) {
-      var source = new EventSource(
-              "/" + db_name + "/_changes?feed=eventsource");
-      var results = [];
-      var sourceListener = function(e) {
-        var data = JSON.parse(e.data);
-        results.push(data);
-      };
-
-      source.addEventListener('message', sourceListener , false);
-
-      waitForSuccess(function() {
-        if (results.length != 3) {
-          throw "bad seq, try again";
-        }
-        return true;
-      });
-
-      source.removeEventListener('message', sourceListener, false);
-
-      T(results[0].seq == 1);
-      T(results[0].id == "foo");
-
-      T(results[1].seq == 2);
-      T(results[1].id == "bar");
-      T(results[1].changes[0].rev == docBar._rev);
-    }
-
-    // test that we receive EventSource heartbeat events
-    if (!!window.EventSource) {
-      var source = new EventSource(
-              "/" + db_name + "/_changes?feed=eventsource&heartbeat=10");
-
-      var count_heartbeats = 0;
-      source.addEventListener('heartbeat', function () { count_heartbeats = count_heartbeats + 1; } , false);
-
-      waitForSuccess(function() {
-        if (count_heartbeats < 3) {
-          throw "keep waiting";
-        }
-        return true;
-      }, "eventsource-heartbeat");
-
-      T(count_heartbeats >= 3);
-      source.close();
-    }
-
-    // test longpolling
-    xhr = CouchDB.newXhr();
-
-    xhr.open("GET", CouchDB.proxyUrl("/" + db_name + "/_changes?feed=longpoll"), true);
-    xhr.send("");
-
-    waitForSuccess(function() {
-      lines = xhr.responseText.split("\n");
-      if (lines[5] != '"last_seq":3}') {
-        throw("still waiting");
-      }
-      return true;
-    }, "last_seq");
-
-    xhr = CouchDB.newXhr();
-
-    xhr.open("GET", CouchDB.proxyUrl("/" + db_name + "/_changes?feed=longpoll&since=3"), true);
-    xhr.send("");
-
-    var docBarz = {_id:"barz", bar:1};
-    db.save(docBarz);
-
-    var parse_changes_line = function(line) {
-      if (line.charAt(line.length-1) == ",") {
-        var linetrimmed = line.substring(0, line.length-1);
-      } else {
-        var linetrimmed = line;
-      }
-      return JSON.parse(linetrimmed);
-    };
-
-    waitForSuccess(function() {
-      lines = xhr.responseText.split("\n");
-      if (lines[3] != '"last_seq":4}') {
-        throw("still waiting");
-      }
-      return true;
-    }, "change_lines");
-
-    var change = parse_changes_line(lines[1]);
-    T(change.seq == 4);
-    T(change.id == "barz");
-    T(change.changes[0].rev == docBarz._rev);
-    T(lines[3]=='"last_seq":4}');
-
-
-    // test since=now
-    xhr = CouchDB.newXhr();
-
-    xhr.open("GET", "/" + db_name + "/_changes?feed=longpoll&since=now", true);
-    xhr.send("");
-
-    var docBarz = {_id:"barzzzz", bar:1};
-    db.save(docBarz);
-
-    var parse_changes_line = function(line) {
-      if (line.charAt(line.length-1) == ",") {
-        var linetrimmed = line.substring(0, line.length-1);
-      } else {
-        var linetrimmed = line;
-      }
-      return JSON.parse(linetrimmed);
-    };
-
-    waitForSuccess(function() {
-      lines = xhr.responseText.split("\n");
-      if (lines[3] != '"last_seq":5}') {
-        throw("still waiting");
-      }
-      return true;
-    }, "change_lines");
-
-    var change = parse_changes_line(lines[1]);
-    T(change.seq == 5);
-    T(change.id == "barzzzz");
-    T(change.changes[0].rev == docBarz._rev);
-    T(lines[3]=='"last_seq":5}');
-  }
-
-  db.deleteDb();
-  // test on a new DB
-  var db_name = get_random_db_name();
-  db = new CouchDB(db_name, {"X-Couch-Full-Commit":"true"}, {"w": 3});
-  db.createDb();
-
-  // test the filtered changes
-  var ddoc = {
-    _id : "_design/changes_filter",
-    "filters" : {
-      "bop" : "function(doc, req) { return (doc.bop);}",
-      "dynamic" : stringFun(function(doc, req) {
-        var field = req.query.field;
-        return doc[field];
-      }),
-      "userCtx" : stringFun(function(doc, req) {
-        return doc.user && (doc.user == req.userCtx.name);
-      }),
-      "conflicted" : "function(doc, req) { return (doc._conflicts);}"
-    },
-    options : {
-      local_seq : true
-    },
-    views : {
-      local_seq : {
-        map : "function(doc) {emit(doc._local_seq, null)}"
-      },
-      blah: {
-        map : 'function(doc) {' +
-              '  if (doc._id == "blah") {' +
-              '    emit(null, null);' +
-              '  }' +
-              '}'
-      }
-    }
-  };
-
-  db.save(ddoc);
-
-  var req = CouchDB.request("GET", "/" + db_name + "/_changes?filter=changes_filter/bop");
-  var resp = JSON.parse(req.responseText);
-  T(resp.results.length == 0);
-
-  var docres1 = db.save({"bop" : "foom"});
-  T(docres1.ok);
-  var docres2 = db.save({"bop" : false});
-  T(docres2.ok);
-
-  var req = CouchDB.request("GET", "/" + db_name + "/_changes?filter=changes_filter/bop");
-  var resp = JSON.parse(req.responseText);
-  var seqold = resp.results[0].seq;
-  T(resp.results.length == 1, "filtered/bop");
-  T(resp.results[0].changes[0].rev == docres1.rev, "filtered/bop rev");
-  // save and reload (substitute for all those parts that never run)
-  var chgdoc1 = db.open(docres1.id);
-  chgdoc1.newattr = "s/th new";
-  docres1 = db.save(chgdoc1);
-  T(docres1.ok);
-  req = CouchDB.request("GET", "/" + db_name + "/_changes?filter=changes_filter/bop");
-  resp = JSON.parse(req.responseText);
-  var seqchg = resp.results[0].seq;
-  T(resp.results.length == 1, "filtered/bop new");
-  T(resp.results[0].changes[0].rev == docres1.rev, "filtered/bop rev new");
-  T(seqold != seqchg, "filtered/bop new seq number");
-
-  req = CouchDB.request("GET", "/" + db_name + "/_changes?filter=changes_filter/dynamic&field=woox");
-  resp = JSON.parse(req.responseText);
-  T(resp.results.length == 0);
-
-  req = CouchDB.request("GET", "/" + db_name + "/_changes?filter=changes_filter/dynamic&field=bop");
-  resp = JSON.parse(req.responseText);
-  T(resp.results.length == 1, "changes_filter/dynamic&field=bop");
-  T(resp.results[0].changes[0].rev == docres1.rev, "filtered/dynamic&field=bop rev");
-
-  // these will NEVER run as we're always in navigator == undefined
-  if (!is_safari && xhr) { // full test requires parallel connections
-    // filter with longpoll
-    // longpoll filters full history when run without a since seq
-    xhr = CouchDB.newXhr();
-    xhr.open("GET", CouchDB.proxyUrl("/" + db_name + "/_changes?feed=longpoll&filter=changes_filter/bop"), false);
-    xhr.send("");
-    var resp = JSON.parse(xhr.responseText);
-    T(resp.last_seq == 8);
-    // longpoll waits until a matching change before returning
-    xhr = CouchDB.newXhr();
-    xhr.open("GET", CouchDB.proxyUrl("/" + db_name + "/_changes?feed=longpoll&since=7&filter=changes_filter/bop"), true);
-    xhr.send("");
-    db.save({"_id":"falsy", "bop" : ""}); // empty string is falsy
-    db.save({"_id":"bingo","bop" : "bingo"});
-
-    waitForSuccess(function() {
-      resp = JSON.parse(xhr.responseText);
-      return true;
-    }, "longpoll-since");
-
-    T(resp.last_seq == 10);
-    T(resp.results && resp.results.length > 0 && resp.results[0]["id"] == "bingo", "filter the correct update");
-    xhr.abort();
-
-    var timeout = 500;
-    var last_seq = 11;
-    while (true) {
-
-      // filter with continuous
-      xhr = CouchDB.newXhr();
-      xhr.open("GET", CouchDB.proxyUrl("/" + db_name + "/_changes?feed=continuous&filter=changes_filter/bop&timeout="+timeout), true);
-      xhr.send("");
-
-      db.save({"_id":"rusty", "bop" : "plankton"});
-      T(xhr.readyState != 4, "test client too slow");
-      var rusty = db.open("rusty", {cache_bust : new Date()});
-      T(rusty._id == "rusty");
-
-      waitForSuccess(function() { // throws an error after 5 seconds
-        if (xhr.readyState != 4) {
-          throw("still waiting");
-        }
-        return true;
-      }, "continuous-rusty");
-      lines = xhr.responseText.split("\n");
-      var good = false;
-      try {
-        JSON.parse(lines[3]);
-        good = true;
-      } catch(e) {
-      }
-      if (good) {
-        T(JSON.parse(lines[1]).id == "bingo", lines[1]);
-        T(JSON.parse(lines[2]).id == "rusty", lines[2]);
-        T(JSON.parse(lines[3]).last_seq == last_seq, lines[3]);
-        break;
-      } else {
-        xhr.abort();
-        db.deleteDoc(rusty);
-        timeout = timeout * 2;
-        last_seq = last_seq + 2;
-      }
-    }
-  }
-  // error conditions
-
-  // non-existing design doc
-  var req = CouchDB.request("GET",
-    "/" + db_name + "/_changes?filter=nothingtosee/bop");
-  TEquals(404, req.status, "should return 404 for non existant design doc");
-
-  // non-existing filter
-  var req = CouchDB.request("GET",
-    "/" + db_name + "/_changes?filter=changes_filter/movealong");
-  TEquals(404, req.status, "should return 404 for non existant filter fun");
-
-  // both
-  var req = CouchDB.request("GET",
-    "/" + db_name + "/_changes?filter=nothingtosee/movealong");
-  TEquals(404, req.status,
-    "should return 404 for non existant design doc and filter fun");
-
-  // changes get all_docs style with deleted docs
-  var doc = {a:1};
-  db.save(doc);
-  db.deleteDoc(doc);
-  var req = CouchDB.request("GET",
-    "/" + db_name + "/_changes?filter=changes_filter/bop&style=all_docs");
-  var resp = JSON.parse(req.responseText);
-  var expect = (!is_safari && xhr) ? 3: 1;
-  TEquals(expect, resp.results.length, "should return matching rows");
-
-  // test filter on view function (map)
-  //
-  T(db.save({"_id":"blah", "bop" : "plankton"}).ok);
-  var req = CouchDB.request("GET", "/" + db_name + "/_changes?filter=_view&view=changes_filter/blah");
-  var resp = JSON.parse(req.responseText);
-  T(resp.results.length === 1);
-  T(resp.results[0].id === "blah");
-
-
-  // test for userCtx
-// TODO: either make part of global config, or allow 4 config changes - or leave out
-/*
-  run_on_modified_server(
-    [{section: "httpd",
-      key: "authentication_handlers",
-      value: "{couch_httpd_auth, special_test_authentication_handler}"},
-     {section:"httpd",
-      key: "WWW-Authenticate",
-      value:  "X-Couch-Test-Auth"}],
-
-    function() {
-      var authOpts = {"headers":{"WWW-Authenticate": "X-Couch-Test-Auth Chris Anderson:mp3"}};
-
-      var req = CouchDB.request("GET", "/_session", authOpts);
-      var resp = JSON.parse(req.responseText);
-
-      T(db.save({"user" : "Noah Slater"}).ok);
-      var req = CouchDB.request("GET", "/" + db_name + "/_changes?filter=changes_filter/userCtx", authOpts);
-      var resp = JSON.parse(req.responseText);
-      T(resp.results.length == 0);
-
-      var docResp = db.save({"user" : "Chris Anderson"});
-      T(docResp.ok);
-      T(db.ensureFullCommit().ok);
-      req = CouchDB.request("GET", "/" + db_name + "/_changes?filter=changes_filter/userCtx", authOpts);
-      resp = JSON.parse(req.responseText);
-      T(resp.results.length == 1, "userCtx");
-      T(resp.results[0].id == docResp.id);
-    }
-  );
-*/
-
-  req = CouchDB.request("GET", "/" + db_name + "/_changes?limit=1");
-  resp = JSON.parse(req.responseText);
-  TEquals(1, resp.results.length);
-
-  //filter includes _conflicts
-// TODO: all_or_nothing not yet in place
-//  var id = db.save({'food' : 'pizza'}).id;
-//  db.bulkSave([{_id: id, 'food' : 'pasta'}], {all_or_nothing:true});
-//
-//  req = CouchDB.request("GET", "/" + db_name + "/_changes?filter=changes_filter/conflicted");
-//  resp = JSON.parse(req.responseText);
-//  T(resp.results.length == 1, "filter=changes_filter/conflicted");
-
-  // test with erlang filter function
-// TODO: either make part of global config, or allow 4 config changes - or leave out
-/*
... 9925 lines suppressed ...