diff --git a/.gitignore b/.gitignore
index 3f95581..9755012 100644
--- a/.gitignore
+++ b/.gitignore
@@ -188,6 +188,9 @@
 /lib/js/test/build
 /lib/js/test/Makefile
 /lib/js/test/Makefile.in
+/lib/nodejs/Makefile
+/lib/nodejs/Makefile.in
+/lib/nodejs/node_modules/
 /lib/perl/MANIFEST
 /lib/perl/MYMETA.yml
 /lib/perl/Makefile
diff --git a/configure.ac b/configure.ac
index 7d9a82e..b2577dd 100755
--- a/configure.ac
+++ b/configure.ac
@@ -178,6 +178,18 @@
 fi
 AM_CONDITIONAL(WITH_ERLANG, [test "$have_erlang" = "yes"])
 
+AX_THRIFT_LIB(nodejs, [Nodejs], yes)
+have_nodejs=no
+if test "$with_nodejs" = "yes"; then
+  AC_PATH_PROGS([NODEJS], [nodejs node])
+  AC_PATH_PROG([NPM], [npm])
+  if test "x$NODEJS" != "x" -a "x$NPM" != "x"; then
+    have_nodejs="yes"
+  fi
+fi
+AM_CONDITIONAL(WITH_NODEJS, [test "$have_nodejs" = "yes"])
+AM_CONDITIONAL(HAVE_NPM, [test "x$NPM" != "x"])
+
 AX_THRIFT_LIB(python, [Python], yes)
 if test "$with_python" = "yes";  then
   AM_PATH_PYTHON(2.4,, :)
@@ -547,7 +559,7 @@
 # gruard against pre defined config.h
 AH_TOP([
 #ifndef CONFIG_H
-#define CONFIG_H 
+#define CONFIG_H
 ])
 AH_BOTTOM([
 #endif
@@ -578,6 +590,7 @@
   lib/hs/Makefile
   lib/java/Makefile
   lib/js/test/Makefile
+  lib/nodejs/Makefile
   lib/perl/Makefile
   lib/perl/test/Makefile
   lib/php/Makefile
@@ -587,7 +600,6 @@
   test/Makefile
   test/cpp/Makefile
   test/hs/Makefile
-  test/nodejs/Makefile
   test/php/Makefile
   test/perl/Makefile
   test/py/Makefile
@@ -623,6 +635,7 @@
 echo "Building Erlang Library ...... : $have_erlang"
 echo "Building Go Library .......... : $have_go"
 echo "Building D Library ........... : $have_d"
+echo "Building NodeJS Library ...... : $have_nodejs"
 
 if test "$have_cpp" = "yes" ; then
   echo
@@ -687,6 +700,12 @@
   echo "   Building D libevent tests . : $with_d_event_tests"
   echo "   Building D SSL tests ...... : $with_d_ssl_tests"
 fi
+if test "$have_nodejs" = "yes" ; then
+  echo
+  echo "NodeJS Library:"
+  echo "   Using NodeJS .............. : $NODEJS"
+  echo "   Using NodeJS version....... : $($NODEJS --version)"
+fi
 echo
 echo "If something is missing that you think should be present,"
 echo "please skim the output of configure to find the missing"
diff --git a/lib/Makefile.am b/lib/Makefile.am
index 1cc5c6c..26d9020 100644
--- a/lib/Makefile.am
+++ b/lib/Makefile.am
@@ -70,6 +70,11 @@
 SUBDIRS += d
 endif
 
+if WITH_NODEJS
+SUBDIRS += nodejs
+endif
+
+
 # All of the libs that don't use Automake need to go in here
 # so they will end up in our release tarballs.
 EXTRA_DIST = \
@@ -79,6 +84,5 @@
 			delphi \
 			javame \
 			js \
-			nodejs \
 			ocaml \
 			st
diff --git a/lib/nodejs/Makefile.am b/lib/nodejs/Makefile.am
new file mode 100755
index 0000000..5e298d4
--- /dev/null
+++ b/lib/nodejs/Makefile.am
@@ -0,0 +1,31 @@
+# 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: $(top_srcdir)/test/ThriftTest.thrift
+#	$(THRIFT) --gen js:node -o test/ $(top_srcdir)/test/ThriftTest.thrift
+
+deps: package.json
+	$(NPM) install
+
+check: deps
+	$(NPM) test
+
+clean-local:
+	$(RM) -r test/gen-nodejs
diff --git a/lib/nodejs/package.json b/lib/nodejs/package.json
index 668c58d..b2b92d6 100755
--- a/lib/nodejs/package.json
+++ b/lib/nodejs/package.json
@@ -29,6 +29,10 @@
     "nodeunit": "~0.8.0"
   },
   "devDependencies": {
-    "connect": "2.7.x"
+    "connect": "2.7.x",
+    "commander": "2.1.x"
+  },
+  "scripts": {
+    "test" : "test/testAll.sh"
   }
 }
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/test/nodejs/multiplex_client.js b/lib/nodejs/test/multiplex_client.js
similarity index 90%
rename from test/nodejs/multiplex_client.js
rename to lib/nodejs/test/multiplex_client.js
index ba0d47b..6cf6975 100644
--- a/test/nodejs/multiplex_client.js
+++ b/lib/nodejs/test/multiplex_client.js
@@ -17,15 +17,45 @@
  * under the License.
  */
 var thrift = require('thrift');
-var ttransport = require('transport');
+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': ttransport.TFramedTransport
+  transport: transport,
+  protocol: protocol
 });
 
 var mp = new thrift.Multiplexer();
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/test/nodejs/server_http.js b/lib/nodejs/test/server_http.js
similarity index 100%
rename from test/nodejs/server_http.js
rename to lib/nodejs/test/server_http.js
diff --git a/test/nodejs/test.html b/lib/nodejs/test/test.html
similarity index 100%
rename from test/nodejs/test.html
rename to lib/nodejs/test/test.html
diff --git a/test/nodejs/test.js b/lib/nodejs/test/test.js
similarity index 100%
rename from test/nodejs/test.js
rename to lib/nodejs/test/test.js
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/test/nodejs/test_handler.js b/lib/nodejs/test/test_handler.js
similarity index 100%
rename from test/nodejs/test_handler.js
rename to lib/nodejs/test/test_handler.js
diff --git a/test/nodejs/thrift_test_driver.js b/lib/nodejs/test/thrift_test_driver.js
similarity index 100%
rename from test/nodejs/thrift_test_driver.js
rename to lib/nodejs/test/thrift_test_driver.js
diff --git a/test/Makefile.am b/test/Makefile.am
index 175f477..2d44229 100755
--- a/test/Makefile.am
+++ b/test/Makefile.am
@@ -17,7 +17,7 @@
 # under the License.
 #
 
-SUBDIRS = nodejs
+SUBDIRS =
 
 if WITH_CPP
 SUBDIRS += cpp
@@ -55,7 +55,6 @@
 	test.sh \
 	cpp \
 	hs \
-	nodejs \
 	ocaml \
 	perl \
 	php \
diff --git a/test/nodejs/Makefile.am b/test/nodejs/Makefile.am
deleted file mode 100755
index 39a7237..0000000
--- a/test/nodejs/Makefile.am
+++ /dev/null
@@ -1,56 +0,0 @@
-# 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
-	@if which nodeunit &> /dev/null ; then \
-		echo "   Testing thrift/binary"; \
-		NODE_PATH=../../lib/nodejs/lib:../../lib/nodejs/lib/thrift:$(NODE_PATH) nodeunit ../../lib/nodejs/test/binary.test.js; \
-	fi
-	@if which node &> /dev/null ; then \
-		echo "   Testing Client/Server"; \
-		timeout -s14 5 $(MAKE) server & \
-		sleep 1; $(MAKE) client; sleep 2; \
-		\
-		echo "   Testing Multiplex Client/Server"; \
-		sleep 4; timeout -s14 5 $(MAKE) mserver & \
-		sleep 1; $(MAKE) mclient; sleep 2; \
-		\
-		echo "   Testing Client/Server examples"; \
-		sleep 4; timeout -s14 5 $(MAKE) -C ../../lib/nodejs/examples server & \
-		sleep 1; $(MAKE) -C ../../lib/nodejs/examples client; sleep 2; \
-	fi
-
-clean-local:
-	$(RM) -r gen-nodejs
-
-server:
-	NODE_PATH=../../lib/nodejs/lib:../../lib/nodejs/lib/thrift:$(NODE_PATH) node server.js
-
-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 multiplex_server.js
-
-mclient:
-	NODE_PATH=../../lib/nodejs/lib:../../lib/nodejs/lib/thrift:$(NODE_PATH) node multiplex_client.js
diff --git a/test/nodejs/client.js b/test/nodejs/client.js
deleted file mode 100644
index d70ec0c..0000000
--- a/test/nodejs/client.js
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * 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 TFramedTransport = require('thrift/transport').TFramedTransport;
-var ThriftTest = require('./gen-nodejs/ThriftTest');
-var ThriftTestDriver = require('./thrift_test_driver').ThriftTestDriver;
-
-var connection = thrift.createConnection('localhost', 9090, { transport: TFramedTransport} );
-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/test/nodejs/client_bin.js b/test/nodejs/client_bin.js
deleted file mode 100644
index d077202..0000000
--- a/test/nodejs/client_bin.js
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * 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.
- */
-
-//Node client test for the following I/O stack:
-//    TJSONProtocol
-//    TBufferedTransport
-//    TSocket
-
-var assert = require('assert');
-var thrift = require('thrift');
-var TBufferedTransport = require('thrift/transport').TBufferedTransport;
-var TBinaryProtocol = require('thrift/protocol').TBinaryProtocol;
-var ThriftTest = require('./gen-nodejs/ThriftTest');
-var ThriftTestDriver = require('./thrift_test_driver').ThriftTestDriver;
-
-var connection = thrift.createConnection('localhost', 9090, 
-	                { protocol: TBinaryProtocol, transport: TBufferedTransport} );
-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/test/nodejs/client_json.js b/test/nodejs/client_json.js
deleted file mode 100644
index de0190f..0000000
--- a/test/nodejs/client_json.js
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * 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.
- */
-
-//Node client test for the following I/O stack:
-//    TJSONProtocol
-//    TBufferedTransport
-//    TSocket
-
-var assert = require('assert');
-var thrift = require('thrift');
-var TBufferedTransport = require('thrift/transport').TBufferedTransport;
-var TJSONProtocol = require('thrift/protocol').TJSONProtocol;
-var ThriftTest = require('./gen-nodejs/ThriftTest');
-var ThriftTestDriver = require('./thrift_test_driver').ThriftTestDriver;
-
-var connection = thrift.createConnection('localhost', 9090, 
-	                { protocol: TJSONProtocol, transport: TBufferedTransport} );
-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/test/nodejs/client_json_frame.js b/test/nodejs/client_json_frame.js
deleted file mode 100644
index f23ddd4..0000000
--- a/test/nodejs/client_json_frame.js
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * 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.
- */
-
-//Node client test for the following I/O stack:
-//    TJSONProtocol
-//    TBufferedTransport
-//    TSocket
-
-var assert = require('assert');
-var thrift = require('thrift');
-var TFramedTransport = require('thrift/transport').TFramedTransport;
-var TJSONProtocol = require('thrift/protocol').TJSONProtocol;
-var ThriftTest = require('./gen-nodejs/ThriftTest');
-var ThriftTestDriver = require('./thrift_test_driver').ThriftTestDriver;
-
-var connection = thrift.createConnection('localhost', 9090, 
-	                { protocol: TJSONProtocol, transport: TFramedTransport} );
-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/test/nodejs/multiplex_server.js b/test/nodejs/multiplex_server.js
deleted file mode 100644
index 6b2d7d3..0000000
--- a/test/nodejs/multiplex_server.js
+++ /dev/null
@@ -1,242 +0,0 @@
-/*
- * 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);
diff --git a/test/nodejs/package.json b/test/nodejs/package.json
deleted file mode 100755
index 85adef1..0000000
--- a/test/nodejs/package.json
+++ /dev/null
@@ -1,30 +0,0 @@
-{
-  "name": "thrift-nodejs-test",
-  "version": "1.0.0-dev",
-  "description": "node.js test server and client for the Apache Thrift",
-  "homepage": "http://thrift.apache.org/",
-  "repository":
-    { "type" : "git",
-      "url" : "https://git-wip-us.apache.org/repos/asf/thrift.git"
-    },
-  "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
deleted file mode 100644
index 78a21c6..0000000
--- a/test/nodejs/server.js
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * 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 TFramedTransport = require('thrift/transport').TFramedTransport;
-var ThriftTest = require('./gen-nodejs/ThriftTest');
-var ThriftTestHandler = require('./test_handler').ThriftTestHandler;
-
-thrift.createServer(ThriftTest, 
-                    ThriftTestHandler, 
-                    {'transport': TFramedTransport}).listen(9090);
-
diff --git a/test/nodejs/server_bin.js b/test/nodejs/server_bin.js
deleted file mode 100644
index ba84449..0000000
--- a/test/nodejs/server_bin.js
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * 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.
- */
-
-//Node server test for the following I/O stack:
-//    TJSONProtocol
-//    TBufferedTransport
-//    TSocket
-
-var thrift = require('thrift');
-var TBufferedTransport = require('thrift/transport').TBufferedTransport;
-var TBinaryProtocol = require('thrift/protocol').TBinaryProtocol;
-var ThriftTestSvc = require('./gen-nodejs/ThriftTest');
-var ThriftTestHandler = require('./test_handler').ThriftTestHandler;
-
-var ThriftTestSvcOpt = {
-  transport: TBufferedTransport,
-  protocol: TBinaryProtocol
-};
-
-thrift.createServer(ThriftTestSvc, 
-                    ThriftTestHandler, 
-                    ThriftTestSvcOpt).listen(9090);
diff --git a/test/nodejs/server_json.js b/test/nodejs/server_json.js
deleted file mode 100644
index 406c982..0000000
--- a/test/nodejs/server_json.js
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * 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.
- */
-
-//Node server test for the following I/O stack:
-//    TJSONProtocol
-//    TBufferedTransport
-//    TSocket
-
-var thrift = require('thrift');
-var TBufferedTransport = require('thrift/transport').TBufferedTransport;
-var TJSONProtocol = require('thrift/protocol').TJSONProtocol;
-var ThriftTestSvc = require('./gen-nodejs/ThriftTest');
-var ThriftTestHandler = require('./test_handler').ThriftTestHandler;
-
-var ThriftTestSvcOpt = {
-  transport: TBufferedTransport,
-  protocol: TJSONProtocol
-};
-
-thrift.createServer(ThriftTestSvc, 
-                    ThriftTestHandler, 
-                    ThriftTestSvcOpt).listen(9090);
diff --git a/test/nodejs/server_json_frame.js b/test/nodejs/server_json_frame.js
deleted file mode 100644
index 828063a..0000000
--- a/test/nodejs/server_json_frame.js
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * 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.
- */
-
-//Node server test for the following I/O stack:
-//    TJSONProtocol
-//    TBufferedTransport
-//    TSocket
-
-var thrift = require('thrift');
-var TFramedTransport = require('thrift/transport').TFramedTransport;
-var TJSONProtocol = require('thrift/protocol').TJSONProtocol;
-var ThriftTestSvc = require('./gen-nodejs/ThriftTest');
-var ThriftTestHandler = require('./test_handler').ThriftTestHandler;
-
-var ThriftTestSvcOpt = {
-  transport: TFramedTransport,
-  protocol: TJSONProtocol
-};
-
-thrift.createServer(ThriftTestSvc, 
-                    ThriftTestHandler, 
-                    ThriftTestSvcOpt).listen(9090);
diff --git a/test/test.sh b/test/test.sh
index 520a632..5170e13 100755
--- a/test/test.sh
+++ b/test/test.sh
@@ -101,6 +101,9 @@
 java_sockets="ip ip-ssl"
 # TODO fastframed java transport is another implementation of framed transport
 
+nodejs_protocols="binary json"
+nodejs_transports="buffered framed"
+nodejs_sockets="ip"
 
 ant -f ../lib/java/build.xml compile-test 1>/dev/null
 
@@ -170,6 +173,34 @@
   done
 done
 
+
+NODE_TEST_DIR=${BASEDIR}/../bin/nodejs/tests
+export NODE_PATH=${NODE_TEST_DIR}:${NODE_TEST_DIR}/../lib:${NODE_PATH}
+######### nodejs client - cpp server ##############
+##
+for proto in $(intersection "${nodejs_protocols}" "${cpp_protocols}"); do
+  for trans in $(intersection "${nodejs_transports}" "${cpp_transports}"); do
+    for sock in $(intersection "${nodejs_sockets}" "${cpp_sockets}"); do
+      do_test "nodejs-cpp" "${proto}" "${trans}-ip" \
+              "nodejs ${NODE_TEST_DIR}/client.js -p ${proto} -t ${trans}" \
+              "cpp/TestServer --protocol=${proto} --transport=${trans} ${extraparam}" \
+              "10" "10"
+    done
+  done
+done
+
+######### cpp client - nodejs server ##############
+for proto in $(intersection "${nodejs_protocols}" "${cpp_protocols}"); do
+  for trans in $(intersection "${nodejs_transports}" "${cpp_transports}"); do
+    for sock in $(intersection "${nodejs_sockets}" "${cpp_sockets}"); do
+      do_test "cpp-nodejs" "${proto}" "${trans}-ip" \
+              "cpp/TestClient --protocol=${proto} --transport=${trans}" \
+              "nodejs ${NODE_TEST_DIR}/server.js -p ${proto} -t ${trans}" \
+              "10" "10"
+    done
+  done
+done
+
 # delete Unix Domain Socket used by cpp tests
 rm -f /tmp/ThriftTest.thrift
 
@@ -221,18 +252,6 @@
         "make -C php/ client" \
         "cpp/TestServer" \
         "10" "10"
-do_test "nodejs-nodejs" "binary" "framed-ip" \
-        "make -C nodejs/ client" \
-        "make -C nodejs/ server" \
-        "1" "5"
-do_test "nodejs-cpp" "binary" "framed-ip" \
-        "make -C nodejs/ client" \
-        "cpp/TestServer --transport=framed" \
-        "1" "10"
-do_test "cpp-nodejs" "binary" "framed-ip" \
-        "cpp/TestClient --transport=framed" \
-        "make -C nodejs/ server" \
-        "1" "5"
 do_test "rb-rb" "binary" "buffered-ip" \
         "ruby rb/integration/simple_client.rb" \
         "ruby rb/integration/simple_server.rb" \
