diff --git a/Network/HTTP/Rest/Signature/EC2.hs b/Network/HTTP/Rest/Signature/EC2.hs
--- a/Network/HTTP/Rest/Signature/EC2.hs
+++ b/Network/HTTP/Rest/Signature/EC2.hs
@@ -1,19 +1,18 @@
 module Network.HTTP.Rest.Signature.EC2
-    ( -- * Types
-      QueryString
+    ( -- * Re-exports
+      module Network.HTTP.QueryString
+      -- * Types
     , Method
     , Endpoint
     , Path
     , SecretKey
     , SignatureMethod(..)
       -- * Building signature
-    , toString
-    , queryString
-    , queryStringFromMap
     , stringToSign
     , stringToSign'
     , signature
     , signature'
     ) where
 
+import Network.HTTP.QueryString
 import Network.HTTP.Rest.Signature.EC2.Internal
diff --git a/Network/HTTP/Rest/Signature/EC2/Internal.hs b/Network/HTTP/Rest/Signature/EC2/Internal.hs
--- a/Network/HTTP/Rest/Signature/EC2/Internal.hs
+++ b/Network/HTTP/Rest/Signature/EC2/Internal.hs
@@ -2,60 +2,19 @@
 
 import Data.ByteString (ByteString)
 import qualified Data.ByteString as BS
-import Data.ByteString.Char8 ()
 import qualified Data.ByteString.Lazy as BL
 import qualified Data.ByteString.Base64 as Base64
 import qualified Data.Digest.Pure.SHA as SHA
-import Data.List
-import Data.Map (Map)
-import qualified Data.Map as Map
 import Data.Monoid
 import qualified Network.HTTP.Types as HTTP
 
--- | A query string for HTTP.
---
--- > "param1=value1&param2=value2"
-data QueryString =
-    QueryString { rawData :: [(ByteString, ByteString)] }
-  deriving (Eq)
-
-instance Monoid QueryString where
-    mempty = QueryString []
-    mappend a b = QueryString $ rawData a `merge` rawData b
-
-merge :: Ord a => [a] -> [a] -> [a]
-merge [] bs = bs
-merge as [] = as
-merge (a:as) (b:bs)
-    | a <= b    = a:merge as (b:bs)
-    | otherwise = b:merge (a:as) bs
+import Network.HTTP.QueryString
 
 type Method = ByteString
 type Endpoint = ByteString
 type Path = ByteString
 type SecretKey = ByteString
 data SignatureMethod = HmacSHA256
-
--- | Convert a parameter list to 'QueryString'.
---
--- >>> toString $ queryString [("param1", "value1"), ("param2", "value2")]
--- "param1=value1&param2=value2"
-queryString :: [(ByteString, ByteString)] -> QueryString
-queryString = QueryString . sort
-
--- | Convert a parameter map to 'QueryString'.
-queryStringFromMap :: Map ByteString ByteString -> QueryString
-queryStringFromMap = queryString . Map.toList
-
-toString :: QueryString -> ByteString
-toString = BS.intercalate "&" . map concatWithEqual . rawData
-  where
-    concatWithEqual ("", _)    = error "name is null."
-    concatWithEqual (key, val) = mconcat
-        [ HTTP.urlEncode True key
-        , "="
-        , HTTP.urlEncode True val
-        ]
 
 -- | Make a string for making signature.
 --
diff --git a/ec2-signature.cabal b/ec2-signature.cabal
--- a/ec2-signature.cabal
+++ b/ec2-signature.cabal
@@ -1,5 +1,5 @@
 name:                ec2-signature
-version:             2.0
+version:             3.0
 synopsis:            The Amazon EC2 style signature calculator.
 description:         The Amazon EC2 style signature calculator.
                      <http://docs.aws.amazon.com/general/latest/gr/signature-version-2.html>
@@ -21,9 +21,9 @@
   build-depends:       base == 4.*
                      , bytestring
                      , base64-bytestring
-                     , containers
                      , SHA
                      , http-types
+                     , http-querystring
 
 test-suite doctest
   type:              exitcode-stdio-1.0
@@ -32,22 +32,6 @@
   ghc-options:       -Wall
   build-depends:       base == 4.*
                      , doctest
-
-test-suite spec
-  type:              exitcode-stdio-1.0
-  hs-source-dirs:    ., test
-  main-is:           Spec.hs
-  ghc-options:       -Wall
-  extensions:        OverloadedStrings
-  build-depends:       base == 4.*
-                     , bytestring
-                     , base64-bytestring
-                     , containers
-                     , SHA
-                     , http-types
-                     , hspec
-                     , QuickCheck
-                     , bytestring
 
 source-repository head
     type:            git
diff --git a/test/Spec.hs b/test/Spec.hs
deleted file mode 100644
--- a/test/Spec.hs
+++ /dev/null
@@ -1,35 +0,0 @@
-{-# OPTIONS_GHC -fno-warn-orphans #-}
-
-import Control.Applicative
-import Data.ByteString (ByteString)
-import qualified Data.ByteString.Char8 as BC
-import Data.Monoid
-import Test.Hspec
-import Test.Hspec.QuickCheck
-import Test.QuickCheck
-
-import Network.HTTP.Rest.Signature.EC2.Internal
-
-instance Arbitrary ByteString where
-    arbitrary = BC.pack <$> arbitrary
-
-data KeyString = Key { unpack :: ByteString }
-
-instance Arbitrary KeyString where
-    arbitrary = Key . BC.pack <$> ((:) <$> arbitrary <*> arbitrary)
-
-instance Arbitrary QueryString where
-    arbitrary = queryString . map f <$> arbitrary
-      where
-        f (a, b) = (unpack a, b)
-
-instance Show QueryString where
-    show = show . rawData
-
-main :: IO ()
-main = hspec $ do
-    describe "QueryString" $ do
-        prop "mappend" prop_mappend
-
-prop_mappend :: QueryString -> QueryString -> Bool
-prop_mappend a b = (a <> b) == queryString (rawData a ++ rawData b)
