diff --git a/liblastfm.cabal b/liblastfm.cabal
--- a/liblastfm.cabal
+++ b/liblastfm.cabal
@@ -1,5 +1,5 @@
 name: liblastfm
-version: 0.1.1.0
+version: 0.1.1.1
 synopsis: Lastfm API interface
 license: MIT
 license-file: LICENSE
@@ -8,20 +8,20 @@
 category: Network APIs
 description:
   Provides interface to Lastfm REST API, supports XML and JSON formats.
-cabal-version: >= 1.8
+cabal-version: >= 1.9.2
 build-type: Simple
 
 library
-  build-depends: base >= 4.6 && < 5,
+  build-depends: base >= 3 && < 5,
                  bytestring,
                  containers >= 0.5,
                  text,
                  cereal,
-                 http-conduit,
+                 http-conduit >= 1.9,
                  http-types,
                  pureMD5,
                  crypto-api,
-                 network >= 2.4,
+                 network,
                  aeson
   hs-source-dirs: src
   exposed-modules: Network.Lastfm
@@ -46,6 +46,24 @@
   ghc-options: -Wall
                -fno-warn-unused-do-bind
                -funbox-strict-fields
+
+
+test-suite json
+  build-depends: base >= 3 && < 5,
+                 bytestring >= 0.9 && < 0.11,
+                 attoparsec >= 0.10,
+                 aeson == 0.6.*,
+                 HUnit,
+                 test-framework,
+                 test-framework-hunit,
+                 text,
+                 liblastfm
+  type: exitcode-stdio-1.0
+  main-is: json.hs
+  hs-source-dirs: tests
+  ghc-options: -Wall
+               -fno-warn-unused-do-bind
+               -fno-warn-orphans
 
 
 source-repository head
diff --git a/tests/json.hs b/tests/json.hs
new file mode 100644
--- /dev/null
+++ b/tests/json.hs
@@ -0,0 +1,68 @@
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE UnicodeSyntax #-}
+module Main where
+
+import Control.Applicative
+import Data.Monoid
+import System.Exit (ExitCode(ExitFailure), exitWith)
+
+import qualified Data.ByteString.Lazy as B
+import           Data.Aeson
+import           Data.Text (Text)
+import           Network.Lastfm
+import           Test.Framework
+
+import qualified Album as Album
+import qualified Artist as Artist
+import qualified Chart as Chart
+import qualified Event as Event
+import qualified Geo as Geo
+import qualified Group as Group
+import qualified Library as Library
+import qualified Playlist as Playlist
+import qualified Tag as Tag
+import qualified Tasteometer as Tasteometer
+import qualified Track as Track
+import qualified User as User
+import qualified Venue as Venue
+
+
+main ∷ IO ()
+main =
+  do keys ← B.readFile "tests/lastfm-keys.json"
+     case decode keys of
+       Just (Keys ak sk s) →
+         defaultMainWithOpts (auth <> noauth) (mempty { ropt_threads = Just 20 })
+          where
+           auth = mconcat . map (\f → f (apiKey ak) (sessionKey sk) (Secret s)) $
+             [ Album.auth
+             , Artist.auth
+             , Event.auth
+             , Library.auth
+             , Playlist.auth
+             , Track.auth
+             , User.auth
+             ]
+           noauth = mconcat . map (\f → f (apiKey ak)) $
+             [ Album.noauth
+             , Artist.noauth
+             , Chart.noauth
+             , Event.noauth
+             , Geo.noauth
+             , Group.noauth
+             , Library.noauth
+             , Tag.noauth
+             , Tasteometer.noauth
+             , Track.noauth
+             , User.noauth
+             , Venue.noauth
+             ]
+       Nothing → exitWith (ExitFailure 1)
+
+
+data Keys = Keys Text Text Text
+
+
+instance FromJSON Keys where
+  parseJSON (Object o) = Keys <$> (o .: "APIKey") <*> (o .: "SessionKey") <*> (o .: "Secret")
+  parseJSON _ = empty
