diff --git a/lib/nodejs/examples/README.md b/lib/nodejs/examples/README.md
index a87581f..0773e60 100644
--- a/lib/nodejs/examples/README.md
+++ b/lib/nodejs/examples/README.md
@@ -25,5 +25,8 @@
 #Now run the client:
 NODE_PATH=../lib:../lib/thrift node client.js
 
+#For an example using JavaScript in the browser to connect to 
+#a node.js server look at hello.html, hello.js and hello.thrift
+
 
     
diff --git a/lib/nodejs/examples/hello.html b/lib/nodejs/examples/hello.html
new file mode 100644
index 0000000..0897ea9
--- /dev/null
+++ b/lib/nodejs/examples/hello.html
@@ -0,0 +1,65 @@
+<!--
+ * 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.
+-->
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <title>Apache Thrift JavaScript Browser Client Demo</title>
+    <script src="thrift.js" type="text/javascript"></script>
+    <script src="gen-js/HelloSvc.js" type="text/javascript"></script>
+    <script src="gen-js/TimesTwo.js" type="text/javascript"></script>
+</head>
+<body>
+    <h1>Apache Thrift JavaScript Browser Client Demo</h1>
+    <p>This html file demonstrates Apache Thrift JavaScrpt RPC between a browser client to a node.js server. Clicking the button below will call the hello_func() hosted by the Apache Thrift server at localhost:8585. The file hello.js contains the JavaScript node.js server required. Here are the steps to get the example running:</p>
+    <ol>
+        <li>Install Node.js <pre><a href="http://nodejs.org">nodejs.org</a></pre></li>
+        <li>Install Apache Thrift for node (note that the node package manager will create the node_modules folder in the current directory so make sure to run npm from the same directory as hello.js so that the server can find the Thrift libraries. This example requires Apache Thrift 0.9.2+) <pre>$ npm install thrift</pre></li>
+        <li>Compile the hello.idl for JavaScript and Node.js (you'll need to have the Apache Thrift compiler installed for this step. This also needs to be executed in the same directory as hello.js because hello.js and hello.html look for the gen-nodejs and gen-js directories here.)<pre>$ thrift -gen js -gen js:node hello.thrift</pre></li>
+        <li>Run the node server in the directory with the hello.html file<pre>$ node hello.js</pre></li>
+        <li>Copy the Apache Thrift JavaScript library, thrift.js, into the directory with this html file.<pre>$ cp ...../thrift.js .</pre>
+        <li>Reload this page in a browser through the node server using using the URL: <pre>http://localhost:8585/hello.html</pre>then click a button below to make an RPC call</li>
+    </ol>
+    <button id="btn">Get Message from Node Server</button>
+    <button id="btnDbl">Double 25</button>
+    <script type="text/javascript">
+        document.getElementById("btn").addEventListener("click", getMessage, false);
+
+        function getMessage() {
+            var transport = new Thrift.Transport("http://localhost:8585/hello");
+            var protocol  = new Thrift.Protocol(transport);
+            var client = new HelloSvcClient(protocol);
+            var msg = client.hello_func();
+            document.getElementById("output").innerHTML = msg;
+        }
+
+        document.getElementById("btnDbl").addEventListener("click", dblMessage, false);
+
+        function dblMessage() {
+            var transport = new Thrift.Transport("http://localhost:8585/dbl");
+            var protocol  = new Thrift.Protocol(transport);
+            var client = new TimesTwoClient(protocol);
+            var val = client.dbl(25);
+            document.getElementById("output2").innerHTML = val;
+        }
+    </script>
+    <h2>Server Response: <div id="output"></div></h2>
+    <h2>Server Dbl: <div id="output2"></div></h2>
+</body> 
+</html>
+
diff --git a/lib/nodejs/examples/hello.js b/lib/nodejs/examples/hello.js
new file mode 100644
index 0000000..90634c9
--- /dev/null
+++ b/lib/nodejs/examples/hello.js
@@ -0,0 +1,65 @@
+/*
+ * 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 TBufferedTransport = require('thrift/transport').TBufferedTransport;
+var TJSONProtocol = require('thrift/protocol').TJSONProtocol;
+var HelloSvc = require('./gen-nodejs/HelloSvc.js');
+var TimesTwoSvc = require('./gen-nodejs/TimesTwo.js');
+
+var helloHandler = {
+	hello_func: function(result) {
+		this.call_counter = this.call_counter || 0;
+		console.log("Client call: " + (++this.call_counter));
+		result(null, "Hello Apache Thrift for JavaScript " + this.call_counter);
+	}
+}
+
+var timesTwoHandler = {
+	dbl: function(val, result) {
+		console.log("Client call: " + val);
+		result(null, val * 2);
+	}
+}
+
+var helloService = {
+	transport: TBufferedTransport,
+	protocol: TJSONProtocol,
+	cls: HelloSvc,
+	handler: helloHandler
+};
+
+var dblService = {
+	transport: TBufferedTransport,
+	protocol: TJSONProtocol,
+	cls: TimesTwoSvc,
+	handler: timesTwoHandler
+};
+
+var StaticHttpThriftServerOptions = {
+	staticFilePath: ".",
+	services: {
+		"/hello": helloService,
+		"/dbl": dblService,
+	}
+}
+
+var server = thrift.createStaticHttpThriftServer(StaticHttpThriftServerOptions);
+var port = 8585;
+server.listen(port);
+console.log("Http/Thrift Server running on port: " + port);
diff --git a/lib/nodejs/examples/hello.thrift b/lib/nodejs/examples/hello.thrift
new file mode 100644
index 0000000..deaf5a5
--- /dev/null
+++ b/lib/nodejs/examples/hello.thrift
@@ -0,0 +1,27 @@
+/*
+ * 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.
+ */
+service HelloSvc {
+    string hello_func(),
+}
+
+service TimesTwo {
+    i64 dbl(1: i64 val),
+}
+
+
