diff --git a/lib/nodejs/test/client.js b/lib/nodejs/test/client.js
new file mode 100644
index 0000000..e7d6e61
--- /dev/null
+++ b/lib/nodejs/test/client.js
@@ -0,0 +1,77 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.
+ */
+
+//Client test for the following I/O stack:
+//    TBinaryProtocol
+//    TFramedTransport
+//    TSocket
+
+var assert = require('assert');
+var thrift = require('thrift');
+var ThriftTransports = require('thrift/transport');
+var ThriftProtocols = require('thrift/protocol');
+var ThriftTest = require('./gen-nodejs/ThriftTest');
+var ThriftTestDriver = require('./thrift_test_driver').ThriftTestDriver;
+
+var program = require('commander');
+
+program
+  .option('-p, --protocol <protocol>', 'Set thift protocol (binary|json) [protocol]')
+  .option('-t, --transport <transport>', 'Set thift transport (buffered|framed) [transport]')
+  .parse(process.argv);
+
+var protocol = undefined;
+var transport =  undefined;
+
+if (program.protocol === "binary") {
+  protocol = ThriftProtocols.TBinaryProtocol;
+} else if (program.protocol === "json") {
+  protocol = ThriftProtocols.TJSONProtocol;
+} else {
+  //default
+  protocol = ThriftProtocols.TBinaryProtocol;
+}
+
+if (program.transport === "framed") {
+  transport = ThriftTransports.TFramedTransport;
+} else if (program.transport === "buffered") {
+  transport = ThriftTransports.TBufferedTransport;
+} else {
+  //default
+  transport = ThriftTransports.TBufferedTransport;
+}
+
+var connection = thrift.createConnection('localhost', 9090, {
+  transport: transport,
+  protocol: protocol
+});
+
+var client = thrift.createClient(ThriftTest, connection);
+
+connection.on('error', function(err) {
+  assert(false, err);
+});
+
+ThriftTestDriver(client, function (status) {
+  console.log(status);
+  connection.end();
+});
+
+// to make it also run on expresso
+exports.expressoTest = function() {};
diff --git a/lib/nodejs/test/multiplex_client.js b/lib/nodejs/test/multiplex_client.js
new file mode 100644
index 0000000..6cf6975
--- /dev/null
+++ b/lib/nodejs/test/multiplex_client.js
@@ -0,0 +1,356 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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 thrift = require('thrift');
+var ThriftTransports = require('thrift/transport');
+var ThriftProtocols = require('thrift/protocol');
+var assert = require('assert');
+
+var ThriftTest = require('./gen-nodejs/ThriftTest'),
+    SecondService = require('./gen-nodejs/SecondService'),
+    ttypes = require('./gen-nodejs/ThriftTest_types');
+
+var program = require('commander');
+
+program
+  .option('-p, --protocol <protocol>', 'Set thift protocol (binary|json) [protocol]')
+  .option('-t, --transport <transport>', 'Set thift transport (buffered|framed) [transport]')
+  .parse(process.argv);
+
+var protocol = undefined;
+var transport =  undefined;
+
+if (program.protocol === "binary") {
+  protocol = ThriftProtocols.TBinaryProtocol;
+} else if (program.protocol === "json") {
+  protocol = ThriftProtocols.TJSONProtocol;
+} else {
+  //default
+  protocol = ThriftProtocols.TBinaryProtocol;
+}
+
+if (program.transport === "framed") {
+  transport = ThriftTransports.TFramedTransport;
+} else if (program.transport === "buffered") {
+  transport = ThriftTransports.TBufferedTransport;
+} else {
+  //default
+  transport = ThriftTransports.TBufferedTransport;
+}
+
+var connection = thrift.createConnection('localhost', 9090, {
+  transport: transport,
+  protocol: protocol
+});
+
+var mp = new thrift.Multiplexer();
+
+client = mp.createClient("ThriftTest", ThriftTest, connection);
+secondclient = mp.createClient("SecondService", SecondService, connection);
+
+connection.on('error', function(err) {
+    assert(false, err);
+});
+
+// deepEqual doesn't work with fields using node-int64
+
+function checkRecursively(map1, map2) {
+    if (typeof map1 !== 'function' && typeof map2 !== 'function') {
+        if (!map1 || typeof map1 !== 'object') {
+            assert.equal(map1, map2);
+        } else {
+            for (var key in map1) {
+                checkRecursively(map1[key], map2[key]);
+            }
+        }
+    }
+}
+
+client.testString("Test", function(err, response) {
+    assert(!err);
+    assert.equal("Test", response);
+});
+secondclient.secondtestString("Test", function(err, response) {
+    assert(!err);
+    assert.equal("Test", response);
+});
+
+
+client.testVoid(function(err, response) {
+    assert(!err);
+    assert.equal(undefined, response); //void
+});
+
+
+secondclient.secondtestString("Test", function(err, response) {
+    assert(!err);
+    assert.equal("Test", response);
+});
+
+client.testString("", function(err, response) {
+    assert(!err);
+    assert.equal("", response);
+});
+
+// all Languages in UTF-8
+var stringTest = "Afrikaans, Alemannisch, Aragonés, العربية, مصرى, " +
+    "Asturianu, Aymar aru, Azərbaycan, Башҡорт, Boarisch, Žemaitėška, " +
+    "Беларуская, Беларуская (тарашкевіца), Български, Bamanankan, বাংলা, " +
+    "Brezhoneg, Bosanski, Català, Mìng-dĕ̤ng-ngṳ̄, Нохчийн, Cebuano, ᏣᎳᎩ, " +
+    "Česky, Словѣ́ньскъ / ⰔⰎⰑⰂⰡⰐⰠⰔⰍⰟ, Чӑвашла, Cymraeg, Dansk, Zazaki, " +
+    "ދިވެހިބަސް, Ελληνικά, Emiliàn e rumagnòl, English, Esperanto, " +
+    "Español, Eesti, Euskara, فارسی, Suomi, Võro, Føroyskt, Français, " +
+    "Arpetan, Furlan, Frysk, Gaeilge, 贛語, Gàidhlig, Galego, Avañe'ẽ, " +
+    "ગુજરાતી, Gaelg, עברית, हिन्दी, Fiji Hindi, Hrvatski, Kreyòl ayisyen, " +
+    "Magyar, Հայերեն, Interlingua, Bahasa Indonesia, Ilokano, Ido, " +
+    "Íslenska, Italiano, 日本語, Lojban, Basa Jawa, ქართული, Kongo, " +
+    "Kalaallisut, ಕನ್ನಡ, 한국어, Къарачай-Малкъар, Ripoarisch, Kurdî, Коми, " +
+    "Kernewek, Кыргызча, Latina, Ladino, Lëtzebuergesch, Limburgs, " +
+    "Lingála, ລາວ, Lietuvių, Latviešu, Basa Banyumasan, Malagasy, " +
+    "Македонски, മലയാളം, मराठी, Bahasa Melayu, مازِرونی, Nnapulitano, " +
+    "Nedersaksisch, नेपाल भाषा, Nederlands, ‪Norsk (nynorsk)‬, ‪Norsk (" +
+    "bokmål)‬, Nouormand, Diné bizaad, Occitan, Иронау, Papiamentu, " +
+    "Deitsch, Norfuk / Pitkern, Polski, پنجابی, پښتو, Português, Runa " +
+    "Simi, Rumantsch, Romani, Română, Русский, Саха тыла, Sardu, " +
+    "Sicilianu, Scots, Sámegiella, Simple English, Slovenčina, " +
+    "Slovenščina, Српски / Srpski, Seeltersk, Svenska, Kiswahili, தமிழ், " +
+    "తెలుగు, Тоҷикӣ, ไทย, Türkmençe, Tagalog, Türkçe, Татарча/Tatarça, " +
+    "Українська, اردو, Tiếng Việt, Volapük, Walon, Winaray, 吴语, isiXhosa, " +
+    "ייִדיש, Yorùbá, Zeêuws, 中文, Bân-lâm-gú, 粵語";
+
+client.testString(stringTest, function(err, response) {
+    assert(!err);
+    assert.equal(stringTest, response);
+});
+
+var specialCharacters = 'quote: \" backslash:' +
+    ' forwardslash-escaped: \/ ' +
+    ' backspace: \b formfeed: \f newline: \n return: \r tab: ' +
+    ' now-all-of-them-together: "\\\/\b\n\r\t' +
+    ' now-a-bunch-of-junk: !@#$%&()(&%$#{}{}<><><';
+client.testString(specialCharacters, function(err, response) {
+    assert(!err);
+    assert.equal(specialCharacters, response);
+});
+
+
+client.testByte(1, function(err, response) {
+    assert(!err);
+    assert.equal(1, response);
+});
+client.testByte(0, function(err, response) {
+    assert(!err);
+    assert.equal(0, response);
+});
+client.testByte(-1, function(err, response) {
+    assert(!err);
+    assert.equal(-1, response);
+});
+client.testByte(-127, function(err, response) {
+    assert(!err);
+    assert.equal(-127, response);
+});
+
+client.testI32(-1, function(err, response) {
+    assert(!err);
+    assert.equal(-1, response);
+});
+
+client.testI64(5, function(err, response) {
+    assert(!err);
+    assert.equal(5, response);
+});
+client.testI64(-5, function(err, response) {
+    assert(!err);
+    assert.equal(-5, response);
+});
+client.testI64(-34359738368, function(err, response) {
+    assert(!err);
+    assert.equal(-34359738368, response);
+});
+
+client.testDouble(-5.2098523, function(err, response) {
+    assert(!err);
+    assert.equal(-5.2098523, response);
+});
+client.testDouble(7.012052175215044, function(err, response) {
+    assert(!err);
+    assert.equal(7.012052175215044, response);
+});
+
+
+var out = new ttypes.Xtruct({
+    string_thing: 'Zero',
+    byte_thing: 1,
+    i32_thing: -3,
+    i64_thing: 1000000
+});
+client.testStruct(out, function(err, response) {
+    assert(!err);
+    checkRecursively(out, response);
+});
+
+
+var out2 = new ttypes.Xtruct2();
+out2.byte_thing = 1;
+out2.struct_thing = out;
+out2.i32_thing = 5;
+client.testNest(out2, function(err, response) {
+    assert(!err);
+    checkRecursively(out2, response);
+});
+
+
+var mapout = {};
+for (var i = 0; i < 5; ++i) {
+    mapout[i] = i - 10;
+}
+client.testMap(mapout, function(err, response) {
+    assert(!err);
+    assert.deepEqual(mapout, response);
+});
+
+
+var mapTestInput = {
+    "a": "123",
+    "a b": "with spaces ",
+    "same": "same",
+    "0": "numeric key",
+    "longValue": stringTest,
+    stringTest: "long key"
+};
+client.testStringMap(mapTestInput, function(err, response) {
+    assert(!err);
+    assert.deepEqual(mapTestInput, response);
+});
+
+
+var setTestInput = [1, 2, 3];
+client.testSet(setTestInput, function(err, response) {
+    assert(!err);
+    assert.deepEqual(setTestInput, response);
+});
+client.testList(setTestInput, function(err, response) {
+    assert(!err);
+    assert.deepEqual(setTestInput, response);
+});
+
+client.testEnum(ttypes.Numberz.ONE, function(err, response) {
+    assert(!err);
+    assert.equal(ttypes.Numberz.ONE, response);
+});
+
+client.testTypedef(69, function(err, response) {
+    assert(!err);
+    assert.equal(69, response);
+});
+
+
+var mapMapTest = {
+    "4": {
+        "1": 1,
+        "2": 2,
+        "3": 3,
+        "4": 4
+    },
+    "-4": {
+        "-4": -4,
+        "-3": -3,
+        "-2": -2,
+        "-1": -1
+    }
+};
+client.testMapMap(mapMapTest, function(err, response) {
+    assert(!err);
+    assert.deepEqual(mapMapTest, response);
+});
+
+var crazy = new ttypes.Insanity({
+    "userMap": {
+        "5": 5,
+        "8": 8
+    },
+    "xtructs": [new ttypes.Xtruct({
+            "string_thing": "Goodbye4",
+            "byte_thing": 4,
+            "i32_thing": 4,
+            "i64_thing": 4
+        }), new ttypes.Xtruct({
+            "string_thing": "Hello2",
+            "byte_thing": 2,
+            "i32_thing": 2,
+            "i64_thing": 2
+        })]
+});
+var insanity = {
+    "1": {
+        "2": crazy,
+        "3": crazy
+    },
+    "2": {
+        "6": {
+            "userMap": null,
+            "xtructs": null
+        }
+    }
+};
+client.testInsanity(crazy, function(err, response) {
+    assert(!err);
+    checkRecursively(insanity, response);
+});
+
+
+client.testException('TException', function(err, response) {
+    //assert(err); //BUG?
+    assert(!response);
+});
+client.testException('Xception', function(err, response) {
+    assert(!response);
+    assert.equal(err.errorCode, 1001);
+    assert.equal('Xception', err.message);
+});
+client.testException('no Exception', function(err, response) {
+    assert(!err);
+    assert.equal(undefined, response); //void
+});
+
+
+client.testOneway(1, function(err, response) {
+    assert(!response); //should not answer
+});
+
+/**
+ * redo a simple test after the oneway to make sure we aren't "off by one" --
+ * if the server treated oneway void like normal void, this next test will
+ * fail since it will get the void confirmation rather than the correct
+ * result. In this circumstance, the client will throw the exception:
+ *
+ *   TApplicationException: Wrong method namea
+ */
+client.testI32(-1, function(err, response) {
+    assert(!err);
+    assert.equal(-1, response);
+});
+
+setTimeout(function() {
+    console.log("Server successfully tested!");
+    connection.end();
+}, 1500);
+
+// to make it also run on expresso
+exports.expressoTest = function() {};
diff --git a/lib/nodejs/test/multiplex_server.js b/lib/nodejs/test/multiplex_server.js
new file mode 100644
index 0000000..a2a1709
--- /dev/null
+++ b/lib/nodejs/test/multiplex_server.js
@@ -0,0 +1,80 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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 thrift = require('thrift');
+var Thrift = thrift.Thrift;
+var ThriftTransports = require('thrift/transport');
+var ThriftProtocols = require('thrift/protocol');
+
+var ThriftTest = require('./gen-nodejs/ThriftTest'),
+  SecondService = require('./gen-nodejs/SecondService'),
+  ttypes = require('./gen-nodejs/ThriftTest_types');
+
+var program = require('commander');
+
+program
+  .option('-p, --protocol <protocol>', 'Set thift protocol (binary|json) [protocol]')
+  .option('-t, --transport <transport>', 'Set thift transport (buffered|framed) [transport]')
+  .parse(process.argv);
+
+var protocol = undefined;
+var transport =  undefined;
+
+if (program.protocol === "binary") {
+  protocol = ThriftProtocols.TBinaryProtocol;
+} else if (program.protocol === "json") {
+  protocol = ThriftProtocols.TJSONProtocol;
+} else {
+  //default
+  protocol = ThriftProtocols.TBinaryProtocol;
+}
+
+if (program.transport === "framed") {
+  transport = ThriftTransports.TFramedTransport;
+} else if (program.transport === "buffered") {
+  transport = ThriftTransports.TBufferedTransport;
+} else {
+  //default
+  transport = ThriftTransports.TBufferedTransport;
+}
+
+var ThriftTestHandler = require("./test_handler").ThriftTestHandler;
+
+var SecondServiceHandler = {
+  secondtestString: function(thing, result) {
+    console.log('testString(\'' + thing + '\')');
+    result(null, thing);
+  }
+};
+
+var processor = new thrift.MultiplexedProcessor();
+
+processor.registerProcessor(
+  "ThriftTest",
+  new ThriftTest.Processor(ThriftTestHandler));
+
+processor.registerProcessor(
+  "SecondService",
+  new SecondService.Processor(SecondServiceHandler));
+
+var server = thrift.createMultiplexServer(processor, {
+  protocol: protocol,
+  transport: transport
+});
+
+server.listen(9090);
diff --git a/lib/nodejs/test/server.js b/lib/nodejs/test/server.js
new file mode 100644
index 0000000..da9a4d6
--- /dev/null
+++ b/lib/nodejs/test/server.js
@@ -0,0 +1,63 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.
+ */
+
+//Server test for the following I/O stack:
+//    TBinaryProtocol
+//    TFramedTransport
+//    TSocket
+
+var thrift = require('thrift');
+var ThriftTransports = require('thrift/transport');
+var ThriftProtocols = require('thrift/protocol');
+var ThriftTest = require('./gen-nodejs/ThriftTest');
+var ThriftTestHandler = require('./test_handler').ThriftTestHandler;
+
+
+var program = require('commander');
+
+program
+  .option('-p, --protocol <protocol>', 'Set thift protocol (binary|json) [protocol]')
+  .option('-t, --transport <transport>', 'Set thift transport (buffered|framed) [transport]')
+  .parse(process.argv);
+
+var protocol = undefined;
+var transport =  undefined;
+
+if (program.protocol === "binary") {
+  protocol = ThriftProtocols.TBinaryProtocol;
+} else if (program.protocol === "json") {
+  protocol = ThriftProtocols.TJSONProtocol;
+} else {
+  //default
+  protocol = ThriftProtocols.TBinaryProtocol;
+}
+
+if (program.transport === "framed") {
+  transport = ThriftTransports.TFramedTransport;
+} else if (program.transport === "buffered") {
+  transport = ThriftTransports.TBufferedTransport;
+} else {
+  //default
+  transport = ThriftTransports.TBufferedTransport;
+}
+
+thrift.createServer(ThriftTest, ThriftTestHandler, {
+  protocol: protocol,
+  transport: transport
+}).listen(9090);
diff --git a/lib/nodejs/test/server_http.js b/lib/nodejs/test/server_http.js
new file mode 100644
index 0000000..4366943
--- /dev/null
+++ b/lib/nodejs/test/server_http.js
@@ -0,0 +1,52 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.
+ */
+
+//This HTTP server is designed to server the test.html browser
+//  based JavaScript test page (which must be in the current directory). 
+//  This server also supplies the Thrift based test service, which depends
+//  on the standard ThriftTest.thrift IDL service (which must be compiled
+//  for Node and browser based JavaScript in ./gen-nodejs and ./gen-js
+//  respectively). The current directory must also include the browser
+//  support libraries for test.html (jquery.js, qunit.js and qunit.css
+//  in ./build/js/lib).
+
+var thrift = require('thrift');
+var TBufferedTransport = require('thrift/transport').TBufferedTransport;
+var TJSONProtocol = require('thrift/protocol').TJSONProtocol;
+var ThriftTestSvc = require('./gen-nodejs/ThriftTest.js');
+var ThriftTestHandler = require('./test_handler').ThriftTestHandler;
+
+var ThriftTestSvcOpt = {
+	transport: TBufferedTransport,
+	protocol: TJSONProtocol,
+	cls: ThriftTestSvc,
+	handler: ThriftTestHandler
+};
+
+var StaticHttpThriftServerOptions = {
+	staticFilePath: ".",
+	services: {
+		"/service": ThriftTestSvcOpt
+	}
+}
+
+var server = thrift.createStaticHttpThriftServer(StaticHttpThriftServerOptions);
+var port = 8088;
+server.listen(port);
+console.log("Http/Thrift Server running on port: " + port);
diff --git a/lib/nodejs/test/test.html b/lib/nodejs/test/test.html
new file mode 100644
index 0000000..fe0e52b
--- /dev/null
+++ b/lib/nodejs/test/test.html
@@ -0,0 +1,51 @@
+﻿<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements. See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership. The ASF licenses this file
+  to you 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.
+-->
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+  <title>Thrift Javascript Bindings: Unit Test</title>
+
+  <script src="/thrift.js"                 type="text/javascript" charset="utf-8"></script>
+  <script src="gen-js/ThriftTest_types.js" type="text/javascript" charset="utf-8"></script>
+  <script src="gen-js/ThriftTest.js"       type="text/javascript" charset="utf-8"></script>
+
+  <!-- jQuery -->
+  <script type="text/javascript" src="build/js/lib/jquery-1.7.2.js" charset="utf-8"></script>
+  
+  <!-- QUnit Test framework-->
+  <script type="text/javascript" src="build/js/lib/qunit.js" charset="utf-8"></script>
+  <link rel="stylesheet" href="build/js/lib/qunit.css" type="text/css" media="screen" />
+  
+  <!-- the Test Suite-->
+  <script type="text/javascript" src="test.js" charset="utf-8"></script>
+</head>
+<body>
+  <h1 id="qunit-header">Thrift Javascript Bindings: Unit Test (<a href="https://git-wip-us.apache.org/repos/asf?p=thrift.git;a=blob;f=test/ThriftTest.thrift;hb=HEAD">ThriftTest.thrift</a>)</h1>
+  <h2 id="qunit-banner"></h2>
+  <div id="qunit-testrunner-toolbar"></div> 
+  <h2 id="qunit-userAgent"></h2>
+  <ol id="qunit-tests"><li><!-- get valid xhtml strict--></li></ol>
+  <p>
+      <a href="http://validator.w3.org/check/referer"><img
+          src="http://www.w3.org/Icons/valid-xhtml10"
+          alt="Valid XHTML 1.0!" height="31" width="88" /></a>
+  </p>
+</body>
+</html>
diff --git a/lib/nodejs/test/test.js b/lib/nodejs/test/test.js
new file mode 100644
index 0000000..91ba4d1
--- /dev/null
+++ b/lib/nodejs/test/test.js
@@ -0,0 +1,420 @@
+﻿/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.
+ */
+ /* jshint -W100 */
+ 
+/*
+ * JavaScript test suite
+ */
+
+var transport = new Thrift.Transport("/service");
+var protocol  = new Thrift.Protocol(transport);
+var client    = new ThriftTest.ThriftTestClient(protocol);
+
+// all Languages in UTF-8
+var stringTest = "Afrikaans, Alemannisch, Aragonés, العربية, مصرى, Asturianu, Aymar aru, Azərbaycan, Башҡорт, Boarisch, Žemaitėška, Беларуская, Беларуская (тарашкевіца), Български, Bamanankan, বাংলা, Brezhoneg, Bosanski, Català, Mìng-dĕ̤ng-ngṳ̄, Нохчийн, Cebuano, ᏣᎳᎩ, Česky, Словѣ́ньскъ / ⰔⰎⰑⰂⰡⰐⰠⰔⰍⰟ, Чӑвашла, Cymraeg, Dansk, Zazaki, ދިވެހިބަސް, Ελληνικά, Emiliàn e rumagnòl, English, Esperanto, Español, Eesti, Euskara, فارسی, Suomi, Võro, Føroyskt, Français, Arpetan, Furlan, Frysk, Gaeilge, 贛語, Gàidhlig, Galego, Avañe'ẽ, ગુજરાતી, Gaelg, עברית, हिन्दी, Fiji Hindi, Hrvatski, Kreyòl ayisyen, Magyar, Հայերեն, Interlingua, Bahasa Indonesia, Ilokano, Ido, Íslenska, Italiano, 日本語, Lojban, Basa Jawa, ქართული, Kongo, Kalaallisut, ಕನ್ನಡ, 한국어, Къарачай-Малкъар, Ripoarisch, Kurdî, Коми, Kernewek, Кыргызча, Latina, Ladino, Lëtzebuergesch, Limburgs, Lingála, ລາວ, Lietuvių, Latviešu, Basa Banyumasan, Malagasy, Македонски, മലയാളം, मराठी, Bahasa Melayu, مازِرونی, Nnapulitano, Nedersaksisch, नेपाल भाषा, Nederlands, ‪Norsk (nynorsk)‬, ‪Norsk (bokmål)‬, Nouormand, Diné bizaad, Occitan, Иронау, Papiamentu, Deitsch, Norfuk / Pitkern, Polski, پنجابی, پښتو, Português, Runa Simi, Rumantsch, Romani, Română, Русский, Саха тыла, Sardu, Sicilianu, Scots, Sámegiella, Simple English, Slovenčina, Slovenščina, Српски / Srpski, Seeltersk, Svenska, Kiswahili, தமிழ், తెలుగు, Тоҷикӣ, ไทย, Türkmençe, Tagalog, Türkçe, Татарча/Tatarça, Українська, اردو, Tiếng Việt, Volapük, Walon, Winaray, 吴语, isiXhosa, ייִדיש, Yorùbá, Zeêuws, 中文, Bân-lâm-gú, 粵語";
+  
+function checkRecursively(map1, map2) {
+  if (typeof map1 !== 'function' && typeof map2 !== 'function') {
+    if (!map1 || typeof map1 !== 'object') {
+        equal(map1, map2);
+    } else {
+      for (var key in map1) {
+        checkRecursively(map1[key], map2[key]);
+      }
+    }
+  }
+}
+
+module("Base Types");
+
+  test("Void", function() {
+    equal(client.testVoid(), undefined);
+  });
+  test("String", function() {
+    equal(client.testString(''), '');
+    equal(client.testString(stringTest), stringTest);
+
+    var specialCharacters = 'quote: \" backslash:' +
+          ' forwardslash-escaped: \/ ' +
+          ' backspace: \b formfeed: \f newline: \n return: \r tab: ' +
+          ' now-all-of-them-together: "\\\/\b\n\r\t' +
+          ' now-a-bunch-of-junk: !@#$%&()(&%$#{}{}<><><';
+    equal(client.testString(specialCharacters),specialCharacters);
+  });
+  test("Double", function() {
+    equal(client.testDouble(0), 0);
+    equal(client.testDouble(-1), -1);
+    equal(client.testDouble(3.14), 3.14);
+    equal(client.testDouble(Math.pow(2,60)), Math.pow(2,60));
+  });
+  test("Byte", function() {
+    equal(client.testByte(0), 0);
+    equal(client.testByte(0x01), 0x01);
+  });
+  test("I32", function() {
+    equal(client.testI32(0), 0);
+    equal(client.testI32(Math.pow(2,30)), Math.pow(2,30));
+    equal(client.testI32(-Math.pow(2,30)), -Math.pow(2,30));
+  });
+  test("I64", function() {
+    equal(client.testI64(0), 0);
+    //This is usually 2^60 but JS cannot represent anything over 2^52 accurately
+    equal(client.testI64(Math.pow(2,52)), Math.pow(2,52));
+    equal(client.testI64(-Math.pow(2,52)), -Math.pow(2,52));
+  });
+
+
+module("Structured Types");
+
+  test("Struct", function() {
+    var structTestInput = new ThriftTest.Xtruct();
+    structTestInput.string_thing = 'worked';
+    structTestInput.byte_thing = 0x01;
+    structTestInput.i32_thing = Math.pow(2,30);
+    //This is usually 2^60 but JS cannot represent anything over 2^52 accurately
+    structTestInput.i64_thing = Math.pow(2,52);
+
+    var structTestOutput = client.testStruct(structTestInput);
+
+    equal(structTestOutput.string_thing, structTestInput.string_thing);
+    equal(structTestOutput.byte_thing, structTestInput.byte_thing);
+    equal(structTestOutput.i32_thing, structTestInput.i32_thing);
+    equal(structTestOutput.i64_thing, structTestInput.i64_thing);
+    
+    equal(JSON.stringify(structTestOutput), JSON.stringify(structTestInput));
+  });
+
+  test("Nest", function() {
+    var xtrTestInput = new ThriftTest.Xtruct();
+    xtrTestInput.string_thing = 'worked';
+    xtrTestInput.byte_thing = 0x01;
+    xtrTestInput.i32_thing = Math.pow(2,30);
+    //This is usually 2^60 but JS cannot represent anything over 2^52 accurately
+    xtrTestInput.i64_thing = Math.pow(2,52);
+    
+    var nestTestInput = new ThriftTest.Xtruct2();
+    nestTestInput.byte_thing = 0x02;
+    nestTestInput.struct_thing = xtrTestInput;
+    nestTestInput.i32_thing = Math.pow(2,15);
+    
+    var nestTestOutput = client.testNest(nestTestInput);
+    
+    equal(nestTestOutput.byte_thing, nestTestInput.byte_thing);
+    equal(nestTestOutput.struct_thing.string_thing, nestTestInput.struct_thing.string_thing);
+    equal(nestTestOutput.struct_thing.byte_thing, nestTestInput.struct_thing.byte_thing);
+    equal(nestTestOutput.struct_thing.i32_thing, nestTestInput.struct_thing.i32_thing);
+    equal(nestTestOutput.struct_thing.i64_thing, nestTestInput.struct_thing.i64_thing);
+    equal(nestTestOutput.i32_thing, nestTestInput.i32_thing);
+    
+    equal(JSON.stringify(nestTestOutput), JSON.stringify(nestTestInput));
+  });
+
+  test("Map", function() {
+    var mapTestInput = {7:77, 8:88, 9:99};
+
+    var mapTestOutput = client.testMap(mapTestInput);
+
+    for (var key in mapTestOutput) {
+      equal(mapTestOutput[key], mapTestInput[key]);
+    }
+  });
+
+  test("StringMap", function() {
+    var mapTestInput = {
+      "a":"123", "a b":"with spaces ", "same":"same", "0":"numeric key",
+      "longValue":stringTest, stringTest:"long key"
+    };
+
+    var mapTestOutput = client.testStringMap(mapTestInput);
+
+    for (var key in mapTestOutput) {
+      equal(mapTestOutput[key], mapTestInput[key]);
+    }
+  });
+
+  test("Set", function() {
+    var setTestInput = [1,2,3];
+    ok(client.testSet(setTestInput), setTestInput);
+  });
+
+  test("List", function() {
+    var listTestInput = [1,2,3];
+    ok(client.testList(listTestInput), listTestInput);
+  });
+
+  test("Enum", function() {
+    equal(client.testEnum(ThriftTest.Numberz.ONE), ThriftTest.Numberz.ONE);
+  });
+
+  test("TypeDef", function() {
+    equal(client.testTypedef(69), 69);
+  });
+
+
+module("deeper!");
+
+  test("MapMap", function() {
+    var mapMapTestExpectedResult = {
+      "4":{"1":1,"2":2,"3":3,"4":4},
+      "-4":{"-4":-4, "-3":-3, "-2":-2, "-1":-1}
+    };
+
+    var mapMapTestOutput = client.testMapMap(1);
+
+
+    for (var key in mapMapTestOutput) {
+      for (var key2 in mapMapTestOutput[key]) {
+        equal(mapMapTestOutput[key][key2], mapMapTestExpectedResult[key][key2]);
+      }
+    }
+    
+    checkRecursively(mapMapTestOutput, mapMapTestExpectedResult);
+  });
+
+
+module("Exception");
+
+  test("Xception", function() {
+    expect(2);
+    try{
+      client.testException("Xception");
+    }catch(e){
+      equal(e.errorCode, 1001);
+      equal(e.message, "Xception");
+    }
+  });
+
+  test("no Exception", 0, function() {
+    try{
+      client.testException("no Exception");
+    }catch(e){
+      ok(false);
+    }
+  });
+
+  test("TException", function() {
+    //ThriftTest does not list TException as a legal exception so it will
+    // generate an exception on the server that does not propagate back to 
+    // the client. This test has been modified to equate to "no exception"
+    expect(1);
+    try{
+      client.testException("TException");
+    } catch(e) {
+      //ok(false);
+    }
+    ok(true);
+  });
+
+
+module("Insanity");
+
+  test("testInsanity", function() {
+    var insanity = {
+      "1":{
+        "2":{
+          "userMap":{ "5":5, "8":8 },
+          "xtructs":[{
+              "string_thing":"Goodbye4",
+              "byte_thing":4,
+              "i32_thing":4,
+              "i64_thing":4
+            },
+            {
+              "string_thing":"Hello2",
+              "byte_thing":2,
+              "i32_thing":2,
+              "i64_thing":2
+            }
+          ]
+        },
+        "3":{
+          "userMap":{ "5":5, "8":8 },
+          "xtructs":[{
+              "string_thing":"Goodbye4",
+              "byte_thing":4,
+              "i32_thing":4,
+              "i64_thing":4
+            },
+            {
+              "string_thing":"Hello2",
+              "byte_thing":2,
+              "i32_thing":2,
+              "i64_thing":2
+            }
+          ]
+        }
+      },
+      "2":{ "6":{ "userMap":null, "xtructs":null } }
+    };
+    var res = client.testInsanity(new ThriftTest.Insanity());
+    ok(res, JSON.stringify(res));
+    ok(insanity, JSON.stringify(insanity));
+
+    checkRecursively(res, insanity);
+  });
+
+
+//////////////////////////////////
+//Run same tests asynchronously
+jQuery.ajaxSetup({ timeout: 0 });
+$(document).ajaxError( function() { QUnit.start(); } );
+
+module("Async Manual");
+
+  test("testI32", function() {
+    expect( 2 );
+    QUnit.stop();
+
+    var transport = new Thrift.Transport();
+    var protocol  = new Thrift.Protocol(transport);
+    var client    = new ThriftTest.ThriftTestClient(protocol);
+
+    var jqxhr = jQuery.ajax({
+      url: "/service",
+      data: client.send_testI32(Math.pow(-2,31)),
+      type: "POST",
+      cache: false,
+      dataType: "text",
+      success: function(res){
+        transport.setRecvBuffer( res );
+        equal(client.recv_testI32(), Math.pow(-2,31));
+      },
+      error: function() { ok(false); },
+      complete: function() {
+        ok(true);
+        QUnit.start();
+      }
+    });
+  });
+
+
+  test("testI64", function() {
+    expect( 2 );
+    QUnit.stop();
+
+    var transport = new Thrift.Transport();
+    var protocol  = new Thrift.Protocol(transport);
+    var client    = new ThriftTest.ThriftTestClient(protocol);
+
+    jQuery.ajax({
+      url: "/service",
+      //This is usually 2^61 but JS cannot represent anything over 2^52 accurately
+      data: client.send_testI64(Math.pow(-2,52)),
+      type: "POST",
+      cache: false,
+      dataType: "text",
+      success: function(res){
+        transport.setRecvBuffer( res );
+        //This is usually 2^61 but JS cannot represent anything over 2^52 accurately
+        equal(client.recv_testI64(), Math.pow(-2,52));
+      },
+      error: function() { ok(false); },
+      complete: function() {
+        ok(true);
+        QUnit.start();
+      }
+    });
+  });
+
+
+module("Async");
+
+  test("Double", function() {
+    expect( 1 );
+
+    QUnit.stop();
+    client.testDouble(3.14159265, function(result) {
+      equal(result, 3.14159265);
+      QUnit.start();
+    });
+  });
+
+  test("Byte", function() {
+    expect( 1 );
+
+    QUnit.stop();
+    client.testByte(0x01, function(result) {
+      equal(result, 0x01);
+      QUnit.start();
+    });
+  });
+
+  test("I32", function() {
+    expect( 3 );
+
+    QUnit.stop();
+    client.testI32(Math.pow(2,30), function(result) {
+      equal(result, Math.pow(2,30));
+      QUnit.start();
+    });
+
+    QUnit.stop();
+    var jqxhr = client.testI32(Math.pow(-2,31), function(result) {
+      equal(result, Math.pow(-2,31));
+    });
+
+    jqxhr.success(function(result) {
+      equal(result, Math.pow(-2,31));
+      QUnit.start();
+    });
+  });
+
+  test("I64", function() {
+    expect( 4 );
+
+    QUnit.stop();
+    //This is usually 2^60 but JS cannot represent anything over 2^52 accurately
+    client.testI64(Math.pow(2,52), function(result) {
+      equal(result, Math.pow(2,52));
+      QUnit.start();
+    });
+
+    QUnit.stop();
+    //This is usually 2^60 but JS cannot represent anything over 2^52 accurately
+    client.testI64(Math.pow(-2,52), function(result) {
+      equal(result, Math.pow(-2,52));
+    })
+    .error( function(xhr, status, e) {  ok(false, e.message); } )
+    .success(function(result) {
+      //This is usually 2^60 but JS cannot represent anything over 2^52 accurately
+      equal(result, Math.pow(-2,52));
+    })
+    .complete(function() {
+      ok(true);
+      QUnit.start();
+    });
+  });
+
+  test("Xception", function() {
+    expect( 2 );
+
+    QUnit.stop();
+
+    var dfd = client.testException("Xception", function(result) {
+      ok(false);
+      QUnit.start();
+    })
+    .error(function(xhr, status, e){
+      equal(e.errorCode, 1001);
+      equal(e.message, "Xception");
+      //QUnit.start();
+      //Note start is not required here because:
+      //$(document).ajaxError( function() { QUnit.start(); } );
+    });
+  });
diff --git a/lib/nodejs/test/testAll.sh b/lib/nodejs/test/testAll.sh
new file mode 100755
index 0000000..3e64393
--- /dev/null
+++ b/lib/nodejs/test/testAll.sh
@@ -0,0 +1,73 @@
+#! /bin/sh
+
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you 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.
+#
+
+DIR="$( cd "$( dirname "$0" )" && pwd )"
+
+export NODE_PATH="${DIR}:${DIR}/../lib:${NODE_PATH}"
+
+testClientServer()
+{
+  echo "   Testing Client/Server with protocol $1 and transport $2";
+  RET=0
+  node ${DIR}/server.js -p $1 -t $2 &
+  SERVERPID=$!
+  sleep 1
+  node ${DIR}/client.js -p $1 -t $2 || RET=1
+  kill -9 $SERVERPID || RET=1
+  return $RET
+}
+
+testMultiplexedClientServer()
+{
+  echo "   Testing Multiplexed Client/Server with protocol $1 and transport $2";
+  RET=0
+  node ${DIR}/multiplex_server.js -p $1 -t $2 &
+  SERVERPID=$!
+  sleep 1
+  node ${DIR}/multiplex_client.js -p $1 -t $2 || RET=1
+  kill -9 $SERVERPID || RET=1 #f
+  return $RET
+}
+
+
+TESTOK=0
+
+#generating thrift code
+
+${DIR}/../../../compiler/cpp/thrift -o ${DIR} --gen js:node ${DIR}/../../../test/ThriftTest.thrift
+
+#unit tests
+
+node ${DIR}/binary.test.js || TESTOK=1
+
+#integration tests
+
+testClientServer binary buffered || TESTOK=1
+testClientServer json buffered || TESTOK=1
+testClientServer binary framed || TESTOK=1
+testClientServer json framed || TESTOK=1
+
+testMultiplexedClientServer binary buffered || TESTOK=1
+testMultiplexedClientServer json buffered || TESTOK=1
+testMultiplexedClientServer binary framed || TESTOK=1
+testMultiplexedClientServer json framed || TESTOK=1
+
+exit $TESTOK
diff --git a/lib/nodejs/test/test_handler.js b/lib/nodejs/test/test_handler.js
new file mode 100644
index 0000000..e697408
--- /dev/null
+++ b/lib/nodejs/test/test_handler.js
@@ -0,0 +1,195 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.
+ */
+
+//This is the server side Node test handler for the standard 
+//  Apache Thrift test service.
+
+var ttypes = require('./gen-nodejs/ThriftTest_types');
+var TException = require('thrift/thrift').TException;
+
+var ThriftTestHandler = exports.ThriftTestHandler = {
+  testVoid: function(result) {
+    console.log('testVoid()');
+    result(null);
+  },
+  testString: function(thing, result) {
+    console.log('testString(\'' + thing + '\')');
+    result(null, thing);
+  },
+  testByte: function(thing, result) {
+    console.log('testByte(' + thing + ')');
+    result(null, thing);
+  },
+  testI32: function(thing, result) {
+    console.log('testI32(' + thing + ')');
+    result(null, thing);
+  },
+  testI64: function(thing, result) {
+    console.log('testI64(' + thing + ')');
+    result(null, thing);
+  },
+  testDouble: function(thing, result) {
+    console.log('testDouble(' + thing + ')');
+    result(null, thing);
+  },
+  testStruct: function(thing, result) {
+    console.log('testStruct(');
+    console.log(thing);
+    console.log(')');
+    result(null, thing);
+  },
+  testNest: function(nest, result) {
+    console.log('testNest(');
+    console.log(nest);
+    console.log(')');
+    result(null, nest);
+  },
+  testMap: function(thing, result) {
+    console.log('testMap(');
+    console.log(thing);
+    console.log(')');
+    result(null, thing);
+  },
+  testStringMap: function(thing, result) {
+    console.log('testStringMap(');
+    console.log(thing);
+    console.log(')');
+    result(null, thing);
+  },
+  testSet: function(thing, result) {
+    console.log('testSet(');
+    console.log(thing);
+    console.log(')');
+    result(null, thing);
+  },
+  testList: function(thing, result) {
+    console.log('testList(');
+    console.log(thing);
+    console.log(')');
+    result(null, thing);
+  },
+  testEnum: function(thing, result) {
+    console.log('testEnum(' + thing + ')');
+    result(null, thing);
+  },
+  testTypedef: function(thing, result) {
+    console.log('testTypedef(' + thing + ')');
+    result(null, thing);
+  },
+  testMapMap: function(hello, result) {
+    console.log('testMapMap(' + hello + ')');
+
+    var mapmap = [];
+    var pos = [];
+    var neg = [];
+    for (var i = 1; i < 5; i++) {
+      pos[i] = i;
+      neg[-i] = -i;
+    }
+    mapmap[4] = pos;
+    mapmap[-4] = neg;
+
+    result(null, mapmap);
+  },
+  testInsanity: function(argument, result) {
+    console.log('testInsanity(');
+    console.log(argument);
+    console.log(')');
+
+    var hello = new ttypes.Xtruct();
+    hello.string_thing = 'Hello2';
+    hello.byte_thing = 2;
+    hello.i32_thing = 2;
+    hello.i64_thing = 2;
+
+    var goodbye = new ttypes.Xtruct();
+    goodbye.string_thing = 'Goodbye4';
+    goodbye.byte_thing = 4;
+    goodbye.i32_thing = 4;
+    goodbye.i64_thing = 4;
+
+    var crazy = new ttypes.Insanity();
+    crazy.userMap = [];
+    crazy.userMap[ttypes.Numberz.EIGHT] = 8;
+    crazy.userMap[ttypes.Numberz.FIVE] = 5;
+    crazy.xtructs = [goodbye, hello];
+
+    var first_map = [];
+    var second_map = [];
+
+    first_map[ttypes.Numberz.TWO] = crazy;
+    first_map[ttypes.Numberz.THREE] = crazy;
+
+    var looney = new ttypes.Insanity();
+    second_map[ttypes.Numberz.SIX] = looney;
+
+    var insane = [];
+    insane[1] = first_map;
+    insane[2] = second_map;
+
+    console.log('insane result:');
+    console.log(insane);
+    result(null, insane);
+  },
+  testMulti: function(arg0, arg1, arg2, arg3, arg4, arg5, result) {
+    console.log('testMulti()');
+
+    var hello = new ttypes.Xtruct();;
+    hello.string_thing = 'Hello2';
+    hello.byte_thing = arg0;
+    hello.i32_thing = arg1;
+    hello.i64_thing = arg2;
+    result(null, hello);
+  },
+  testException: function(arg, result) {
+    console.log('testException('+arg+')');
+    if (arg === 'Xception') {
+      var x = new ttypes.Xception();
+      x.errorCode = 1001;
+      x.message = arg;
+      result(x);
+    } else if (arg === 'TException') {
+      result(new TException(arg));
+    } else {
+      result(null);
+    }
+  },
+  testMultiException: function(arg0, arg1, result) {
+    console.log('testMultiException(' + arg0 + ', ' + arg1 + ')');
+    if (arg0 === ('Xception')) {
+      var x = new ttypes.Xception();
+      x.errorCode = 1001;
+      x.message = 'This is an Xception';
+      result(x);
+    } else if (arg0 === ('Xception2')) {
+      var x = new ttypes.Xception2();
+      x.errorCode = 2002;
+      x.struct_thing = new ttypes.Xtruct();
+      x.struct_thing.string_thing = 'This is an Xception2';
+      result(x);
+    }
+
+    var res = new ttypes.Xtruct();
+    res.string_thing = arg1;
+    result(null, res);
+  },
+  testOneway: function(sleepFor, result) {
+    console.log('testOneway(' + sleepFor + ') => JavaScript (like Rust) never sleeps!');
+  }
+}   //ThriftTestSvcHandler
diff --git a/lib/nodejs/test/thrift_test_driver.js b/lib/nodejs/test/thrift_test_driver.js
new file mode 100644
index 0000000..c61e99d
--- /dev/null
+++ b/lib/nodejs/test/thrift_test_driver.js
@@ -0,0 +1,304 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.
+ */
+
+ // This is the Node test driver for the standard Apache Thrift 
+ // test service. The driver invokes every function defined in the 
+ // Thrift Test service with a representative range of parameters.
+ //
+ // The ThriftTestDriver function requires a client object
+ // connected to a server hosting the Thrift Test service and
+ // supports an optional callback function which is called with 
+ // a status message when the test is complete.
+
+var assert = require('assert');
+var ttypes = require('./gen-nodejs/ThriftTest_types');
+
+var ThriftTestDriver = exports.ThriftTestDriver = function(client, callback) {
+	
+// deepEqual doesn't work with fields using node-int64
+function checkRecursively(map1, map2) {
+  if (typeof map1 !== 'function' && typeof map2 !== 'function') {
+    if (!map1 || typeof map1 !== 'object') {
+        assert.equal(map1, map2);
+    } else {
+      for (var key in map1) {
+        checkRecursively(map1[key], map2[key]);
+      }
+    }
+  }
+}
+
+client.testVoid(function(err, response) {
+  assert( ! err);
+  assert.equal(undefined, response); //void
+});
+
+client.testString("Test", function(err, response) {
+  assert( ! err);
+  assert.equal("Test", response);
+});
+
+client.testString("", function(err, response) {
+  assert( ! err);
+  assert.equal("", response);
+});
+
+//all Languages in UTF-8
+var stringTest = "Afrikaans, Alemannisch, Aragonés, العربية, مصرى, " +
+    "Asturianu, Aymar aru, Azərbaycan, Башҡорт, Boarisch, Žemaitėška, " +
+    "Беларуская, Беларуская (тарашкевіца), Български, Bamanankan, " +
+    "বাংলা, Brezhoneg, Bosanski, Català, Mìng-dĕ̤ng-ngṳ̄, Нохчийн, " +
+    "Cebuano, ᏣᎳᎩ, Česky, Словѣ́ньскъ / ⰔⰎⰑⰂⰡⰐⰠⰔⰍⰟ, Чӑвашла, Cymraeg, " +
+    "Dansk, Zazaki, ދިވެހިބަސް, Ελληνικά, Emiliàn e rumagnòl, English, " +
+    "Esperanto, Español, Eesti, Euskara, فارسی, Suomi, Võro, Føroyskt, " +
+    "Français, Arpetan, Furlan, Frysk, Gaeilge, 贛語, Gàidhlig, Galego, " +
+    "Avañe'ẽ, ગુજરાતી, Gaelg, עברית, हिन्दी, Fiji Hindi, Hrvatski, " +
+    "Kreyòl ayisyen, Magyar, Հայերեն, Interlingua, Bahasa Indonesia, " +
+    "Ilokano, Ido, Íslenska, Italiano, 日本語, Lojban, Basa Jawa, " +
+    "ქართული, Kongo, Kalaallisut, ಕನ್ನಡ, 한국어, Къарачай-Малкъар, " +
+    "Ripoarisch, Kurdî, Коми, Kernewek, Кыргызча, Latina, Ladino, " +
+    "Lëtzebuergesch, Limburgs, Lingála, ລາວ, Lietuvių, Latviešu, Basa " +
+    "Banyumasan, Malagasy, Македонски, മലയാളം, मराठी, مازِرونی, Bahasa " +
+    "Melayu, Nnapulitano, Nedersaksisch, नेपाल भाषा, Nederlands, ‪" +
+    "Norsk (nynorsk)‬, ‪Norsk (bokmål)‬, Nouormand, Diné bizaad, " +
+    "Occitan, Иронау, Papiamentu, Deitsch, Polski, پنجابی, پښتو, " +
+    "Norfuk / Pitkern, Português, Runa Simi, Rumantsch, Romani, Română, " +
+    "Русский, Саха тыла, Sardu, Sicilianu, Scots, Sámegiella, Simple " +
+    "English, Slovenčina, Slovenščina, Српски / Srpski, Seeltersk, " +
+    "Svenska, Kiswahili, தமிழ், తెలుగు, Тоҷикӣ, ไทย, Türkmençe, Tagalog, " +
+    "Türkçe, Татарча/Tatarça, Українська, اردو, Tiếng Việt, Volapük, " +
+    "Walon, Winaray, 吴语, isiXhosa, ייִדיש, Yorùbá, Zeêuws, 中文, " +
+    "Bân-lâm-gú, 粵語";
+
+client.testString(stringTest, function(err, response) {
+  assert( ! err);
+  assert.equal(stringTest, response);
+});
+
+var specialCharacters = 'quote: \" backslash:' +
+    ' forwardslash-escaped: \/ ' +
+    ' backspace: \b formfeed: \f newline: \n return: \r tab: ' +
+    ' now-all-of-them-together: "\\\/\b\n\r\t' +
+    ' now-a-bunch-of-junk: !@#$%&()(&%$#{}{}<><><' +
+    ' char-to-test-json-parsing: ]] \"]] \\" }}}{ [[[ ';
+client.testString(specialCharacters, function(err, response) {
+  assert( ! err);
+  assert.equal(specialCharacters, response);
+});
+
+client.testByte(1, function(err, response) {
+  assert( ! err);
+  assert.equal(1, response);
+});
+
+client.testByte(0, function(err, response) {
+  assert( ! err);
+  assert.equal(0, response);
+});
+
+client.testByte(-1, function(err, response) {
+  assert( ! err);
+  assert.equal(-1, response);
+});
+
+client.testByte(-127, function(err, response) {
+  assert( ! err);
+  assert.equal(-127, response);
+});
+
+client.testI32(-1, function(err, response) {
+  assert( ! err);
+  assert.equal(-1, response);
+});
+
+client.testI64(5, function(err, response) {
+  assert( ! err);
+  assert.equal(5, response);
+});
+
+client.testI64(-5, function(err, response) {
+  assert( ! err);
+  assert.equal(-5, response);
+});
+
+client.testI64(-34359738368, function(err, response) {
+  assert( ! err);
+  assert.equal(-34359738368, response);
+});
+
+client.testDouble(-5.2098523, function(err, response) {
+  assert( ! err);
+  assert.equal(-5.2098523, response);
+});
+
+client.testDouble(7.012052175215044, function(err, response) {
+  assert( ! err);
+  assert.equal(7.012052175215044, response);
+});
+
+var out = new ttypes.Xtruct({
+  string_thing: 'Zero',
+  byte_thing: 1,
+  i32_thing: -3,
+  i64_thing: 1000000
+});
+client.testStruct(out, function(err, response) {
+  assert( ! err);
+  checkRecursively(out, response);
+});
+
+var out2 = new ttypes.Xtruct2();
+out2.byte_thing = 1;
+out2.struct_thing = out;
+out2.i32_thing = 5;
+client.testNest(out2, function(err, response) {
+  assert( ! err);
+  checkRecursively(out2, response);
+});
+
+var mapout = {};
+for (var i = 0; i < 5; ++i) {
+  mapout[i] = i-10;
+}
+client.testMap(mapout, function(err, response) {
+  assert( ! err);
+  assert.deepEqual(mapout, response);
+});
+
+var mapTestInput = {
+  "a":"123", "a b":"with spaces ", "same":"same", "0":"numeric key",
+  "longValue":stringTest, stringTest:"long key"
+};
+client.testStringMap(mapTestInput, function(err, response) {
+  assert( ! err);
+  assert.deepEqual(mapTestInput, response);
+});
+
+var setTestInput = [1,2,3];
+client.testSet(setTestInput, function(err, response) {
+  assert( ! err);
+  assert.deepEqual(setTestInput, response);
+});
+client.testList(setTestInput, function(err, response) {
+  assert( ! err);
+  assert.deepEqual(setTestInput, response);
+});
+
+client.testEnum(ttypes.Numberz.ONE, function(err, response) {
+  assert( ! err);
+  assert.equal(ttypes.Numberz.ONE, response);
+});
+
+client.testTypedef(69, function(err, response) {
+  assert( ! err);
+  assert.equal(69, response);
+});
+
+var mapMapTest = {
+  "4": {"1":1, "2":2, "3":3, "4":4},
+  "-4": {"-4":-4, "-3":-3, "-2":-2, "-1":-1}
+};
+client.testMapMap(mapMapTest, function(err, response) {
+  assert( ! err);
+  assert.deepEqual(mapMapTest, response);
+});
+
+var crazy = new ttypes.Insanity({
+  "userMap":{ "5":5, "8":8 },
+  "xtructs":[new ttypes.Xtruct({
+      "string_thing":"Goodbye4",
+      "byte_thing":4,
+      "i32_thing":4,
+      "i64_thing":4
+    }), new ttypes.Xtruct({
+      "string_thing":"Hello2",
+      "byte_thing":2,
+      "i32_thing":2,
+      "i64_thing":2
+    })]
+});
+var insanity = {
+  "1":{ "2": crazy, "3": crazy },
+  "2":{ "6":{ "userMap":null, "xtructs":null } }
+};
+client.testInsanity(crazy, function(err, response) {
+  assert( ! err);
+  checkRecursively(insanity, response);
+});
+
+client.testException('TException', function(err, response) {
+  assert( ! response);
+});
+
+client.testException('Xception', function(err, response) {
+  assert( ! response);
+  assert.equal(err.errorCode, 1001);
+  assert.equal('Xception', err.message);
+});
+
+client.testException('no Exception', function(err, response) {
+  assert( ! err);
+  assert.equal(undefined, response); //void
+});
+
+client.testOneway(0, function(err, response) {
+  assert(false); //should not answer
+});
+
+(function() {
+  var test_complete = false;
+  var retrys = 0;
+  var retry_limit = 30;
+  var retry_interval = 100;
+  /**
+   * redo a simple test after the oneway to make sure we aren't "off by one" --
+   * if the server treated oneway void like normal void, this next test will
+   * fail since it will get the void confirmation rather than the correct
+   * result. In this circumstance, the client will throw the exception:
+   *
+   * Because this is the last test against the server, when it completes
+   * the entire suite is complete by definition (the tests run serially).
+   */
+  client.testI32(-1, function(err, response) {
+    assert( ! err);
+    assert.equal(-1, response);
+    test_complete = true;
+  });
+
+//We wait up to retry_limit * retry_interval for the test suite to complete
+  function TestForCompletion() {
+    if(test_complete) {
+      if (callback) {
+        callback("Server successfully tested!");
+      }
+    } else {
+      if (++retrys < retry_limit) {
+        setTimeout(TestForCompletion, retry_interval);
+      } else {
+    if (callback) {
+      callback("Server test failed to complete after " +
+        (retry_limit*retry_interval/1000) + " seconds");
+    }
+      }
+    }
+  }
+
+  setTimeout(TestForCompletion, retry_interval);
+})();
+}
