diff --git a/hs_sources/SDR/Plot.hs b/hs_sources/SDR/Plot.hs
--- a/hs_sources/SDR/Plot.hs
+++ b/hs_sources/SDR/Plot.hs
@@ -18,7 +18,7 @@
     centeredAxes
     ) where
 
-import           Control.Monad.Trans.Either
+import           Control.Monad.Trans.Except
 import qualified Data.Vector.Storable       as VS
 import           Graphics.Rendering.OpenGL
 import           Graphics.Rendering.Cairo
@@ -39,7 +39,7 @@
          -> Int -- ^ Window height
          -> Int -- ^ Number of samples in each buffer
          -> Int -- ^ Number of vertices in graph
-         -> EitherT String IO (Consumer (VS.Vector GLfloat) IO ())
+         -> ExceptT String IO (Consumer (VS.Vector GLfloat) IO ())
 plotLine width height samples resolution = window width height $ fmap pipeify $ renderLine samples resolution
 
 -- | Create a window and plot a dynamic line graph of the incoming data. With Axes.
@@ -48,7 +48,7 @@
              -> Int       -- ^ Number of samples in each buffer
              -> Int       -- ^ Number of vertices in graph
              -> Render () -- ^ Cairo Render object that draws the axes
-             -> EitherT String IO (Consumer (VS.Vector GLfloat) IO ())
+             -> ExceptT String IO (Consumer (VS.Vector GLfloat) IO ())
 plotLineAxes width height samples xResolution rm = window width height $ do
     --render the graph
     renderFunc <- renderLine samples xResolution
@@ -74,7 +74,7 @@
               -> Int       -- ^ Number of columns
               -> Int       -- ^ Number of rows 
               -> [GLfloat] -- ^ The color map
-              -> EitherT String IO (Consumer (VS.Vector GLfloat) IO ())
+              -> ExceptT String IO (Consumer (VS.Vector GLfloat) IO ())
 plotWaterfall windowWidth windowHeight width height colorMap = window windowWidth windowHeight $ renderWaterfall width height colorMap 
 
 {-
@@ -105,7 +105,7 @@
          -> Int       -- ^ Window height
          -> Int       -- ^ Number of samples in each buffer
          -> [GLfloat] -- ^ The color map
-         -> EitherT String IO (Consumer (VS.Vector GLfloat) IO ())
+         -> ExceptT String IO (Consumer (VS.Vector GLfloat) IO ())
 plotFill width height samples colorMap = window width height $ fmap pipeify $ renderFilledLine samples colorMap
 
 -- | Create a window and plot a dynamic filled in line graph of the incoming data. With Axes.
@@ -114,7 +114,7 @@
              -> Int       -- ^ Number of samples in each buffer
              -> [GLfloat] -- ^ The color map
              -> Render () -- ^ Cairo Render object that draws the axes
-             -> EitherT String IO (Consumer (VS.Vector GLfloat) IO ())
+             -> ExceptT String IO (Consumer (VS.Vector GLfloat) IO ())
 plotFillAxes width height samples colorMap rm = window width height $ do
     renderFunc <- renderFilledLine samples colorMap
     
diff --git a/hs_sources/SDR/RTLSDRStream.hs b/hs_sources/SDR/RTLSDRStream.hs
--- a/hs_sources/SDR/RTLSDRStream.hs
+++ b/hs_sources/SDR/RTLSDRStream.hs
@@ -10,7 +10,7 @@
     ) where
 
 import           Control.Monad
-import           Control.Monad.Trans.Either
+import           Control.Monad.Trans.Except
 import           Data.Word
 import           Data.Int
 import           Foreign.ForeignPtr
@@ -54,12 +54,12 @@
 sdrStream :: RTLSDRParams                                          -- ^ Configuration parameters
           -> Word32                                                -- ^ Number of buffers
           -> Word32                                                -- ^ Buffer length
-          -> EitherT String IO (Producer (VS.Vector CUChar) IO ()) -- ^ Either a string describing the error that occurred or the Producer
+          -> ExceptT String IO (Producer (VS.Vector CUChar) IO ()) -- ^ Either a string describing the error that occurred or the Producer
 sdrStream params bufNum bufLen = do
     lift $ putStrLn "Initializing RTLSDR device..."
 
     dev' <- lift $ open 0
-    dev  <- maybe (left "Failed to open device") return dev'
+    dev  <- maybe (throwE "Failed to open device") return dev'
 
     lift $ do
         t <- getTunerType dev
diff --git a/sdr.cabal b/sdr.cabal
--- a/sdr.cabal
+++ b/sdr.cabal
@@ -1,5 +1,5 @@
 name:                sdr
-version:             0.1.0.10
+version:             0.1.0.11
 synopsis:            A software defined radio library
 description:         
     Write software defined radio applications in Haskell.
@@ -73,12 +73,11 @@
         pulse-simple         >=0.1   && <0.2, 
         pipes                >=4.1   && <4.4, 
         pipes-concurrency    >=2.0   && <2.1, 
-        either               >=4.1   && <4.5, 
         time                 >=1.4   && <1.9, 
         rtlsdr               >=0.1   && <0.2, 
         storable-complex     >=0.2   && <0.3, 
         pipes-bytestring     >=2.0   && <2.2, 
-        dynamic-graph        ==0.1.0.10,
+        dynamic-graph        >=0.1.0.12,
         array                >=0.4   && <0.6, 
         vector               >=0.11  && <0.13,
         tuple                >=0.2   && <0.4, 
@@ -91,9 +90,10 @@
         cairo                >=0.13  && <0.14, 
         cereal               >=0.4   && <0.6, 
         optparse-applicative >=0.11  && <0.15, 
-        Decimal              >=0.4   && <0.5,
+        Decimal              >=0.4   && <0.6,
         Chart                >=1.3   && <1.9, 
         Chart-cairo          >=1.3   && <1.9,
+        transformers         >=0.5   && <0.6,
         mwc-random
     -- hs-source-dirs:      
     default-language:    Haskell2010
@@ -131,7 +131,7 @@
     main-is:             Benchmarks.hs
     build-depends:       
         base             >=4.6  && <5, 
-        criterion        >=1.0  && <1.3,
+        criterion        >=1.0  && <1.4,
         vector           >=0.11 && <0.13, 
         primitive        >=0.5  && <0.7, 
         storable-complex >=0.2  && <0.3,
