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.*;
