diff --git a/test/hs/Client.hs b/test/hs/Client.hs
index c5e4d90..e69de29 100644
--- a/test/hs/Client.hs
+++ b/test/hs/Client.hs
@@ -1,58 +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.
---
-
-module Client where
-
-import ThriftTest_Client
-import ThriftTest_Types
-import qualified Data.Map as Map
-import qualified Data.Set as Set
-import Control.Monad
-import Control.Exception as CE
-
-import Network
-
-import Thrift
-import Thrift.Transport.Handle
-import Thrift.Protocol.Binary
-
-
-serverAddress = ("127.0.0.1", PortNumber 9090)
-
-main = do to <- hOpen serverAddress
-          let p =  BinaryProtocol to
-          let ps = (p,p)
-          print =<< testString ps "bya"
-          print =<< testByte ps 8
-          print =<< testByte ps (-8)
-          print =<< testI32 ps 32
-          print =<< testI32 ps (-32)
-          print =<< testI64 ps 64
-          print =<< testI64 ps (-64)
-          print =<< testDouble ps 3.14
-          print =<< testDouble ps (-3.14)
-          print =<< testMap ps (Map.fromList [(1,1),(2,2),(3,3)])
-          print =<< testList ps [1,2,3,4,5]
-          print =<< testSet ps (Set.fromList [1,2,3,4,5])
-          print =<< testStruct ps (Xtruct (Just "hi") (Just 4) (Just 5) Nothing)
-          CE.catch (testException ps "e" >> print "bad") (\e -> print (e :: Xception))
-          CE.catch (testMultiException ps "e" "e2" >> print "ok") (\e -> print (e :: Xception))
-          CE.catch (CE.catch (testMultiException ps "e" "e2">> print "bad") (\e -> print (e :: Xception2))) (\(e :: SomeException) -> print "ok")
-          tClose to
-
diff --git a/test/hs/ConstantsDemo_TestClient.hs b/test/hs/ConstantsDemo_TestClient.hs
new file mode 100644
index 0000000..1cc350d
--- /dev/null
+++ b/test/hs/ConstantsDemo_TestClient.hs
@@ -0,0 +1,44 @@
+{-# LANGUAGE ScopedTypeVariables #-}
+--
+-- 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.
+--
+
+module ConstantsDemo_TestClient where
+
+
+import Network
+
+import Thrift
+import Thrift.Protocol.Binary
+import Thrift.Transport.Handle
+
+import Yowza_Client
+
+
+serverAddress :: (String, PortID)
+serverAddress = ("127.0.0.1", PortNumber 9090)
+
+main :: IO ()
+main = do
+    to <- hOpen serverAddress
+    let p =  BinaryProtocol to
+    let ps = (p,p)
+    blingity ps
+    print =<< blangity ps
+    tClose to
+
diff --git a/test/hs/ConstantsDemo_TestServer.hs b/test/hs/ConstantsDemo_TestServer.hs
new file mode 100644
index 0000000..10b2177
--- /dev/null
+++ b/test/hs/ConstantsDemo_TestServer.hs
@@ -0,0 +1,47 @@
+--
+-- 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.
+--
+
+module ConstantsDemo_TestServer where
+
+
+import Control.Exception
+
+import Thrift
+import Thrift.Server
+
+import Yowza
+import Yowza_Iface
+
+
+data YowzaHandler = YowzaHandler
+instance Yowza_Iface YowzaHandler where
+    blingity _ = do
+        print $ "Got blingity"
+        return ()
+
+    blangity _ = do
+        print $ "Got blangity"
+        return $ 31
+
+
+main :: IO ()
+main = do putStrLn "Server ready..."
+          (runBasicServer YowzaHandler process 9090)
+          `Control.Exception.catch`
+          (\(TransportExn s _) -> print s)
diff --git a/test/hs/DebugProtoTest_TestClient.hs b/test/hs/DebugProtoTest_TestClient.hs
new file mode 100644
index 0000000..fc1582b
--- /dev/null
+++ b/test/hs/DebugProtoTest_TestClient.hs
@@ -0,0 +1,49 @@
+{-# LANGUAGE ScopedTypeVariables #-}
+--
+-- 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.
+--
+
+module DebugProtoTest_TestClient where
+
+
+import Network
+
+import Thrift.Transport.Handle
+import Thrift.Protocol.Binary
+
+import Inherited_Client
+import Srv_Client
+
+
+serverAddress :: (String, PortID)
+serverAddress = ("127.0.0.1", PortNumber 9090)
+
+main :: IO ()
+main = do to <- hOpen serverAddress
+          let p =  BinaryProtocol to
+          let ps = (p,p)
+          print =<< janky ps 42
+          voidMethod ps
+          _ <- primitiveMethod ps
+          _ <- structMethod ps
+          methodWithDefaultArgs ps 42
+          onewayMethod ps
+          _ <- identity ps 42
+          return ()
+
+
diff --git a/test/hs/DebugProtoTest_TestServer.hs b/test/hs/DebugProtoTest_TestServer.hs
new file mode 100644
index 0000000..af3e5a9
--- /dev/null
+++ b/test/hs/DebugProtoTest_TestServer.hs
@@ -0,0 +1,125 @@
+--
+-- 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.
+--
+
+module DebugProtoTest_TestServer where
+
+
+import Control.Exception
+import qualified Data.ByteString.Lazy as DBL
+import Maybe
+
+import Thrift
+import Thrift.Server
+
+import DebugProtoTest_Types
+import Inherited
+import Inherited_Iface
+import Srv_Iface
+
+
+data InheritedHandler = InheritedHandler
+instance Srv_Iface InheritedHandler where
+    janky _ arg = do
+        print $ "Got janky method call: " ++ show arg
+        return $ 31
+
+    voidMethod _ = do
+        print "Got voidMethod method call"
+        return ()
+
+    primitiveMethod _ = do
+        print "Got primitiveMethod call"
+        return $ 42
+
+    structMethod _ = do
+        print "Got structMethod call"
+        return $ CompactProtoTestStruct {
+            f_CompactProtoTestStruct_a_byte = Just 0x01,
+            f_CompactProtoTestStruct_a_i16 = Just 0x02,
+            f_CompactProtoTestStruct_a_i32 = Just 0x03,
+            f_CompactProtoTestStruct_a_i64 = Just 0x04,
+            f_CompactProtoTestStruct_a_double = Just 0.1,
+            f_CompactProtoTestStruct_a_string = Just "abcdef",
+            f_CompactProtoTestStruct_a_binary = Just DBL.empty,
+            f_CompactProtoTestStruct_true_field = Just True,
+            f_CompactProtoTestStruct_false_field = Just False,
+            f_CompactProtoTestStruct_empty_struct_field = Just Empty,
+            
+            f_CompactProtoTestStruct_byte_list = Nothing,
+            f_CompactProtoTestStruct_i16_list = Nothing,
+            f_CompactProtoTestStruct_i32_list = Nothing,
+            f_CompactProtoTestStruct_i64_list = Nothing,
+            f_CompactProtoTestStruct_double_list = Nothing,
+            f_CompactProtoTestStruct_string_list = Nothing,
+            f_CompactProtoTestStruct_binary_list = Nothing,
+            f_CompactProtoTestStruct_boolean_list = Nothing,
+            f_CompactProtoTestStruct_struct_list = Just [Empty],
+
+            f_CompactProtoTestStruct_byte_set = Nothing,
+            f_CompactProtoTestStruct_i16_set = Nothing,
+            f_CompactProtoTestStruct_i32_set = Nothing,
+            f_CompactProtoTestStruct_i64_set = Nothing,
+            f_CompactProtoTestStruct_double_set = Nothing,
+            f_CompactProtoTestStruct_string_set = Nothing,
+            f_CompactProtoTestStruct_binary_set = Nothing,
+            f_CompactProtoTestStruct_boolean_set = Nothing,
+            f_CompactProtoTestStruct_struct_set = Nothing,
+
+            f_CompactProtoTestStruct_byte_byte_map = Nothing,
+            f_CompactProtoTestStruct_i16_byte_map = Nothing,
+            f_CompactProtoTestStruct_i32_byte_map = Nothing,
+            f_CompactProtoTestStruct_i64_byte_map = Nothing,
+            f_CompactProtoTestStruct_double_byte_map = Nothing,
+            f_CompactProtoTestStruct_string_byte_map = Nothing,
+            f_CompactProtoTestStruct_binary_byte_map = Nothing,
+            f_CompactProtoTestStruct_boolean_byte_map = Nothing,
+
+            f_CompactProtoTestStruct_byte_i16_map = Nothing,
+            f_CompactProtoTestStruct_byte_i32_map = Nothing,
+            f_CompactProtoTestStruct_byte_i64_map = Nothing,
+            f_CompactProtoTestStruct_byte_double_map = Nothing,
+            f_CompactProtoTestStruct_byte_string_map = Nothing,
+            f_CompactProtoTestStruct_byte_binary_map = Nothing,
+            f_CompactProtoTestStruct_byte_boolean_map = Nothing,
+
+            f_CompactProtoTestStruct_list_byte_map = Nothing,
+            f_CompactProtoTestStruct_set_byte_map = Nothing,
+            f_CompactProtoTestStruct_map_byte_map = Nothing,
+
+            f_CompactProtoTestStruct_byte_map_map = Nothing,
+            f_CompactProtoTestStruct_byte_set_map = Nothing,
+            f_CompactProtoTestStruct_byte_list_map = Nothing }
+
+    methodWithDefaultArgs _ arg = do
+        print $ "Got methodWithDefaultArgs: " ++ show arg
+        return ()
+
+    onewayMethod _ = do
+        print "Got onewayMethod"
+
+instance Inherited_Iface InheritedHandler where
+    identity _ arg = do
+        print $ "Got identity method: " ++ show arg
+        return $ fromJust arg
+
+main :: IO ()
+main = do putStrLn "Server ready..."
+          (runBasicServer InheritedHandler process 9090)
+          `Control.Exception.catch`
+          (\(TransportExn s _) -> print s)
diff --git a/test/hs/Server.hs b/test/hs/Server.hs
index 0ca9d9f..e69de29 100644
--- a/test/hs/Server.hs
+++ b/test/hs/Server.hs
@@ -1,57 +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.
---
-
-module Server where
-
-import ThriftTest
-import ThriftTest_Iface
-import Data.Map as Map
-import Control.Exception
-import ThriftTest_Types
-
-import Thrift
-import Thrift.Server
-
-
-data TestHandler = TestHandler
-instance ThriftTest_Iface TestHandler where
-    testVoid a = return ()
-    testString a (Just s) = do print s; return s
-    testByte a (Just x) = do print x; return x
-    testI32 a (Just x) = do print x; return x
-    testI64 a (Just x) = do print x; return x
-    testDouble a (Just x) = do print x; return x
-    testStruct a (Just x) = do print x; return x
-    testNest a (Just x) = do print x; return x
-    testMap a (Just x) = do print x; return x
-    testSet a (Just x) = do print x; return x
-    testList a (Just x) = do print x; return x
-    testEnum a (Just x) = do print x; return x
-    testTypedef a (Just x) = do print x; return x
-    testMapMap a (Just x) = return (Map.fromList [(1,Map.fromList [(2,2)])])
-    testInsanity a (Just x) = return (Map.fromList [(1,Map.fromList [(ONE,x)])])
-    testMulti a a1 a2 a3 a4 a5 a6 = return (Xtruct Nothing Nothing Nothing Nothing)
-    testException a c = throw (Xception (Just 1) (Just "bya"))
-    testMultiException a c1 c2 = throw (Xception (Just 1) (Just "xyz"))
-    testOneway a (Just i) = do print i
-
-
-main = do (runBasicServer TestHandler process 9090)
-          `Control.Exception.catch`
-          (\(TransportExn s t) -> print s)
diff --git a/test/hs/ThriftTest_TestClient.hs b/test/hs/ThriftTest_TestClient.hs
new file mode 100644
index 0000000..4aca275
--- /dev/null
+++ b/test/hs/ThriftTest_TestClient.hs
@@ -0,0 +1,61 @@
+{-# LANGUAGE ScopedTypeVariables #-}
+--
+-- 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.
+--
+
+module ThriftTest_TestClient where
+
+
+import Control.Exception as CE
+import qualified Data.Map as Map
+import qualified Data.Set as Set
+import Network
+
+import Thrift
+import Thrift.Transport.Handle
+import Thrift.Protocol.Binary
+
+import ThriftTest_Client
+import ThriftTest_Types
+
+
+serverAddress :: (String, PortID)
+serverAddress = ("127.0.0.1", PortNumber 9090)
+
+main :: IO ()
+main = do to <- hOpen serverAddress
+          let p =  BinaryProtocol to
+          let ps = (p,p)
+          print =<< testString ps "bya"
+          print =<< testByte ps 8
+          print =<< testByte ps (-8)
+          print =<< testI32 ps 32
+          print =<< testI32 ps (-32)
+          print =<< testI64 ps 64
+          print =<< testI64 ps (-64)
+          print =<< testDouble ps 3.14
+          print =<< testDouble ps (-3.14)
+          print =<< testMap ps (Map.fromList [(1,1),(2,2),(3,3)])
+          print =<< testList ps [1,2,3,4,5]
+          print =<< testSet ps (Set.fromList [1,2,3,4,5])
+          print =<< testStruct ps (Xtruct (Just "hi") (Just 4) (Just 5) Nothing)
+          CE.catch (testException ps "e" >> print "bad") (\e -> print (e :: Xception))
+          CE.catch (testMultiException ps "e" "e2" >> print "ok") (\e -> print (e :: Xception))
+          CE.catch (CE.catch (testMultiException ps "e" "e2">> print "bad") (\e -> print (e :: Xception2))) (\(_ :: SomeException) -> print "ok")
+          tClose to
+
diff --git a/test/hs/ThriftTest_TestServer.hs b/test/hs/ThriftTest_TestServer.hs
new file mode 100644
index 0000000..fbfcd53
--- /dev/null
+++ b/test/hs/ThriftTest_TestServer.hs
@@ -0,0 +1,152 @@
+--
+-- 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 _ 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.
+--
+
+module ThriftTest_TestServer where
+
+import ThriftTest
+import ThriftTest_Iface
+import Data.Map as Map
+import Control.Exception
+import ThriftTest_Types
+
+import Thrift
+import Thrift.Server
+
+
+data TestHandler = TestHandler
+instance ThriftTest_Iface TestHandler where
+    testVoid _ = return ()
+
+    testString _ (Just s) = do
+        print s
+        return s
+
+    testString _ Nothing = do
+        error $ "Unsupported testString form"
+
+    testByte _ (Just x) = do
+        print x
+        return x
+
+    testByte _ Nothing = do
+        error $ "Unsupported testByte form"
+
+    testI32 _ (Just x) = do
+        print x
+        return x
+
+    testI32 _ Nothing = do
+        error $ "Unsupported testI32 form"
+
+    testI64 _ (Just x) = do
+        print x
+        return x
+
+    testI64 _ Nothing = do
+        error $ "Unsupported testI64 form"
+
+    testDouble _ (Just x) = do
+        print x
+        return x
+
+    testDouble _ Nothing = do
+        error $ "Unsupported testDouble form"
+
+    testStruct _ (Just x) = do
+        print x
+        return x
+
+    testStruct _ Nothing = do
+        error $ "Unsupported testStruct form"
+
+    testNest _ (Just x) = do
+        print x
+        return x
+
+    testNest _ Nothing = do
+        error $ "Unsupported testNest form"
+
+    testMap _ (Just x) = do
+        print x
+        return x
+
+    testMap _ Nothing = do
+        error $ "Unsupported testMap form"
+
+    testSet _ (Just x) = do
+        print x
+        return x
+
+    testSet _ Nothing = do
+        error $ "Unsupported testSet form"
+
+    testList _ (Just x) = do
+        print x
+        return x
+
+    testList _ Nothing = do
+        error $ "Unsupported testList form"
+
+    testEnum _ (Just x) = do
+        print x
+        return x
+
+    testEnum _ Nothing = do
+        error $ "Unsupported testEnum form"
+
+    testTypedef _ (Just x) = do
+        print x
+        return x
+
+    testTypedef _ Nothing = do
+        error $ "Unsupported testTypedef form"
+
+    testMapMap _ (Just _) = do
+        return (Map.fromList [(1, Map.fromList [(2, 2)])])
+
+    testMapMap _ Nothing = do
+        error $ "Unsupported testMapMap form"
+
+    testInsanity _ (Just x) = do
+        return (Map.fromList [(1, Map.fromList [(ONE, x)])])
+
+    testInsanity _ Nothing = do
+        error $ "Unsupported testInsanity form"
+
+    testMulti _ _ _ _ _ _ _ = do
+        return (Xtruct Nothing Nothing Nothing Nothing)
+
+    testException _ _ = do
+        throw (Xception (Just 1) (Just "bya"))
+
+    testMultiException _ _ _ = do
+        throw (Xception (Just 1) (Just "xyz"))
+
+    testOneway _ (Just i) = do
+        print i
+
+    testOneway _ Nothing = do
+        error $ "Unsupported testOneway form"
+
+
+main :: IO ()
+main = do putStrLn "Server ready..."
+          (runBasicServer TestHandler process 9090)
+          `Control.Exception.catch`
+          (\(TransportExn s _) -> print s)
diff --git a/test/hs/runclient.sh b/test/hs/runclient.sh
index b93bbb1..aab9f17 100644
--- a/test/hs/runclient.sh
+++ b/test/hs/runclient.sh
@@ -19,8 +19,50 @@
 # under the License.
 #
 
+# Check some basic 
 if [ -z $BASE ]; then
     BASE=../..
 fi
 
-ghci -fglasgow-exts -i$BASE/lib/hs/src -i$BASE/test/hs/gen-hs Client.hs
+if [ -z $OUTDIR ]; then
+    OUTDIR=client-bindings
+fi
+
+if [ -z $THRIFT_BIN ]; then
+    THRIFT_BIN=$(which thrift)
+fi
+
+if [ ! -x "$THRIFT_BIN" ]; then
+    printf "Could not find thrift binary; pass it as environment variable THRIFT_BIN\n"
+    exit 1
+fi
+
+# Figure out what file to generate bindings from
+if [ -z $THRIFT_FILE ]; then
+    THRIFT_FILE=$BASE/test/$1.thrift
+fi
+
+if [ ! -e $THRIFT_FILE ]; then
+    printf "Missing thrift file $THRIFT_FILE \n"
+    exit 2
+fi
+
+# Figure out what file to run has a client
+if [ -z $CLIENT_FILE ]; then
+    CLIENT_FILE=$BASE/test/hs/$1_TestClient.hs
+fi
+
+if [ ! -e $CLIENT_FILE ]; then
+    printf "Missing client code file $CLIENT_FILE \n"
+    exit 3
+fi
+
+# Actually run the client bits
+printf "Creating directory $OUTDIR to hold generated bindings... \n"
+[ -d $OUTDIR ] || mkdir $OUTDIR
+
+printf "Generating bindings... \n"
+$THRIFT_BIN -o $OUTDIR --gen hs $THRIFT_FILE
+
+printf "Starting client... \n"
+runhaskell -Wall -Werror -i$BASE/lib/hs/src -i$OUTDIR/gen-hs $CLIENT_FILE
diff --git a/test/hs/runserver.sh b/test/hs/runserver.sh
index b23301b..9189d30 100644
--- a/test/hs/runserver.sh
+++ b/test/hs/runserver.sh
@@ -19,9 +19,50 @@
 # under the License.
 #
 
+# Check some basic 
 if [ -z $BASE ]; then
     BASE=../..
 fi
 
-printf "Starting server... "
-ghc -fglasgow-exts -i$BASE/lib/hs/src -i$BASE/test/hs/gen-hs Server.hs -e "putStrLn \"ready.\" >> Server.main"
+if [ -z $OUTDIR ]; then
+    OUTDIR=server-bindings
+fi
+
+if [ -z $THRIFT_BIN ]; then
+    THRIFT_BIN=$(which thrift)
+fi
+
+if [ ! -x "$THRIFT_BIN" ]; then
+    printf "Could not find thrift binary; pass it as environment variable THRIFT_BIN\n"
+    exit 1
+fi
+
+# Figure out what file to generate bindings from
+if [ -z $THRIFT_FILE ]; then
+    THRIFT_FILE=$BASE/test/$1.thrift
+fi
+
+if [ ! -e $THRIFT_FILE ]; then
+    printf "Missing thrift file $THRIFT_FILE \n"
+    exit 2
+fi
+
+# Figure out what file to run has a server
+if [ -z $SERVER_FILE ]; then
+    SERVER_FILE=$BASE/test/hs/$1_TestServer.hs
+fi
+
+if [ ! -e $SERVER_FILE ]; then
+    printf "Missing server code file $SERVER_FILE \n"
+    exit 3
+fi
+
+# Actually run the server bits
+printf "Creating directory $OUTDIR to hold generated bindings... \n"
+[ -d $OUTDIR ] || mkdir $OUTDIR
+
+printf "Generating bindings... \n"
+$THRIFT_BIN -o $OUTDIR --gen hs $THRIFT_FILE
+
+printf "Starting server... \n"
+runhaskell -Wall -Werror -i$BASE/lib/hs/src -i$OUTDIR/gen-hs $SERVER_FILE
