diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,9 @@
 # Changelog
 
+## 0.4
+
+* Moved functionality from rest-gen into this package, you should regenerate haskell clients
+
 ## 0.3.0.0
 
 * Replace runT' -> runT, use runResourceT (runT ...) if you want the old behavior
diff --git a/rest-client.cabal b/rest-client.cabal
--- a/rest-client.cabal
+++ b/rest-client.cabal
@@ -1,5 +1,5 @@
 name:                rest-client
-version:             0.3.0.0
+version:             0.4
 description:         Utility library for use in generated API client libraries.
 synopsis:            Utility library for use in generated API client libraries.
 maintainer:          code@silk.co
@@ -25,7 +25,6 @@
     Rest.Client.Internal
   build-depends:
       base == 4.*
-    , aeson >= 0.7 && < 0.8
     , aeson-utils >= 0.2.1 && < 0.3
     , bytestring >= 0.9 && < 0.11
     , case-insensitive >= 0.4 && < 1.3
@@ -37,9 +36,8 @@
     , hxt-pickle-utils == 0.1.*
     , monad-control == 0.3.*
     , mtl >= 2.0 && < 2.3
-    , resourcet == 1.1.*
     , primitive == 0.5.*
-    , exceptions >= 0.5 && < 0.7
+    , resourcet == 1.1.*
     , rest-types == 1.10.*
     , tostring == 0.2.*
     , transformers-base == 0.4.*
diff --git a/src/Rest/Client/Internal.hs b/src/Rest/Client/Internal.hs
--- a/src/Rest/Client/Internal.hs
+++ b/src/Rest/Client/Internal.hs
@@ -1,7 +1,7 @@
 {-# LANGUAGE
-    CPP
-  , FlexibleInstances
+    FlexibleInstances
   , OverlappingInstances
+  , OverloadedStrings
   , UndecidableInstances
   #-}
 module Rest.Client.Internal
@@ -25,12 +25,16 @@
   , toJSON
   , fromXML
   , toXML
+
+  , makeReq
+  , doReq
   ) where
 
 import Control.Arrow
 import Control.Monad
 import Control.Monad.Cont
 import Data.Aeson.Utils (FromJSON, ToJSON, decodeV, encode)
+import Data.Default (def)
 import Data.List
 import Data.Maybe
 import Data.Monoid
@@ -38,22 +42,17 @@
 import Data.String.ToString
 import Network.HTTP.Conduit hiding (method, responseBody, responseHeaders)
 import Network.HTTP.Types hiding (statusCode, statusMessage)
+import Rest.Types.Error
+import Rest.Types.ShowUrl
 import Text.XML.HXT.Arrow.Pickle
-#if MIN_VERSION_http_conduit(2,0,0)
-import Data.Default (def)
-#endif
-
 import qualified Data.ByteString.Char8     as CH
 import qualified Data.ByteString.Lazy      as L
 import qualified Data.ByteString.Lazy.UTF8 as L
 import qualified Network.HTTP.Conduit      as HTTP
 import qualified Network.HTTP.Types        as HTTP
-
-import Rest.Types.Error
-import Rest.Types.ShowUrl
-
-import qualified Network.URI.Encode as URI
-import qualified Text.Xml.Pickle    as P
+import qualified Network.HTTP.Types.Header
+import qualified Network.URI.Encode        as URI
+import qualified Text.Xml.Pickle           as P
 
 import Rest.Client.Base
 
@@ -81,8 +80,11 @@
 splitHost :: String -> (String, String)
 splitHost hst = break (== '/') hst
 
-doRequest :: (ApiStateC m, MonadIO m) => ApiRequest -> m (Response L.ByteString)
-doRequest (ApiRequest m ur ps rhds bd) =
+doRequest :: ApiStateC m => (L.ByteString -> Rest.Types.Error.Reason e) -> (L.ByteString -> a) -> ApiRequest -> m (ApiResponse e a)
+doRequest a b = liftM (parseResult a b) . doReq
+
+doReq :: (ApiStateC m, MonadIO m) => ApiRequest -> m (Response L.ByteString)
+doReq (ApiRequest m ur ps rhds bd) =
   do mn  <- fmap manager askApiInfo
      hst <- fmap apiHost askApiInfo
      prt <- fmap apiPort askApiInfo
@@ -134,4 +136,8 @@
               ) v
     where err = error ("Error parsing XML in api binding, this should not happen: " ++ L.toString v)
   toXML = L.fromString . P.toXML
+
+
+makeReq :: String -> String -> [[String]] -> [(String, String)] -> Network.HTTP.Types.Header.RequestHeaders -> L.ByteString -> ApiRequest
+makeReq meth v ls pList hs body = ApiRequest meth (intercalate "/" (v : map URI.encode (concat ls))) pList hs body
 
