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);
