diff --git a/lib/ts/test/phantom-client.ts b/lib/ts/test/phantom-client.ts
new file mode 100644
index 0000000..5518937
--- /dev/null
+++ b/lib/ts/test/phantom-client.ts
@@ -0,0 +1,352 @@
+/*
+ * 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.
+ */
+ /* jshint -W100 */
+
+import { ThriftTest } from "./gen-js/ThriftTest_types";
+import "./gen-js/ThriftTest";
+var Int64 = require("node-int64");
+var phantom = require("phantom");
+
+const int64_2_pow_60: typeof Int64 = new Int64('1000000000000000');
+const int64_minus_2_pow_60: typeof Int64 = new Int64('f000000000000000');
+
+ (function() {
+    'use strict';
+  
+    // Rudimentary test helper functions
+    // TODO: Return error code based on kind of errors rather than throw
+    var ok = function(t, msg) {
+      if (!t) {
+        console.log('*** FAILED ***');
+        throw new Error(msg);
+      }
+    };
+    var equal = function(a, b) {
+      if (a !== b) {
+        console.log('*** FAILED ***');
+        throw new Error();
+      }
+    };
+    var test = function(name, f) {
+      console.log('TEST : ' + name);
+      f();
+      console.log('OK\n');
+    };
+  
+    var parseArgs = function(args) {
+      var skips = [
+        '--transport=http',
+        '--protocol=json'
+      ];
+      var opts = {
+        port: '9090'
+        // protocol: 'json',
+      };
+      var keys = {};
+      for (var key in opts) {
+        keys['--' + key + '='] = key;
+      }
+      for (var i in args) {
+        var arg = args[i];
+        if (skips.indexOf(arg) != -1) {
+          continue;
+        }
+        var hit = false;
+        for (var k in keys) {
+          if (arg.slice(0, k.length) === k) {
+            opts[keys[k]] = arg.slice(k.length);
+            hit = true;
+            break;
+          }
+        }
+        if (!hit) {
+          throw new Error('Unknown argument: ' + arg);
+        }
+      }
+      var portAsInt: number = parseInt(opts.port, 10);
+      if (!opts.port || portAsInt < 1 || portAsInt > 65535) {
+        throw new Error('Invalid port number');
+      }
+      return opts;
+    };
+  
+    var execute = function() {
+      console.log('### Apache Thrift Javascript standalone test client');
+      console.log('------------------------------------------------------------');
+  
+      phantom.page.injectJs('thrift.js');
+      phantom.page.injectJs('gen-js/ThriftTest_types.js');
+      phantom.page.injectJs('gen-js/ThriftTest.js');
+  
+      var system = require('system');
+      var opts = parseArgs(system.args.slice(1));
+      var port = opts.port;
+      var transport = new Thrift.Transport('http://localhost:' + port + '/service');
+      var protocol = new Thrift.Protocol(transport);
+      var client = new ThriftTest.ThriftTestClient(protocol);
+  
+  
+      // TODO: Remove duplicate code with test.js.
+      // 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ú, 粵語";
+  
+      function checkRecursively(map1, map2) {
+        if (typeof map1 !== 'function' && typeof map2 !== 'function') {
+          if (!map1 || typeof map1 !== 'object') {
+            equal(map1, map2);
+          } else {
+            for (var key in map1) {
+              checkRecursively(map1[key], map2[key]);
+            }
+          }
+        }
+      }
+  
+      test('Void', function() {
+        equal(client.testVoid(), undefined);
+      });
+      test('Binary (String)', function() {
+        var binary: string = '';
+        for (var v = 255; v >= 0; --v) {
+          binary += String.fromCharCode(v);
+        }
+        equal(client.testBinary(binary), binary);
+      });
+      test('Binary (Uint8Array)', function() {
+        var binary: string = '';
+        for (var v = 255; v >= 0; --v) {
+          binary += String.fromCharCode(v);
+        }
+        var arr = new Uint8Array(binary.length);
+        for (var i = 0; i < binary.length; ++i) {
+          arr[i] = binary[i].charCodeAt(0);
+        }
+        const hexEncodedString = Array.from(arr, function(byte) {
+            return String.fromCharCode(byte);
+        }).join('')
+        equal(client.testBinary(hexEncodedString), binary);
+      });
+      test('String', function() {
+        equal(client.testString(''), '');
+        equal(client.testString(stringTest), stringTest);
+  
+        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: !@#$%&()(&%$#{}{}<><><';
+                equal(client.testString(specialCharacters), specialCharacters);
+      });
+      test('Double', function() {
+        equal(client.testDouble(0), 0);
+        equal(client.testDouble(-1), -1);
+        equal(client.testDouble(3.14), 3.14);
+        equal(client.testDouble(Math.pow(2, 60)), Math.pow(2, 60));
+      });
+      test('Bool', function() {
+        equal(client.testBool(true), true);
+        equal(client.testBool(false), false);
+      });
+      test('I8', function() {
+        equal(client.testByte(0), 0);
+        equal(client.testByte(0x01), 0x01);
+      });
+      test('I32', function() {
+        equal(client.testI32(0), 0);
+        equal(client.testI32(Math.pow(2, 30)), Math.pow(2, 30));
+        equal(client.testI32(-Math.pow(2, 30)), -Math.pow(2, 30));
+      });
+      test('I64', function() {
+        equal(client.testI64(new Int64(0)), 0);
+        equal(client.testI64(int64_2_pow_60), Math.pow(2, 52));
+        equal(client.testI64(int64_minus_2_pow_60), -Math.pow(2, 52));
+      });
+  
+      test('Struct', function() {
+        var structTestInput: ThriftTest.Xtruct = new ThriftTest.Xtruct();
+        structTestInput.string_thing = 'worked';
+        structTestInput.byte_thing = 0x01;
+        structTestInput.i32_thing = Math.pow(2, 30);
+        structTestInput.i64_thing = int64_2_pow_60;
+  
+        var structTestOutput: ThriftTest.Xtruct = client.testStruct(structTestInput);
+  
+        equal(structTestOutput.string_thing, structTestInput.string_thing);
+        equal(structTestOutput.byte_thing, structTestInput.byte_thing);
+        equal(structTestOutput.i32_thing, structTestInput.i32_thing);
+        equal(structTestOutput.i64_thing, structTestInput.i64_thing);
+  
+        equal(JSON.stringify(structTestOutput), JSON.stringify(structTestInput));
+      });
+  
+      test('Nest', function() {
+        var xtrTestInput: ThriftTest.Xtruct = new ThriftTest.Xtruct();
+        xtrTestInput.string_thing = 'worked';
+        xtrTestInput.byte_thing = 0x01;
+        xtrTestInput.i32_thing = Math.pow(2, 30);
+        xtrTestInput.i64_thing = int64_2_pow_60;
+  
+        var nestTestInput: ThriftTest.Xtruct2 = new ThriftTest.Xtruct2();
+        nestTestInput.byte_thing = 0x02;
+        nestTestInput.struct_thing = xtrTestInput;
+        nestTestInput.i32_thing = Math.pow(2, 15);
+  
+        var nestTestOutput = client.testNest(nestTestInput);
+  
+        equal(nestTestOutput.byte_thing, nestTestInput.byte_thing);
+        equal(nestTestOutput.struct_thing.string_thing, nestTestInput.struct_thing.string_thing);
+        equal(nestTestOutput.struct_thing.byte_thing, nestTestInput.struct_thing.byte_thing);
+        equal(nestTestOutput.struct_thing.i32_thing, nestTestInput.struct_thing.i32_thing);
+        equal(nestTestOutput.struct_thing.i64_thing, nestTestInput.struct_thing.i64_thing);
+        equal(nestTestOutput.i32_thing, nestTestInput.i32_thing);
+  
+        equal(JSON.stringify(nestTestOutput), JSON.stringify(nestTestInput));
+      });
+  
+      test('Map', function() {
+        var mapTestInput: {[k: number]: number;} = {7: 77, 8: 88, 9: 99};
+  
+        var mapTestOutput: {[k: number]: number;} = client.testMap(mapTestInput);
+  
+        for (var key in mapTestOutput) {
+          equal(mapTestOutput[key], mapTestInput[key]);
+        }
+      });
+  
+      test('StringMap', function() {
+        var mapTestInput: {[k: string]: string;} = {
+          'a': '123', 'a b': 'with spaces ', 'same': 'same', '0': 'numeric key',
+          'longValue': stringTest, stringTest: 'long key'
+        };
+  
+        var mapTestOutput: {[k: string]: string;} = client.testStringMap(mapTestInput);
+  
+        for (var key in mapTestOutput) {
+          equal(mapTestOutput[key], mapTestInput[key]);
+        }
+      });
+  
+      test('Set', function() {
+        var setTestInput: number[] = [1, 2, 3];
+        ok(client.testSet(setTestInput), setTestInput);
+      });
+  
+      test('List', function() {
+        var listTestInput: number[] = [1, 2, 3];
+        ok(client.testList(listTestInput), listTestInput);
+      });
+  
+      test('Enum', function() {
+        equal(client.testEnum(ThriftTest.Numberz.ONE), ThriftTest.Numberz.ONE);
+      });
+  
+      test('TypeDef', function() {
+        equal(client.testTypedef(new Int64(69)), 69);
+      });
+  
+      test('MapMap', function() {
+        var mapMapTestExpectedResult: {[K: number]: {[k: number]: number}} = {
+          '4': {'1': 1, '2': 2, '3': 3, '4': 4},
+          '-4': {'-4': -4, '-3': -3, '-2': -2, '-1': -1}
+        };
+  
+        var mapMapTestOutput = client.testMapMap(1);
+  
+  
+        for (var key in mapMapTestOutput) {
+          for (var key2 in mapMapTestOutput[key]) {
+            equal(mapMapTestOutput[key][key2], mapMapTestExpectedResult[key][key2]);
+          }
+        }
+  
+        checkRecursively(mapMapTestOutput, mapMapTestExpectedResult);
+      });
+  
+      test('Xception', function() {
+        try {
+          client.testException('Xception');
+          ok(false, "expected an exception but there was no exception");
+        } catch (e) {
+          equal(e.errorCode, 1001);
+          equal(e.message, 'Xception');
+        }
+      });
+  
+      test('no Exception', function() {
+        try {
+          client.testException('no Exception');
+        } catch (e) {
+          ok(false, "expected no exception but here was an exception");
+        }
+      });
+  
+      test('TException', function() {
+        try {
+          client.testException('TException');
+          ok(false, "expected an exception but there was no exception");
+        } catch (e) {
+          ok(ok, "succesfully got exception");
+        }
+      });
+  
+      const crazy: ThriftTest.Insanity = {
+        'userMap': { '5': new Int64(5), '8': new Int64(8) },
+        'xtructs': [{
+            'string_thing': 'Goodbye4',
+            'byte_thing': 4,
+            'i32_thing': 4,
+            'i64_thing': new Int64(4)
+        },
+        {
+            'string_thing': 'Hello2',
+            'byte_thing': 2,
+            'i32_thing': 2,
+            'i64_thing': new Int64(2)
+        }]
+    };
+      test('Insanity', function() {
+        const insanity: {[k: number]: (ThriftTest.Insanity | {[k:number]: ThriftTest.Insanity})} = {
+            '1': {
+                '2': crazy,
+                '3': crazy
+            },
+            '2': { '6': new ThriftTest.Insanity() }
+        };
+        var res = client.testInsanity(new ThriftTest.Insanity(crazy));
+        ok(res, JSON.stringify(res));
+        ok(insanity, JSON.stringify(insanity));
+  
+        checkRecursively(res, insanity);
+      });
+  
+      console.log('------------------------------------------------------------');
+      console.log('### All tests succeeded.');
+      return 0;
+    };
+  
+    try {
+      var ret = execute();
+      phantom.exit(ret);
+    } catch (err) {
+      // Catch all and exit to avoid hang.
+      console.error(err);
+      phantom.exit(1);
+    }
+  })();
+  
\ No newline at end of file
