diff --git a/test/ThriftTest.thrift b/test/ThriftTest.thrift
index 500f0ea..568ed1b 100644
--- a/test/ThriftTest.thrift
+++ b/test/ThriftTest.thrift
@@ -295,6 +295,12 @@
 service SecondService
 {
   void blahBlah()
+  /**
+   * Prints 'testString("%s")' with thing as '%s'
+   * @param string thing - the string to print
+   * @return string - returns the string 'thing'
+   */
+  string       secondtestString(1: string thing),
 }
 
 struct VersioningTestV1 {
diff --git a/test/nodejs/Makefile.am b/test/nodejs/Makefile.am
index f796b07..ab9a554 100755
--- a/test/nodejs/Makefile.am
+++ b/test/nodejs/Makefile.am
@@ -32,6 +32,12 @@
 		sleep 1; $(MAKE) client; sleep 2; \
 	fi
 
+	@if which node &> /dev/null ; then \
+		echo "   Testing Multiplex Client/Server"; \
+		sleep 4; timeout -s14 5 $(MAKE) mserver & \
+		sleep 1; $(MAKE) mclient; sleep 2; \
+	fi
+
 clean-local:
 	$(RM) -r gen-nodejs
 
@@ -40,3 +46,9 @@
 
 client:
 	NODE_PATH=../../lib/nodejs/lib:../../lib/nodejs/lib/thrift:$(NODE_PATH) node client.js
+
+mserver:
+	NODE_PATH=../../lib/nodejs/lib:../../lib/nodejs/lib/thrift:$(NODE_PATH) node --harmony multiplex_server.js
+
+mclient:
+	NODE_PATH=../../lib/nodejs/lib:../../lib/nodejs/lib/thrift:$(NODE_PATH) node --harmony multiplex_client.js
diff --git a/test/nodejs/multiplex_client.js b/test/nodejs/multiplex_client.js
new file mode 100644
index 0000000..3b79b6c
--- /dev/null
+++ b/test/nodejs/multiplex_client.js
@@ -0,0 +1,302 @@
+/*
+ * 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 ttransport = require('transport');
+var assert = require('assert');
+
+var ThriftTest = require('./gen-nodejs/ThriftTest'),
+    SecondService = require('./gen-nodejs/SecondService'),
+    ttypes = require('./gen-nodejs/ThriftTest_types');
+
+var connection = thrift.createConnection('localhost', 9090, {
+    'transport': ttransport.TFramedTransport
+});
+
+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/test/nodejs/multiplex_server.js b/test/nodejs/multiplex_server.js
new file mode 100644
index 0000000..6b2d7d3
--- /dev/null
+++ b/test/nodejs/multiplex_server.js
@@ -0,0 +1,242 @@
+/*
+ * 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 ttransport = require('transport');
+
+var ThriftTest = require('./gen-nodejs/ThriftTest'),
+    SecondService = require('./gen-nodejs/SecondService'),
+    ttypes = require('./gen-nodejs/ThriftTest_types');
+
+var 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 Thrift.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 + ') => sleeping...');
+        setTimeout(function() {
+            console.log('Done sleeping for testOneway!');
+        }, sleepFor * 1000); //seconds
+    }
+};
+
+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, { //server options
+    'transport': ttransport.TFramedTransport
+});
+
+server.listen(9090);
