diff --git a/ChangeLog.md b/ChangeLog.md
new file mode 100644
--- /dev/null
+++ b/ChangeLog.md
@@ -0,0 +1,3 @@
+# Changelog for mssql-simple
+
+## Unreleased changes
diff --git a/LICENSE b/LICENSE
new file mode 100644
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,30 @@
+Copyright Takamasa Mitsuji (c) 2019
+
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+
+    * Redistributions in binary form must reproduce the above
+      copyright notice, this list of conditions and the following
+      disclaimer in the documentation and/or other materials provided
+      with the distribution.
+
+    * Neither the name of Author name here nor the names of other
+      contributors may be used to endorse or promote products derived
+      from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/README.md b/README.md
new file mode 100644
--- /dev/null
+++ b/README.md
@@ -0,0 +1,61 @@
+# mssql-simple: SQL Server client library implemented in Haskell
+
+This is a Haskell implementation of client library for Microsoft SQL Server.
+
+
+## Usage Example
+
+https://github.com/mitsuji/mssql-simple-example/blob/master/app/Main.hs
+
+
+## Related projects
+
+* [mssql-simple-example](https://github.com/mitsuji/mssql-simple-example)
+  : Usage example of mssql-simple  
+  https://github.com/mitsuji/mssql-simple-example
+  
+* [ms-tds](https://github.com/mitsuji/ms-tds)
+  : TDS Protocol implemented in Haskell  
+  https://github.com/mitsuji/ms-tds
+  
+
+## Advantage
+
+* ODBC independent
+
+* Implemented only with Haskell (Independent of other languages ​​and environments)
+
+* Supports encryption at login
+
+* Supports simultaneous acquisition of multiple record sets
+
+* Supports stored procedure RPC
+
+* 7.1 Revision 1 (SQL Server 2000 SP1 and later)
+
+* Tested with SQL Server 2008 R2
+
+
+
+## Todo
+
+* Write tests
+  * Write general tests
+  
+
+* Transaction support
+
+
+* ETC
+  * Encrypt entire connection support
+  * Mars support
+  * SSPI support
+  * FedAuth support
+  * TDS protocol versions other than 7.1
+
+  * Bulk Load  
+    https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-tds/88176081-df75-4b24-bcfb-4c16ff03cbfa
+
+  * Distributed Transaction  
+    https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-tds/b4b78564-5440-4fc0-b5ef-c9e1925aaefe
+
diff --git a/Setup.hs b/Setup.hs
new file mode 100644
--- /dev/null
+++ b/Setup.hs
@@ -0,0 +1,2 @@
+import Distribution.Simple
+main = defaultMain
diff --git a/mssql-simple.cabal b/mssql-simple.cabal
new file mode 100644
--- /dev/null
+++ b/mssql-simple.cabal
@@ -0,0 +1,69 @@
+cabal-version: 1.12
+
+-- This file has been generated from package.yaml by hpack version 0.31.1.
+--
+-- see: https://github.com/sol/hpack
+--
+-- hash: 9aa32b25a330fcdb7d4bc7b492b2f647344cbaf877dd13cbdbc191b842f80690
+
+name:           mssql-simple
+version:        0.1.0.0
+description:    Please see the README on GitHub at <https://github.com/mitsuji/mssql-simple#readme>
+homepage:       https://github.com/mitsuji/mssql-simple#readme
+bug-reports:    https://github.com/mitsuji/mssql-simple/issues
+author:         Takamasa Mitsuji
+maintainer:     tkms@mitsuji.org
+copyright:      2019 Takamasa Mitsuji
+license:        BSD3
+license-file:   LICENSE
+build-type:     Simple
+extra-source-files:
+    README.md
+    ChangeLog.md
+
+source-repository head
+  type: git
+  location: https://github.com/mitsuji/mssql-simple
+
+library
+  exposed-modules:
+      Database.MSSQLServer.Connection
+      Database.MSSQLServer.Query
+      Database.MSSQLServer.Query.Only
+      Database.MSSQLServer.Query.ResultSet
+      Database.MSSQLServer.Query.RpcQuerySet
+      Database.MSSQLServer.Query.RpcResultSet
+  other-modules:
+      Paths_mssql_simple
+  hs-source-dirs:
+      src
+  build-depends:
+      base >=4.7 && <5
+    , binary
+    , bytestring
+    , ms-tds <0.2
+    , network
+    , text
+    , time
+    , tls
+  default-language: Haskell2010
+
+test-suite tds-test
+  type: exitcode-stdio-1.0
+  main-is: Spec.hs
+  other-modules:
+      Paths_mssql_simple
+  hs-source-dirs:
+      test
+  ghc-options: -threaded -rtsopts -with-rtsopts=-N
+  build-depends:
+      base >=4.7 && <5
+    , binary
+    , bytestring
+    , ms-tds <0.2
+    , mssql-simple
+    , network
+    , text
+    , time
+    , tls
+  default-language: Haskell2010
diff --git a/src/Database/MSSQLServer/Connection.hs b/src/Database/MSSQLServer/Connection.hs
new file mode 100644
--- /dev/null
+++ b/src/Database/MSSQLServer/Connection.hs
@@ -0,0 +1,262 @@
+{-# LANGUAGE OverloadedStrings #-}
+
+module Database.MSSQLServer.Connection ( ConnectInfo(..)
+                                       , Connection(..)
+                                       , connect
+                                       , connectWithoutEncription
+                                       , close
+                                       , ProtocolError(..)
+                                       , AuthError(..)
+                                       ) where
+
+import qualified Network.Socket as Socket
+import Network.Socket (AddrInfo(..),SocketType(..),Socket(..))
+import Network.Socket.ByteString (recv)
+import Network.Socket.ByteString.Lazy (sendAll)
+
+import Data.Monoid ((<>))
+
+import qualified Data.ByteString as B
+import qualified Data.ByteString.Lazy as LB
+
+import qualified Data.Text as T
+import qualified Data.Text.IO as T
+import qualified Data.Text.Encoding as T
+
+import Data.Binary (Binary(..),encode)
+import qualified Data.Binary.Put as Put
+import qualified Data.Binary.Get as Get
+
+import Control.Monad (when)
+import Control.Exception (Exception(..),throwIO)
+
+import qualified Network.TLS as TLS
+import Network.BSD (getHostName)
+
+import Database.Tds.Message
+import Database.Tds.Transport (contextNew)
+
+import Data.Word (Word8)
+
+
+data ProtocolError = ProtocolError String
+                   deriving (Show)
+instance Exception ProtocolError
+
+data AuthError = AuthError !Info
+               deriving (Show)
+instance Exception AuthError
+
+
+
+
+data ConnectInfo = ConnectInfo { connectHost :: String
+                               , connectPort :: String
+                               , connectDatabase :: String
+                               , connectUser :: String
+                               , connectPassword :: String
+                               }
+                   
+newtype Connection = Connection Socket
+
+
+connect :: ConnectInfo -> IO Connection
+connect ci@(ConnectInfo host port database user pass) = do
+  addr <- resolve host port
+  sock <- connect' addr
+  
+  Prelogin plResOpts <- performPrelogin sock 0x00 -- ENCRYPT_OFF (Encrypt login packet only)
+
+  [PLOEncription modeEnc]  <- case filter isPLOEncription plResOpts of
+                                [] -> throwIO $ ProtocolError "connect: PLOEncription is necessary"
+                                xs -> return xs
+  [PLOMars modeMars] <- case filter isPLOMars plResOpts of
+                          [] -> throwIO $ ProtocolError "connect: PLOMars is necessary"
+                          xs -> return xs
+  when (modeEnc/=0x00)  $ throwIO $ ProtocolError "connect: Server reported unsupported encription mode"
+  when (modeMars/=0) $ throwIO $ ProtocolError "connect: Server reported unsupported mars mode"
+
+  login7 <- newLogin7 ci
+
+  ---
+  --- TLS handshake
+  ---
+  tlsContext <- contextNew sock host
+  TLS.handshake tlsContext
+
+  --- 
+  --- Login with encripted packet
+  --- 
+  TLS.sendData tlsContext $ encode $ CMLogin7 login7
+  ServerMessage tss <- readMessage sock $ Get.runGetIncremental get
+
+  --- 
+  --- Verify Ack
+  --- 
+  validLoginAck login7 tss
+  
+  return $ Connection sock
+
+
+
+connectWithoutEncription :: ConnectInfo -> IO Connection
+connectWithoutEncription ci@(ConnectInfo host port database user pass) = do
+  addr <- resolve host port
+  sock <- connect' addr
+  
+  Prelogin plResOpts <- performPrelogin sock 0x02 -- ENCRYPT_NOT_SUP (No encription)
+
+  [PLOEncription modeEnc]  <- case filter isPLOEncription plResOpts of
+                                [] -> throwIO $ ProtocolError "connectWithoutEncription: PLOEncription is necessary"
+                                xs -> return xs
+  [PLOMars modeMars] <- case filter isPLOMars plResOpts of
+                          [] -> throwIO $ ProtocolError "connectWithoutEncription: PLOMars is necessary"
+                          xs -> return xs
+  when (modeEnc/=0x02)  $ throwIO $ ProtocolError "connectWithoutEncription: Server reported unsupported encription mode"
+  when (modeMars/=0) $ throwIO $ ProtocolError "connectWithoutEncription: Server reported unsupported mars mode"
+
+  login7 <- newLogin7 ci
+  
+  --- 
+  --- Login without encripted packet
+  --- 
+  sendAll sock $ encode $ CMLogin7 login7
+  ServerMessage tss <- readMessage sock $ Get.runGetIncremental get
+
+  --- 
+  --- Verify Ack
+  --- 
+  validLoginAck login7 tss
+  
+  return $ Connection sock
+
+
+
+close :: Connection -> IO ()
+close (Connection sock) = Socket.close sock
+
+
+
+
+performPrelogin :: Socket -> Word8 -> IO Prelogin
+performPrelogin sock enc = do
+  -- https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-tds/60f56408-0188-4cd5-8b90-25c6f2423868
+  --
+  -- Prelogin
+  --
+  -- [TODO] Threadid support
+  -- [TODO] Mars support
+  let clientPrelogin = Prelogin [ PLOVersion 9 0 0 0
+                                , PLOEncription enc
+                                , PLOInstopt "MSSQLServer"
+                                , PLOThreadid (Just 1000) -- [TODO]
+                                , PLOMars 0 -- [TODO]
+                                ]
+  sendAll sock $ encode $ CMPrelogin clientPrelogin
+  ServerMessage serverPrelogin <- readMessage sock $ Get.runGetIncremental get
+  
+  return serverPrelogin
+
+
+  
+newLogin7 :: ConnectInfo -> IO Login7
+newLogin7 (ConnectInfo host port database user pass) = do
+  ---
+  --- Login7
+  ---
+  -- [TODO] Improve default params
+  -- [TODO] process ID support
+  -- [TODO] MAC address support
+  hostname <- getHostName
+  let login7 = defaultLogin7 { l7ClientPID = 1 -- [TODO]
+                             , l7ClientMacAddr = B.pack [0x00,0x00,0x00,0x00,0x00,0x00] -- [TODO]
+                             , l7ClientHostName = (T.pack hostname)
+                             , l7AppName = "mssql-simple" -- [TODO] more nice name
+                             , l7ServerName = (T.pack host)
+                             , l7UserName = (T.pack user)
+                             , l7Password = (T.pack pass)
+                             , l7Database = (T.pack database)
+                             }
+  return login7
+
+
+
+validLoginAck :: Login7 -> TokenStreams -> IO ()
+validLoginAck login7 (TokenStreams loginResTokenStreams) = do
+  
+  let loginAcks   = filter isTSLoginAck loginResTokenStreams
+  when (null loginAcks) $ do
+    [TSError info] <- case filter isTSError loginResTokenStreams of
+                        [] -> throwIO $ ProtocolError "validLoginAck: TSError is necessary"
+                        xs -> return xs
+    throwIO $ AuthError info
+
+  let [TSLoginAck _ tdsVersion _ _] = loginAcks
+  when (l7TdsVersion login7 /= tdsVersion) $ throwIO $ ProtocolError "validLoginAck: Server reported unsupported tds version"
+
+  return ()
+  where
+
+    isTSLoginAck :: TokenStream -> Bool
+    isTSLoginAck (TSLoginAck{}) = True
+    isTSLoginAck _ = False
+
+    isTSError :: TokenStream -> Bool
+    isTSError (TSError{}) = True
+    isTSError _ = False
+
+    printEnvChange :: TokenStream -> IO ()
+    printEnvChange (TSEnvChange t o n) = do
+      putStr "TSEnvChange: "
+      case t of
+        1 -> T.putStr $ "Database: "   <> T.decodeUtf16LE o <> " -> " <> T.decodeUtf16LE n
+        2 -> T.putStr $ "Language: "   <> T.decodeUtf16LE o <> " -> " <> T.decodeUtf16LE n
+        3 -> T.putStr $ "Charset: "    <> T.decodeUtf16LE o <> " -> " <> T.decodeUtf16LE n
+        4 -> T.putStr $ "PacketSize: " <> T.decodeUtf16LE o <> " -> " <> T.decodeUtf16LE n
+        5 -> T.putStr $ "DSLID:      " <> T.decodeUtf16LE n
+        6 -> T.putStr $ "DSCFlags: "   <> T.decodeUtf16LE n
+        7 -> putStr $ "Collaction: " <> show o <> " -> " <> show n
+        8 -> putStr $ "BeginTran: " <> show n
+        9 -> putStr $ "CommitTran: " <> show o
+        10 -> putStr $ "RollbackTran: " <> show o
+        11 -> putStr $ "EnlistDTCTran: " <> show o
+        12 -> putStr $ "DefactTran: " <> show n
+        13 -> T.putStr $ "MirrorPartner: " <> T.decodeUtf16LE n
+        15 -> putStr $ "PromoteTran: " <> show n
+        16 -> putStr $ "TranManAddr: " <> show n
+        17 -> putStr $ "TranEndedr: " <> show o
+        18 -> putStr $ "ResetAck: "
+        19 -> T.putStr $ "SendsBackInfo: " <> T.decodeUtf16LE n
+        20 -> putStr $ "Routing: " <> show n
+      putStrLn mempty
+
+
+
+isPLOEncription :: PreloginOption -> Bool
+isPLOEncription (PLOEncription{}) = True
+isPLOEncription _ = False
+
+isPLOMars :: PreloginOption -> Bool
+isPLOMars (PLOMars{}) = True
+isPLOMars _ = False
+
+resolve host port = do
+  let hints = Socket.defaultHints { addrSocketType = Stream }
+  addr:_ <- Socket.getAddrInfo (Just hints) (Just host) (Just port)
+  return addr
+
+connect' addr = do
+  sock <- Socket.socket (addrFamily addr) (addrSocketType addr) (addrProtocol addr)
+  Socket.connect sock $ addrAddress addr
+  return sock
+
+readMessage :: Socket -> Get.Decoder a -> IO a
+readMessage sock decoder = do
+  bs <- recv sock 512 -- [TODO] optimize
+  case Get.pushChunk decoder bs of
+    Get.Done _ _ msg -> return msg
+    decoder' -> readMessage sock decoder'
+
+
+
+
diff --git a/src/Database/MSSQLServer/Query.hs b/src/Database/MSSQLServer/Query.hs
new file mode 100644
--- /dev/null
+++ b/src/Database/MSSQLServer/Query.hs
@@ -0,0 +1,113 @@
+
+module Database.MSSQLServer.Query ( -- * SQL Text Query
+                                    sql
+                                    
+                                  -- ** ResultSet
+                                  , ResultSet (..)
+                                  , Row (..)
+                                  
+                                  -- * RPC Query
+                                  , rpc
+                                  
+                                  -- ** RpcResultSet
+                                  , RpcResultSet (..)
+                                  , RpcResult (..)
+                                  , RpcOutputSet (..)
+                                  
+                                  -- ** RpcQuerySet
+                                  , RpcQuerySet (..)
+                                  , RpcQuery (..)
+                                  , RpcQueryId (..)
+                                  , StoredProcedure (..)
+                                  , RpcParamSet (..)
+                                  , RpcParam (..)
+                                  , RpcParamName
+                                  , Only (..)
+                                  
+                                  -- * Exceptions
+                                  , QueryError (..)
+                                  ) where
+
+import Data.Monoid ((<>))
+
+import Network.Socket (Socket)
+import Network.Socket.ByteString (recv)
+import Network.Socket.ByteString.Lazy (sendAll)
+
+import qualified Data.ByteString as B
+import qualified Data.ByteString.Lazy as LB
+
+import qualified Data.Text as T
+
+import Data.Binary (Binary(..),encode)
+import qualified Data.Binary.Get as Get
+
+import Control.Monad (when)
+import Control.Exception (Exception(..),throwIO)
+
+import Database.Tds.Message
+
+import Database.MSSQLServer.Connection
+import Database.MSSQLServer.Query.Only
+import Database.MSSQLServer.Query.ResultSet
+import Database.MSSQLServer.Query.RpcResultSet
+import Database.MSSQLServer.Query.RpcQuerySet
+
+
+data QueryError = QueryError !Info
+                deriving (Show)
+
+instance Exception QueryError
+
+
+sql :: ResultSet a => Connection -> T.Text -> IO a
+sql (Connection sock) query = do
+  sendAll sock $ encode $ CMSqlBatch $ SqlBatch query
+  ServerMessage (TokenStreams tss) <- readMessage sock $ Get.runGetIncremental get
+
+  case filter isTSError tss of
+    [] -> return $ fromTokenStreams tss
+    TSError info :_ -> throwIO $ QueryError info
+
+
+
+rpc :: (RpcQuerySet a, RpcResultSet b) => Connection -> a -> IO b
+rpc (Connection sock) queries = do
+  sendAll sock $ encode $ CMRpcRequest $ toRpcRequest queries
+  ServerMessage (TokenStreams tss) <- readMessage sock $ Get.runGetIncremental get
+
+  case filter isTSError tss of
+    [] -> return $ fromListOfTokenStreams $ splitBy isTSDoneProc tss
+    TSError info :_ -> throwIO $ QueryError info
+  
+  where
+    isTSDoneProc :: TokenStream -> Bool
+    isTSDoneProc (TSDoneProc{}) = True
+    isTSDoneProc _ = False
+
+
+    spanBy :: (a -> Bool) -> [a] -> ([a],[a])
+    spanBy q xs = case span (not . q) xs of
+      t@(ys,z:zs) | (q z) -> (ys <> [z], zs)
+                  | otherwise -> t
+      t -> t
+
+    splitBy :: (a -> Bool) -> [a] ->[[a]]
+    splitBy q xs = case spanBy q xs of
+      (ys,[]) -> [ys]
+      (ys,zs) -> ys:splitBy q zs
+
+
+
+isTSError :: TokenStream -> Bool
+isTSError (TSError{}) = True
+isTSError _ = False
+
+readMessage :: Socket -> Get.Decoder a -> IO a
+readMessage sock decoder = do
+  bs <- recv sock 512 -- [TODO] optimize
+  case Get.pushChunk decoder bs of
+    Get.Done _ _ msg -> return msg
+    decoder' -> readMessage sock decoder'
+
+
diff --git a/src/Database/MSSQLServer/Query/Only.hs b/src/Database/MSSQLServer/Query/Only.hs
new file mode 100644
--- /dev/null
+++ b/src/Database/MSSQLServer/Query/Only.hs
@@ -0,0 +1,8 @@
+{-# OPTIONS_HADDOCK hide #-}
+
+module Database.MSSQLServer.Query.Only ( Only (..)
+                                       ) where
+
+newtype Only a = Only {fromOnly::a}
+               deriving (Show)
+
diff --git a/src/Database/MSSQLServer/Query/ResultSet.hs b/src/Database/MSSQLServer/Query/ResultSet.hs
new file mode 100644
--- /dev/null
+++ b/src/Database/MSSQLServer/Query/ResultSet.hs
@@ -0,0 +1,643 @@
+{-# OPTIONS_HADDOCK hide #-}
+{-# LANGUAGE BangPatterns #-}
+{-# LANGUAGE FlexibleInstances #-}
+
+module Database.MSSQLServer.Query.ResultSet ( ResultSet (..)
+                                            , Row (..)
+                                            ) where
+
+
+import Database.Tds.Message
+import Database.MSSQLServer.Query.Only
+
+
+
+
+class ResultSet a where
+  fromTokenStreams :: [TokenStream] -> a
+
+
+instance ResultSet () where
+  fromTokenStreams = f . extractStreams
+    where
+      f [] = ()
+      f _ = error "fromTokenStreams: List length must be 0"
+
+instance (Row a) => ResultSet [a] where
+  fromTokenStreams = f . extractStreams
+    where
+      f [v1] = b1
+        where
+          !b1 = rowList v1
+      f _ = error "fromTokenStreams: List length must be 1"
+
+instance (Row a, Row b) => ResultSet ([a],[b]) where
+  fromTokenStreams = f . extractStreams
+    where
+      f [v1,v2] = (b1,b2)
+        where
+          !b1 = rowList v1
+          !b2 = rowList v2
+      f _ = error "fromTokenStreams: List length must be 2"
+
+instance (Row a, Row b, Row c) => ResultSet ([a],[b],[c]) where
+  fromTokenStreams = f . extractStreams
+    where
+      f [v1,v2,v3] = (b1,b2,b3)
+        where
+          !b1 = rowList v1
+          !b2 = rowList v2
+          !b3 = rowList v3
+      f _ = error "fromTokenStreams: List length must be 3"
+
+instance (Row a, Row b, Row c, Row d) => ResultSet ([a],[b],[c],[d]) where
+  fromTokenStreams = f . extractStreams
+    where
+      f [v1,v2,v3,v4] = (b1,b2,b3,b4)
+        where
+          !b1 = rowList v1
+          !b2 = rowList v2
+          !b3 = rowList v3
+          !b4 = rowList v4
+      f _ = error "fromTokenStreams: List length must be 4"
+
+instance (Row a, Row b, Row c, Row d, Row e) => ResultSet ([a],[b],[c],[d],[e]) where
+  fromTokenStreams = f . extractStreams
+    where
+      f [v1,v2,v3,v4,v5] = (b1,b2,b3,b4,b5)
+        where
+          !b1 = rowList v1
+          !b2 = rowList v2
+          !b3 = rowList v3
+          !b4 = rowList v4
+          !b5 = rowList v5
+      f _ = error "fromTokenStreams: List length must be 5"
+
+      
+
+-- (TSColMetaData,[TSRow])
+rowList :: (Row a) => (TokenStream,[TokenStream]) -> [a]
+rowList = \(tsCmd,tsRss) ->
+  let (TSColMetaData (maybeCmd)) = tsCmd
+      cds = case (\(ColMetaData x) -> x) <$> maybeCmd of
+        Nothing -> error "rowList: ColMetaData is necessary"
+        Just cds' -> cds'
+      datas = (\(TSRow row) -> rawBytes <$> row) <$> tsRss
+  in map (fromListOfRawBytes cds) datas
+  where
+    rawBytes :: RowColumnData -> RawBytes
+    rawBytes (RCDOrdinal dt) = dt
+    rawBytes (RCDLarge _ _ dt) = dt
+
+
+
+-- [(TSColMetaData,[TSRow])]
+extractStreams :: [TokenStream] -> [(TokenStream,[TokenStream])]
+extractStreams = f . ( filter $ \x -> isTSColMetaData x || isTSRow x )
+  where
+    f :: [TokenStream] -> [(TokenStream,[TokenStream])]
+    f [] = []
+    f (cmd:xs) =
+      let
+        (rs,xs') = span isTSRow xs
+      in (cmd,rs):f xs'
+
+    isTSColMetaData :: TokenStream -> Bool
+    isTSColMetaData (TSColMetaData{}) = True
+    isTSColMetaData _ = False
+
+    isTSRow :: TokenStream -> Bool
+    isTSRow (TSRow{}) = True
+    isTSRow _ = False
+
+
+
+
+mcdTypeInfo :: MetaColumnData -> TypeInfo
+mcdTypeInfo (MetaColumnData _ _ ti _ _) = ti
+
+
+class Row a where
+  fromListOfRawBytes :: [MetaColumnData] -> [RawBytes] -> a
+
+instance Row () where
+  fromListOfRawBytes [] [] = ()
+  fromListOfRawBytes _ _ = error "fromListOfRawBytes: List length must be 0"
+
+instance (Data a) => Row (Only a) where
+  fromListOfRawBytes [m1] [b1] = Only d1
+    where
+      !d1 = fromRawBytes (mcdTypeInfo m1) b1
+  fromListOfRawBytes _ _ = error "fromListOfRawBytes: List length must be 1"
+
+instance (Data a, Data b) => Row (a,b) where
+  fromListOfRawBytes [m1,m2] [b1,b2] = (d1,d2)
+    where
+      !d1 = fromRawBytes (mcdTypeInfo m1) b1
+      !d2 = fromRawBytes (mcdTypeInfo m2) b2
+  fromListOfRawBytes _ _ = error "fromListOfRawBytes: List length must be 2"
+
+instance (Data a, Data b, Data c) => Row (a,b,c) where
+  fromListOfRawBytes [m1,m2,m3] [b1,b2,b3] = (d1,d2,d3)
+    where
+      !d1 = fromRawBytes (mcdTypeInfo m1) b1
+      !d2 = fromRawBytes (mcdTypeInfo m2) b2
+      !d3 = fromRawBytes (mcdTypeInfo m3) b3
+  fromListOfRawBytes _ _ = error "fromListOfRawBytes: List length must be 3"
+
+instance (Data a, Data b, Data c, Data d) => Row (a,b,c,d) where
+  fromListOfRawBytes [m1,m2,m3,m4] [b1,b2,b3,b4] = (d1,d2,d3,d4)
+    where
+      !d1 = fromRawBytes (mcdTypeInfo m1) b1
+      !d2 = fromRawBytes (mcdTypeInfo m2) b2
+      !d3 = fromRawBytes (mcdTypeInfo m3) b3
+      !d4 = fromRawBytes (mcdTypeInfo m4) b4
+  fromListOfRawBytes _ _ = error "fromListOfRawBytes: List length must be 4"
+
+instance (Data a, Data b, Data c, Data d, Data e) => Row (a,b,c,d,e) where
+  fromListOfRawBytes [m1,m2,m3,m4,m5] [b1,b2,b3,b4,b5] = (d1,d2,d3,d4,d5)
+    where
+      !d1 = fromRawBytes (mcdTypeInfo m1) b1
+      !d2 = fromRawBytes (mcdTypeInfo m2) b2
+      !d3 = fromRawBytes (mcdTypeInfo m3) b3
+      !d4 = fromRawBytes (mcdTypeInfo m4) b4
+      !d5 = fromRawBytes (mcdTypeInfo m5) b5
+  fromListOfRawBytes _ _ = error "fromListOfRawBytes: List length must be 5"
+
+instance (Data a, Data b, Data c, Data d, Data e, Data f) => Row (a,b,c,d,e,f) where
+  fromListOfRawBytes [m1,m2,m3,m4,m5,m6] [b1,b2,b3,b4,b5,b6] = (d1,d2,d3,d4,d5,d6)
+    where
+      !d1 = fromRawBytes (mcdTypeInfo m1) b1
+      !d2 = fromRawBytes (mcdTypeInfo m2) b2
+      !d3 = fromRawBytes (mcdTypeInfo m3) b3
+      !d4 = fromRawBytes (mcdTypeInfo m4) b4
+      !d5 = fromRawBytes (mcdTypeInfo m5) b5
+      !d6 = fromRawBytes (mcdTypeInfo m6) b6
+  fromListOfRawBytes _ _ = error "fromListOfRawBytes: List length must be 6"
+
+instance (Data a, Data b, Data c, Data d, Data e, Data f, Data g) => Row (a,b,c,d,e,f,g) where
+  fromListOfRawBytes [m1,m2,m3,m4,m5,m6,m7] [b1,b2,b3,b4,b5,b6,b7] = (d1,d2,d3,d4,d5,d6,d7)
+    where
+      !d1 = fromRawBytes (mcdTypeInfo m1) b1
+      !d2 = fromRawBytes (mcdTypeInfo m2) b2
+      !d3 = fromRawBytes (mcdTypeInfo m3) b3
+      !d4 = fromRawBytes (mcdTypeInfo m4) b4
+      !d5 = fromRawBytes (mcdTypeInfo m5) b5
+      !d6 = fromRawBytes (mcdTypeInfo m6) b6
+      !d7 = fromRawBytes (mcdTypeInfo m7) b7
+  fromListOfRawBytes _ _ = error "fromListOfRawBytes: List length must be 7"
+
+instance (Data a, Data b, Data c, Data d, Data e, Data f, Data g, Data h) => Row (a,b,c,d,e,f,g,h) where
+  fromListOfRawBytes [m1,m2,m3,m4,m5,m6,m7,m8] [b1,b2,b3,b4,b5,b6,b7,b8] = (d1,d2,d3,d4,d5,d6,d7,d8)
+    where
+      !d1 = fromRawBytes (mcdTypeInfo m1) b1
+      !d2 = fromRawBytes (mcdTypeInfo m2) b2
+      !d3 = fromRawBytes (mcdTypeInfo m3) b3
+      !d4 = fromRawBytes (mcdTypeInfo m4) b4
+      !d5 = fromRawBytes (mcdTypeInfo m5) b5
+      !d6 = fromRawBytes (mcdTypeInfo m6) b6
+      !d7 = fromRawBytes (mcdTypeInfo m7) b7
+      !d8 = fromRawBytes (mcdTypeInfo m8) b8
+  fromListOfRawBytes _ _ = error "fromListOfRawBytes: List length must be 8"
+
+instance (Data a, Data b, Data c, Data d, Data e, Data f, Data g, Data h, Data i) => Row (a,b,c,d,e,f,g,h,i) where
+  fromListOfRawBytes [m1,m2,m3,m4,m5,m6,m7,m8,m9] [b1,b2,b3,b4,b5,b6,b7,b8,b9] = (d1,d2,d3,d4,d5,d6,d7,d8,d9)
+    where
+      !d1 = fromRawBytes (mcdTypeInfo m1) b1
+      !d2 = fromRawBytes (mcdTypeInfo m2) b2
+      !d3 = fromRawBytes (mcdTypeInfo m3) b3
+      !d4 = fromRawBytes (mcdTypeInfo m4) b4
+      !d5 = fromRawBytes (mcdTypeInfo m5) b5
+      !d6 = fromRawBytes (mcdTypeInfo m6) b6
+      !d7 = fromRawBytes (mcdTypeInfo m7) b7
+      !d8 = fromRawBytes (mcdTypeInfo m8) b8
+      !d9 = fromRawBytes (mcdTypeInfo m9) b9
+  fromListOfRawBytes _ _ = error "fromListOfRawBytes: List length must be 9"
+
+instance (Data a, Data b, Data c, Data d, Data e, Data f, Data g, Data h, Data i, Data j) => Row (a,b,c,d,e,f,g,h,i,j) where
+  fromListOfRawBytes [m1,m2,m3,m4,m5,m6,m7,m8,m9,m10] [b1,b2,b3,b4,b5,b6,b7,b8,b9,b10] = (d1,d2,d3,d4,d5,d6,d7,d8,d9,d10)
+    where
+      !d1 = fromRawBytes (mcdTypeInfo m1) b1
+      !d2 = fromRawBytes (mcdTypeInfo m2) b2
+      !d3 = fromRawBytes (mcdTypeInfo m3) b3
+      !d4 = fromRawBytes (mcdTypeInfo m4) b4
+      !d5 = fromRawBytes (mcdTypeInfo m5) b5
+      !d6 = fromRawBytes (mcdTypeInfo m6) b6
+      !d7 = fromRawBytes (mcdTypeInfo m7) b7
+      !d8 = fromRawBytes (mcdTypeInfo m8) b8
+      !d9 = fromRawBytes (mcdTypeInfo m9) b9
+      !d10 = fromRawBytes (mcdTypeInfo m10) b10
+  fromListOfRawBytes _ _ = error "fromListOfRawBytes: List length must be 10"
+
+instance (Data a, Data b, Data c, Data d, Data e, Data f, Data g, Data h, Data i, Data j, Data k) => Row (a,b,c,d,e,f,g,h,i,j,k) where
+  fromListOfRawBytes [m1,m2,m3,m4,m5,m6,m7,m8,m9,m10,m11] [b1,b2,b3,b4,b5,b6,b7,b8,b9,b10,b11]
+    = (d1,d2,d3,d4,d5,d6,d7,d8,d9,d10,d11)
+    where
+      !d1 = fromRawBytes (mcdTypeInfo m1) b1
+      !d2 = fromRawBytes (mcdTypeInfo m2) b2
+      !d3 = fromRawBytes (mcdTypeInfo m3) b3
+      !d4 = fromRawBytes (mcdTypeInfo m4) b4
+      !d5 = fromRawBytes (mcdTypeInfo m5) b5
+      !d6 = fromRawBytes (mcdTypeInfo m6) b6
+      !d7 = fromRawBytes (mcdTypeInfo m7) b7
+      !d8 = fromRawBytes (mcdTypeInfo m8) b8
+      !d9 = fromRawBytes (mcdTypeInfo m9) b9
+      !d10 = fromRawBytes (mcdTypeInfo m10) b10
+      !d11 = fromRawBytes (mcdTypeInfo m11) b11
+  fromListOfRawBytes _ _ = error "fromListOfRawBytes: List length must be 11"
+
+instance (Data a, Data b, Data c, Data d, Data e, Data f, Data g, Data h, Data i, Data j, Data k, Data l) => Row (a,b,c,d,e,f,g,h,i,j,k,l) where
+  fromListOfRawBytes [m1,m2,m3,m4,m5,m6,m7,m8,m9,m10,m11,m12] [b1,b2,b3,b4,b5,b6,b7,b8,b9,b10,b11,b12]
+    = (d1,d2,d3,d4,d5,d6,d7,d8,d9,d10,d11,d12)
+    where
+      !d1 = fromRawBytes (mcdTypeInfo m1) b1
+      !d2 = fromRawBytes (mcdTypeInfo m2) b2
+      !d3 = fromRawBytes (mcdTypeInfo m3) b3
+      !d4 = fromRawBytes (mcdTypeInfo m4) b4
+      !d5 = fromRawBytes (mcdTypeInfo m5) b5
+      !d6 = fromRawBytes (mcdTypeInfo m6) b6
+      !d7 = fromRawBytes (mcdTypeInfo m7) b7
+      !d8 = fromRawBytes (mcdTypeInfo m8) b8
+      !d9 = fromRawBytes (mcdTypeInfo m9) b9
+      !d10 = fromRawBytes (mcdTypeInfo m10) b10
+      !d11 = fromRawBytes (mcdTypeInfo m11) b11
+      !d12 = fromRawBytes (mcdTypeInfo m12) b12
+  fromListOfRawBytes _ _ = error "fromListOfRawBytes: List length must be 12"
+
+instance (Data a, Data b, Data c, Data d, Data e, Data f, Data g, Data h, Data i, Data j, Data k, Data l, Data m) => Row (a,b,c,d,e,f,g,h,i,j,k,l,m) where
+  fromListOfRawBytes [m1,m2,m3,m4,m5,m6,m7,m8,m9,m10,m11,m12,m13] [b1,b2,b3,b4,b5,b6,b7,b8,b9,b10,b11,b12,b13]
+    = (d1,d2,d3,d4,d5,d6,d7,d8,d9,d10,d11,d12,d13)
+    where
+      !d1 = fromRawBytes (mcdTypeInfo m1) b1
+      !d2 = fromRawBytes (mcdTypeInfo m2) b2
+      !d3 = fromRawBytes (mcdTypeInfo m3) b3
+      !d4 = fromRawBytes (mcdTypeInfo m4) b4
+      !d5 = fromRawBytes (mcdTypeInfo m5) b5
+      !d6 = fromRawBytes (mcdTypeInfo m6) b6
+      !d7 = fromRawBytes (mcdTypeInfo m7) b7
+      !d8 = fromRawBytes (mcdTypeInfo m8) b8
+      !d9 = fromRawBytes (mcdTypeInfo m9) b9
+      !d10 = fromRawBytes (mcdTypeInfo m10) b10
+      !d11 = fromRawBytes (mcdTypeInfo m11) b11
+      !d12 = fromRawBytes (mcdTypeInfo m12) b12
+      !d13 = fromRawBytes (mcdTypeInfo m13) b13
+  fromListOfRawBytes _ _ = error "fromListOfRawBytes: List length must be 13"
+
+instance (Data a, Data b, Data c, Data d, Data e, Data f, Data g, Data h, Data i, Data j, Data k, Data l, Data m, Data n) => Row (a,b,c,d,e,f,g,h,i,j,k,l,m,n) where
+  fromListOfRawBytes [m1,m2,m3,m4,m5,m6,m7,m8,m9,m10,m11,m12,m13,m14] [b1,b2,b3,b4,b5,b6,b7,b8,b9,b10,b11,b12,b13,b14]
+    = (d1,d2,d3,d4,d5,d6,d7,d8,d9,d10,d11,d12,d13,d14)
+    where
+      !d1 = fromRawBytes (mcdTypeInfo m1) b1
+      !d2 = fromRawBytes (mcdTypeInfo m2) b2
+      !d3 = fromRawBytes (mcdTypeInfo m3) b3
+      !d4 = fromRawBytes (mcdTypeInfo m4) b4
+      !d5 = fromRawBytes (mcdTypeInfo m5) b5
+      !d6 = fromRawBytes (mcdTypeInfo m6) b6
+      !d7 = fromRawBytes (mcdTypeInfo m7) b7
+      !d8 = fromRawBytes (mcdTypeInfo m8) b8
+      !d9 = fromRawBytes (mcdTypeInfo m9) b9
+      !d10 = fromRawBytes (mcdTypeInfo m10) b10
+      !d11 = fromRawBytes (mcdTypeInfo m11) b11
+      !d12 = fromRawBytes (mcdTypeInfo m12) b12
+      !d13 = fromRawBytes (mcdTypeInfo m13) b13
+      !d14 = fromRawBytes (mcdTypeInfo m14) b14
+  fromListOfRawBytes _ _ = error "fromListOfRawBytes: List length must be 14"
+
+instance (Data a, Data b, Data c, Data d, Data e, Data f, Data g, Data h, Data i, Data j, Data k, Data l, Data m, Data n, Data o) =>
+         Row (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o) where
+  fromListOfRawBytes [m1,m2,m3,m4,m5,m6,m7,m8,m9,m10,m11,m12,m13,m14,m15] [b1,b2,b3,b4,b5,b6,b7,b8,b9,b10,b11,b12,b13,b14,b15]
+    = (d1,d2,d3,d4,d5,d6,d7,d8,d9,d10,d11,d12,d13,d14,d15)
+    where
+      !d1 = fromRawBytes (mcdTypeInfo m1) b1
+      !d2 = fromRawBytes (mcdTypeInfo m2) b2
+      !d3 = fromRawBytes (mcdTypeInfo m3) b3
+      !d4 = fromRawBytes (mcdTypeInfo m4) b4
+      !d5 = fromRawBytes (mcdTypeInfo m5) b5
+      !d6 = fromRawBytes (mcdTypeInfo m6) b6
+      !d7 = fromRawBytes (mcdTypeInfo m7) b7
+      !d8 = fromRawBytes (mcdTypeInfo m8) b8
+      !d9 = fromRawBytes (mcdTypeInfo m9) b9
+      !d10 = fromRawBytes (mcdTypeInfo m10) b10
+      !d11 = fromRawBytes (mcdTypeInfo m11) b11
+      !d12 = fromRawBytes (mcdTypeInfo m12) b12
+      !d13 = fromRawBytes (mcdTypeInfo m13) b13
+      !d14 = fromRawBytes (mcdTypeInfo m14) b14
+      !d15 = fromRawBytes (mcdTypeInfo m15) b15
+  fromListOfRawBytes _ _ = error "fromListOfRawBytes: List length must be 15"
+
+instance (Data a, Data b, Data c, Data d, Data e, Data f, Data g, Data h, Data i, Data j, Data k, Data l, Data m, Data n, Data o, Data p) =>
+         Row (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p) where
+  fromListOfRawBytes [m1,m2,m3,m4,m5,m6,m7,m8,m9,m10,m11,m12,m13,m14,m15,m16] [b1,b2,b3,b4,b5,b6,b7,b8,b9,b10,b11,b12,b13,b14,b15,b16]
+    = (d1,d2,d3,d4,d5,d6,d7,d8,d9,d10,d11,d12,d13,d14,d15,d16)
+    where
+      !d1 = fromRawBytes (mcdTypeInfo m1) b1
+      !d2 = fromRawBytes (mcdTypeInfo m2) b2
+      !d3 = fromRawBytes (mcdTypeInfo m3) b3
+      !d4 = fromRawBytes (mcdTypeInfo m4) b4
+      !d5 = fromRawBytes (mcdTypeInfo m5) b5
+      !d6 = fromRawBytes (mcdTypeInfo m6) b6
+      !d7 = fromRawBytes (mcdTypeInfo m7) b7
+      !d8 = fromRawBytes (mcdTypeInfo m8) b8
+      !d9 = fromRawBytes (mcdTypeInfo m9) b9
+      !d10 = fromRawBytes (mcdTypeInfo m10) b10
+      !d11 = fromRawBytes (mcdTypeInfo m11) b11
+      !d12 = fromRawBytes (mcdTypeInfo m12) b12
+      !d13 = fromRawBytes (mcdTypeInfo m13) b13
+      !d14 = fromRawBytes (mcdTypeInfo m14) b14
+      !d15 = fromRawBytes (mcdTypeInfo m15) b15
+      !d16 = fromRawBytes (mcdTypeInfo m16) b16
+  fromListOfRawBytes _ _ = error "fromListOfRawBytes: List length must be 16"
+
+instance (Data a, Data b, Data c, Data d, Data e, Data f, Data g, Data h, Data i, Data j, Data k, Data l, Data m, Data n, Data o, Data p, Data q) =>
+         Row (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q) where
+  fromListOfRawBytes [m1,m2,m3,m4,m5,m6,m7,m8,m9,m10,m11,m12,m13,m14,m15,m16,m17] [b1,b2,b3,b4,b5,b6,b7,b8,b9,b10,b11,b12,b13,b14,b15,b16,b17]
+    = (d1,d2,d3,d4,d5,d6,d7,d8,d9,d10,d11,d12,d13,d14,d15,d16,d17)
+    where
+      !d1 = fromRawBytes (mcdTypeInfo m1) b1
+      !d2 = fromRawBytes (mcdTypeInfo m2) b2
+      !d3 = fromRawBytes (mcdTypeInfo m3) b3
+      !d4 = fromRawBytes (mcdTypeInfo m4) b4
+      !d5 = fromRawBytes (mcdTypeInfo m5) b5
+      !d6 = fromRawBytes (mcdTypeInfo m6) b6
+      !d7 = fromRawBytes (mcdTypeInfo m7) b7
+      !d8 = fromRawBytes (mcdTypeInfo m8) b8
+      !d9 = fromRawBytes (mcdTypeInfo m9) b9
+      !d10 = fromRawBytes (mcdTypeInfo m10) b10
+      !d11 = fromRawBytes (mcdTypeInfo m11) b11
+      !d12 = fromRawBytes (mcdTypeInfo m12) b12
+      !d13 = fromRawBytes (mcdTypeInfo m13) b13
+      !d14 = fromRawBytes (mcdTypeInfo m14) b14
+      !d15 = fromRawBytes (mcdTypeInfo m15) b15
+      !d16 = fromRawBytes (mcdTypeInfo m16) b16
+      !d17 = fromRawBytes (mcdTypeInfo m17) b17
+  fromListOfRawBytes _ _ = error "fromListOfRawBytes: List length must be 17"
+
+instance (Data a, Data b, Data c, Data d, Data e, Data f, Data g, Data h, Data i, Data j, Data k, Data l, Data m, Data n, Data o, Data p, Data q, Data r) =>
+         Row (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r) where
+  fromListOfRawBytes [m1,m2,m3,m4,m5,m6,m7,m8,m9,m10,m11,m12,m13,m14,m15,m16,m17,m18] [b1,b2,b3,b4,b5,b6,b7,b8,b9,b10,b11,b12,b13,b14,b15,b16,b17,b18]
+    = (d1,d2,d3,d4,d5,d6,d7,d8,d9,d10,d11,d12,d13,d14,d15,d16,d17,d18)
+    where
+      !d1 = fromRawBytes (mcdTypeInfo m1) b1
+      !d2 = fromRawBytes (mcdTypeInfo m2) b2
+      !d3 = fromRawBytes (mcdTypeInfo m3) b3
+      !d4 = fromRawBytes (mcdTypeInfo m4) b4
+      !d5 = fromRawBytes (mcdTypeInfo m5) b5
+      !d6 = fromRawBytes (mcdTypeInfo m6) b6
+      !d7 = fromRawBytes (mcdTypeInfo m7) b7
+      !d8 = fromRawBytes (mcdTypeInfo m8) b8
+      !d9 = fromRawBytes (mcdTypeInfo m9) b9
+      !d10 = fromRawBytes (mcdTypeInfo m10) b10
+      !d11 = fromRawBytes (mcdTypeInfo m11) b11
+      !d12 = fromRawBytes (mcdTypeInfo m12) b12
+      !d13 = fromRawBytes (mcdTypeInfo m13) b13
+      !d14 = fromRawBytes (mcdTypeInfo m14) b14
+      !d15 = fromRawBytes (mcdTypeInfo m15) b15
+      !d16 = fromRawBytes (mcdTypeInfo m16) b16
+      !d17 = fromRawBytes (mcdTypeInfo m17) b17
+      !d18 = fromRawBytes (mcdTypeInfo m18) b18
+  fromListOfRawBytes _ _ = error "fromListOfRawBytes: List length must be 18"
+
+instance (Data a, Data b, Data c, Data d, Data e, Data f, Data g, Data h, Data i, Data j, Data k, Data l, Data m, Data n, Data o, Data p, Data q, Data r, Data s) =>
+         Row (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s) where
+  fromListOfRawBytes [m1,m2,m3,m4,m5,m6,m7,m8,m9,m10,m11,m12,m13,m14,m15,m16,m17,m18,m19] [b1,b2,b3,b4,b5,b6,b7,b8,b9,b10,b11,b12,b13,b14,b15,b16,b17,b18,b19]
+    = (d1,d2,d3,d4,d5,d6,d7,d8,d9,d10,d11,d12,d13,d14,d15,d16,d17,d18,d19)
+    where
+      !d1 = fromRawBytes (mcdTypeInfo m1) b1
+      !d2 = fromRawBytes (mcdTypeInfo m2) b2
+      !d3 = fromRawBytes (mcdTypeInfo m3) b3
+      !d4 = fromRawBytes (mcdTypeInfo m4) b4
+      !d5 = fromRawBytes (mcdTypeInfo m5) b5
+      !d6 = fromRawBytes (mcdTypeInfo m6) b6
+      !d7 = fromRawBytes (mcdTypeInfo m7) b7
+      !d8 = fromRawBytes (mcdTypeInfo m8) b8
+      !d9 = fromRawBytes (mcdTypeInfo m9) b9
+      !d10 = fromRawBytes (mcdTypeInfo m10) b10
+      !d11 = fromRawBytes (mcdTypeInfo m11) b11
+      !d12 = fromRawBytes (mcdTypeInfo m12) b12
+      !d13 = fromRawBytes (mcdTypeInfo m13) b13
+      !d14 = fromRawBytes (mcdTypeInfo m14) b14
+      !d15 = fromRawBytes (mcdTypeInfo m15) b15
+      !d16 = fromRawBytes (mcdTypeInfo m16) b16
+      !d17 = fromRawBytes (mcdTypeInfo m17) b17
+      !d18 = fromRawBytes (mcdTypeInfo m18) b18
+      !d19 = fromRawBytes (mcdTypeInfo m19) b19
+  fromListOfRawBytes _ _ = error "fromListOfRawBytes: List length must be 19"
+
+instance (Data a, Data b, Data c, Data d, Data e, Data f, Data g, Data h, Data i, Data j, Data k, Data l, Data m, Data n, Data o, Data p, Data q, Data r, Data s
+         , Data t) =>
+         Row (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t) where
+  fromListOfRawBytes [m1,m2,m3,m4,m5,m6,m7,m8,m9,m10,m11,m12,m13,m14,m15,m16,m17,m18,m19,m20] [b1,b2,b3,b4,b5,b6,b7,b8,b9,b10,b11,b12,b13,b14,b15,b16,b17,b18,b19,b20]
+    = (d1,d2,d3,d4,d5,d6,d7,d8,d9,d10,d11,d12,d13,d14,d15,d16,d17,d18,d19,d20)
+    where
+      !d1 = fromRawBytes (mcdTypeInfo m1) b1
+      !d2 = fromRawBytes (mcdTypeInfo m2) b2
+      !d3 = fromRawBytes (mcdTypeInfo m3) b3
+      !d4 = fromRawBytes (mcdTypeInfo m4) b4
+      !d5 = fromRawBytes (mcdTypeInfo m5) b5
+      !d6 = fromRawBytes (mcdTypeInfo m6) b6
+      !d7 = fromRawBytes (mcdTypeInfo m7) b7
+      !d8 = fromRawBytes (mcdTypeInfo m8) b8
+      !d9 = fromRawBytes (mcdTypeInfo m9) b9
+      !d10 = fromRawBytes (mcdTypeInfo m10) b10
+      !d11 = fromRawBytes (mcdTypeInfo m11) b11
+      !d12 = fromRawBytes (mcdTypeInfo m12) b12
+      !d13 = fromRawBytes (mcdTypeInfo m13) b13
+      !d14 = fromRawBytes (mcdTypeInfo m14) b14
+      !d15 = fromRawBytes (mcdTypeInfo m15) b15
+      !d16 = fromRawBytes (mcdTypeInfo m16) b16
+      !d17 = fromRawBytes (mcdTypeInfo m17) b17
+      !d18 = fromRawBytes (mcdTypeInfo m18) b18
+      !d19 = fromRawBytes (mcdTypeInfo m19) b19
+      !d20 = fromRawBytes (mcdTypeInfo m20) b20
+  fromListOfRawBytes _ _ = error "fromListOfRawBytes: List length must be 20"
+
+instance (Data a, Data b, Data c, Data d, Data e, Data f, Data g, Data h, Data i, Data j, Data k, Data l, Data m, Data n, Data o, Data p, Data q, Data r, Data s
+         , Data t, Data u) =>
+         Row (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u) where
+  fromListOfRawBytes [m1,m2,m3,m4,m5,m6,m7,m8,m9,m10,m11,m12,m13,m14,m15,m16,m17,m18,m19,m20,m21] [b1,b2,b3,b4,b5,b6,b7,b8,b9,b10,b11,b12,b13,b14,b15,b16,b17,b18,b19,b20,b21]
+    = (d1,d2,d3,d4,d5,d6,d7,d8,d9,d10,d11,d12,d13,d14,d15,d16,d17,d18,d19,d20,d21)
+    where
+      !d1 = fromRawBytes (mcdTypeInfo m1) b1
+      !d2 = fromRawBytes (mcdTypeInfo m2) b2
+      !d3 = fromRawBytes (mcdTypeInfo m3) b3
+      !d4 = fromRawBytes (mcdTypeInfo m4) b4
+      !d5 = fromRawBytes (mcdTypeInfo m5) b5
+      !d6 = fromRawBytes (mcdTypeInfo m6) b6
+      !d7 = fromRawBytes (mcdTypeInfo m7) b7
+      !d8 = fromRawBytes (mcdTypeInfo m8) b8
+      !d9 = fromRawBytes (mcdTypeInfo m9) b9
+      !d10 = fromRawBytes (mcdTypeInfo m10) b10
+      !d11 = fromRawBytes (mcdTypeInfo m11) b11
+      !d12 = fromRawBytes (mcdTypeInfo m12) b12
+      !d13 = fromRawBytes (mcdTypeInfo m13) b13
+      !d14 = fromRawBytes (mcdTypeInfo m14) b14
+      !d15 = fromRawBytes (mcdTypeInfo m15) b15
+      !d16 = fromRawBytes (mcdTypeInfo m16) b16
+      !d17 = fromRawBytes (mcdTypeInfo m17) b17
+      !d18 = fromRawBytes (mcdTypeInfo m18) b18
+      !d19 = fromRawBytes (mcdTypeInfo m19) b19
+      !d20 = fromRawBytes (mcdTypeInfo m20) b20
+      !d21 = fromRawBytes (mcdTypeInfo m21) b21
+  fromListOfRawBytes _ _ = error "fromListOfRawBytes: List length must be 21"
+
+instance (Data a, Data b, Data c, Data d, Data e, Data f, Data g, Data h, Data i, Data j, Data k, Data l, Data m, Data n, Data o, Data p, Data q, Data r, Data s
+         , Data t, Data u, Data v) =>
+         Row (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v) where
+  fromListOfRawBytes [m1,m2,m3,m4,m5,m6,m7,m8,m9,m10,m11,m12,m13,m14,m15,m16,m17,m18,m19,m20,m21,m22] [b1,b2,b3,b4,b5,b6,b7,b8,b9,b10,b11,b12,b13,b14,b15,b16,b17,b18,b19,b20,b21,b22]
+    = (d1,d2,d3,d4,d5,d6,d7,d8,d9,d10,d11,d12,d13,d14,d15,d16,d17,d18,d19,d20,d21,d22)
+    where
+      !d1 = fromRawBytes (mcdTypeInfo m1) b1
+      !d2 = fromRawBytes (mcdTypeInfo m2) b2
+      !d3 = fromRawBytes (mcdTypeInfo m3) b3
+      !d4 = fromRawBytes (mcdTypeInfo m4) b4
+      !d5 = fromRawBytes (mcdTypeInfo m5) b5
+      !d6 = fromRawBytes (mcdTypeInfo m6) b6
+      !d7 = fromRawBytes (mcdTypeInfo m7) b7
+      !d8 = fromRawBytes (mcdTypeInfo m8) b8
+      !d9 = fromRawBytes (mcdTypeInfo m9) b9
+      !d10 = fromRawBytes (mcdTypeInfo m10) b10
+      !d11 = fromRawBytes (mcdTypeInfo m11) b11
+      !d12 = fromRawBytes (mcdTypeInfo m12) b12
+      !d13 = fromRawBytes (mcdTypeInfo m13) b13
+      !d14 = fromRawBytes (mcdTypeInfo m14) b14
+      !d15 = fromRawBytes (mcdTypeInfo m15) b15
+      !d16 = fromRawBytes (mcdTypeInfo m16) b16
+      !d17 = fromRawBytes (mcdTypeInfo m17) b17
+      !d18 = fromRawBytes (mcdTypeInfo m18) b18
+      !d19 = fromRawBytes (mcdTypeInfo m19) b19
+      !d20 = fromRawBytes (mcdTypeInfo m20) b20
+      !d21 = fromRawBytes (mcdTypeInfo m21) b21
+      !d22 = fromRawBytes (mcdTypeInfo m22) b22
+  fromListOfRawBytes _ _ = error "fromListOfRawBytes: List length must be 22"
+
+instance (Data a, Data b, Data c, Data d, Data e, Data f, Data g, Data h, Data i, Data j, Data k, Data l, Data m, Data n, Data o, Data p, Data q, Data r, Data s
+         , Data t, Data u, Data v, Data w) =>
+         Row (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w) where
+  fromListOfRawBytes [m1,m2,m3,m4,m5,m6,m7,m8,m9,m10,m11,m12,m13,m14,m15,m16,m17,m18,m19,m20,m21,m22,m23] [b1,b2,b3,b4,b5,b6,b7,b8,b9,b10,b11,b12,b13,b14,b15,b16,b17,b18,b19,b20,b21,b22,b23]
+    = (d1,d2,d3,d4,d5,d6,d7,d8,d9,d10,d11,d12,d13,d14,d15,d16,d17,d18,d19,d20,d21,d22,d23)
+    where
+      !d1 = fromRawBytes (mcdTypeInfo m1) b1
+      !d2 = fromRawBytes (mcdTypeInfo m2) b2
+      !d3 = fromRawBytes (mcdTypeInfo m3) b3
+      !d4 = fromRawBytes (mcdTypeInfo m4) b4
+      !d5 = fromRawBytes (mcdTypeInfo m5) b5
+      !d6 = fromRawBytes (mcdTypeInfo m6) b6
+      !d7 = fromRawBytes (mcdTypeInfo m7) b7
+      !d8 = fromRawBytes (mcdTypeInfo m8) b8
+      !d9 = fromRawBytes (mcdTypeInfo m9) b9
+      !d10 = fromRawBytes (mcdTypeInfo m10) b10
+      !d11 = fromRawBytes (mcdTypeInfo m11) b11
+      !d12 = fromRawBytes (mcdTypeInfo m12) b12
+      !d13 = fromRawBytes (mcdTypeInfo m13) b13
+      !d14 = fromRawBytes (mcdTypeInfo m14) b14
+      !d15 = fromRawBytes (mcdTypeInfo m15) b15
+      !d16 = fromRawBytes (mcdTypeInfo m16) b16
+      !d17 = fromRawBytes (mcdTypeInfo m17) b17
+      !d18 = fromRawBytes (mcdTypeInfo m18) b18
+      !d19 = fromRawBytes (mcdTypeInfo m19) b19
+      !d20 = fromRawBytes (mcdTypeInfo m20) b20
+      !d21 = fromRawBytes (mcdTypeInfo m21) b21
+      !d22 = fromRawBytes (mcdTypeInfo m22) b22
+      !d23 = fromRawBytes (mcdTypeInfo m23) b23
+  fromListOfRawBytes _ _ = error "fromListOfRawBytes: List length must be 23"
+
+instance (Data a, Data b, Data c, Data d, Data e, Data f, Data g, Data h, Data i, Data j, Data k, Data l, Data m, Data n, Data o, Data p, Data q, Data r, Data s
+         , Data t, Data u, Data v, Data w, Data x) =>
+         Row (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x) where
+  fromListOfRawBytes [m1,m2,m3,m4,m5,m6,m7,m8,m9,m10,m11,m12,m13,m14,m15,m16,m17,m18,m19,m20,m21,m22,m23,m24] [b1,b2,b3,b4,b5,b6,b7,b8,b9,b10,b11,b12,b13,b14,b15,b16,b17,b18,b19,b20,b21,b22,b23,b24]
+    = (d1,d2,d3,d4,d5,d6,d7,d8,d9,d10,d11,d12,d13,d14,d15,d16,d17,d18,d19,d20,d21,d22,d23,d24)
+    where
+      !d1 = fromRawBytes (mcdTypeInfo m1) b1
+      !d2 = fromRawBytes (mcdTypeInfo m2) b2
+      !d3 = fromRawBytes (mcdTypeInfo m3) b3
+      !d4 = fromRawBytes (mcdTypeInfo m4) b4
+      !d5 = fromRawBytes (mcdTypeInfo m5) b5
+      !d6 = fromRawBytes (mcdTypeInfo m6) b6
+      !d7 = fromRawBytes (mcdTypeInfo m7) b7
+      !d8 = fromRawBytes (mcdTypeInfo m8) b8
+      !d9 = fromRawBytes (mcdTypeInfo m9) b9
+      !d10 = fromRawBytes (mcdTypeInfo m10) b10
+      !d11 = fromRawBytes (mcdTypeInfo m11) b11
+      !d12 = fromRawBytes (mcdTypeInfo m12) b12
+      !d13 = fromRawBytes (mcdTypeInfo m13) b13
+      !d14 = fromRawBytes (mcdTypeInfo m14) b14
+      !d15 = fromRawBytes (mcdTypeInfo m15) b15
+      !d16 = fromRawBytes (mcdTypeInfo m16) b16
+      !d17 = fromRawBytes (mcdTypeInfo m17) b17
+      !d18 = fromRawBytes (mcdTypeInfo m18) b18
+      !d19 = fromRawBytes (mcdTypeInfo m19) b19
+      !d20 = fromRawBytes (mcdTypeInfo m20) b20
+      !d21 = fromRawBytes (mcdTypeInfo m21) b21
+      !d22 = fromRawBytes (mcdTypeInfo m22) b22
+      !d23 = fromRawBytes (mcdTypeInfo m23) b23
+      !d24 = fromRawBytes (mcdTypeInfo m24) b24
+  fromListOfRawBytes _ _ = error "fromListOfRawBytes: List length must be 24"
+
+instance (Data a, Data b, Data c, Data d, Data e, Data f, Data g, Data h, Data i, Data j, Data k, Data l, Data m, Data n, Data o, Data p, Data q, Data r, Data s
+         , Data t, Data u, Data v, Data w, Data x, Data y) =>
+         Row (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y) where
+  fromListOfRawBytes [m1,m2,m3,m4,m5,m6,m7,m8,m9,m10,m11,m12,m13,m14,m15,m16,m17,m18,m19,m20,m21,m22,m23,m24,m25] [b1,b2,b3,b4,b5,b6,b7,b8,b9,b10,b11,b12,b13,b14,b15,b16,b17,b18,b19,b20,b21,b22,b23,b24,b25]
+    = (d1,d2,d3,d4,d5,d6,d7,d8,d9,d10,d11,d12,d13,d14,d15,d16,d17,d18,d19,d20,d21,d22,d23,d24,d25)
+    where
+      !d1 = fromRawBytes (mcdTypeInfo m1) b1
+      !d2 = fromRawBytes (mcdTypeInfo m2) b2
+      !d3 = fromRawBytes (mcdTypeInfo m3) b3
+      !d4 = fromRawBytes (mcdTypeInfo m4) b4
+      !d5 = fromRawBytes (mcdTypeInfo m5) b5
+      !d6 = fromRawBytes (mcdTypeInfo m6) b6
+      !d7 = fromRawBytes (mcdTypeInfo m7) b7
+      !d8 = fromRawBytes (mcdTypeInfo m8) b8
+      !d9 = fromRawBytes (mcdTypeInfo m9) b9
+      !d10 = fromRawBytes (mcdTypeInfo m10) b10
+      !d11 = fromRawBytes (mcdTypeInfo m11) b11
+      !d12 = fromRawBytes (mcdTypeInfo m12) b12
+      !d13 = fromRawBytes (mcdTypeInfo m13) b13
+      !d14 = fromRawBytes (mcdTypeInfo m14) b14
+      !d15 = fromRawBytes (mcdTypeInfo m15) b15
+      !d16 = fromRawBytes (mcdTypeInfo m16) b16
+      !d17 = fromRawBytes (mcdTypeInfo m17) b17
+      !d18 = fromRawBytes (mcdTypeInfo m18) b18
+      !d19 = fromRawBytes (mcdTypeInfo m19) b19
+      !d20 = fromRawBytes (mcdTypeInfo m20) b20
+      !d21 = fromRawBytes (mcdTypeInfo m21) b21
+      !d22 = fromRawBytes (mcdTypeInfo m22) b22
+      !d23 = fromRawBytes (mcdTypeInfo m23) b23
+      !d24 = fromRawBytes (mcdTypeInfo m24) b24
+      !d25 = fromRawBytes (mcdTypeInfo m25) b25
+  fromListOfRawBytes _ _ = error "fromListOfRawBytes: List length must be 25"
+
+instance (Data a, Data b, Data c, Data d, Data e, Data f, Data g, Data h, Data i, Data j, Data k, Data l, Data m, Data n, Data o, Data p, Data q, Data r, Data s
+         , Data t, Data u, Data v, Data w, Data x, Data y, Data z) =>
+         Row (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z) where
+  fromListOfRawBytes [m1,m2,m3,m4,m5,m6,m7,m8,m9,m10,m11,m12,m13,m14,m15,m16,m17,m18,m19,m20,m21,m22,m23,m24,m25,m26] [b1,b2,b3,b4,b5,b6,b7,b8,b9,b10,b11,b12,b13,b14,b15,b16,b17,b18,b19,b20,b21,b22,b23,b24,b25,b26]
+    = (d1,d2,d3,d4,d5,d6,d7,d8,d9,d10,d11,d12,d13,d14,d15,d16,d17,d18,d19,d20,d21,d22,d23,d24,d25,d26)
+    where
+      !d1 = fromRawBytes (mcdTypeInfo m1) b1
+      !d2 = fromRawBytes (mcdTypeInfo m2) b2
+      !d3 = fromRawBytes (mcdTypeInfo m3) b3
+      !d4 = fromRawBytes (mcdTypeInfo m4) b4
+      !d5 = fromRawBytes (mcdTypeInfo m5) b5
+      !d6 = fromRawBytes (mcdTypeInfo m6) b6
+      !d7 = fromRawBytes (mcdTypeInfo m7) b7
+      !d8 = fromRawBytes (mcdTypeInfo m8) b8
+      !d9 = fromRawBytes (mcdTypeInfo m9) b9
+      !d10 = fromRawBytes (mcdTypeInfo m10) b10
+      !d11 = fromRawBytes (mcdTypeInfo m11) b11
+      !d12 = fromRawBytes (mcdTypeInfo m12) b12
+      !d13 = fromRawBytes (mcdTypeInfo m13) b13
+      !d14 = fromRawBytes (mcdTypeInfo m14) b14
+      !d15 = fromRawBytes (mcdTypeInfo m15) b15
+      !d16 = fromRawBytes (mcdTypeInfo m16) b16
+      !d17 = fromRawBytes (mcdTypeInfo m17) b17
+      !d18 = fromRawBytes (mcdTypeInfo m18) b18
+      !d19 = fromRawBytes (mcdTypeInfo m19) b19
+      !d20 = fromRawBytes (mcdTypeInfo m20) b20
+      !d21 = fromRawBytes (mcdTypeInfo m21) b21
+      !d22 = fromRawBytes (mcdTypeInfo m22) b22
+      !d23 = fromRawBytes (mcdTypeInfo m23) b23
+      !d24 = fromRawBytes (mcdTypeInfo m24) b24
+      !d25 = fromRawBytes (mcdTypeInfo m25) b25
+      !d26 = fromRawBytes (mcdTypeInfo m26) b26
+  fromListOfRawBytes _ _ = error "fromListOfRawBytes: List length must be 26"
+
+
diff --git a/src/Database/MSSQLServer/Query/RpcQuerySet.hs b/src/Database/MSSQLServer/Query/RpcQuerySet.hs
new file mode 100644
--- /dev/null
+++ b/src/Database/MSSQLServer/Query/RpcQuerySet.hs
@@ -0,0 +1,221 @@
+{-# OPTIONS_HADDOCK hide #-}
+{-# LANGUAGE BangPatterns #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE BinaryLiterals #-}
+
+
+module Database.MSSQLServer.Query.RpcQuerySet ( RpcQuerySet (..)
+                                              , RpcQuery (..)
+                                              , RpcQueryId (..)
+                                              , StoredProcedure (..)
+                                              , RpcParamSet (..)
+                                              , RpcParam (..)
+                                              , RpcParamName
+                                              ) where
+
+
+import qualified Data.Text as T
+import Data.Word (Word16(..))
+
+import Database.Tds.Message
+import Database.MSSQLServer.Query.Only
+
+
+
+class RpcQuerySet a where
+  toRpcRequest :: a -> RpcRequest
+
+instance (RpcQueryId a1, RpcParamSet b1) => RpcQuerySet (RpcQuery a1 b1) where
+  toRpcRequest (RpcQuery a1 b1) = RpcRequest [r1]
+    where
+      !r1 = toRpcReqBatch a1 b1
+
+instance (RpcQueryId a1, RpcParamSet b1, RpcQueryId a2, RpcParamSet b2) => RpcQuerySet (RpcQuery a1 b1, RpcQuery a2 b2) where
+  toRpcRequest (RpcQuery a1 b1,RpcQuery a2 b2) = RpcRequest [r1,r2]
+    where
+      !r1 = toRpcReqBatch a1 b1
+      !r2 = toRpcReqBatch a2 b2
+
+instance (RpcQueryId a1, RpcParamSet b1, RpcQueryId a2, RpcParamSet b2, RpcQueryId a3, RpcParamSet b3) => RpcQuerySet (RpcQuery a1 b1, RpcQuery a2 b2, RpcQuery a3 b3) where
+  toRpcRequest (RpcQuery a1 b1,RpcQuery a2 b2,RpcQuery a3 b3) = RpcRequest [r1,r2,r3]
+    where
+      !r1 = toRpcReqBatch a1 b1
+      !r2 = toRpcReqBatch a2 b2
+      !r3 = toRpcReqBatch a3 b3
+
+instance (RpcQueryId a1, RpcParamSet b1, RpcQueryId a2, RpcParamSet b2, RpcQueryId a3, RpcParamSet b3, RpcQueryId a4, RpcParamSet b4) =>
+         RpcQuerySet (RpcQuery a1 b1, RpcQuery a2 b2, RpcQuery a3 b3, RpcQuery a4 b4) where
+  toRpcRequest (RpcQuery a1 b1,RpcQuery a2 b2,RpcQuery a3 b3,RpcQuery a4 b4) = RpcRequest [r1,r2,r3,r4]
+    where
+      !r1 = toRpcReqBatch a1 b1
+      !r2 = toRpcReqBatch a2 b2
+      !r3 = toRpcReqBatch a3 b3
+      !r4 = toRpcReqBatch a4 b4
+
+instance (RpcQueryId a1, RpcParamSet b1, RpcQueryId a2, RpcParamSet b2, RpcQueryId a3, RpcParamSet b3, RpcQueryId a4, RpcParamSet b4, RpcQueryId a5, RpcParamSet b5) =>
+         RpcQuerySet (RpcQuery a1 b1, RpcQuery a2 b2, RpcQuery a3 b3, RpcQuery a4 b4, RpcQuery a5 b5) where
+  toRpcRequest (RpcQuery a1 b1,RpcQuery a2 b2,RpcQuery a3 b3,RpcQuery a4 b4,RpcQuery a5 b5) = RpcRequest [r1,r2,r3,r4,r5]
+    where
+      !r1 = toRpcReqBatch a1 b1
+      !r2 = toRpcReqBatch a2 b2
+      !r3 = toRpcReqBatch a3 b3
+      !r4 = toRpcReqBatch a4 b4
+      !r5 = toRpcReqBatch a5 b5
+
+
+
+data RpcQuery a b = RpcQuery a b
+                  deriving (Show)
+
+class RpcQueryId a where
+  toRpcReqBatch :: (RpcParamSet b) => a -> b -> RpcReqBatch
+
+instance RpcQueryId Word16 where
+  toRpcReqBatch id ps = RpcReqBatchProcId id 0x0000 $ toRpcReqBatchParams ps
+  
+instance RpcQueryId T.Text where
+  toRpcReqBatch name ps = RpcReqBatchProcName name 0x0000 $ toRpcReqBatchParams ps
+
+data StoredProcedure = SP_Cursor 
+                     | SP_CursorOpen
+                     | SP_CursorPrepare
+                     | SP_CursorExecute
+                     | SP_CursorPrepExec
+                     | SP_CursorUnprepare
+                     | SP_CursorFetch
+                     | SP_CursorOption
+                     | SP_CursorClose
+                     | SP_ExecuteSql
+                     | SP_Prepare
+                     | SP_Execute
+                     | SP_PrepExec
+                     | SP_PrepExecRpc
+                     | SP_Unprepare
+                     deriving (Show,Enum,Bounded)
+
+instance RpcQueryId StoredProcedure where
+  toRpcReqBatch sp ps = RpcReqBatchProcId (fromIntegral $ (fromEnum sp) +1) 0x0000 $ toRpcReqBatchParams ps
+
+
+class RpcParamSet a where
+  toRpcReqBatchParams :: a -> [RpcReqBatchParam]
+  
+instance RpcParamSet () where
+  toRpcReqBatchParams _ = []
+
+instance (Data a) => RpcParamSet (RpcParam a) where
+  toRpcReqBatchParams v1 = [b1]
+    where
+      !b1 = rpcReqBatchParam v1
+
+instance (Data a, Data b) => RpcParamSet (RpcParam a, RpcParam b) where
+  toRpcReqBatchParams (v1,v2) = [b1,b2]
+    where
+      !b1 = rpcReqBatchParam v1
+      !b2 = rpcReqBatchParam v2
+
+instance (Data a, Data b, Data c) => RpcParamSet (RpcParam a, RpcParam b, RpcParam c) where
+  toRpcReqBatchParams (v1,v2,v3) = [b1,b2,b3]
+    where
+      !b1 = rpcReqBatchParam v1
+      !b2 = rpcReqBatchParam v2
+      !b3 = rpcReqBatchParam v3
+
+instance (Data a, Data b, Data c, Data d) => RpcParamSet (RpcParam a, RpcParam b, RpcParam c, RpcParam d) where
+  toRpcReqBatchParams (v1,v2,v3,v4) = [b1,b2,b3,b4]
+    where
+      !b1 = rpcReqBatchParam v1
+      !b2 = rpcReqBatchParam v2
+      !b3 = rpcReqBatchParam v3
+      !b4 = rpcReqBatchParam v4
+
+instance (Data a, Data b, Data c, Data d, Data e) => RpcParamSet (RpcParam a, RpcParam b, RpcParam c, RpcParam d, RpcParam e) where
+  toRpcReqBatchParams (v1,v2,v3,v4,v5) = [b1,b2,b3,b4,b5]
+    where
+      !b1 = rpcReqBatchParam v1
+      !b2 = rpcReqBatchParam v2
+      !b3 = rpcReqBatchParam v3
+      !b4 = rpcReqBatchParam v4
+      !b5 = rpcReqBatchParam v5
+
+instance (Data a, Data b, Data c, Data d, Data e, Data f) => RpcParamSet (RpcParam a, RpcParam b, RpcParam c, RpcParam d, RpcParam e, RpcParam f) where
+  toRpcReqBatchParams (v1,v2,v3,v4,v5,v6) = [b1,b2,b3,b4,b5,b6]
+    where
+      !b1 = rpcReqBatchParam v1
+      !b2 = rpcReqBatchParam v2
+      !b3 = rpcReqBatchParam v3
+      !b4 = rpcReqBatchParam v4
+      !b5 = rpcReqBatchParam v5
+      !b6 = rpcReqBatchParam v6
+
+instance (Data a, Data b, Data c, Data d, Data e, Data f, Data g) => RpcParamSet (RpcParam a, RpcParam b, RpcParam c, RpcParam d, RpcParam e, RpcParam f, RpcParam g) where
+  toRpcReqBatchParams (v1,v2,v3,v4,v5,v6,v7) = [b1,b2,b3,b4,b5,b6,b7]
+    where
+      !b1 = rpcReqBatchParam v1
+      !b2 = rpcReqBatchParam v2
+      !b3 = rpcReqBatchParam v3
+      !b4 = rpcReqBatchParam v4
+      !b5 = rpcReqBatchParam v5
+      !b6 = rpcReqBatchParam v6
+      !b7 = rpcReqBatchParam v7
+
+instance (Data a, Data b, Data c, Data d, Data e, Data f, Data g, Data h) => RpcParamSet (RpcParam a, RpcParam b, RpcParam c, RpcParam d, RpcParam e, RpcParam f, RpcParam g, RpcParam h) where
+  toRpcReqBatchParams (v1,v2,v3,v4,v5,v6,v7,v8) = [b1,b2,b3,b4,b5,b6,b7,b8]
+    where
+      !b1 = rpcReqBatchParam v1
+      !b2 = rpcReqBatchParam v2
+      !b3 = rpcReqBatchParam v3
+      !b4 = rpcReqBatchParam v4
+      !b5 = rpcReqBatchParam v5
+      !b6 = rpcReqBatchParam v6
+      !b7 = rpcReqBatchParam v7
+      !b8 = rpcReqBatchParam v8
+
+instance (Data a, Data b, Data c, Data d, Data e, Data f, Data g, Data h, Data i) => RpcParamSet (RpcParam a, RpcParam b, RpcParam c, RpcParam d, RpcParam e, RpcParam f, RpcParam g, RpcParam h, RpcParam i) where
+  toRpcReqBatchParams (v1,v2,v3,v4,v5,v6,v7,v8,v9) = [b1,b2,b3,b4,b5,b6,b7,b8,b9]
+    where
+      !b1 = rpcReqBatchParam v1
+      !b2 = rpcReqBatchParam v2
+      !b3 = rpcReqBatchParam v3
+      !b4 = rpcReqBatchParam v4
+      !b5 = rpcReqBatchParam v5
+      !b6 = rpcReqBatchParam v6
+      !b7 = rpcReqBatchParam v7
+      !b8 = rpcReqBatchParam v8
+      !b9 = rpcReqBatchParam v9
+
+instance (Data a, Data b, Data c, Data d, Data e, Data f, Data g, Data h, Data i, Data j) => RpcParamSet (RpcParam a, RpcParam b, RpcParam c, RpcParam d, RpcParam e, RpcParam f, RpcParam g, RpcParam h, RpcParam i, RpcParam j) where
+  toRpcReqBatchParams (v1,v2,v3,v4,v5,v6,v7,v8,v9,v10) = [b1,b2,b3,b4,b5,b6,b7,b8,b9,b10]
+    where
+      !b1 = rpcReqBatchParam v1
+      !b2 = rpcReqBatchParam v2
+      !b3 = rpcReqBatchParam v3
+      !b4 = rpcReqBatchParam v4
+      !b5 = rpcReqBatchParam v5
+      !b6 = rpcReqBatchParam v6
+      !b7 = rpcReqBatchParam v7
+      !b8 = rpcReqBatchParam v8
+      !b9 = rpcReqBatchParam v9
+      !b10 = rpcReqBatchParam v10
+
+
+
+type RpcParamName  = T.Text
+
+data RpcParam a = RpcParamVal RpcParamName TypeInfo a
+                | RpcParamRef RpcParamName TypeInfo a
+                | RpcParamDefVal RpcParamName TypeInfo a
+                | RpcParamDefRef RpcParamName TypeInfo a
+                deriving (Show)
+
+
+
+rpcReqBatchParam :: (Data a) => RpcParam a -> RpcReqBatchParam
+rpcReqBatchParam = f
+  where
+    f (RpcParamVal name ti dt) = RpcReqBatchParam name 0b00 ti (toRawBytes ti dt)
+    f (RpcParamRef name ti dt) = RpcReqBatchParam name 0b01 ti (toRawBytes ti dt)
+    f (RpcParamDefVal name ti dt) = RpcReqBatchParam name 0b10 ti (toRawBytes ti dt)
+    f (RpcParamDefRef name ti dt) = RpcReqBatchParam name 0b11 ti (toRawBytes ti dt)
+
+
diff --git a/src/Database/MSSQLServer/Query/RpcResultSet.hs b/src/Database/MSSQLServer/Query/RpcResultSet.hs
new file mode 100644
--- /dev/null
+++ b/src/Database/MSSQLServer/Query/RpcResultSet.hs
@@ -0,0 +1,595 @@
+{-# OPTIONS_HADDOCK hide #-}
+{-# LANGUAGE BangPatterns #-}
+{-# LANGUAGE FlexibleInstances #-}
+
+module Database.MSSQLServer.Query.RpcResultSet ( RpcResultSet (..)
+                                               , RpcResult (..)
+                                               , RpcOutputSet (..)
+                                               ) where
+
+import Database.Tds.Message
+import Database.MSSQLServer.Query.ResultSet (ResultSet(..))
+import Database.MSSQLServer.Query.Only
+
+
+
+
+class RpcResultSet a where
+  fromListOfTokenStreams :: [[TokenStream]] -> a
+
+instance (RpcOutputSet a1, ResultSet b1) => RpcResultSet (RpcResult a1 b1) where
+  fromListOfTokenStreams [v1] = b1
+    where
+      !b1 = rpcResult v1
+  fromListOfTokenStreams _ = error "fromListOfTokenStreams: List length must be 1"
+  
+instance (RpcOutputSet a1, ResultSet b1, RpcOutputSet a2, ResultSet b2) => RpcResultSet (RpcResult a1 b1, RpcResult a2 b2) where
+  fromListOfTokenStreams [v1,v2] =  (b1, b2)
+    where
+      !b1 = rpcResult v1
+      !b2 = rpcResult v2
+  fromListOfTokenStreams _ = error "fromListOfTokenStreams: List length must be 2"
+
+instance (RpcOutputSet a1, ResultSet b1, RpcOutputSet a2, ResultSet b2, RpcOutputSet a3, ResultSet b3) => RpcResultSet (RpcResult a1 b1, RpcResult a2 b2, RpcResult a3 b3) where
+  fromListOfTokenStreams [v1,v2,v3] =  (b1, b2, b3)
+    where
+      !b1 = rpcResult v1
+      !b2 = rpcResult v2
+      !b3 = rpcResult v3
+  fromListOfTokenStreams _ = error "fromListOfTokenStreams: List length must be 3"
+
+instance (RpcOutputSet a1, ResultSet b1, RpcOutputSet a2, ResultSet b2, RpcOutputSet a3, ResultSet b3, RpcOutputSet a4, ResultSet b4) => RpcResultSet (RpcResult a1 b1, RpcResult a2 b2, RpcResult a3 b3, RpcResult a4 b4) where
+  fromListOfTokenStreams [v1,v2,v3,v4] =  (b1, b2, b3, b4)
+    where
+      !b1 = rpcResult v1
+      !b2 = rpcResult v2
+      !b3 = rpcResult v3
+      !b4 = rpcResult v4
+  fromListOfTokenStreams _ = error "fromListOfTokenStreams: List length must be 4"
+
+instance (RpcOutputSet a1, ResultSet b1, RpcOutputSet a2, ResultSet b2, RpcOutputSet a3, ResultSet b3, RpcOutputSet a4, ResultSet b4, RpcOutputSet a5, ResultSet b5) => RpcResultSet (RpcResult a1 b1, RpcResult a2 b2, RpcResult a3 b3, RpcResult a4 b4, RpcResult a5 b5) where
+  fromListOfTokenStreams [v1,v2,v3,v4,v5] =  (b1, b2, b3, b4, b5)
+    where
+      !b1 = rpcResult v1
+      !b2 = rpcResult v2
+      !b3 = rpcResult v3
+      !b4 = rpcResult v4
+      !b5 = rpcResult v5
+  fromListOfTokenStreams _ = error "fromListOfTokenStreams: List length must be 5"
+
+
+
+
+-- (RpcOutputSet a, ResultSet b) => 
+data RpcResult a b = RpcResult Int a b
+                   deriving (Show)
+
+rpcResult :: (RpcOutputSet a, ResultSet b) => [TokenStream] -> RpcResult a b
+rpcResult tss =
+  let [TSReturnStatus ret] = case filter isTSReturnStatus tss of
+                               [] -> error "rpcResult: TSReturnStatus is necessary"
+                               xs -> xs
+      rvs = (\(TSReturnValue rv) -> rv) <$> filter isTSReturnValue tss
+      rss = fromTokenStreams tss
+
+  in RpcResult (fromIntegral ret) (fromReturnValues rvs) rss
+
+  where
+    isTSReturnStatus :: TokenStream -> Bool
+    isTSReturnStatus (TSReturnStatus{}) = True
+    isTSReturnStatus _ = False
+    
+    isTSReturnValue :: TokenStream -> Bool
+    isTSReturnValue (TSReturnValue{}) = True
+    isTSReturnValue _ = False
+
+
+  
+
+
+rvTypeInfo :: ReturnValue -> TypeInfo
+rvTypeInfo (ReturnValue _ _ _ _ _ ti _) = ti
+
+rvRawBytes :: ReturnValue -> RawBytes
+rvRawBytes (ReturnValue _ _ _ _ _ _ rb) = rb
+
+
+class RpcOutputSet a where
+  fromReturnValues :: [ReturnValue] -> a
+
+instance RpcOutputSet () where
+  fromReturnValues [] = ()
+  fromReturnValues _ = error "fromReturnValues: List length must be 0"
+  
+instance (Data a) => RpcOutputSet (Only a) where
+  fromReturnValues [r1] = Only d1
+    where
+      !d1 = fromRawBytes (rvTypeInfo r1) (rvRawBytes r1)
+  fromReturnValues _ = error "fromReturnValues: List length must be 1"
+
+instance (Data a, Data b) => RpcOutputSet (a,b) where
+  fromReturnValues [r1,r2] = (d1,d2)
+    where
+      !d1 = fromRawBytes (rvTypeInfo r1) (rvRawBytes r1)
+      !d2 = fromRawBytes (rvTypeInfo r2) (rvRawBytes r2)
+  fromReturnValues _ = error "fromReturnValues: List length must be 2"
+
+instance (Data a, Data b, Data c) => RpcOutputSet (a,b,c) where
+  fromReturnValues [r1,r2,r3] = (d1,d2,d3)
+    where
+      !d1 = fromRawBytes (rvTypeInfo r1) (rvRawBytes r1)
+      !d2 = fromRawBytes (rvTypeInfo r2) (rvRawBytes r2)
+      !d3 = fromRawBytes (rvTypeInfo r3) (rvRawBytes r3)
+  fromReturnValues _ = error "fromReturnValues: List length must be 3"
+
+instance (Data a, Data b, Data c, Data d) => RpcOutputSet (a,b,c,d) where
+  fromReturnValues [r1,r2,r3,r4] = (d1,d2,d3,d4)
+    where
+      !d1 = fromRawBytes (rvTypeInfo r1) (rvRawBytes r1)
+      !d2 = fromRawBytes (rvTypeInfo r2) (rvRawBytes r2)
+      !d3 = fromRawBytes (rvTypeInfo r3) (rvRawBytes r3)
+      !d4 = fromRawBytes (rvTypeInfo r4) (rvRawBytes r4)
+  fromReturnValues _ = error "fromReturnValues: List length must be 4"
+
+instance (Data a, Data b, Data c, Data d, Data e) => RpcOutputSet (a,b,c,d,e) where
+  fromReturnValues [r1,r2,r3,r4,r5] = (d1,d2,d3,d4,d5)
+    where
+      !d1 = fromRawBytes (rvTypeInfo r1) (rvRawBytes r1)
+      !d2 = fromRawBytes (rvTypeInfo r2) (rvRawBytes r2)
+      !d3 = fromRawBytes (rvTypeInfo r3) (rvRawBytes r3)
+      !d4 = fromRawBytes (rvTypeInfo r4) (rvRawBytes r4)
+      !d5 = fromRawBytes (rvTypeInfo r5) (rvRawBytes r5)
+  fromReturnValues _ = error "fromReturnValues: List length must be 5"
+
+instance (Data a, Data b, Data c, Data d, Data e, Data f) => RpcOutputSet (a,b,c,d,e,f) where
+  fromReturnValues [r1,r2,r3,r4,r5,r6] = (d1,d2,d3,d4,d5,d6)
+    where
+      !d1 = fromRawBytes (rvTypeInfo r1) (rvRawBytes r1)
+      !d2 = fromRawBytes (rvTypeInfo r2) (rvRawBytes r2)
+      !d3 = fromRawBytes (rvTypeInfo r3) (rvRawBytes r3)
+      !d4 = fromRawBytes (rvTypeInfo r4) (rvRawBytes r4)
+      !d5 = fromRawBytes (rvTypeInfo r5) (rvRawBytes r5)
+      !d6 = fromRawBytes (rvTypeInfo r6) (rvRawBytes r6)
+  fromReturnValues _ = error "fromReturnValues: List length must be 6"
+
+instance (Data a, Data b, Data c, Data d, Data e, Data f, Data g) => RpcOutputSet (a,b,c,d,e,f,g) where
+  fromReturnValues [r1,r2,r3,r4,r5,r6,r7] = (d1,d2,d3,d4,d5,d6,d7)
+    where
+      !d1 = fromRawBytes (rvTypeInfo r1) (rvRawBytes r1)
+      !d2 = fromRawBytes (rvTypeInfo r2) (rvRawBytes r2)
+      !d3 = fromRawBytes (rvTypeInfo r3) (rvRawBytes r3)
+      !d4 = fromRawBytes (rvTypeInfo r4) (rvRawBytes r4)
+      !d5 = fromRawBytes (rvTypeInfo r5) (rvRawBytes r5)
+      !d6 = fromRawBytes (rvTypeInfo r6) (rvRawBytes r6)
+      !d7 = fromRawBytes (rvTypeInfo r7) (rvRawBytes r7)
+  fromReturnValues _ = error "fromReturnValues: List length must be 7"
+
+instance (Data a, Data b, Data c, Data d, Data e, Data f, Data g, Data h) => RpcOutputSet (a,b,c,d,e,f,g,h) where
+  fromReturnValues [r1,r2,r3,r4,r5,r6,r7,r8] = (d1,d2,d3,d4,d5,d6,d7,d8)
+    where
+      !d1 = fromRawBytes (rvTypeInfo r1) (rvRawBytes r1)
+      !d2 = fromRawBytes (rvTypeInfo r2) (rvRawBytes r2)
+      !d3 = fromRawBytes (rvTypeInfo r3) (rvRawBytes r3)
+      !d4 = fromRawBytes (rvTypeInfo r4) (rvRawBytes r4)
+      !d5 = fromRawBytes (rvTypeInfo r5) (rvRawBytes r5)
+      !d6 = fromRawBytes (rvTypeInfo r6) (rvRawBytes r6)
+      !d7 = fromRawBytes (rvTypeInfo r7) (rvRawBytes r7)
+      !d8 = fromRawBytes (rvTypeInfo r8) (rvRawBytes r8)
+  fromReturnValues _ = error "fromReturnValues: List length must be 8"
+
+instance (Data a, Data b, Data c, Data d, Data e, Data f, Data g, Data h, Data i) => RpcOutputSet (a,b,c,d,e,f,g,h,i) where
+  fromReturnValues [r1,r2,r3,r4,r5,r6,r7,r8,r9] = (d1,d2,d3,d4,d5,d6,d7,d8,d9)
+    where
+      !d1 = fromRawBytes (rvTypeInfo r1) (rvRawBytes r1)
+      !d2 = fromRawBytes (rvTypeInfo r2) (rvRawBytes r2)
+      !d3 = fromRawBytes (rvTypeInfo r3) (rvRawBytes r3)
+      !d4 = fromRawBytes (rvTypeInfo r4) (rvRawBytes r4)
+      !d5 = fromRawBytes (rvTypeInfo r5) (rvRawBytes r5)
+      !d6 = fromRawBytes (rvTypeInfo r6) (rvRawBytes r6)
+      !d7 = fromRawBytes (rvTypeInfo r7) (rvRawBytes r7)
+      !d8 = fromRawBytes (rvTypeInfo r8) (rvRawBytes r8)
+      !d9 = fromRawBytes (rvTypeInfo r9) (rvRawBytes r9)
+  fromReturnValues _ = error "fromReturnValues: List length must be 9"
+
+instance (Data a, Data b, Data c, Data d, Data e, Data f, Data g, Data h, Data i, Data j) => RpcOutputSet (a,b,c,d,e,f,g,h,i,j) where
+  fromReturnValues [r1,r2,r3,r4,r5,r6,r7,r8,r9,r10] = (d1,d2,d3,d4,d5,d6,d7,d8,d9,d10)
+    where
+      !d1 = fromRawBytes (rvTypeInfo r1) (rvRawBytes r1)
+      !d2 = fromRawBytes (rvTypeInfo r2) (rvRawBytes r2)
+      !d3 = fromRawBytes (rvTypeInfo r3) (rvRawBytes r3)
+      !d4 = fromRawBytes (rvTypeInfo r4) (rvRawBytes r4)
+      !d5 = fromRawBytes (rvTypeInfo r5) (rvRawBytes r5)
+      !d6 = fromRawBytes (rvTypeInfo r6) (rvRawBytes r6)
+      !d7 = fromRawBytes (rvTypeInfo r7) (rvRawBytes r7)
+      !d8 = fromRawBytes (rvTypeInfo r8) (rvRawBytes r8)
+      !d9 = fromRawBytes (rvTypeInfo r9) (rvRawBytes r9)
+      !d10 = fromRawBytes (rvTypeInfo r10) (rvRawBytes r10)
+  fromReturnValues _ = error "fromReturnValues: List length must be 10"
+
+instance (Data a, Data b, Data c, Data d, Data e, Data f, Data g, Data h, Data i, Data j, Data k) => RpcOutputSet (a,b,c,d,e,f,g,h,i,j,k) where
+  fromReturnValues [r1,r2,r3,r4,r5,r6,r7,r8,r9,r10,r11] = (d1,d2,d3,d4,d5,d6,d7,d8,d9,d10,d11)
+    where
+      !d1 = fromRawBytes (rvTypeInfo r1) (rvRawBytes r1)
+      !d2 = fromRawBytes (rvTypeInfo r2) (rvRawBytes r2)
+      !d3 = fromRawBytes (rvTypeInfo r3) (rvRawBytes r3)
+      !d4 = fromRawBytes (rvTypeInfo r4) (rvRawBytes r4)
+      !d5 = fromRawBytes (rvTypeInfo r5) (rvRawBytes r5)
+      !d6 = fromRawBytes (rvTypeInfo r6) (rvRawBytes r6)
+      !d7 = fromRawBytes (rvTypeInfo r7) (rvRawBytes r7)
+      !d8 = fromRawBytes (rvTypeInfo r8) (rvRawBytes r8)
+      !d9 = fromRawBytes (rvTypeInfo r9) (rvRawBytes r9)
+      !d10 = fromRawBytes (rvTypeInfo r10) (rvRawBytes r10)
+      !d11 = fromRawBytes (rvTypeInfo r11) (rvRawBytes r11)
+  fromReturnValues _ = error "fromReturnValues: List length must be 11"
+
+instance (Data a, Data b, Data c, Data d, Data e, Data f, Data g, Data h, Data i, Data j, Data k, Data l) => RpcOutputSet (a,b,c,d,e,f,g,h,i,j,k,l) where
+  fromReturnValues [r1,r2,r3,r4,r5,r6,r7,r8,r9,r10,r11,r12] = (d1,d2,d3,d4,d5,d6,d7,d8,d9,d10,d11,d12)
+    where
+      !d1 = fromRawBytes (rvTypeInfo r1) (rvRawBytes r1)
+      !d2 = fromRawBytes (rvTypeInfo r2) (rvRawBytes r2)
+      !d3 = fromRawBytes (rvTypeInfo r3) (rvRawBytes r3)
+      !d4 = fromRawBytes (rvTypeInfo r4) (rvRawBytes r4)
+      !d5 = fromRawBytes (rvTypeInfo r5) (rvRawBytes r5)
+      !d6 = fromRawBytes (rvTypeInfo r6) (rvRawBytes r6)
+      !d7 = fromRawBytes (rvTypeInfo r7) (rvRawBytes r7)
+      !d8 = fromRawBytes (rvTypeInfo r8) (rvRawBytes r8)
+      !d9 = fromRawBytes (rvTypeInfo r9) (rvRawBytes r9)
+      !d10 = fromRawBytes (rvTypeInfo r10) (rvRawBytes r10)
+      !d11 = fromRawBytes (rvTypeInfo r11) (rvRawBytes r11)
+      !d12 = fromRawBytes (rvTypeInfo r12) (rvRawBytes r12)
+  fromReturnValues _ = error "fromReturnValues: List length must be 12"
+
+instance (Data a, Data b, Data c, Data d, Data e, Data f, Data g, Data h, Data i, Data j, Data k, Data l, Data m) => RpcOutputSet (a,b,c,d,e,f,g,h,i,j,k,l,m) where
+  fromReturnValues [r1,r2,r3,r4,r5,r6,r7,r8,r9,r10,r11,r12,r13] = (d1,d2,d3,d4,d5,d6,d7,d8,d9,d10,d11,d12,d13)
+    where
+      !d1 = fromRawBytes (rvTypeInfo r1) (rvRawBytes r1)
+      !d2 = fromRawBytes (rvTypeInfo r2) (rvRawBytes r2)
+      !d3 = fromRawBytes (rvTypeInfo r3) (rvRawBytes r3)
+      !d4 = fromRawBytes (rvTypeInfo r4) (rvRawBytes r4)
+      !d5 = fromRawBytes (rvTypeInfo r5) (rvRawBytes r5)
+      !d6 = fromRawBytes (rvTypeInfo r6) (rvRawBytes r6)
+      !d7 = fromRawBytes (rvTypeInfo r7) (rvRawBytes r7)
+      !d8 = fromRawBytes (rvTypeInfo r8) (rvRawBytes r8)
+      !d9 = fromRawBytes (rvTypeInfo r9) (rvRawBytes r9)
+      !d10 = fromRawBytes (rvTypeInfo r10) (rvRawBytes r10)
+      !d11 = fromRawBytes (rvTypeInfo r11) (rvRawBytes r11)
+      !d12 = fromRawBytes (rvTypeInfo r12) (rvRawBytes r12)
+      !d13 = fromRawBytes (rvTypeInfo r13) (rvRawBytes r13)
+  fromReturnValues _ = error "fromReturnValues: List length must be 13"
+
+instance (Data a, Data b, Data c, Data d, Data e, Data f, Data g, Data h, Data i, Data j, Data k, Data l, Data m, Data n) => RpcOutputSet (a,b,c,d,e,f,g,h,i,j,k,l,m,n) where
+  fromReturnValues [r1,r2,r3,r4,r5,r6,r7,r8,r9,r10,r11,r12,r13,r14] = (d1,d2,d3,d4,d5,d6,d7,d8,d9,d10,d11,d12,d13,d14)
+    where
+      !d1 = fromRawBytes (rvTypeInfo r1) (rvRawBytes r1)
+      !d2 = fromRawBytes (rvTypeInfo r2) (rvRawBytes r2)
+      !d3 = fromRawBytes (rvTypeInfo r3) (rvRawBytes r3)
+      !d4 = fromRawBytes (rvTypeInfo r4) (rvRawBytes r4)
+      !d5 = fromRawBytes (rvTypeInfo r5) (rvRawBytes r5)
+      !d6 = fromRawBytes (rvTypeInfo r6) (rvRawBytes r6)
+      !d7 = fromRawBytes (rvTypeInfo r7) (rvRawBytes r7)
+      !d8 = fromRawBytes (rvTypeInfo r8) (rvRawBytes r8)
+      !d9 = fromRawBytes (rvTypeInfo r9) (rvRawBytes r9)
+      !d10 = fromRawBytes (rvTypeInfo r10) (rvRawBytes r10)
+      !d11 = fromRawBytes (rvTypeInfo r11) (rvRawBytes r11)
+      !d12 = fromRawBytes (rvTypeInfo r12) (rvRawBytes r12)
+      !d13 = fromRawBytes (rvTypeInfo r13) (rvRawBytes r13)
+      !d14 = fromRawBytes (rvTypeInfo r14) (rvRawBytes r14)
+  fromReturnValues _ = error "fromReturnValues: List length must be 14"
+
+instance (Data a, Data b, Data c, Data d, Data e, Data f, Data g, Data h, Data i, Data j, Data k, Data l, Data m, Data n, Data o) => RpcOutputSet (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o) where
+  fromReturnValues [r1,r2,r3,r4,r5,r6,r7,r8,r9,r10,r11,r12,r13,r14,r15] = (d1,d2,d3,d4,d5,d6,d7,d8,d9,d10,d11,d12,d13,d14,d15)
+    where
+      !d1 = fromRawBytes (rvTypeInfo r1) (rvRawBytes r1)
+      !d2 = fromRawBytes (rvTypeInfo r2) (rvRawBytes r2)
+      !d3 = fromRawBytes (rvTypeInfo r3) (rvRawBytes r3)
+      !d4 = fromRawBytes (rvTypeInfo r4) (rvRawBytes r4)
+      !d5 = fromRawBytes (rvTypeInfo r5) (rvRawBytes r5)
+      !d6 = fromRawBytes (rvTypeInfo r6) (rvRawBytes r6)
+      !d7 = fromRawBytes (rvTypeInfo r7) (rvRawBytes r7)
+      !d8 = fromRawBytes (rvTypeInfo r8) (rvRawBytes r8)
+      !d9 = fromRawBytes (rvTypeInfo r9) (rvRawBytes r9)
+      !d10 = fromRawBytes (rvTypeInfo r10) (rvRawBytes r10)
+      !d11 = fromRawBytes (rvTypeInfo r11) (rvRawBytes r11)
+      !d12 = fromRawBytes (rvTypeInfo r12) (rvRawBytes r12)
+      !d13 = fromRawBytes (rvTypeInfo r13) (rvRawBytes r13)
+      !d14 = fromRawBytes (rvTypeInfo r14) (rvRawBytes r14)
+      !d15 = fromRawBytes (rvTypeInfo r15) (rvRawBytes r15)
+  fromReturnValues _ = error "fromReturnValues: List length must be 15"
+
+instance (Data a, Data b, Data c, Data d, Data e, Data f, Data g, Data h, Data i, Data j, Data k, Data l, Data m, Data n, Data o, Data p) => RpcOutputSet (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p) where
+  fromReturnValues [r1,r2,r3,r4,r5,r6,r7,r8,r9,r10,r11,r12,r13,r14,r15,r16]
+    = (d1,d2,d3,d4,d5,d6,d7,d8,d9,d10,d11,d12,d13,d14,d15,d16)
+    where
+      !d1 = fromRawBytes (rvTypeInfo r1) (rvRawBytes r1)
+      !d2 = fromRawBytes (rvTypeInfo r2) (rvRawBytes r2)
+      !d3 = fromRawBytes (rvTypeInfo r3) (rvRawBytes r3)
+      !d4 = fromRawBytes (rvTypeInfo r4) (rvRawBytes r4)
+      !d5 = fromRawBytes (rvTypeInfo r5) (rvRawBytes r5)
+      !d6 = fromRawBytes (rvTypeInfo r6) (rvRawBytes r6)
+      !d7 = fromRawBytes (rvTypeInfo r7) (rvRawBytes r7)
+      !d8 = fromRawBytes (rvTypeInfo r8) (rvRawBytes r8)
+      !d9 = fromRawBytes (rvTypeInfo r9) (rvRawBytes r9)
+      !d10 = fromRawBytes (rvTypeInfo r10) (rvRawBytes r10)
+      !d11 = fromRawBytes (rvTypeInfo r11) (rvRawBytes r11)
+      !d12 = fromRawBytes (rvTypeInfo r12) (rvRawBytes r12)
+      !d13 = fromRawBytes (rvTypeInfo r13) (rvRawBytes r13)
+      !d14 = fromRawBytes (rvTypeInfo r14) (rvRawBytes r14)
+      !d15 = fromRawBytes (rvTypeInfo r15) (rvRawBytes r15)
+      !d16 = fromRawBytes (rvTypeInfo r16) (rvRawBytes r16)
+  fromReturnValues _ = error "fromReturnValues: List length must be 16"
+
+instance (Data a, Data b, Data c, Data d, Data e, Data f, Data g, Data h, Data i, Data j, Data k, Data l, Data m, Data n, Data o, Data p, Data q) => RpcOutputSet (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q) where
+  fromReturnValues [r1,r2,r3,r4,r5,r6,r7,r8,r9,r10,r11,r12,r13,r14,r15,r16,r17]
+    = (d1,d2,d3,d4,d5,d6,d7,d8,d9,d10,d11,d12,d13,d14,d15,d16,d17)
+    where
+      !d1 = fromRawBytes (rvTypeInfo r1) (rvRawBytes r1)
+      !d2 = fromRawBytes (rvTypeInfo r2) (rvRawBytes r2)
+      !d3 = fromRawBytes (rvTypeInfo r3) (rvRawBytes r3)
+      !d4 = fromRawBytes (rvTypeInfo r4) (rvRawBytes r4)
+      !d5 = fromRawBytes (rvTypeInfo r5) (rvRawBytes r5)
+      !d6 = fromRawBytes (rvTypeInfo r6) (rvRawBytes r6)
+      !d7 = fromRawBytes (rvTypeInfo r7) (rvRawBytes r7)
+      !d8 = fromRawBytes (rvTypeInfo r8) (rvRawBytes r8)
+      !d9 = fromRawBytes (rvTypeInfo r9) (rvRawBytes r9)
+      !d10 = fromRawBytes (rvTypeInfo r10) (rvRawBytes r10)
+      !d11 = fromRawBytes (rvTypeInfo r11) (rvRawBytes r11)
+      !d12 = fromRawBytes (rvTypeInfo r12) (rvRawBytes r12)
+      !d13 = fromRawBytes (rvTypeInfo r13) (rvRawBytes r13)
+      !d14 = fromRawBytes (rvTypeInfo r14) (rvRawBytes r14)
+      !d15 = fromRawBytes (rvTypeInfo r15) (rvRawBytes r15)
+      !d16 = fromRawBytes (rvTypeInfo r16) (rvRawBytes r16)
+      !d17 = fromRawBytes (rvTypeInfo r17) (rvRawBytes r17)
+  fromReturnValues _ = error "fromReturnValues: List length must be 17"
+
+instance (Data a, Data b, Data c, Data d, Data e, Data f, Data g, Data h, Data i, Data j, Data k, Data l, Data m, Data n, Data o, Data p, Data q, Data r) => RpcOutputSet (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r) where
+  fromReturnValues [r1,r2,r3,r4,r5,r6,r7,r8,r9,r10,r11,r12,r13,r14,r15,r16,r17,r18]
+    = (d1,d2,d3,d4,d5,d6,d7,d8,d9,d10,d11,d12,d13,d14,d15,d16,d17,d18)
+    where
+      !d1 = fromRawBytes (rvTypeInfo r1) (rvRawBytes r1)
+      !d2 = fromRawBytes (rvTypeInfo r2) (rvRawBytes r2)
+      !d3 = fromRawBytes (rvTypeInfo r3) (rvRawBytes r3)
+      !d4 = fromRawBytes (rvTypeInfo r4) (rvRawBytes r4)
+      !d5 = fromRawBytes (rvTypeInfo r5) (rvRawBytes r5)
+      !d6 = fromRawBytes (rvTypeInfo r6) (rvRawBytes r6)
+      !d7 = fromRawBytes (rvTypeInfo r7) (rvRawBytes r7)
+      !d8 = fromRawBytes (rvTypeInfo r8) (rvRawBytes r8)
+      !d9 = fromRawBytes (rvTypeInfo r9) (rvRawBytes r9)
+      !d10 = fromRawBytes (rvTypeInfo r10) (rvRawBytes r10)
+      !d11 = fromRawBytes (rvTypeInfo r11) (rvRawBytes r11)
+      !d12 = fromRawBytes (rvTypeInfo r12) (rvRawBytes r12)
+      !d13 = fromRawBytes (rvTypeInfo r13) (rvRawBytes r13)
+      !d14 = fromRawBytes (rvTypeInfo r14) (rvRawBytes r14)
+      !d15 = fromRawBytes (rvTypeInfo r15) (rvRawBytes r15)
+      !d16 = fromRawBytes (rvTypeInfo r16) (rvRawBytes r16)
+      !d17 = fromRawBytes (rvTypeInfo r17) (rvRawBytes r17)
+      !d18 = fromRawBytes (rvTypeInfo r18) (rvRawBytes r18)
+  fromReturnValues _ = error "fromReturnValues: List length must be 18"
+
+instance (Data a, Data b, Data c, Data d, Data e, Data f, Data g, Data h, Data i, Data j, Data k, Data l, Data m, Data n, Data o, Data p, Data q, Data r, Data s) => RpcOutputSet (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s) where
+  fromReturnValues [r1,r2,r3,r4,r5,r6,r7,r8,r9,r10,r11,r12,r13,r14,r15,r16,r17,r18,r19]
+    = (d1,d2,d3,d4,d5,d6,d7,d8,d9,d10,d11,d12,d13,d14,d15,d16,d17,d18,d19)
+    where
+      !d1 = fromRawBytes (rvTypeInfo r1) (rvRawBytes r1)
+      !d2 = fromRawBytes (rvTypeInfo r2) (rvRawBytes r2)
+      !d3 = fromRawBytes (rvTypeInfo r3) (rvRawBytes r3)
+      !d4 = fromRawBytes (rvTypeInfo r4) (rvRawBytes r4)
+      !d5 = fromRawBytes (rvTypeInfo r5) (rvRawBytes r5)
+      !d6 = fromRawBytes (rvTypeInfo r6) (rvRawBytes r6)
+      !d7 = fromRawBytes (rvTypeInfo r7) (rvRawBytes r7)
+      !d8 = fromRawBytes (rvTypeInfo r8) (rvRawBytes r8)
+      !d9 = fromRawBytes (rvTypeInfo r9) (rvRawBytes r9)
+      !d10 = fromRawBytes (rvTypeInfo r10) (rvRawBytes r10)
+      !d11 = fromRawBytes (rvTypeInfo r11) (rvRawBytes r11)
+      !d12 = fromRawBytes (rvTypeInfo r12) (rvRawBytes r12)
+      !d13 = fromRawBytes (rvTypeInfo r13) (rvRawBytes r13)
+      !d14 = fromRawBytes (rvTypeInfo r14) (rvRawBytes r14)
+      !d15 = fromRawBytes (rvTypeInfo r15) (rvRawBytes r15)
+      !d16 = fromRawBytes (rvTypeInfo r16) (rvRawBytes r16)
+      !d17 = fromRawBytes (rvTypeInfo r17) (rvRawBytes r17)
+      !d18 = fromRawBytes (rvTypeInfo r18) (rvRawBytes r18)
+      !d19 = fromRawBytes (rvTypeInfo r19) (rvRawBytes r19)
+  fromReturnValues _ = error "fromReturnValues: List length must be 19"
+
+instance (Data a, Data b, Data c, Data d, Data e, Data f, Data g, Data h, Data i, Data j, Data k, Data l, Data m, Data n, Data o, Data p, Data q, Data r, Data s, Data t) => RpcOutputSet (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t) where
+  fromReturnValues [r1,r2,r3,r4,r5,r6,r7,r8,r9,r10,r11,r12,r13,r14,r15,r16,r17,r18,r19,r20]
+    = (d1,d2,d3,d4,d5,d6,d7,d8,d9,d10,d11,d12,d13,d14,d15,d16,d17,d18,d19,d20)
+    where
+      !d1 = fromRawBytes (rvTypeInfo r1) (rvRawBytes r1)
+      !d2 = fromRawBytes (rvTypeInfo r2) (rvRawBytes r2)
+      !d3 = fromRawBytes (rvTypeInfo r3) (rvRawBytes r3)
+      !d4 = fromRawBytes (rvTypeInfo r4) (rvRawBytes r4)
+      !d5 = fromRawBytes (rvTypeInfo r5) (rvRawBytes r5)
+      !d6 = fromRawBytes (rvTypeInfo r6) (rvRawBytes r6)
+      !d7 = fromRawBytes (rvTypeInfo r7) (rvRawBytes r7)
+      !d8 = fromRawBytes (rvTypeInfo r8) (rvRawBytes r8)
+      !d9 = fromRawBytes (rvTypeInfo r9) (rvRawBytes r9)
+      !d10 = fromRawBytes (rvTypeInfo r10) (rvRawBytes r10)
+      !d11 = fromRawBytes (rvTypeInfo r11) (rvRawBytes r11)
+      !d12 = fromRawBytes (rvTypeInfo r12) (rvRawBytes r12)
+      !d13 = fromRawBytes (rvTypeInfo r13) (rvRawBytes r13)
+      !d14 = fromRawBytes (rvTypeInfo r14) (rvRawBytes r14)
+      !d15 = fromRawBytes (rvTypeInfo r15) (rvRawBytes r15)
+      !d16 = fromRawBytes (rvTypeInfo r16) (rvRawBytes r16)
+      !d17 = fromRawBytes (rvTypeInfo r17) (rvRawBytes r17)
+      !d18 = fromRawBytes (rvTypeInfo r18) (rvRawBytes r18)
+      !d19 = fromRawBytes (rvTypeInfo r19) (rvRawBytes r19)
+      !d20 = fromRawBytes (rvTypeInfo r20) (rvRawBytes r20)
+  fromReturnValues _ = error "fromReturnValues: List length must be 20"
+
+instance (Data a, Data b, Data c, Data d, Data e, Data f, Data g, Data h, Data i, Data j, Data k, Data l, Data m, Data n, Data o, Data p, Data q, Data r, Data s, Data t, Data u) => RpcOutputSet (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u) where
+  fromReturnValues [r1,r2,r3,r4,r5,r6,r7,r8,r9,r10,r11,r12,r13,r14,r15,r16,r17,r18,r19,r20,r21]
+    = (d1,d2,d3,d4,d5,d6,d7,d8,d9,d10,d11,d12,d13,d14,d15,d16,d17,d18,d19,d20,d21)
+    where
+      !d1 = fromRawBytes (rvTypeInfo r1) (rvRawBytes r1)
+      !d2 = fromRawBytes (rvTypeInfo r2) (rvRawBytes r2)
+      !d3 = fromRawBytes (rvTypeInfo r3) (rvRawBytes r3)
+      !d4 = fromRawBytes (rvTypeInfo r4) (rvRawBytes r4)
+      !d5 = fromRawBytes (rvTypeInfo r5) (rvRawBytes r5)
+      !d6 = fromRawBytes (rvTypeInfo r6) (rvRawBytes r6)
+      !d7 = fromRawBytes (rvTypeInfo r7) (rvRawBytes r7)
+      !d8 = fromRawBytes (rvTypeInfo r8) (rvRawBytes r8)
+      !d9 = fromRawBytes (rvTypeInfo r9) (rvRawBytes r9)
+      !d10 = fromRawBytes (rvTypeInfo r10) (rvRawBytes r10)
+      !d11 = fromRawBytes (rvTypeInfo r11) (rvRawBytes r11)
+      !d12 = fromRawBytes (rvTypeInfo r12) (rvRawBytes r12)
+      !d13 = fromRawBytes (rvTypeInfo r13) (rvRawBytes r13)
+      !d14 = fromRawBytes (rvTypeInfo r14) (rvRawBytes r14)
+      !d15 = fromRawBytes (rvTypeInfo r15) (rvRawBytes r15)
+      !d16 = fromRawBytes (rvTypeInfo r16) (rvRawBytes r16)
+      !d17 = fromRawBytes (rvTypeInfo r17) (rvRawBytes r17)
+      !d18 = fromRawBytes (rvTypeInfo r18) (rvRawBytes r18)
+      !d19 = fromRawBytes (rvTypeInfo r19) (rvRawBytes r19)
+      !d20 = fromRawBytes (rvTypeInfo r20) (rvRawBytes r20)
+      !d21 = fromRawBytes (rvTypeInfo r21) (rvRawBytes r21)
+  fromReturnValues _ = error "fromReturnValues: List length must be 21"
+
+instance (Data a, Data b, Data c, Data d, Data e, Data f, Data g, Data h, Data i, Data j, Data k, Data l, Data m, Data n, Data o, Data p, Data q, Data r, Data s, Data t, Data u, Data v) => RpcOutputSet (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v) where
+  fromReturnValues [r1,r2,r3,r4,r5,r6,r7,r8,r9,r10,r11,r12,r13,r14,r15,r16,r17,r18,r19,r20,r21,r22]
+    = (d1,d2,d3,d4,d5,d6,d7,d8,d9,d10,d11,d12,d13,d14,d15,d16,d17,d18,d19,d20,d21,d22)
+    where
+      !d1 = fromRawBytes (rvTypeInfo r1) (rvRawBytes r1)
+      !d2 = fromRawBytes (rvTypeInfo r2) (rvRawBytes r2)
+      !d3 = fromRawBytes (rvTypeInfo r3) (rvRawBytes r3)
+      !d4 = fromRawBytes (rvTypeInfo r4) (rvRawBytes r4)
+      !d5 = fromRawBytes (rvTypeInfo r5) (rvRawBytes r5)
+      !d6 = fromRawBytes (rvTypeInfo r6) (rvRawBytes r6)
+      !d7 = fromRawBytes (rvTypeInfo r7) (rvRawBytes r7)
+      !d8 = fromRawBytes (rvTypeInfo r8) (rvRawBytes r8)
+      !d9 = fromRawBytes (rvTypeInfo r9) (rvRawBytes r9)
+      !d10 = fromRawBytes (rvTypeInfo r10) (rvRawBytes r10)
+      !d11 = fromRawBytes (rvTypeInfo r11) (rvRawBytes r11)
+      !d12 = fromRawBytes (rvTypeInfo r12) (rvRawBytes r12)
+      !d13 = fromRawBytes (rvTypeInfo r13) (rvRawBytes r13)
+      !d14 = fromRawBytes (rvTypeInfo r14) (rvRawBytes r14)
+      !d15 = fromRawBytes (rvTypeInfo r15) (rvRawBytes r15)
+      !d16 = fromRawBytes (rvTypeInfo r16) (rvRawBytes r16)
+      !d17 = fromRawBytes (rvTypeInfo r17) (rvRawBytes r17)
+      !d18 = fromRawBytes (rvTypeInfo r18) (rvRawBytes r18)
+      !d19 = fromRawBytes (rvTypeInfo r19) (rvRawBytes r19)
+      !d20 = fromRawBytes (rvTypeInfo r20) (rvRawBytes r20)
+      !d21 = fromRawBytes (rvTypeInfo r21) (rvRawBytes r21)
+      !d22 = fromRawBytes (rvTypeInfo r22) (rvRawBytes r22)
+  fromReturnValues _ = error "fromReturnValues: List length must be 22"
+
+instance (Data a, Data b, Data c, Data d, Data e, Data f, Data g, Data h, Data i, Data j, Data k, Data l, Data m, Data n, Data o, Data p, Data q, Data r, Data s, Data t, Data u, Data v, Data w) => RpcOutputSet (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w) where
+  fromReturnValues [r1,r2,r3,r4,r5,r6,r7,r8,r9,r10,r11,r12,r13,r14,r15,r16,r17,r18,r19,r20,r21,r22,r23]
+    = (d1,d2,d3,d4,d5,d6,d7,d8,d9,d10,d11,d12,d13,d14,d15,d16,d17,d18,d19,d20,d21,d22,d23)
+    where
+      !d1 = fromRawBytes (rvTypeInfo r1) (rvRawBytes r1)
+      !d2 = fromRawBytes (rvTypeInfo r2) (rvRawBytes r2)
+      !d3 = fromRawBytes (rvTypeInfo r3) (rvRawBytes r3)
+      !d4 = fromRawBytes (rvTypeInfo r4) (rvRawBytes r4)
+      !d5 = fromRawBytes (rvTypeInfo r5) (rvRawBytes r5)
+      !d6 = fromRawBytes (rvTypeInfo r6) (rvRawBytes r6)
+      !d7 = fromRawBytes (rvTypeInfo r7) (rvRawBytes r7)
+      !d8 = fromRawBytes (rvTypeInfo r8) (rvRawBytes r8)
+      !d9 = fromRawBytes (rvTypeInfo r9) (rvRawBytes r9)
+      !d10 = fromRawBytes (rvTypeInfo r10) (rvRawBytes r10)
+      !d11 = fromRawBytes (rvTypeInfo r11) (rvRawBytes r11)
+      !d12 = fromRawBytes (rvTypeInfo r12) (rvRawBytes r12)
+      !d13 = fromRawBytes (rvTypeInfo r13) (rvRawBytes r13)
+      !d14 = fromRawBytes (rvTypeInfo r14) (rvRawBytes r14)
+      !d15 = fromRawBytes (rvTypeInfo r15) (rvRawBytes r15)
+      !d16 = fromRawBytes (rvTypeInfo r16) (rvRawBytes r16)
+      !d17 = fromRawBytes (rvTypeInfo r17) (rvRawBytes r17)
+      !d18 = fromRawBytes (rvTypeInfo r18) (rvRawBytes r18)
+      !d19 = fromRawBytes (rvTypeInfo r19) (rvRawBytes r19)
+      !d20 = fromRawBytes (rvTypeInfo r20) (rvRawBytes r20)
+      !d21 = fromRawBytes (rvTypeInfo r21) (rvRawBytes r21)
+      !d22 = fromRawBytes (rvTypeInfo r22) (rvRawBytes r22)
+      !d23 = fromRawBytes (rvTypeInfo r23) (rvRawBytes r23)
+  fromReturnValues _ = error "fromReturnValues: List length must be 23"
+
+instance (Data a, Data b, Data c, Data d, Data e, Data f, Data g, Data h, Data i, Data j, Data k, Data l, Data m, Data n, Data o, Data p, Data q, Data r, Data s, Data t, Data u, Data v, Data w, Data x) => RpcOutputSet (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x) where
+  fromReturnValues [r1,r2,r3,r4,r5,r6,r7,r8,r9,r10,r11,r12,r13,r14,r15,r16,r17,r18,r19,r20,r21,r22,r23,r24]
+    = (d1,d2,d3,d4,d5,d6,d7,d8,d9,d10,d11,d12,d13,d14,d15,d16,d17,d18,d19,d20,d21,d22,d23,d24)
+    where
+      !d1 = fromRawBytes (rvTypeInfo r1) (rvRawBytes r1)
+      !d2 = fromRawBytes (rvTypeInfo r2) (rvRawBytes r2)
+      !d3 = fromRawBytes (rvTypeInfo r3) (rvRawBytes r3)
+      !d4 = fromRawBytes (rvTypeInfo r4) (rvRawBytes r4)
+      !d5 = fromRawBytes (rvTypeInfo r5) (rvRawBytes r5)
+      !d6 = fromRawBytes (rvTypeInfo r6) (rvRawBytes r6)
+      !d7 = fromRawBytes (rvTypeInfo r7) (rvRawBytes r7)
+      !d8 = fromRawBytes (rvTypeInfo r8) (rvRawBytes r8)
+      !d9 = fromRawBytes (rvTypeInfo r9) (rvRawBytes r9)
+      !d10 = fromRawBytes (rvTypeInfo r10) (rvRawBytes r10)
+      !d11 = fromRawBytes (rvTypeInfo r11) (rvRawBytes r11)
+      !d12 = fromRawBytes (rvTypeInfo r12) (rvRawBytes r12)
+      !d13 = fromRawBytes (rvTypeInfo r13) (rvRawBytes r13)
+      !d14 = fromRawBytes (rvTypeInfo r14) (rvRawBytes r14)
+      !d15 = fromRawBytes (rvTypeInfo r15) (rvRawBytes r15)
+      !d16 = fromRawBytes (rvTypeInfo r16) (rvRawBytes r16)
+      !d17 = fromRawBytes (rvTypeInfo r17) (rvRawBytes r17)
+      !d18 = fromRawBytes (rvTypeInfo r18) (rvRawBytes r18)
+      !d19 = fromRawBytes (rvTypeInfo r19) (rvRawBytes r19)
+      !d20 = fromRawBytes (rvTypeInfo r20) (rvRawBytes r20)
+      !d21 = fromRawBytes (rvTypeInfo r21) (rvRawBytes r21)
+      !d22 = fromRawBytes (rvTypeInfo r22) (rvRawBytes r22)
+      !d23 = fromRawBytes (rvTypeInfo r23) (rvRawBytes r23)
+      !d24 = fromRawBytes (rvTypeInfo r24) (rvRawBytes r24)
+  fromReturnValues _ = error "fromReturnValues: List length must be 24"
+
+instance (Data a, Data b, Data c, Data d, Data e, Data f, Data g, Data h, Data i, Data j, Data k, Data l, Data m, Data n, Data o, Data p, Data q, Data r, Data s, Data t, Data u, Data v, Data w, Data x, Data y) => RpcOutputSet (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y) where
+  fromReturnValues [r1,r2,r3,r4,r5,r6,r7,r8,r9,r10,r11,r12,r13,r14,r15,r16,r17,r18,r19,r20,r21,r22,r23,r24,r25]
+    = (d1,d2,d3,d4,d5,d6,d7,d8,d9,d10,d11,d12,d13,d14,d15,d16,d17,d18,d19,d20,d21,d22,d23,d24,d25)
+    where
+      !d1 = fromRawBytes (rvTypeInfo r1) (rvRawBytes r1)
+      !d2 = fromRawBytes (rvTypeInfo r2) (rvRawBytes r2)
+      !d3 = fromRawBytes (rvTypeInfo r3) (rvRawBytes r3)
+      !d4 = fromRawBytes (rvTypeInfo r4) (rvRawBytes r4)
+      !d5 = fromRawBytes (rvTypeInfo r5) (rvRawBytes r5)
+      !d6 = fromRawBytes (rvTypeInfo r6) (rvRawBytes r6)
+      !d7 = fromRawBytes (rvTypeInfo r7) (rvRawBytes r7)
+      !d8 = fromRawBytes (rvTypeInfo r8) (rvRawBytes r8)
+      !d9 = fromRawBytes (rvTypeInfo r9) (rvRawBytes r9)
+      !d10 = fromRawBytes (rvTypeInfo r10) (rvRawBytes r10)
+      !d11 = fromRawBytes (rvTypeInfo r11) (rvRawBytes r11)
+      !d12 = fromRawBytes (rvTypeInfo r12) (rvRawBytes r12)
+      !d13 = fromRawBytes (rvTypeInfo r13) (rvRawBytes r13)
+      !d14 = fromRawBytes (rvTypeInfo r14) (rvRawBytes r14)
+      !d15 = fromRawBytes (rvTypeInfo r15) (rvRawBytes r15)
+      !d16 = fromRawBytes (rvTypeInfo r16) (rvRawBytes r16)
+      !d17 = fromRawBytes (rvTypeInfo r17) (rvRawBytes r17)
+      !d18 = fromRawBytes (rvTypeInfo r18) (rvRawBytes r18)
+      !d19 = fromRawBytes (rvTypeInfo r19) (rvRawBytes r19)
+      !d20 = fromRawBytes (rvTypeInfo r20) (rvRawBytes r20)
+      !d21 = fromRawBytes (rvTypeInfo r21) (rvRawBytes r21)
+      !d22 = fromRawBytes (rvTypeInfo r22) (rvRawBytes r22)
+      !d23 = fromRawBytes (rvTypeInfo r23) (rvRawBytes r23)
+      !d24 = fromRawBytes (rvTypeInfo r24) (rvRawBytes r24)
+      !d25 = fromRawBytes (rvTypeInfo r25) (rvRawBytes r25)
+  fromReturnValues _ = error "fromReturnValues: List length must be 25"
+
+instance (Data a, Data b, Data c, Data d, Data e, Data f, Data g, Data h, Data i, Data j, Data k, Data l, Data m, Data n, Data o, Data p, Data q, Data r, Data s, Data t, Data u, Data v, Data w, Data x, Data y, Data z) => RpcOutputSet (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z) where
+  fromReturnValues [r1,r2,r3,r4,r5,r6,r7,r8,r9,r10,r11,r12,r13,r14,r15,r16,r17,r18,r19,r20,r21,r22,r23,r24,r25,r26]
+    = (d1,d2,d3,d4,d5,d6,d7,d8,d9,d10,d11,d12,d13,d14,d15,d16,d17,d18,d19,d20,d21,d22,d23,d24,d25,d26)
+    where
+      !d1 = fromRawBytes (rvTypeInfo r1) (rvRawBytes r1)
+      !d2 = fromRawBytes (rvTypeInfo r2) (rvRawBytes r2)
+      !d3 = fromRawBytes (rvTypeInfo r3) (rvRawBytes r3)
+      !d4 = fromRawBytes (rvTypeInfo r4) (rvRawBytes r4)
+      !d5 = fromRawBytes (rvTypeInfo r5) (rvRawBytes r5)
+      !d6 = fromRawBytes (rvTypeInfo r6) (rvRawBytes r6)
+      !d7 = fromRawBytes (rvTypeInfo r7) (rvRawBytes r7)
+      !d8 = fromRawBytes (rvTypeInfo r8) (rvRawBytes r8)
+      !d9 = fromRawBytes (rvTypeInfo r9) (rvRawBytes r9)
+      !d10 = fromRawBytes (rvTypeInfo r10) (rvRawBytes r10)
+      !d11 = fromRawBytes (rvTypeInfo r11) (rvRawBytes r11)
+      !d12 = fromRawBytes (rvTypeInfo r12) (rvRawBytes r12)
+      !d13 = fromRawBytes (rvTypeInfo r13) (rvRawBytes r13)
+      !d14 = fromRawBytes (rvTypeInfo r14) (rvRawBytes r14)
+      !d15 = fromRawBytes (rvTypeInfo r15) (rvRawBytes r15)
+      !d16 = fromRawBytes (rvTypeInfo r16) (rvRawBytes r16)
+      !d17 = fromRawBytes (rvTypeInfo r17) (rvRawBytes r17)
+      !d18 = fromRawBytes (rvTypeInfo r18) (rvRawBytes r18)
+      !d19 = fromRawBytes (rvTypeInfo r19) (rvRawBytes r19)
+      !d20 = fromRawBytes (rvTypeInfo r20) (rvRawBytes r20)
+      !d21 = fromRawBytes (rvTypeInfo r21) (rvRawBytes r21)
+      !d22 = fromRawBytes (rvTypeInfo r22) (rvRawBytes r22)
+      !d23 = fromRawBytes (rvTypeInfo r23) (rvRawBytes r23)
+      !d24 = fromRawBytes (rvTypeInfo r24) (rvRawBytes r24)
+      !d25 = fromRawBytes (rvTypeInfo r25) (rvRawBytes r25)
+      !d26 = fromRawBytes (rvTypeInfo r26) (rvRawBytes r26)
+  fromReturnValues _ = error "fromReturnValues: List length must be 26"
+
diff --git a/test/Spec.hs b/test/Spec.hs
new file mode 100644
--- /dev/null
+++ b/test/Spec.hs
@@ -0,0 +1,2 @@
+main :: IO ()
+main = putStrLn "Test suite not yet implemented"
