diff --git a/test/nodejs/Makefile.am b/test/nodejs/Makefile.am
new file mode 100755
index 0000000..fc8e7d0
--- /dev/null
+++ b/test/nodejs/Makefile.am
@@ -0,0 +1,33 @@
+# 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.
+
+
+THRIFT = $(top_srcdir)/compiler/cpp/thrift
+
+stubs: ../ThriftTest.thrift
+	$(THRIFT) --gen js:node ../ThriftTest.thrift
+
+check: stubs
+
+clean-local:
+	$(RM) -r gen-nodejs
+
+server: stubs
+	NODE_PATH=../../lib/nodejs/lib:../../lib/nodejs/lib/thrift node server.js
+
+client: stubs
+	NODE_PATH=../../lib/nodejs/lib:../../lib/nodejs/lib/thrift node client.js
diff --git a/test/nodejs/client.js b/test/nodejs/client.js
new file mode 100644
index 0000000..60d70bf
--- /dev/null
+++ b/test/nodejs/client.js
@@ -0,0 +1,157 @@
+/*
+ * 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 ThriftTest = require('./gen-nodejs/ThriftTest'),
+    ttypes = require('./gen-nodejs/ThriftTest_types');
+
+var connection = thrift.createConnection('localhost', 9090),
+    client = thrift.createClient(ThriftTest, connection);
+
+var tfailed = 0;
+var tpassed = 0;
+
+function failed(err) {
+  console.trace(err);
+	return tfailed++;
+}
+function passed() {
+	return tpassed++;
+}
+
+connection.on('error', function(err) {
+  failed(err);
+});
+
+console.time("Tests completed in");
+
+client.testVoid(function(err, response) {
+  if (err) { return failed(err); }
+  console.log("testVoid() = ", response);
+	passed();
+});
+
+client.testString("Test", function(err, response) {
+  if (err) { return failed(err); }
+  console.log("testString('Test') = ", response);
+	passed();
+});
+
+client.testByte(1, function(err, response) {
+  if (err) { return failed(err); }
+  console.log("testByte(1) = ", response);
+	passed();
+});
+
+client.testI32(-1, function(err, response) {
+  if (err) { return failed(err); }
+  console.log("testI32(-1) = ", response);
+	passed();
+});
+
+client.testI64(5, function(err, response) {
+  if (err) { return failed(err); }
+  console.log("testI64(5) = ", response);
+	passed();
+});
+
+/*
+ * FATAL ERROR: CALL_AND_RETRY_2 Allocation failed - process out of memory
+client.testI64(-5, function(err, response) {
+  if (err) { return failed(err); }
+  console.log("testI64(-5) = ", response);
+	passed();
+});
+ */
+
+client.testI64(-34359738368, function(err, response) {
+  if (err) { return failed(err); }
+  console.log("testI64(-34359738368) = ", response);
+	passed();
+});
+
+client.testDouble(-5.2098523, function(err, response) {
+  if (err) { return failed(err); }
+  console.log("testDouble(-5.2098523) = ", response);
+	passed();
+});
+
+var out = new ttypes.Xtruct({
+	string_thing: 'Zero',
+	byte_thing: 1,
+	i32_thing: -3,
+	i64_thing: 1000000
+});
+client.testStruct(out, function(err, response) {
+  if (err) { return failed(err); }
+  console.log("testStruct(", out, ") = \n", response);
+	passed();
+});
+
+var out2 = new ttypes.Xtruct2();
+out2.byte_thing = 1;
+out2.struct_thing = out;
+out2.i32_thing = 5;
+client.testNest(out2, function(err, response) {
+  if (err) { return failed(err); }
+  console.log("testNest(", out2, ") = \n", response);
+	passed();
+});
+
+/*
+ * TypeError: Cannot read property 'length' of undefined
+var mapout = {};
+for (var i = 0; i < 5; ++i) {
+  mapout[i] = i-10;
+}
+client.testMap(mapout, function(err, response) {
+  if (err) { return failed(err); }
+  console.log("testMap(", mapout, ") = \n", response);
+	passed();
+});
+*/
+
+/*
+ * TODO: testSet, testList, testEnum, testTypedef, testMapMap, testInsanity
+ */
+
+
+client.testException('ApplicationException', function(err, response) {
+  console.log("testException('ApplicationException') = ", err);
+  if (response) { return failed(response); }
+	passed();
+});
+
+client.testException('Xception', function(err, response) {
+  console.log("testException('Xception') = ", err);
+  if (response) { return failed(response); }
+	passed();
+});
+
+client.testException('success', function(err, response) {
+  if (err) { return failed(err); }
+  console.log("testException('success') = ", response);
+	passed();
+});
+
+setTimeout(function(){
+  console.timeEnd("Tests completed in");
+	console.log(tpassed + " passed, " + tfailed + " failed");
+	connection.end();
+}, 200);
diff --git a/test/nodejs/package.json b/test/nodejs/package.json
new file mode 100644
index 0000000..09c6b2c
--- /dev/null
+++ b/test/nodejs/package.json
@@ -0,0 +1,30 @@
+{
+  "name": "thrift-nodejs-test",
+  "version": "0.9.0-dev",
+  "description": "node.js test server and client for the Apache Thrift",
+  "homepage": "http://thrift.apache.org/",
+  "repository":
+    { "type" : "svn",
+      "url" : "http://svn.apache.org/repos/asf/thrift/trunk/"
+    },
+  "author":
+    { "name": "Apache Thrift Developers",
+      "email": "dev@thrift.apache.org",
+      "url": "http://thrift.apache.org"
+    },
+  "licenses":
+    [ { "type": "Apache-2.0",
+        "url": "http://www.apache.org/licenses/LICENSE-2.0"
+      }
+    ],
+  "bugs":
+    { "mail": "dev@thrift.apache.org",
+      "url": "https://issues.apache.org/jira/browse/THRIFT"
+    },
+  "directories" : { "lib" : "../lib/nodejs/lib/thrift" },
+  "main": "../lib/nodejs/lib/thrift",
+  "scripts": {
+    "start": "node ./http-server"
+  },
+  "engines": { "node": ">= 0.2.4" }
+}
diff --git a/test/nodejs/server.js b/test/nodejs/server.js
new file mode 100644
index 0000000..056209d
--- /dev/null
+++ b/test/nodejs/server.js
@@ -0,0 +1,220 @@
+/*
+ * 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 ThriftTest = require('./gen-nodejs/ThriftTest'),
+    ttypes = require('./gen-nodejs/ThriftTest_types');
+
+
+var server = thrift.createServer(ThriftTest, {
+  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()');
+
+    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 = [];
+    crazy.xtructs.add(goodbye);
+    crazy.xtructs.add(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;
+
+    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 === 'ApplicationException') {
+      result(new Thrift.TException(arg));
+    } else {
+      var res = new ttypes.Xtruct();
+      res.string_thing = arg;
+			result(null, res);
+    }
+  },
+
+  testMultiException: function(arg0, arg1, result) {
+    console.log('testMultiException(' + arg0 + ', ' + arg1 + ')');
+    if (arg0 === ('Xception')) {
+      var x = new Xception();
+      x.errorCode = 1001;
+      x.message = 'This is an Xception';
+      result(x);
+    } else if (arg0 === ('Xception2')) {
+      var x = new Xception2();
+      x.errorCode = 2002;
+      x.struct_thing = new Xtruct();
+      x.struct_thing.string_thing = 'This is an Xception2';
+      result(x);
+    }
+
+    var res = new Xtruct();
+    res.string_thing = arg1;
+    result(null, res);
+  },
+
+  testOneway: function(sleepFor, result) {
+    console.log('testOneway(' + sleepFor + ') => sleeping...');
+    setTimeout(function(){
+      console.log('Done sleeping!');
+    }, sleepFor);
+		result(null);
+  }
+});
+
+server.listen(9090);
