diff --git a/lib/haxe/test/HaxeTests.hxproj b/lib/haxe/test/HaxeTests.hxproj
index 839917b..fbb9c8e 100644
--- a/lib/haxe/test/HaxeTests.hxproj
+++ b/lib/haxe/test/HaxeTests.hxproj
@@ -63,7 +63,7 @@
   <options>
     <option showHiddenPaths="False" />
     <option testMovie="Custom" />
-    <option testMovieCommand="bin/HaxeTests/Main.exe server multiplex" />
+    <option testMovieCommand="bin/HaxeTests/Main.exe server constants" />
   </options>
   <!-- Plugin storage -->
   <storage />
diff --git a/lib/haxe/test/src/ConstantsTest.hx b/lib/haxe/test/src/ConstantsTest.hx
deleted file mode 100644
index d0041e4..0000000
--- a/lib/haxe/test/src/ConstantsTest.hx
+++ /dev/null
@@ -1,74 +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.
- */
-
-package;
-
-import haxe.Int64;
-
-import org.apache.thrift.*;
-import org.apache.thrift.protocol.*;
-import org.apache.thrift.transport.*;
-import org.apache.thrift.server.*;
-import org.apache.thrift.meta_data.*;
-
-import constantsDemo.*;  // generated code
-
-
-class ConstantsTest extends TestBase {
-
-    public static function Run(server : Bool) : Void
-    {
-        TestBase.Expect( ConstantsDemoConstants.myInt == 3, "myInt = 3");
-        TestBase.Expect( ConstantsDemoConstants.hex_const == 0x0001F, "hex_const = 31");
-        TestBase.Expect( ConstantsDemoConstants.negative_hex_constant == -0x0001F, "negative_hex_constant = -31");
-        TestBase.Expect( ConstantsDemoConstants.GEN_ME == -3523553, "GEN_ME = -3523553");
-        TestBase.Expect( ConstantsDemoConstants.GEn_DUB == 325.532, "GEn_DUB = 325.532");
-        TestBase.Expect( ConstantsDemoConstants.GEn_DU == 85.2355, "GEn_DU = 85.2355");
-        TestBase.Expect( ConstantsDemoConstants.GEN_STRING == "asldkjasfd", "GEN_STRING = \"asldkjasfd\"");
-        TestBase.Expect( ConstantsDemoConstants.e10 == 1e+10, "e10 = 1e+10");
-        TestBase.Expect( ConstantsDemoConstants.e11 == -1e+10, "e11 = -1e+10");
-        TestBase.Expect( ConstantsDemoConstants.GEN_UUID == "00000000-4444-CCCC-ffff-0123456789ab", "GEN_UUID = \"00000000-4444-CCCC-ffff-0123456789ab\"");
-
-        TestBase.Expect( ConstantsDemoConstants.GEN_MAP.get(35532) == 233, "GEN_MAP.get(35532) == 233");
-        TestBase.Expect( ConstantsDemoConstants.GEN_MAP.get(43523) == 853, "GEN_MAP.get(43523) == 853");
-        
-        TestBase.Expect( ConstantsDemoConstants.GEN_LIST.length == 3, "GEN_LIST.size() == 3");
-        TestBase.Expect( ConstantsDemoConstants.GEN_LIST.join("/") == "235235/23598352/3253523", "GEN_LIST elements");
-
-        TestBase.Expect( ConstantsDemoConstants.GEN_MAPMAP.get(235).get(532) == 53255, "GEN_MAPMAP.get(235).get(532) == 53255");
-        TestBase.Expect( ConstantsDemoConstants.GEN_MAPMAP.get(235).get(235) == 235, "GEN_MAPMAP.get(235).get(235) == 235");
-
-        TestBase.Expect( ConstantsDemoConstants.GEN_MAP2.get("hello") == 233, "GEN_MAP2.get(\"hello\") == 233");
-        TestBase.Expect( ConstantsDemoConstants.GEN_MAP2.get("lkj98d") == 853, "GEN_MAP2.get(\"lkj98d\") == 853");
-        TestBase.Expect( ConstantsDemoConstants.GEN_MAP2.get('lkjsdf') == 98325, "GEN_MAP2.get('lkjsdf') == 98325");
-        
-        TestBase.Expect( ConstantsDemoConstants.GEN_THING.hello == 325, "GEN_THING.hello == 325");
-        TestBase.Expect( ConstantsDemoConstants.GEN_THING.goodbye == 325352, "GEN_THING.goodbye == 325352");
-
-        TestBase.Expect( ConstantsDemoConstants.GEN_WHAT.get(35).hello == 325, "GEN_WHAT.get(35).hello == 325");
-        TestBase.Expect( ConstantsDemoConstants.GEN_WHAT.get(35).goodbye == 325352, "GEN_WHAT.get(35).goodbye == 325352");
-
-        TestBase.Expect( ConstantsDemoConstants.GEN_SET.size == 2, "GEN_SET.size() == 2");
-        TestBase.Expect( ConstantsDemoConstants.GEN_SET.contains(235), "GEN_SET.contains(235)");  // added twice, but this is a set
-        TestBase.Expect( ConstantsDemoConstants.GEN_SET.contains(53235), "GEN_SET.contains(53235)");
-    }
-
-}
-
-
diff --git a/lib/haxe/test/src/Main.hx b/lib/haxe/test/src/Main.hx
index 5976bb0..5e69839 100644
--- a/lib/haxe/test/src/Main.hx
+++ b/lib/haxe/test/src/Main.hx
@@ -20,83 +20,92 @@
 package;
 
 import org.apache.thrift.*;
-import org.apache.thrift.protocol.*;
-import org.apache.thrift.transport.*;
-import org.apache.thrift.server.*;
 import org.apache.thrift.meta_data.*;
+import org.apache.thrift.protocol.*;
+import org.apache.thrift.server.*;
+import org.apache.thrift.transport.*;
+import tests.ConstantsTest;
+import tests.MultiplexTest;
+import tests.StreamTest;
+import thrift.test.*;
 
-import thrift.test.*;  // generated code
-
-
-enum WhatTests {
-    Normal;
-    Multiplex;
-    Constants;
+enum WhatTests
+{
+	Normal;
+	Multiplex;
+	Constants;
 }
 
 class Main
 {
-    static private var tests : WhatTests = Normal;
-    static private var server : Bool = false;
+	static private var what : WhatTests = Normal;
+	static private var server : Bool = false;
 
-    static private inline var CMDLINEHELP : String
-        = "\nHaxeTests  [client|server]  [multiplex]\n"
-        + "  client|server  ... determines run mode for some tests, default is client\n"
-        + "  multiplex ........ run multiplex test server or client\n";
+	static private inline var CMDLINEHELP : String
+		= "\nHaxeTests  [client|server]  [multiplex]\n"
+		  + "  client|server  ... determines run mode for some tests, default is client\n"
+		  + "  multiplex ........ run multiplex test server or client\n"
+		  + "  constants ........ run constants and conformity tests\n"
+		  ;
 
-    static private function ParseArgs() {
-        #if sys
+	static private function ParseArgs()
+	{
+		#if sys
 
-        var args = Sys.args();
-        if ( args != null) {
-            for ( arg in args) {
-                switch(arg.toLowerCase()) {
-                    case "client":
-                        server = false;
-                    case "server" :
-                        server = true;
-                    case "multiplex" :
-                        tests = Multiplex;
-                    case "constants" :
-                        tests = Constants;
-                    default:
-                throw 'Invalid argument "$arg"\n'+CMDLINEHELP;
-                }
-            }
-        }
+		var args = Sys.args();
+		if ( args != null)
+		{
+			for ( arg in args)
+			{
+				switch (arg.toLowerCase())
+				{
+					case "client":
+						server = false;
+					case "server" :
+						server = true;
+					case "multiplex" :
+						what = Multiplex;
+					case "constants" :
+						what = Constants;
+					default:
+						throw 'Invalid argument "$arg"\n'+CMDLINEHELP;
+				}
+			}
+		}
 
-        #end
-    }
+		#end
+	}
 
-    static public function main()
-    {
-        try
-        {
-            ParseArgs();
+	static public function main()
+	{
+		try
+		{
+			ParseArgs();
 
-            switch( tests) {
-                case Normal:
-                    #if sys
-                    StreamTest.Run(server);
-                    #end
-                case Multiplex:
-                    #if ! (flash || html5 || js)
-                    MultiplexTest.Run(server);
-                    #end
-                case Constants:
-                    ConstantsTest.Run(server);
-                default:
-                    throw "Unhandled test mode $tests";
-            }
+			switch ( what)
+			{
+				case Normal:
+					#if sys
+					tests.StreamTest.Run(server);
+					#end
+				case Multiplex:
+					#if ! (flash || html5 || js)
+					tests.MultiplexTest.Run(server);
+					#end
+				case Constants:
+					tests.ConstantsTest.Run(server);
+				default:
+					throw 'Unhandled test mode $what';
+			}
 
-            trace("All tests completed.");
-        }
-        catch( e: Dynamic)
-        {
-            trace('$e');
-            #if sys
-            Sys.exit(1);  // indicate error
-            #end
-        }
-    }
+			trace("All tests completed.");
+		}
+		catch ( e: Dynamic)
+		{
+			trace('$e');
+			#if sys
+			Sys.exit(1);  // indicate error
+			#end
+		}
+	}
 }
\ No newline at end of file
diff --git a/lib/haxe/test/src/tests/ConstantsTest.hx b/lib/haxe/test/src/tests/ConstantsTest.hx
new file mode 100644
index 0000000..11b266c
--- /dev/null
+++ b/lib/haxe/test/src/tests/ConstantsTest.hx
@@ -0,0 +1,150 @@
+/*
+ * 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.
+ */
+
+package tests;
+
+import haxe.Int64;
+import haxe.io.BytesBuffer;
+import tests.TestBase;
+
+import org.apache.thrift.*;
+import org.apache.thrift.protocol.*;
+import org.apache.thrift.transport.*;
+import org.apache.thrift.server.*;
+import org.apache.thrift.meta_data.*;
+
+import constantsDemo.*;  // generated code
+
+
+class ConstantsTest extends tests.TestBase {
+
+    public static function Run(server : Bool) : Void
+    {
+		TestConstants();		
+    	TestProtocolConformity();
+    }
+
+
+	private static function TestConstants() : Void
+	{
+        tests.TestBase.Expect( ConstantsDemoConstants.myInt == 3, "myInt = 3");
+        tests.TestBase.Expect( ConstantsDemoConstants.hex_const == 0x0001F, "hex_const = 31");
+        tests.TestBase.Expect( ConstantsDemoConstants.negative_hex_constant == -0x0001F, "negative_hex_constant = -31");
+        tests.TestBase.Expect( ConstantsDemoConstants.GEN_ME == -3523553, "GEN_ME = -3523553");
+        tests.TestBase.Expect( ConstantsDemoConstants.GEn_DUB == 325.532, "GEn_DUB = 325.532");
+        tests.TestBase.Expect( ConstantsDemoConstants.GEn_DU == 85.2355, "GEn_DU = 85.2355");
+        tests.TestBase.Expect( ConstantsDemoConstants.GEN_STRING == "asldkjasfd", "GEN_STRING = \"asldkjasfd\"");
+        tests.TestBase.Expect( ConstantsDemoConstants.e10 == 1e+10, "e10 = 1e+10");
+        tests.TestBase.Expect( ConstantsDemoConstants.e11 == -1e+10, "e11 = -1e+10");
+        tests.TestBase.Expect( ConstantsDemoConstants.GEN_UUID == "00000000-4444-CCCC-ffff-0123456789ab", "GEN_UUID = \"00000000-4444-CCCC-ffff-0123456789ab\"");
+
+        tests.TestBase.Expect( ConstantsDemoConstants.GEN_MAP.get(35532) == 233, "GEN_MAP.get(35532) == 233");
+        tests.TestBase.Expect( ConstantsDemoConstants.GEN_MAP.get(43523) == 853, "GEN_MAP.get(43523) == 853");
+        
+        tests.TestBase.Expect( ConstantsDemoConstants.GEN_LIST.length == 3, "GEN_LIST.size() == 3");
+        tests.TestBase.Expect( ConstantsDemoConstants.GEN_LIST.join("/") == "235235/23598352/3253523", "GEN_LIST elements");
+
+        tests.TestBase.Expect( ConstantsDemoConstants.GEN_MAPMAP.get(235).get(532) == 53255, "GEN_MAPMAP.get(235).get(532) == 53255");
+        tests.TestBase.Expect( ConstantsDemoConstants.GEN_MAPMAP.get(235).get(235) == 235, "GEN_MAPMAP.get(235).get(235) == 235");
+
+        tests.TestBase.Expect( ConstantsDemoConstants.GEN_MAP2.get("hello") == 233, "GEN_MAP2.get(\"hello\") == 233");
+        tests.TestBase.Expect( ConstantsDemoConstants.GEN_MAP2.get("lkj98d") == 853, "GEN_MAP2.get(\"lkj98d\") == 853");
+        tests.TestBase.Expect( ConstantsDemoConstants.GEN_MAP2.get('lkjsdf') == 98325, "GEN_MAP2.get('lkjsdf') == 98325");
+        
+        tests.TestBase.Expect( ConstantsDemoConstants.GEN_THING.hello == 325, "GEN_THING.hello == 325");
+        tests.TestBase.Expect( ConstantsDemoConstants.GEN_THING.goodbye == 325352, "GEN_THING.goodbye == 325352");
+
+        tests.TestBase.Expect( ConstantsDemoConstants.GEN_WHAT.get(35).hello == 325, "GEN_WHAT.get(35).hello == 325");
+        tests.TestBase.Expect( ConstantsDemoConstants.GEN_WHAT.get(35).goodbye == 325352, "GEN_WHAT.get(35).goodbye == 325352");
+
+        tests.TestBase.Expect( ConstantsDemoConstants.GEN_SET.size == 2, "GEN_SET.size() == 2");
+        tests.TestBase.Expect( ConstantsDemoConstants.GEN_SET.contains(235), "GEN_SET.contains(235)");  // added twice, but this is a set
+        tests.TestBase.Expect( ConstantsDemoConstants.GEN_SET.contains(53235), "GEN_SET.contains(53235)");
+    }
+
+	private static function TestProtocolConformity() : Void
+	{
+		for( factory in [new TBinaryProtocolFactory(), new TCompactProtocolFactory(), new TJSONProtocolFactory()])
+		{
+			DeserializeGuidData(factory);
+		}
+    }
+
+	private static function DeserializeGuidData(factory : TProtocolFactory) : Void
+	{
+		var data = new BytesBuffer();
+		var sCase = Type.getClassName(Type.getClass(factory)).split('.').pop();
+		switch(sCase)
+		{
+			case "TJSONProtocolFactory":
+				data.addString('"00112233-4455-6677-8899-aabbccddeeff"');
+
+			case "TCompactProtocolFactory":
+				data.addByte(0x00);
+				data.addByte(0x11);
+				data.addByte(0x22);
+				data.addByte(0x33);
+				data.addByte(0x44);
+				data.addByte(0x55);
+				data.addByte(0x66);
+				data.addByte(0x77);
+				data.addByte(0x88);
+				data.addByte(0x99);
+				data.addByte(0xaa);
+				data.addByte(0xbb);
+				data.addByte(0xcc);
+				data.addByte(0xdd);
+				data.addByte(0xee);
+				data.addByte(0xff);
+
+			case "TBinaryProtocolFactory":
+				data.addByte(0x00);
+				data.addByte(0x11);
+				data.addByte(0x22);
+				data.addByte(0x33);
+				data.addByte(0x44);
+				data.addByte(0x55);
+				data.addByte(0x66);
+				data.addByte(0x77);
+				data.addByte(0x88);
+				data.addByte(0x99);
+				data.addByte(0xaa);
+				data.addByte(0xbb);
+				data.addByte(0xcc);
+				data.addByte(0xdd);
+				data.addByte(0xee);
+				data.addByte(0xff);
+
+			default:
+				tests.TestBase.Expect( false, 'Unhandled ${sCase}');
+		}
+
+		var stream = new TMemoryStream(data.getBytes());
+		stream.Position = 0;
+		
+		var config = new TConfiguration();
+		var transport = new TStreamTransport(stream, stream, config);
+		var protocol = factory.getProtocol(transport);
+		
+		var sUuid = protocol.readUuid();	
+		tests.TestBase.Expect( sUuid == "00112233-4455-6677-8899-aabbccddeeff", 'DeserializeGuidData(${sCase}): ${sUuid}');
+	}
+}
+
+
diff --git a/lib/haxe/test/src/MultiplexTest.hx b/lib/haxe/test/src/tests/MultiplexTest.hx
similarity index 91%
rename from lib/haxe/test/src/MultiplexTest.hx
rename to lib/haxe/test/src/tests/MultiplexTest.hx
index a17bf15..8676082 100644
--- a/lib/haxe/test/src/MultiplexTest.hx
+++ b/lib/haxe/test/src/tests/MultiplexTest.hx
@@ -17,7 +17,8 @@
  * under the License.
  */
 
-package;
+package tests;
+import tests.TestBase;
 
 #if ! (flash || html5 || js)
 
@@ -86,7 +87,7 @@
 
 
 
-class MultiplexTest extends TestBase {
+class MultiplexTest extends tests.TestBase {
 
     private inline static var NAME_BENCHMARKSERVICE : String = "BenchmarkService";
     private inline static var NAME_AGGR             : String  = "Aggr";
@@ -128,11 +129,11 @@
        }
         catch( e : TApplicationException)
         {
-            TestBase.Expect(false,'${e.errorID} ${e.errorMsg}');
+            tests.TestBase.Expect(false,'${e.errorID} ${e.errorMsg}');
         }
         catch( e : TException)
         {
-            TestBase.Expect(false,'$e');
+            tests.TestBase.Expect(false,'$e');
         }
     }
 
@@ -165,7 +166,7 @@
             trace('calling aggr ...');
             var i = 1;
             var values = aggr.getValues();
-            TestBase.Expect(values != null,'aggr.getValues() == null');
+            tests.TestBase.Expect(values != null,'aggr.getValues() == null');
             for( k in values)
             {
                 trace('fib($i) = $k');
@@ -178,11 +179,11 @@
         }
         catch( e : TApplicationException)
         {
-            TestBase.Expect(false,'${e.errorID} ${e.errorMsg}');
+            tests.TestBase.Expect(false,'${e.errorID} ${e.errorMsg}');
         }
         catch( e : TException)
         {
-            TestBase.Expect(false,'$e');
+            tests.TestBase.Expect(false,'$e');
         }
     }
 
@@ -212,11 +213,11 @@
         }
         catch( e : TApplicationException)
         {
-            TestBase.Expect(false,'${e.errorID} ${e.errorMsg}');
+            tests.TestBase.Expect(false,'${e.errorID} ${e.errorMsg}');
         }
         catch( e : TException)
         {
-            TestBase.Expect(false,'$e');
+            tests.TestBase.Expect(false,'$e');
         }
     }
 
diff --git a/lib/haxe/test/src/StreamTest.hx b/lib/haxe/test/src/tests/StreamTest.hx
similarity index 84%
rename from lib/haxe/test/src/StreamTest.hx
rename to lib/haxe/test/src/tests/StreamTest.hx
index 3e70ada..97af6f3 100644
--- a/lib/haxe/test/src/StreamTest.hx
+++ b/lib/haxe/test/src/tests/StreamTest.hx
@@ -17,7 +17,8 @@
  * under the License.
  */
 
-package;
+package tests;
+import tests.TestBase;
 #if sys
 
 import haxe.Int64;
@@ -32,7 +33,7 @@
 import thrift.test.*;  // generated code
 
 
-class StreamTest extends TestBase {
+class StreamTest extends tests.TestBase {
 
 
     private inline static var tmpfile : String = "data.tmp";
@@ -82,10 +83,10 @@
             var read = ReadData();
             FileSystem.deleteFile(tmpfile);
 
-            TestBase.Expect( read.string_thing == written.string_thing, "string data");
-            TestBase.Expect( read.byte_thing == written.byte_thing, "byte data");
-            TestBase.Expect( read.i32_thing == written.i32_thing, "i32 data");
-            TestBase.Expect( Int64.compare( read.i64_thing, written.i64_thing) == 0, "i64 data");
+            tests.TestBase.Expect( read.string_thing == written.string_thing, "string data");
+            tests.TestBase.Expect( read.byte_thing == written.byte_thing, "byte data");
+            tests.TestBase.Expect( read.i32_thing == written.i32_thing, "i32 data");
+            tests.TestBase.Expect( Int64.compare( read.i64_thing, written.i64_thing) == 0, "i64 data");
 
         } catch(e:Dynamic) {
             FileSystem.deleteFile(tmpfile);
diff --git a/lib/haxe/test/src/TestBase.hx b/lib/haxe/test/src/tests/TestBase.hx
similarity index 98%
rename from lib/haxe/test/src/TestBase.hx
rename to lib/haxe/test/src/tests/TestBase.hx
index 865a801..7545a65 100644
--- a/lib/haxe/test/src/TestBase.hx
+++ b/lib/haxe/test/src/tests/TestBase.hx
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package;
+package tests;
 
 import org.apache.thrift.*;
 import org.apache.thrift.protocol.*;
