diff --git a/lib/hs/src/TBinaryProtocol.hs b/lib/hs/src/TBinaryProtocol.hs
index e02a0ee..2903d01 100644
--- a/lib/hs/src/TBinaryProtocol.hs
+++ b/lib/hs/src/TBinaryProtocol.hs
@@ -7,7 +7,7 @@
     import GHC.Word
     import Control.Exception
 
-    data TBinaryProtocol a = (TTransport a) => TBinaryProtocol a
+    data TBinaryProtocol a = TTransport a => TBinaryProtocol a
 
     version_mask = 0xffff0000
     version_1 = 0x80010000;
@@ -33,78 +33,78 @@
     composeBytes64H (h:t) n = (shiftL (fromIntegral (fromEnum h) :: Word64) (8*n)) .|. (composeBytes64H t (n-1))
     compBytes64 :: [Char] -> Word64
     compBytes64 b = composeBytes64H b ((length b)-1)
-    instance TTransport a =>  Protocol (TBinaryProtocol a) where
-                       writeBool (TBinaryProtocol tr) b = twrite tr (if b then [toEnum 1::Char] else [toEnum 0::Char])
-                       writeByte (TBinaryProtocol tr) b = twrite tr (getBytes b 1)
-                       writeI16 (TBinaryProtocol tr) b = twrite tr (getBytes b 2)
-                       writeI32 (TBinaryProtocol tr) b = twrite tr (getBytes b 4)
-                       writeI64 (TBinaryProtocol tr) b = twrite tr (getBytes b 8)
-                       writeDouble (TBinaryProtocol tr) b = writeI64 (TBinaryProtocol tr) (fromIntegral (floatBits b) :: Int)
-                       writeString (TBinaryProtocol tr) s = do twrite tr (getBytes (length s) 4)
-                                                               twrite tr s
-                       writeBinary = writeString
-                       writeMessageBegin (TBinaryProtocol tr) (n,t,s) = do writeI32 (TBinaryProtocol tr) (version_1 .|. (fromEnum t))
-                                                                           writeString (TBinaryProtocol tr) n
-                                                                           writeI32 (TBinaryProtocol tr) s
-                       writeMessageEnd (TBinaryProtocol tr) = return ()
-                       writeStructBegin (TBinaryProtocol tr) s = return ()
-                       writeStructEnd (TBinaryProtocol tr) = return ()
-                       writeFieldBegin a (n,t,i) = do writeByte a (fromEnum t)
-                                                      writeI16 a i
-                       writeFieldEnd a = return ()
-                       writeFieldStop a = writeByte a (fromEnum T_STOP)
-                       writeMapBegin a (k,v,s) = do writeByte a (fromEnum k)
-                                                    writeByte a (fromEnum v)
-                                                    writeI32 a s
-                       writeMapEnd a = return ()
-                       writeListBegin a (t,s) = do writeByte a (fromEnum t)
-                                                   writeI32 a s
-                       writeListEnd a = return ()
-                       writeSetBegin = writeListBegin
-                       writeSetEnd a = return ()
-                       readByte (TBinaryProtocol tr) = do b <- treadAll tr 1
-                                                          return $ (fromIntegral (fromIntegral (compBytes b) :: Int8) :: Int)
-                       readI16 (TBinaryProtocol tr) = do b <- treadAll tr 2
-                                                         return $ (fromIntegral (fromIntegral (compBytes b) :: Int16) :: Int)
-                       readI32 (TBinaryProtocol tr) = do b <- treadAll tr 4
-                                                         return $ (fromIntegral (fromIntegral (compBytes b) :: Int32) :: Int)
-                       readI64 (TBinaryProtocol tr) = do b <- treadAll tr 8
-                                                         return $ (fromIntegral (fromIntegral (compBytes64 b) :: Int64) :: Int)
-                       readDouble (TBinaryProtocol tr) = do b <- readI64 (TBinaryProtocol tr)
-                                                            return $ floatOfBits (fromIntegral b :: Word64)
-                       readBool (TBinaryProtocol tr) = do b <- readByte (TBinaryProtocol tr)
-                                                          return $ b == 1
-                       readString (TBinaryProtocol tr) = do l <- readI32 (TBinaryProtocol tr)
-                                                            treadAll tr l
-                       readBinary = readString
-                       readMessageBegin (TBinaryProtocol tr) = do ver <- readI32 (TBinaryProtocol tr)
-                                                                  if (ver .&. version_mask /= version_1) then
-                                                                      throwDyn (ProtocolExn PE_BAD_VERSION "Missing version identifier")
-                                                                      else do
-                                                                        s <- readString (TBinaryProtocol tr)
-                                                                        sz <- readI32 (TBinaryProtocol tr)
-                                                                        return (s,toEnum (ver .&. 0xFF) :: Message_type,fromIntegral sz :: Int)
-                       readMessageEnd (TBinaryProtocol tr) = return ()
-                       readStructBegin (TBinaryProtocol tr) = return ""
-                       readStructEnd (TBinaryProtocol tr) = return ()
-                       readFieldBegin (TBinaryProtocol tr) = do t <- readByte (TBinaryProtocol tr)
-                                                                if (toEnum t :: T_type) /= T_STOP then
-                                                                    do s <- readI16 (TBinaryProtocol tr)
-                                                                       return ("",toEnum t :: T_type,fromIntegral s :: Int)
-                                                                    else return ("",toEnum t :: T_type,0)
-                       readFieldEnd (TBinaryProtocol tr) = return ()
-                       readMapBegin a = do kt <- readByte a
-                                           vt <- readByte a
-                                           s <- readI32 a
-                                           return (toEnum kt :: T_type,toEnum vt :: T_type,fromIntegral s :: Int)
-                       readMapEnd a = return ()
-                       readListBegin a = do b <- readByte a
-                                            s <- readI32 a
-                                            return (toEnum b :: T_type,fromIntegral s :: Int)
-                       readListEnd a = return ()
-                       readSetBegin = readListBegin
-                       readSetEnd = readListEnd
-                       pflush (TBinaryProtocol tr) = tflush tr
+    instance Protocol TBinaryProtocol where
+        getTransport (TBinaryProtocol t) = t
+        writeBool (TBinaryProtocol tr) b = twrite tr (if b then [toEnum 1::Char] else [toEnum 0::Char])
+        writeByte (TBinaryProtocol tr) b = twrite tr (getBytes b 1)
+        writeI16 (TBinaryProtocol tr) b = twrite tr (getBytes b 2)
+        writeI32 (TBinaryProtocol tr) b = twrite tr (getBytes b 4)
+        writeI64 (TBinaryProtocol tr) b = twrite tr (getBytes b 8)
+        writeDouble (TBinaryProtocol tr) b = writeI64 (TBinaryProtocol tr) (fromIntegral (floatBits b) :: Int)
+        writeString (TBinaryProtocol tr) s = do twrite tr (getBytes (length s) 4)
+                                                twrite tr s
+        writeBinary = writeString
+        writeMessageBegin (TBinaryProtocol tr) (n,t,s) = do writeI32 (TBinaryProtocol tr) (version_1 .|. (fromEnum t))
+                                                            writeString (TBinaryProtocol tr) n
+                                                            writeI32 (TBinaryProtocol tr) s
+        writeMessageEnd (TBinaryProtocol tr) = return ()
+        writeStructBegin (TBinaryProtocol tr) s = return ()
+        writeStructEnd (TBinaryProtocol tr) = return ()
+        writeFieldBegin a (n,t,i) = do writeByte a (fromEnum t)
+                                       writeI16 a i
+        writeFieldEnd a = return ()
+        writeFieldStop a = writeByte a (fromEnum T_STOP)
+        writeMapBegin a (k,v,s) = do writeByte a (fromEnum k)
+                                     writeByte a (fromEnum v)
+                                     writeI32 a s
+        writeMapEnd a = return ()
+        writeListBegin a (t,s) = do writeByte a (fromEnum t)
+                                    writeI32 a s
+        writeListEnd a = return ()
+        writeSetBegin = writeListBegin
+        writeSetEnd a = return ()
+        readByte (TBinaryProtocol tr) = do b <- treadAll tr 1
+                                           return $ (fromIntegral (fromIntegral (compBytes b) :: Int8) :: Int)
+        readI16 (TBinaryProtocol tr) = do b <- treadAll tr 2
+                                          return $ (fromIntegral (fromIntegral (compBytes b) :: Int16) :: Int)
+        readI32 (TBinaryProtocol tr) = do b <- treadAll tr 4
+                                          return $ (fromIntegral (fromIntegral (compBytes b) :: Int32) :: Int)
+        readI64 (TBinaryProtocol tr) = do b <- treadAll tr 8
+                                          return $ (fromIntegral (fromIntegral (compBytes64 b) :: Int64) :: Int)
+        readDouble (TBinaryProtocol tr) = do b <- readI64 (TBinaryProtocol tr)
+                                             return $ floatOfBits (fromIntegral b :: Word64)
+        readBool (TBinaryProtocol tr) = do b <- readByte (TBinaryProtocol tr)
+                                           return $ b == 1
+        readString (TBinaryProtocol tr) = do l <- readI32 (TBinaryProtocol tr)
+                                             treadAll tr l
+        readBinary = readString
+        readMessageBegin (TBinaryProtocol tr) = do ver <- readI32 (TBinaryProtocol tr)
+                                                   if (ver .&. version_mask /= version_1) then
+                                                       throwDyn (ProtocolExn PE_BAD_VERSION "Missing version identifier")
+                                                       else do
+                                                         s <- readString (TBinaryProtocol tr)
+                                                         sz <- readI32 (TBinaryProtocol tr)
+                                                         return (s,toEnum (ver .&. 0xFF) :: Message_type,fromIntegral sz :: Int)
+        readMessageEnd (TBinaryProtocol tr) = return ()
+        readStructBegin (TBinaryProtocol tr) = return ""
+        readStructEnd (TBinaryProtocol tr) = return ()
+        readFieldBegin (TBinaryProtocol tr) = do t <- readByte (TBinaryProtocol tr)
+                                                 if (toEnum t :: T_type) /= T_STOP then
+                                                     do s <- readI16 (TBinaryProtocol tr)
+                                                        return ("",toEnum t :: T_type,fromIntegral s :: Int)
+                                                     else return ("",toEnum t :: T_type,0)
+        readFieldEnd (TBinaryProtocol tr) = return ()
+        readMapBegin a = do kt <- readByte a
+                            vt <- readByte a
+                            s <- readI32 a
+                            return (toEnum kt :: T_type,toEnum vt :: T_type,fromIntegral s :: Int)
+        readMapEnd a = return ()
+        readListBegin a = do b <- readByte a
+                             s <- readI32 a
+                             return (toEnum b :: T_type,fromIntegral s :: Int)
+        readListEnd a = return ()
+        readSetBegin = readListBegin
+        readSetEnd = readListEnd
 
 
 
diff --git a/lib/hs/src/Thrift.hs b/lib/hs/src/Thrift.hs
index 6b94626..bb9f0bc 100644
--- a/lib/hs/src/Thrift.hs
+++ b/lib/hs/src/Thrift.hs
@@ -119,52 +119,52 @@
 
 
   class Protocol a where
-      pflush ::  a -> IO ()
-      writeMessageBegin :: a -> ([Char],Message_type,Int) -> IO ()
-      writeMessageEnd :: a -> IO ()
-      writeStructBegin :: a -> [Char] -> IO ()
-      writeStructEnd :: a -> IO ()
-      writeFieldBegin :: a -> ([Char], T_type,Int) -> IO ()
-      writeFieldEnd :: a -> IO ()
-      writeFieldStop :: a -> IO ()
-      writeMapBegin :: a -> (T_type,T_type,Int) -> IO ()
-      writeMapEnd :: a -> IO ()
-      writeListBegin :: a -> (T_type,Int) -> IO ()
-      writeListEnd :: a -> IO ()
-      writeSetBegin :: a -> (T_type,Int) -> IO ()
-      writeSetEnd :: a -> IO ()
-      writeBool :: a -> Bool -> IO ()
-      writeByte :: a -> Int -> IO ()
-      writeI16 :: a -> Int -> IO ()
-      writeI32 :: a -> Int -> IO ()
-      writeI64 :: a -> Int -> IO ()
-      writeDouble :: a -> Double -> IO ()
-      writeString :: a -> [Char] -> IO ()
-      writeBinary :: a -> [Char] -> IO ()
-      readMessageBegin :: a -> IO ([Char],Message_type,Int)
-      readMessageEnd :: a -> IO ()
-      readStructBegin :: a -> IO [Char]
-      readStructEnd :: a -> IO ()
-      readFieldBegin :: a -> IO ([Char],T_type,Int)
-      readFieldEnd :: a -> IO ()
-      readMapBegin :: a -> IO (T_type,T_type,Int)
-      readMapEnd :: a -> IO ()
-      readListBegin :: a -> IO (T_type,Int)
-      readListEnd :: a -> IO ()
-      readSetBegin :: a -> IO (T_type,Int)
-      readSetEnd :: a -> IO ()
-      readBool :: a -> IO Bool
-      readByte :: a -> IO Int
-      readI16 :: a -> IO Int
-      readI32 :: a -> IO Int
-      readI64 :: a -> IO Int
-      readDouble :: a -> IO Double
-      readString :: a -> IO [Char]
-      readBinary :: a -> IO [Char]
-      skipFields :: a -> IO ()
-      skipMapEntries :: a -> Int -> T_type -> T_type -> IO ()
-      skipSetEntries :: a -> Int -> T_type -> IO ()
-      skip :: a -> T_type -> IO ()
+      getTransport :: TTransport t => a t -> t
+      writeMessageBegin :: TTransport t => a t -> ([Char],Message_type,Int) -> IO ()
+      writeMessageEnd :: TTransport t => a t -> IO ()
+      writeStructBegin :: TTransport t => a t -> [Char] -> IO ()
+      writeStructEnd :: TTransport t => a t -> IO ()
+      writeFieldBegin :: TTransport t => a t -> ([Char], T_type,Int) -> IO ()
+      writeFieldEnd :: TTransport t => a t -> IO ()
+      writeFieldStop :: TTransport t => a t -> IO ()
+      writeMapBegin :: TTransport t => a t -> (T_type,T_type,Int) -> IO ()
+      writeMapEnd :: TTransport t => a t -> IO ()
+      writeListBegin :: TTransport t => a t -> (T_type,Int) -> IO ()
+      writeListEnd :: TTransport t => a t -> IO ()
+      writeSetBegin :: TTransport t => a t -> (T_type,Int) -> IO ()
+      writeSetEnd :: TTransport t => a t -> IO ()
+      writeBool :: TTransport t => a t -> Bool -> IO ()
+      writeByte :: TTransport t => a t -> Int -> IO ()
+      writeI16 :: TTransport t => a t -> Int -> IO ()
+      writeI32 :: TTransport t => a t -> Int -> IO ()
+      writeI64 :: TTransport t => a t -> Int -> IO ()
+      writeDouble :: TTransport t => a t -> Double -> IO ()
+      writeString :: TTransport t => a t -> [Char] -> IO ()
+      writeBinary :: TTransport t => a t -> [Char] -> IO ()
+      readMessageBegin :: TTransport t => a t -> IO ([Char],Message_type,Int)
+      readMessageEnd :: TTransport t => a t -> IO ()
+      readStructBegin :: TTransport t => a t -> IO [Char]
+      readStructEnd :: TTransport t => a t -> IO ()
+      readFieldBegin :: TTransport t => a t -> IO ([Char],T_type,Int)
+      readFieldEnd :: TTransport t => a t -> IO ()
+      readMapBegin :: TTransport t => a t -> IO (T_type,T_type,Int)
+      readMapEnd :: TTransport t => a t -> IO ()
+      readListBegin :: TTransport t => a t -> IO (T_type,Int)
+      readListEnd :: TTransport t => a t -> IO ()
+      readSetBegin :: TTransport t => a t -> IO (T_type,Int)
+      readSetEnd :: TTransport t => a t -> IO ()
+      readBool :: TTransport t => a t -> IO Bool
+      readByte :: TTransport t => a t -> IO Int
+      readI16 :: TTransport t => a t -> IO Int
+      readI32 :: TTransport t => a t -> IO Int
+      readI64 :: TTransport t => a t -> IO Int
+      readDouble :: TTransport t => a t -> IO Double
+      readString :: TTransport t => a t -> IO [Char]
+      readBinary :: TTransport t => a t -> IO [Char]
+      skipFields :: TTransport t => a t -> IO ()
+      skipMapEntries :: TTransport t => a t -> Int -> T_type -> T_type -> IO ()
+      skipSetEntries :: TTransport t => a t -> Int -> T_type -> IO ()
+      skip :: TTransport t => a t -> T_type -> IO ()
       skipFields a = do (_,ty,_) <- readFieldBegin a
                         if ty == T_STOP then
                               return ()
