diff --git a/lib/js/test/build.xml b/lib/js/test/build.xml
old mode 100644
new mode 100755
index 32316a1..c052e64
--- a/lib/js/test/build.xml
+++ b/lib/js/test/build.xml
@@ -86,6 +86,7 @@
     <tstamp />
     <mkdir dir="${build}"/>
     <mkdir dir="${build}/lib"/>
+    <mkdir dir="${build}/log"/>
   </target>
 
   <target name="compile" description="compile the test suite" depends="init, generate, resolve">
@@ -93,7 +94,7 @@
     <javac srcdir="${src}" destdir="${build}" classpathref="libs.classpath" />
   </target>
 
-  <target name="jstest" description="" depends="compile, lint">
+  <target name="jstest" description="create the test suite jar file" depends="compile">
     <jar jarfile="${jar.file}" basedir="${build}"/>
   </target>
 
@@ -104,6 +105,40 @@
     </java>
   </target>
 
+  <target name="xvfb">
+    <echo>check if Xvfb is available:</echo>
+    <exec executable="Xvfb" failifexecutionfails="no" resultproperty="xvfb.present" failonerror="false" output="${build}/log/xvfb.log">
+      <arg line="--version"/>
+    </exec>
+  </target>
+
+  <target name="phantomjs" depends="xvfb" if="xvfb.present">
+    <echo>check if phantomjs is available:</echo>
+    <exec executable="phantomjs" failifexecutionfails="no" resultproperty="phantomjs.present" failonerror="false" output="${build}/log/phantomjs.log">
+      <arg line="--version"/>
+    </exec>
+  </target>
+
+  <target name="unittest" description="do unit tests with headless browser phantomjs" depends="phantomjs, jstest" if="phantomjs.present">
+    <parallel>
+      <exec executable="Xvfb" spawn="true" failonerror="false">
+        <arg line=":99" />
+      </exec>
+      <java classname="test.Httpd" fork="true" timeout="5000"
+        classpathref="test.classpath" failonerror="false" output="${build}/log/unittest.log">
+        <arg value="../" />
+      </java>
+      <sequential>
+        <sleep seconds="2"/>
+        <echo>Running Unit Tests with headless browser!</echo>
+        <exec executable="phantomjs" failonerror="true">
+          <env key="DISPLAY" value=":99"/>
+          <arg line="phantomjs-qunit.js http://localhost:8088/test/test.html" />
+        </exec>
+      </sequential>
+    </parallel>
+  </target>
+
   <target name="generate">
     <exec executable="${thrift.compiler}" failonerror="true">
       <arg line="--gen java ${thrift.dir}/test/ThriftTest.thrift" />
@@ -113,8 +148,7 @@
     </exec>
   </target>
 
-  <!-- @TODO QUnit tests as part of the testsuite-->
-  <target name="test" description="run test suite" depends="init, generate, resolve, lint"/>
+  <target name="test" description="run test suite" depends="init, generate, resolve, lint, jstest, unittest"/>
 
   <target name="lint" description="code quality checks" depends="generate, gjslint, jslint"/>
 
diff --git a/lib/js/test/phantomjs-qunit.js b/lib/js/test/phantomjs-qunit.js
new file mode 100755
index 0000000..d52b522
--- /dev/null
+++ b/lib/js/test/phantomjs-qunit.js
@@ -0,0 +1,83 @@
+/* This file is only used by the test suite.
+ *
+ * Origin:  https://github.com/ariya/phantomjs/blob/master/examples/run-qunit.js
+ * License: https://github.com/ariya/phantomjs/blob/master/LICENSE.BSD
+ *
+ * Inclusion into Apache products is allowed according to http://www.apache.org/legal/3party.html
+ */
+
+
+/**
+ * Wait until the test condition is true or a timeout occurs. Useful for waiting
+ * on a server response or for a ui change (fadeIn, etc.) to occur.
+ *
+ * @param testFx javascript condition that evaluates to a boolean,
+ * it can be passed in as a string (e.g.: "1 == 1" or "$('#bar').is(':visible')" or
+ * as a callback function.
+ * @param onReady what to do when testFx condition is fulfilled,
+ * it can be passed in as a string (e.g.: "1 == 1" or "$('#bar').is(':visible')" or
+ * as a callback function.
+ * @param timeOutMillis the max amount of time to wait. If not specified, 3 sec is used.
+ */
+function waitFor(testFx, onReady, timeOutMillis) {
+    var maxtimeOutMillis = timeOutMillis ? timeOutMillis : 3001, //< Default Max Timout is 3s
+        start = new Date().getTime(),
+        condition = false,
+        interval = setInterval(function() {
+            if ( (new Date().getTime() - start < maxtimeOutMillis) && !condition ) {
+                // If not time-out yet and condition not yet fulfilled
+                condition = (typeof(testFx) === "string" ? eval(testFx) : testFx()); //< defensive code
+            } else {
+                if(!condition) {
+                    // If condition still not fulfilled (timeout but condition is 'false')
+                    console.log("'waitFor()' timeout");
+                    phantom.exit(1);
+                } else {
+                    // Condition fulfilled (timeout and/or condition is 'true')
+                    console.log("'waitFor()' finished in " + (new Date().getTime() - start) + "ms.");
+                    typeof(onReady) === "string" ? eval(onReady) : onReady(); //< Do what it's supposed to do once the condition is fulfilled
+                    clearInterval(interval); //< Stop this interval
+                }
+            }
+        }, 100); //< repeat check every 250ms
+};
+
+
+if (phantom.args.length === 0 || phantom.args.length > 2) {
+    console.log('Usage: phantomjs phantomjs-qunit.js URL');
+    phantom.exit(1);
+}
+
+var page = new WebPage();
+
+// Route "console.log()" calls from within the Page context to the main Phantom context (i.e. current "this")
+page.onConsoleMessage = function(msg) {
+    console.log(msg);
+};
+
+page.open(phantom.args[0], function(status){
+    if (status !== "success") {
+        console.log("Unable to access network");
+        phantom.exit(1);
+    } else {
+        waitFor(function(){
+            return page.evaluate(function(){
+                var el = document.getElementById('qunit-testresult');
+                if (el && el.innerText.match('completed')) {
+                    return true;
+                }
+                return false;
+            });
+        }, function(){
+            var failedNum = page.evaluate(function(){
+                var el = document.getElementById('qunit-testresult');
+                console.log(el.innerText);
+                try {
+                    return el.getElementsByClassName('failed')[0].innerHTML;
+                } catch (e) { }
+                return 10000;
+            });
+            phantom.exit((parseInt(failedNum, 10) > 0) ? 1 : 0);
+        });
+    }
+});
diff --git a/lib/js/test/src/test/Httpd.java b/lib/js/test/src/test/Httpd.java
index e3aad7d..0ed051e 100644
--- a/lib/js/test/src/test/Httpd.java
+++ b/lib/js/test/src/test/Httpd.java
@@ -131,8 +131,12 @@
                 body.setContentType("text/html; charset=UTF-8");
                 response.setEntity(body);
             } else {
+                if(target.indexOf("?") != -1) {
+                 target = target.substring(1, target.indexOf("?"));
+                }
 
-                final File file = new File(this.docRoot, URLDecoder.decode(target));
+                final File file = new File(this.docRoot, URLDecoder.decode(target, "UTF-8"));
+
                 if (!file.exists()) {
 
                     response.setStatusCode(HttpStatus.SC_NOT_FOUND);
