diff --git a/lib/nodejs/test/server.js b/lib/nodejs/test/server.js
old mode 100755
new mode 100644
index b6d28c7..2d53e11
--- a/lib/nodejs/test/server.js
+++ b/lib/nodejs/test/server.js
@@ -1,4 +1,4 @@
-#!/usr/bin/env nodejs
+#!/usr/bin/env node
 
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
@@ -21,53 +21,78 @@
 
 var fs = require('fs');
 var path = require('path');
-var thrift = require('thrift');
-var ThriftTest = require('./gen-nodejs/ThriftTest');
-var ThriftTestHandler = require('./test_handler').ThriftTestHandler;
-var ThriftTestHandlerPromise = require('./test_handler_promise').ThriftTestHandler;
-
+var thrift = require('../lib/thrift');
 var program = require('commander');
+var helpers = require('./helpers');
+
+var ThriftTest = require('./gen-nodejs/ThriftTest');
+var SecondService = require('./gen-nodejs/SecondService');
+var ThriftTestHandler = require('./test_handler').AsyncThriftTestHandler;
+var ThriftTestHandlerPromise = require('./test_handler').SyncThriftTestHandler;
+var ttypes = require('./gen-nodejs/ThriftTest_types');
 
 program
-  .option('-p, --protocol <protocol>', 'Set thift protocol (binary|json) [protocol]')
-  .option('-t, --transport <transport>', 'Set thift transport (buffered|framed) [transport]')
-  .option('--port <port>', 'Set thift server port')
+  .option('-p, --protocol <protocol>', 'Set thift protocol (binary|json|compact)', 'binary')
+  .option('-t, --transport <transport>', 'Set thift transport (buffered|framed)', 'buffered')
   .option('--ssl', 'use ssl transport')
+  .option('--port <port>', 'Set thift server port', 9090)
   .option('--promise', 'test with promise style functions')
+  .option('-t, --type <type>', 'Select server type (tcp|multiplex|http)', 'tcp')
   .parse(process.argv);
 
-var transport =  thrift.TBufferedTransport;
-if (program.transport === "framed") {
-  transport = thrift.TFramedTransport;
-}
+var port = program.port;
+var type = program.type;
+var ssl = program.ssl;
+var promise = program.promise;
 
-var protocol = thrift.TBinaryProtocol;
-if (program.protocol === "json") {
-  protocol = thrift.TJSONProtocol;
-} else if (program.protocol === "compact") {
-  protocol = thrift.TCompactProtocol;
-}
-
-var port = 9090;
-if (String(program.port) === "undefined"){
-} else {
-  port = program.port;
-}
-
-var handler = ThriftTestHandler;
-if (program.promise) {
-  handler = ThriftTestHandlerPromise;
-}
+var handler = program.promise ? ThriftTestHandler : ThriftTestHandlerPromise;
 
 var options = {
-  protocol: protocol,
-  transport: transport
+  transport: helpers.transports[program.transport],
+  protocol: helpers.protocols[program.protocol]
 };
-if (program.ssl) {
+
+if (type === 'http' || type ==='websocket') {
+  options.handler = handler;
+  options.processor = ThriftTest;
+
+  options = {
+    services: { "/test": options }
+  }
+}
+
+if (type === 'multiplex') {
+  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));
+
+}
+
+if (ssl) {
   options.tls = {
     key: fs.readFileSync(path.resolve(__dirname, 'server.key')),
     cert: fs.readFileSync(path.resolve(__dirname, 'server.crt'))
   };
 }
-thrift.createServer(ThriftTest, handler, options).listen(port);
 
+var server;
+if (type === 'tcp') {
+  server = thrift.createServer(ThriftTest, handler, options);
+} else if (type === 'multiplex') {
+  server = thrift.createMultiplexServer(processor, options);
+} else if (type === 'http' || type === 'websocket') {
+  server = thrift.createWebServer(options);
+}
+
+server.listen(port);
