diff --git a/Database/HSparql/Connection.hs b/Database/HSparql/Connection.hs
--- a/Database/HSparql/Connection.hs
+++ b/Database/HSparql/Connection.hs
@@ -54,7 +54,7 @@
           value :: Element -> BindingValue
           value e =
             case qName (elName e) of
-              "uri"     -> Bound $ Data.RDF.unode $ T.pack $ strContent e
+              "uri"     -> Bound $ Data.RDF.unode $ (T.pack $ strContent e)
               "literal" -> case findAttr (unqual "datatype") e of
                              Just dt -> Bound $ Data.RDF.lnode $ Data.RDF.typedL (T.pack $ strContent e) (T.pack dt)
                              Nothing -> case findAttr langAttr e of
diff --git a/Database/HSparql/QueryGenerator.hs b/Database/HSparql/QueryGenerator.hs
--- a/Database/HSparql/QueryGenerator.hs
+++ b/Database/HSparql/QueryGenerator.hs
@@ -10,7 +10,7 @@
     -- * Query Actions
     , prefix
     , var
-    , triple
+    , Database.HSparql.QueryGenerator.triple
     , constructTriple
     , askTriple
     , describeIRI
@@ -71,7 +71,8 @@
 
 import Control.Monad.State
 import Data.List (intercalate)
-import Data.String.Utils
+import qualified Data.Text as T
+import Data.RDF
 
 
 -- State monads
@@ -118,10 +119,10 @@
 -- Manipulate data within monad
 
 -- |Add a prefix to the query, given an IRI reference, and return it.
-prefix :: String -> IRIRef -> Query Prefix
-prefix pre ref = do -- n <- gets prefixIdx
-                let p = Prefix pre ref
-                modify $ \s -> s { {- prefixIdx = n + 1, -} prefixes = p : prefixes s }
+prefix :: T.Text -> IRIRef -> Query Prefix
+prefix pre (AbsoluteIRI node) = do
+                let p = Prefix pre node
+                modify $ \s -> s { prefixes = p : prefixes s }
                 return p
 
 -- |Create and return a variable to the query, usable in later expressions.
@@ -134,20 +135,20 @@
 --  triple, or for which the variables can be bound.
 triple :: (TermLike a, TermLike b, TermLike c) => a -> b -> c -> Query Pattern
 triple a b c = do
-    let t = Triple (varOrTerm a) (varOrTerm b) (varOrTerm c)
+    let t = QTriple (varOrTerm a) (varOrTerm b) (varOrTerm c)
     modify $ \s -> s { pattern = appendPattern t (pattern s) }
     return t
 
 
 constructTriple :: (TermLike a, TermLike b, TermLike c) => a -> b -> c -> Query Pattern
 constructTriple a b c = do
-    let t = Triple (varOrTerm a) (varOrTerm b) (varOrTerm c)
+    let t = QTriple (varOrTerm a) (varOrTerm b) (varOrTerm c)
     modify $ \s -> s { constructTriples = appendTriple t (constructTriples s) }
     return t
 
 askTriple :: (TermLike a, TermLike b, TermLike c) => a -> b -> c -> Query Pattern
 askTriple a b c = do
-    let t = Triple (varOrTerm a) (varOrTerm b) (varOrTerm c)
+    let t = QTriple (varOrTerm a) (varOrTerm b) (varOrTerm c)
     modify $ \s -> s { askTriples = appendTriple t (askTriples s) }
     return t
 
@@ -187,15 +188,10 @@
 
 -- Random auxiliary
 
--- |Form a 'PrefixedName' 'IRIRef', with the 'Prefix' and reference name.
-(.:.) :: Prefix -> String -> IRIRef
+-- |Form a 'Node', with the 'Prefix' and reference name.
+(.:.) :: Prefix -> T.Text -> IRIRef
 (.:.) = PrefixedName
 
--- |Create an 'IRIRef' with an absolute reference to the address at which it is
---  located.
-iriRef :: String -> IRIRef
-iriRef = IRIRef
-
 -- Duplicate handling
 
 -- |Set duplicate handling to 'Distinct'. By default, there are no reductions.
@@ -246,14 +242,14 @@
   varOrTerm = Term . NumericLiteralTerm
   expr = NumericExpr . NumericLiteralExpr
 
-instance TermLike [Char] where
-  varOrTerm = Term . RDFLiteralTerm . RDFLiteral
+instance TermLike T.Text where
+  varOrTerm = Term . RDFLiteralTerm . plainL
 
-instance TermLike ([Char], [Char]) where
-  varOrTerm (s, lang') = Term . RDFLiteralTerm $ RDFLiteralLang s lang'
+instance TermLike (T.Text, T.Text) where
+  varOrTerm (s, lang') = Term . RDFLiteralTerm $ plainLL s lang'
 
-instance TermLike ([Char], IRIRef) where
-  varOrTerm (s, ref) = Term . RDFLiteralTerm $ RDFLiteralIRIRef s ref
+instance TermLike (T.Text, IRIRef) where
+  varOrTerm (s, ref) = Term . RDFLiteralTerm $ typedL s (getFQN ref)
 
 instance TermLike Bool where
   varOrTerm = Term . BooleanLiteralTerm
@@ -363,8 +359,7 @@
 -- Default QueryData
 queryData :: QueryData
 queryData = QueryData
-    { {- prefixIdx  = 0
-    , -} prefixes   = []
+    { prefixes   = []
     , varsIdx    = 0
     , vars       = []
     , queryType  = TypeNotSet
@@ -386,22 +381,23 @@
 
 data Duplicates = NoLimits | Distinct | Reduced
 
--- data Prefix = Prefix Int IRIRef
-data Prefix = Prefix String IRIRef
+data Prefix = Prefix T.Text Node
 
 data Variable = Variable Int
 
+data IRIRef = AbsoluteIRI Node
+            | PrefixedName Prefix T.Text
 
-data IRIRef = IRIRef String
-            | PrefixedName Prefix String 
+iriRef :: T.Text -> IRIRef
+iriRef uri = AbsoluteIRI $ unode uri
 
-data RDFLiteral = RDFLiteral String
-                | RDFLiteralLang String String
-                | RDFLiteralIRIRef String IRIRef
+getFQN :: IRIRef -> T.Text
+getFQN (AbsoluteIRI (UNode n)) = n
+getFQN (PrefixedName (Prefix _ (UNode n)) s) = T.append n s
 
 -- Should support numeric literals, too
 data GraphTerm = IRIRefTerm IRIRef
-               | RDFLiteralTerm RDFLiteral
+               | RDFLiteralTerm LValue
                | NumericLiteralTerm Integer
                | BooleanLiteralTerm Bool
 
@@ -427,7 +423,7 @@
           | BuiltinCall Function [Expr]
           | VarOrTermExpr VarOrTerm
 
-data Pattern = Triple VarOrTerm VarOrTerm VarOrTerm
+data Pattern = QTriple VarOrTerm VarOrTerm VarOrTerm
              | Filter Expr
              | OptionalGraphPattern GroupGraphPattern
              | UnionGraphPattern GroupGraphPattern GroupGraphPattern
@@ -450,7 +446,7 @@
     , vars       :: [Variable]
     , queryType  :: QueryType
     , pattern    :: GroupGraphPattern
-    , constructTriples :: [Pattern] -- Triple
+    , constructTriples :: [Pattern] -- QTriple
     , askTriples :: [Pattern]
     , describeURI :: Maybe IRIRef
     , duplicates :: Duplicates
@@ -484,24 +480,27 @@
   qshow Distinct = "DISTINCT"
   qshow Reduced  = "REDUCED"
 
+instance QueryShow Node where
+  qshow (UNode n) = "<" ++ T.unpack n ++ ">"
+
 instance QueryShow Prefix where
-  qshow (Prefix pre ref) = "PREFIX " ++ pre ++ ": " ++ qshow ref
+  qshow (Prefix pre ref) = "PREFIX " ++ (T.unpack pre) ++ ": " ++ qshow ref
 
 instance QueryShow Variable where
   qshow (Variable v) = "?x" ++ show v
 
 instance QueryShow IRIRef where
-  qshow (IRIRef r) = "<" ++ r ++ ">"
-  qshow (PrefixedName (Prefix pre _) s) = pre ++ ":" ++ s
+  qshow (AbsoluteIRI n) = qshow n
+  qshow (PrefixedName (Prefix pre _) s) = (T.unpack pre) ++ ":" ++ (T.unpack s)
 
 instance QueryShow (Maybe IRIRef) where
   qshow (Just r) = qshow r
   qshow Nothing = ""
 
-instance QueryShow RDFLiteral where
-  qshow (RDFLiteral s)           = "\"" ++ escapeQuotes s ++ "\""
-  qshow (RDFLiteralLang s lang')  = "\"" ++ escapeQuotes s ++ "\"@" ++ lang'
-  qshow (RDFLiteralIRIRef s ref) = "\"" ++ escapeQuotes s ++ "\"^^" ++ qshow ref
+instance QueryShow LValue where
+  qshow (PlainL s)        = "\"" ++ (T.unpack $ escapeQuotes s) ++ "\""
+  qshow (PlainLL s lang') = "\"" ++ (T.unpack $ escapeQuotes s) ++ "\"@" ++ (T.unpack lang')
+  qshow (TypedL s ref)    = "\"" ++ (T.unpack $ escapeQuotes s) ++ "\"^^" ++ (T.unpack ref)
 
 instance QueryShow GraphTerm where
   qshow (IRIRefTerm ref)           = qshow ref
@@ -550,13 +549,13 @@
   qshow e = "(" ++ qshow' e ++ ")"
     where qshow' (OrExpr es)        = intercalate " || " $ map qshow es
           qshow' (AndExpr es)       = intercalate " && " $ map qshow es
-          qshow' (NegatedExpr e')    = '!' : qshow e'
+          qshow' (NegatedExpr e')   = '!' : qshow e'
           qshow' (RelationalExpr rel e1 e2) = qshow e1 ++ qshow rel ++ qshow e2
-          qshow' (NumericExpr e')    = qshow e'
+          qshow' (NumericExpr e')   = qshow e'
           qshow' (BuiltinCall f es) = qshow f ++ "(" ++ intercalate ", " (map qshow es) ++ ")"
 
 instance QueryShow Pattern where
-  qshow (Triple a b c) = qshow [a, b, c] ++ " ."
+  qshow (QTriple a b c) = qshow [a, b, c] ++ " ."
   qshow (Filter e)     = "FILTER " ++ qshow e ++ " ."
 
   qshow (OptionalGraphPattern p)  = "OPTIONAL " ++ qshow p
@@ -615,6 +614,5 @@
 
 
 -- Internal utilities
-
-escapeQuotes :: String -> String
-escapeQuotes = replace "\"" "\\\""
+escapeQuotes :: T.Text -> T.Text
+escapeQuotes = T.replace "\"" "\\\""
diff --git a/hsparql.cabal b/hsparql.cabal
--- a/hsparql.cabal
+++ b/hsparql.cabal
@@ -1,6 +1,6 @@
 Name:          hsparql
 Homepage:      https://github.com/robstewart57/hsparql
-Version:       0.2.2
+Version:       0.2.3
 Synopsis:      A SPARQL query generator and DSL, and a client to query a SPARQL server.
 Category:      Database
 Description:
@@ -32,7 +32,7 @@
                , MissingH
                , network
                , text
-  extensions:  RankNTypes FlexibleInstances
+  extensions:  RankNTypes FlexibleInstances OverloadedStrings
 
 test-suite test-hsparql
   type:          exitcode-stdio-1.0
