diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -15,4 +15,161 @@
 
 [Documentation](http://hackage.haskell.org/package/json-rpc)
 
-[Examples](http://github.com/xenog/json-rpc/examples)
+[Examples](https://github.com/xenog/json-rpc/tree/master/examples)
+
+
+Time Server Example
+===================
+
+```haskell
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE TemplateHaskell #-}
+import Control.Monad
+import Control.Monad.Trans
+import Control.Monad.Logger
+import Data.Aeson.Types
+import Data.Conduit.Network
+import qualified Data.Foldable as F
+import Data.Maybe
+import qualified Data.Text as T
+import Data.Time.Clock
+import Data.Time.Format
+import Network.JsonRpc
+import System.Locale
+
+data Req = TimeReq | Ping deriving (Show, Eq)
+
+instance FromRequest Req where
+    parseParams "time" = Just $ const $ return TimeReq
+    parseParams "ping" = Just $ const $ return Ping
+    parseParams _      = Nothing
+
+instance ToRequest Req where
+    requestMethod TimeReq = "time"
+    requestMethod Ping    = "ping"
+    requestIsNotif        = const False
+
+instance ToJSON Req where
+    toJSON = const emptyArray
+
+data Res = Time { getTime :: UTCTime } | Pong deriving (Show, Eq)
+
+instance FromResponse Res where
+    parseResult "time" = Just $ withText "time" $ \t ->
+        case parseTime defaultTimeLocale "%c" $ T.unpack t of
+            Just t' -> return $ Time t'
+            Nothing -> mzero
+    parseResult "ping" = Just $ const $ return Pong
+    parseResult _ = Nothing
+
+instance ToJSON Res where
+    toJSON (Time t) = toJSON $ formatTime defaultTimeLocale "%c" t
+    toJSON Pong     = emptyArray
+
+respond :: MonadLoggerIO m => Respond Req m Res
+respond TimeReq = liftM (Right . Time) $ liftIO getCurrentTime
+respond Ping    = return $ Right Pong
+
+main :: IO ()
+main = runStderrLoggingT $ do
+    let ss = serverSettings 31337 "::1"
+    jsonRpcTcpServer V2 False ss srv
+
+srv :: MonadLoggerIO m => JsonRpcT m ()
+srv = do
+    $(logDebug) "listening for new request"
+    qM <- receiveBatchRequest
+    case qM of
+        Nothing -> do
+            $(logDebug) "closed request channel, exting"
+            return ()
+        Just (SingleRequest q) -> do
+            $(logDebug) "got request"
+            rM <- buildResponse respond q
+            F.forM_ rM sendResponse
+            srv
+        Just (BatchRequest qs) -> do
+            $(logDebug) "got request batch"
+            rs <- catMaybes `liftM` forM qs (buildResponse respond)
+            sendBatchResponse $ BatchResponse rs
+            srv
+```
+
+
+Time Client Example
+===================
+
+```haskell
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE OverloadedStrings #-}
+import Control.Concurrent
+import Control.Monad
+import Control.Monad.Trans
+import Control.Monad.Logger
+import Data.Aeson
+import Data.Aeson.Types hiding (Error)
+import Data.Conduit.Network
+import qualified Data.Text as T
+import Data.Time.Clock
+import Data.Time.Format
+import Network.JsonRpc
+import System.Locale
+
+data Req = TimeReq | Ping deriving (Show, Eq)
+
+instance FromRequest Req where
+    parseParams "time" = Just $ const $ return TimeReq
+    parseParams "ping" = Just $ const $ return Ping
+    parseParams _      = Nothing
+
+instance ToRequest Req where
+    requestMethod TimeReq = "time"
+    requestMethod Ping    = "ping"
+    requestIsNotif        = const False
+
+instance ToJSON Req where
+    toJSON = const emptyArray
+
+data Res = Time { getTime :: UTCTime } | Pong deriving (Show, Eq)
+
+instance FromResponse Res where
+    parseResult "time" = Just $ withText "time" $ \t ->
+        case parseTime defaultTimeLocale "%c" $ T.unpack t of
+            Just t' -> return $ Time t'
+            Nothing -> mzero
+    parseResult "ping" = Just $ const $ return Pong
+    parseResult _ = Nothing
+
+instance ToJSON Res where
+    toJSON (Time t) = toJSON $ formatTime defaultTimeLocale "%c" t
+    toJSON Pong     = emptyArray
+
+handleResponse :: Maybe (Either ErrorObj Res) -> Res
+handleResponse t =
+    case t of
+        Nothing -> error "could not receive or parse response"
+        Just (Left e) -> error $ fromError e
+        Just (Right r) -> r
+
+req :: MonadLoggerIO m => JsonRpcT m Res
+req = do
+    tEM <- sendRequest TimeReq
+    $(logDebug) "sending time request"
+    return $ handleResponse tEM
+
+reqBatch :: MonadLoggerIO m => JsonRpcT m [Res]
+reqBatch = do
+    $(logDebug) "sending pings"
+    tEMs <- sendBatchRequest $ replicate 2 Ping
+    return $ map handleResponse tEMs
+
+main :: IO ()
+main = runStderrLoggingT $
+    jsonRpcTcpClient V2 True (clientSettings 31337 "::1") $ do
+        $(logDebug) "sending two time requests one second apart"
+        replicateM_ 2 $ do
+            req >>= $(logDebug) . T.pack . ("response: "++) . show
+            liftIO (threadDelay 1000000)
+        $(logDebug) "sending two pings in a batch"
+        reqBatch >>= $(logDebug) . T.pack . ("response: "++) . show
+```
diff --git a/json-rpc.cabal b/json-rpc.cabal
--- a/json-rpc.cabal
+++ b/json-rpc.cabal
@@ -1,5 +1,5 @@
 name:                   json-rpc
-version:                0.7.0.1
+version:                0.7.0.2
 synopsis:               Fully-featured JSON-RPC 2.0 library
 description:
   This JSON-RPC library is fully-compatible with JSON-RPC 2.0 and 1.0. It
@@ -24,7 +24,7 @@
 source-repository this
   type:                 git
   location:             https://github.com/xenog/json-rpc.git
-  tag:                  0.7.0.1
+  tag:                  0.7.0.2
 
 library
   exposed-modules:      Network.JsonRpc
