diff --git a/src/Network/Ethereum/Unit.hs b/src/Network/Ethereum/Unit.hs
--- a/src/Network/Ethereum/Unit.hs
+++ b/src/Network/Ethereum/Unit.hs
@@ -54,12 +54,11 @@
   , KEther
   ) where
 
-import Data.Text.Lazy.Builder (toLazyText)
-import Data.Text.Lazy.Builder.RealFloat
 import Text.ParserCombinators.ReadPrec
 import Data.Text.Lazy (Text, unpack)
 import qualified Text.Read.Lex as L
 import Data.Monoid ((<>))
+import Text.Printf
 import GHC.Read
 
 -- | Ethereum value unit
@@ -110,9 +109,8 @@
     fromRational = mkValue
 
 instance UnitSpec a => Show (Value a) where
-    show val = unpack (toLazyText floatValue <> " " <> name val)
+    show val = printf "%F %s" (x / d :: Double) (name val)
       where
-        floatValue = formatRealFloat Fixed (Just 2) (x / d)
         x = fromIntegral (unValue val)
         d = divider val
 
diff --git a/src/Network/Ethereum/Web3.hs b/src/Network/Ethereum/Web3.hs
--- a/src/Network/Ethereum/Web3.hs
+++ b/src/Network/Ethereum/Web3.hs
@@ -22,6 +22,8 @@
   , Provider(..)
   , DefaultProvider
   , Web3Error(..)
+  , forkWeb3
+  , runWeb3'
   , runWeb3
   -- ** Contract actions
   , EventAction(..)
@@ -40,6 +42,7 @@
 import Network.Ethereum.Web3.Encoding.Tuple
 import Network.Ethereum.Web3.Contract
 import Network.Ethereum.Web3.Encoding
+import Network.Ethereum.Web3.Provider
 import Network.Ethereum.Web3.Address
 import Network.Ethereum.Web3.Types
 import Network.Ethereum.Unit
diff --git a/src/Network/Ethereum/Web3/Api.hs b/src/Network/Ethereum/Web3/Api.hs
--- a/src/Network/Ethereum/Web3/Api.hs
+++ b/src/Network/Ethereum/Web3/Api.hs
@@ -11,6 +11,7 @@
 --
 module Network.Ethereum.Web3.Api where
 
+import Network.Ethereum.Web3.Provider
 import Network.Ethereum.Web3.Address
 import Network.Ethereum.Web3.JsonRpc
 import Network.Ethereum.Web3.Types
diff --git a/src/Network/Ethereum/Web3/Contract.hs b/src/Network/Ethereum/Web3/Contract.hs
--- a/src/Network/Ethereum/Web3/Contract.hs
+++ b/src/Network/Ethereum/Web3/Contract.hs
@@ -36,11 +36,13 @@
 import qualified Data.Text.Lazy.Builder     as B
 import Control.Concurrent (ThreadId, threadDelay)
 import Control.Monad.IO.Class (liftIO)
+import Control.Exception (throwIO)
 import Data.Text.Lazy (toStrict)
 import qualified Data.Text as T
 import Data.Maybe (catMaybes)
 import Data.Monoid ((<>))
 
+import Network.Ethereum.Web3.Provider
 import Network.Ethereum.Web3.Encoding
 import Network.Ethereum.Web3.Address
 import Network.Ethereum.Web3.Types
@@ -133,7 +135,7 @@
 _call to mode dat = do
     res <- eth_call txdata mode
     case fromData (T.drop 2 res) of
-        Nothing -> fail $
+        Nothing -> liftIO $ throwIO $ ParserFail $
             "Unable to parse result on `" ++ T.unpack res
             ++ "` from `" ++ show to ++ "`"
         Just x -> return x
diff --git a/src/Network/Ethereum/Web3/JsonRpc.hs b/src/Network/Ethereum/Web3/JsonRpc.hs
--- a/src/Network/Ethereum/Web3/JsonRpc.hs
+++ b/src/Network/Ethereum/Web3/JsonRpc.hs
@@ -18,6 +18,7 @@
   , ServerUri
   ) where
 
+import Network.Ethereum.Web3.Provider
 import Network.Ethereum.Web3.Types
 
 import Network.HTTP.Client (httpLbs, newManager, requestBody,
diff --git a/src/Network/Ethereum/Web3/Provider.hs b/src/Network/Ethereum/Web3/Provider.hs
new file mode 100644
--- /dev/null
+++ b/src/Network/Ethereum/Web3/Provider.hs
@@ -0,0 +1,43 @@
+-- |
+-- Module      :  Network.Ethereum.Web3.Provider
+-- Copyright   :  Alexander Krupenkin 2016
+-- License     :  BSD3
+--
+-- Maintainer  :  mail@akru.me
+-- Stability   :  experimental
+-- Portability :  portable
+--
+-- Web3 service provider.
+--
+module Network.Ethereum.Web3.Provider where
+
+import Control.Concurrent (forkIO, ThreadId)
+import Control.Monad.IO.Class (MonadIO(..))
+import Network.Ethereum.Web3.Types
+import Control.Exception (try)
+
+-- | Ethereum node service provider
+class Provider a where
+    -- | JSON-RPC provider URI, default: localhost:8545
+    rpcUri :: Web3 a String
+
+-- | Default 'Web3' service provider
+data DefaultProvider
+
+instance Provider DefaultProvider where
+    rpcUri = return "http://localhost:8545"
+
+-- | 'Web3' monad runner
+runWeb3' :: MonadIO m => Web3 a b -> m (Either Web3Error b)
+{-# INLINE runWeb3' #-}
+runWeb3' = liftIO . try . unWeb3
+
+-- | 'Web3' runner for default provider
+runWeb3 :: MonadIO m => Web3 DefaultProvider b -> m (Either Web3Error b)
+{-# INLINE runWeb3 #-}
+runWeb3 = runWeb3'
+
+-- | Fork 'Web3' with the same 'Provider'
+forkWeb3 :: Web3 a () -> Web3 a ThreadId
+{-# INLINE forkWeb3 #-}
+forkWeb3 = Web3 . forkIO . unWeb3
diff --git a/src/Network/Ethereum/Web3/TH.hs b/src/Network/Ethereum/Web3/TH.hs
--- a/src/Network/Ethereum/Web3/TH.hs
+++ b/src/Network/Ethereum/Web3/TH.hs
@@ -44,6 +44,7 @@
 import Network.Ethereum.Web3.Address (Address)
 import Network.Ethereum.Web3.Encoding.Tuple
 import Network.Ethereum.Web3.Encoding
+import Network.Ethereum.Web3.Provider
 import Network.Ethereum.Web3.Internal
 import Network.Ethereum.Web3.Contract
 import Network.Ethereum.Web3.JsonAbi
diff --git a/src/Network/Ethereum/Web3/Types.hs b/src/Network/Ethereum/Web3/Types.hs
--- a/src/Network/Ethereum/Web3/Types.hs
+++ b/src/Network/Ethereum/Web3/Types.hs
@@ -1,6 +1,5 @@
 {-# LANGUAGE GeneralizedNewtypeDeriving #-}
 {-# LANGUAGE DeriveDataTypeable         #-}
-{-# LANGUAGE DefaultSignatures          #-}
 {-# LANGUAGE TemplateHaskell            #-}
 -- |
 -- Module      :  Network.Ethereum.Web3.Types
@@ -20,9 +19,8 @@
 import qualified Data.Text.Lazy.Builder     as B
 import qualified Data.Text.Read             as R
 import Network.Ethereum.Web3.Address (Address)
-import Control.Monad.IO.Class (MonadIO(..))
-import Control.Concurrent (forkIO, ThreadId)
-import Control.Exception (Exception, try)
+import Control.Monad.IO.Class (MonadIO)
+import Control.Exception (Exception)
 import Data.Typeable (Typeable)
 import Data.Monoid ((<>))
 import Data.Text (Text)
@@ -32,31 +30,6 @@
 -- | Any communication with Ethereum node wrapped with 'Web3' monad
 newtype Web3 a b = Web3 { unWeb3 :: IO b }
   deriving (Functor, Applicative, Monad, MonadIO)
-
--- | Ethereum node service provider
-class Provider a where
-    -- | JSON-RPC provider URI, default: localhost:8545
-    rpcUri :: Web3 a String
-
-    -- | 'Web3' monad runner
-    runWeb3' :: MonadIO m => Web3 a b -> m (Either Web3Error b)
-    {-# INLINE runWeb3' #-}
-    runWeb3' = liftIO . try . unWeb3
-
-    -- | Fork 'Web3' with the same 'Provider'
-    forkWeb3 :: Web3 a () -> Web3 a ThreadId
-    {-# INLINE forkWeb3 #-}
-    forkWeb3 = Web3 . forkIO . unWeb3
-
--- | Default 'Web3' service provider
-data DefaultProvider
-instance Provider DefaultProvider where
-    rpcUri = return "http://localhost:8545"
-
--- | 'Web3' runner for default provider
-runWeb3 :: MonadIO m => Web3 DefaultProvider b -> m (Either Web3Error b)
-{-# INLINE runWeb3 #-}
-runWeb3 = runWeb3'
 
 -- | Some peace of error response
 data Web3Error
diff --git a/web3.cabal b/web3.cabal
--- a/web3.cabal
+++ b/web3.cabal
@@ -1,5 +1,5 @@
 name: web3
-version: 0.5.0.0
+version: 0.5.1.0
 cabal-version: >=1.10
 build-type: Simple
 license: BSD3
@@ -29,6 +29,7 @@
         Network.Ethereum.Web3.Types
         Network.Ethereum.Web3.Address
         Network.Ethereum.Web3.JsonAbi
+        Network.Ethereum.Web3.Provider
         Network.Ethereum.Web3.Encoding
         Network.Ethereum.Web3.Contract
         Network.Ethereum.Web3.Encoding.Bytes
@@ -63,7 +64,7 @@
         base >=4.9.0.0 && <4.10,
         memory ==0.13.*,
         text >=1.2.2.1 && <1.3,
-        web3 >=0.5.0.0 && <0.6
+        web3 >=0.5.1.0 && <0.6
     default-language: Haskell2010
     default-extensions: OverloadedStrings
     hs-source-dirs: test
