diff --git a/Database/HSparql/Connection.hs b/Database/HSparql/Connection.hs
--- a/Database/HSparql/Connection.hs
+++ b/Database/HSparql/Connection.hs
@@ -17,8 +17,9 @@
     askQueryRaw,
     updateQueryRaw,
     describeQueryRaw,
+
     -- * parse query results
-    structureContent
+    structureContent,
   )
 where
 
@@ -32,11 +33,13 @@
 import qualified Data.Text as T
 import qualified Data.Text.Encoding as E
 import qualified Data.Text.Encoding as T
+import qualified Data.Text.Lazy.Encoding as EL
 import Database.HSparql.QueryGenerator
 import Network.Connection (TLSSettings (..))
 import Network.HTTP
 import Network.HTTP.Conduit
 import Network.HTTP.Types.Header
+import qualified Network.HTTP.Types.URI as URI
 import Text.RDF.RDF4H.TurtleParser
 import Text.XML.Light
 import Text.XML.Light.Lexer (XmlSource)
@@ -58,7 +61,7 @@
 
 -- | Transform the 'String' result from the HTTP request into a two-dimensional
 --   table storing the bindings for each variable in each row.
-structureContent :: XmlSource a => a -> Maybe [[BindingValue]]
+structureContent :: (XmlSource a) => a -> Maybe [[BindingValue]]
 structureContent s =
   do
     e <- doc
@@ -135,19 +138,21 @@
 
 selectQueryRaw :: Database.HSparql.Connection.EndPoint -> String -> IO (Maybe [[BindingValue]])
 selectQueryRaw ep q = do
-  let uri = ep ++ "?" ++ urlEncodeVars [("query", q)]
+  let contentParams = [("query", Just (T.encodeUtf8 (T.pack q)))]
       h1 = (hAccept, "application/sparql-results+xml")
       h2 = (hUserAgent, "hsparql-client")
-  request' <- parseRequest uri
+      h3 = (hContentType, "application/x-www-form-urlencoded")
+  let request' = parseRequest_ ep
   let request =
         request'
-          { method = "GET",
-            requestHeaders = [h1, h2]
+          { method = "POST",
+            requestHeaders = [h1, h2, h3],
+            requestBody = RequestBodyBS (URI.renderQuery False contentParams)
           }
   let settings = mkManagerSettings (TLSSettingsSimple True False False def) Nothing
   manager <- liftIO $ newManager settings
   resp <- httpLbs request manager
-  return $ structureContent (LB.unpack (responseBody resp))
+  return $ structureContent (EL.decodeUtf8 (responseBody resp))
 
 askQueryRaw :: Database.HSparql.Connection.EndPoint -> String -> IO Bool
 askQueryRaw ep q = do
@@ -204,7 +209,7 @@
 
 -- | Takes a generated uri and makes simple HTTP request,
 --  asking for RDF N3 serialization. Returns either 'ParseFailure' or 'RDF'
-httpCallForRdf :: RDF.Rdf a => String -> IO (Either RDF.ParseFailure (RDF.RDF a))
+httpCallForRdf :: (RDF.Rdf a) => String -> IO (Either RDF.ParseFailure (RDF.RDF a))
 httpCallForRdf uri = do
   let h1 = (hUserAgent, "hsparql-client")
       h2 = (hAccept, "text/turtle")
diff --git a/hsparql.cabal b/hsparql.cabal
--- a/hsparql.cabal
+++ b/hsparql.cabal
@@ -1,5 +1,5 @@
 Name:          hsparql
-Version:       0.3.9
+Version:       0.4.0
 Synopsis:      A SPARQL query generator and DSL, and a client to query a SPARQL server.
 Category:      Database
 Description:
