diff --git a/NetSNMP.cabal b/NetSNMP.cabal
--- a/NetSNMP.cabal
+++ b/NetSNMP.cabal
@@ -1,41 +1,49 @@
+name:                 NetSNMP
+version:              0.3.1.0
+synopsis:             Bindings for net-snmp's C API for clients
+description:          Network.Protocol.NetSNMP is a partial binding to the
+                      library portion of the net-snmp package.  It uses the
+                      'single-session api', which is claimed to be
+                      thread-safe.  Not all operations are supported yet;
+                      please contact the maintainer if you're in need of
+                      expanded functionality, and especially if you would
+                      like to contribute.
+category:             Network
+cabal-version:        >= 1.8
+license:              BSD3
+license-file:         LICENSE
+author:               Pavlo Kerestey and Humane Software for Global Access Internet Services GmbH
+maintainer:           Pavlo Kerestey <pavlo@kerestey.net>
+stability:            alpha
+build-type:           Simple
+homepage:             https://github.com/ptek/netsnmp
+bug-reports:          https://github.com/ptek/netsnmp/issues
+extra-source-files:   changes.md
 
-Name:               NetSNMP
-Version:            0.3.0.6
-Synopsis:           Bindings for net-snmp's C API for clients
-Description:        Network.Protocol.NetSNMP is a partial binding to the
-                    library portion of the net-snmp package.  It uses the
-                    'single-session api', which is claimed to be
-                    thread-safe.  Not all operations are supported yet;
-                    please contact the maintainer if you're in need of
-                    expanded functionality, and especially if you would
-                    like to contribute.
-Category:           Network
-Cabal-Version:      >= 1.8
-License:            BSD3
-License-file:       LICENSE
-Author:             Pavlo Kerestey and Humane Software for Global Access Internet Services GmbH
-Maintainer:         Pavlo Kerestey <pavlo@kerestey.net>
-Stability:          alpha
-Build-type:         Simple
-Homepage:           https://github.com/ptek/netsnmp
-Bug-reports:        https://github.com/ptek/netsnmp/issues
+source-repository head
+  type:               git
+  location:           git@github.com:ptek/netsnmp.git
 
 library
-  hs-source-dirs:   src
-  build-depends:    base >=4.5 && <5
-                   ,bytestring >= 0.10 && < 0.11
-  build-tools:      hsc2hs
-  exposed-modules:  Network.Protocol.NetSNMP
-  extensions:       ForeignFunctionInterface, CPP, EmptyDataDecls
-  extra-libraries:  netsnmp
-  ghc-options:      -static -optc-static -optl-static -optl-pthread
+  hs-source-dirs:     src
+  build-tools:        hsc2hs
+  exposed-modules:    Network.Protocol.NetSNMP
+  extensions:         ForeignFunctionInterface, CPP, EmptyDataDecls
+  extra-libraries:    netsnmp
+  ghc-options:        -Wall -static -fno-warn-missing-signatures -fno-warn-unused-binds
+  build-depends:      base >=4.5 && <5
+                     ,bytestring >= 0.9 && < 0.11
+                     ,utf8-string >= 0.3 && < 0.4
 
 test-suite tests
-  hs-source-dirs:   tests
-  extensions:       OverloadedStrings
-  type:		    exitcode-stdio-1.0
-  main-is:          RunTests.hs
-  build-depends:    base >= 4.5 && <5
-                   ,HUnit
-                   ,NetSNMP
-                   ,process > 1.1 && < 1.2
+  hs-source-dirs:     tests
+  extensions:         OverloadedStrings
+  ghc-options:        -Wall -static -threaded -fno-warn-missing-signatures -fno-warn-unused-binds -fno-warn-unused-do-bind
+  type:               exitcode-stdio-1.0
+  main-is:            RunTests.hs
+  build-depends:      base >= 4.5 && <5
+                     ,bytestring >= 0.9 && < 0.11
+                     ,utf8-string >= 0.3 && < 0.4
+                     ,HUnit
+                     ,NetSNMP
+                     ,process > 1.1 && < 1.2
diff --git a/changes.md b/changes.md
new file mode 100644
--- /dev/null
+++ b/changes.md
@@ -0,0 +1,2 @@
+0.3.1.0 - 19. April 2014
+        * Make the library work on Debian 7 with ByteString 0.9
diff --git a/src/Network/Protocol/NetSNMP.hsc b/src/Network/Protocol/NetSNMP.hsc
--- a/src/Network/Protocol/NetSNMP.hsc
+++ b/src/Network/Protocol/NetSNMP.hsc
@@ -32,9 +32,10 @@
 import           Control.Monad
 import           Data.ByteString (ByteString)
 import qualified Data.ByteString as B
+import           Data.ByteString.Char8 ()
+import qualified Data.ByteString.UTF8 as Utf8
 import           Data.List
-import		 Data.String
-import           Foreign
+import           Foreign hiding (void)
 import           Foreign.C.String
 import           Foreign.C.Types
 
@@ -82,7 +83,7 @@
 showOid = concatMap (('.':) . show)
 
 oidToByteString :: RawOID -> ByteString
-oidToByteString = fromString . showOid
+oidToByteString = Utf8.fromString . showOid
 
 -- I don't know whether (or which of) net-snmp's library functions
 -- account for bytesex; there may be endian bugs lurking here.
@@ -242,11 +243,10 @@
 initialize :: IO ()
 initialize = do
   withCString "Haskell bindings" c_init_snmp
-  withCString "127.0.0.1" $ \localhost -> 
-    withCString "public"  $ \public    -> 
-    alloca                $ \session   -> runTrouble $ 
-    readyCommunitySession snmp_version_2c localhost public session >>= closeSession
-  return ()
+  void $ withCString "127.0.0.1" $ \localhost ->
+         withCString "public"    $ \public    ->
+         alloca                  $ \session   -> runTrouble $
+         readyCommunitySession snmp_version_2c localhost public session >>= closeSession
 
 -- |Create an abstract session, suitable for reuse, responsible
 -- for freeing the string components
@@ -289,14 +289,14 @@
   -> Community   -- ^SNMP community (password)
   -> RawOID         -- ^OID to be queried
   -> IO (Either String SnmpResult)
-snmpGet version hostname community oid =
+snmpGet version hostname community oid' =
   B.useAsCString hostname  $ \cshost  ->
   B.useAsCString community $ \cscomm  ->
   alloca                   $ \session ->
   runTrouble $ bracketT
     (readyCommunitySession version cshost cscomm session)
     closeSession
-    (flip (mkSnmpGet snmp_msg_get) oid)
+    (flip (mkSnmpGet snmp_msg_get) oid')
 
 -- |Simple community-authenticated SNMP getnext.  Returns the first object
 --     after the OID queried, or a descriptive error message.
@@ -313,14 +313,14 @@
   -> Community   -- ^SNMP community (password)
   -> RawOID         -- ^OID to be queried
   -> IO (Either String SnmpResult)
-snmpNext version hostname community oid =
+snmpNext version hostname community oid' =
   B.useAsCString hostname  $ \cshost  ->
   B.useAsCString community $ \cscomm  ->
   alloca                   $ \session ->
   runTrouble $ bracketT
     (readyCommunitySession version cshost cscomm session)
     closeSession
-    (flip (mkSnmpGet snmp_msg_getnext) oid)
+    (flip (mkSnmpGet snmp_msg_getnext) oid')
 
 -- |Simple community-authenticated SNMP walk.  Returns a list of objects,
 --     starting with the object after the OID queried, and continuing
@@ -352,14 +352,14 @@
       (go walkoid . mkSnmpGet snmp_msg_getnext)
   where
     go :: RawOID -> (RawOID -> Trouble SnmpResult) -> Trouble [SnmpResult]
-    go oid next = do
-      v@(SnmpResult nextoid val) <- next oid
+    go oid' next = do
+      v@(SnmpResult nextoid _) <- next oid'
       case () of
-        _ | nextoid == oid -> return [] -- throwT "end of mib" -- return []
+        _ | nextoid == oid' -> return [] -- throwT "end of mib"
           | walkoid `isPrefixOf` nextoid -> do
             vs <- go nextoid next
             return (v:vs)
-          | otherwise -> return [] -- throwT "end of walk" -- return []
+          | otherwise -> return [] -- throwT "end of walk"
 
 
 -- |Same as snmpWalk but implemented with bulk requests
@@ -397,10 +397,10 @@
 -- the supplied oid
 -- It is the caller's obligation to ensure the session's validity.
 mkSnmpBulkGet :: CLong -> CLong -> RawOID -> Session -> Trouble [SnmpResult]
-mkSnmpBulkGet non_repeaters max_repetitions oid session =
+mkSnmpBulkGet non_repeaters max_repetitions oid' session =
   allocaArrayT (fromIntegral max_oid_len) $ \oids -> do
   let version = getVersion session
-  pdu_req <- buildPDU snmp_msg_getbulk oid oids version
+  pdu_req <- buildPDU snmp_msg_getbulk oid' oids version
   pokePDUNonRepeaters pdu_req non_repeaters
   pokePDUMaxRepetitions pdu_req max_repetitions
   dispatchSnmpReq pdu_req session
@@ -409,12 +409,12 @@
 -- the supplied oid
 -- It is the caller's obligation to ensure the session's validity.
 mkSnmpGet :: SnmpPDUType -> Session -> RawOID -> Trouble SnmpResult
-mkSnmpGet pdutype session oid = do
+mkSnmpGet pdutype session oid' = do
   res <- allocaArrayT (fromIntegral max_oid_len) $ \oids -> do
          let version = getVersion session
-         pdu_req <- buildPDU pdutype oid oids version
+         pdu_req <- buildPDU pdutype oid' oids version
          dispatchSnmpReq pdu_req session
-  if null res then throwT ("Could not get the snmp value at " ++ showOid oid)
+  if null res then throwT ("Could not get the snmp value at " ++ showOid oid')
   else return $ head res
 
 dispatchSnmpReq :: Ptr SnmpPDU -> Session -> Trouble [SnmpResult]
@@ -456,7 +456,7 @@
 
 extractVar :: Ptr CVarList -> Trouble SnmpResult
 extractVar rv = do
-  oid <- vlist2oid rv
+  oid' <- vlist2oid rv
   t <- peekVariableType rv
   v <- case () of
     _ | t == asn_octet_str    -> extractOctetStr     rv
@@ -475,7 +475,7 @@
     _ -> do
           descr <- rawvar2cstring rv
           return $ Unsupported (fromIntegral t) descr
-  return (SnmpResult oid v)
+  return (SnmpResult oid' v)
 
 extractOctetStr rv = do
   ptr <- peekVariableValString rv
@@ -498,12 +498,12 @@
 extractIntegral64Type rv constructor = do
   ptr <- peekVariableValInt rv
   (high:low:[]) <- peekArrayT 2 (castPtr ptr) :: Trouble [Word64]
-  return (constructor (fromIntegral ((high * (2 ^ 32) + low) :: Word64)))
+  return (constructor (fromIntegral ((high * (2 ^ (32 :: Word64)) + low) :: Word64)))
 
 extractIpAddress rv = do
   ptr <- peekVariableValInt rv
   octets <- peekArrayT 4 (castPtr ptr) :: Trouble [Word8]
-  let str = B.intercalate "." (map (fromString . show) octets)
+  let str = B.intercalate "." (map (B.pack . (:[])) octets)
   return (IpAddress str octets)
 
 extractOID :: Ptr CVarList -> Trouble ASNValue
@@ -511,10 +511,10 @@
   oidptr <- peekVariableValObjid rv :: Trouble (Ptr OIDpart)
   len <- peekVariableValLen rv
   let oidlen = (fromIntegral len) `div` #{size oid}
-  oid <- peekArrayT oidlen oidptr :: Trouble RawOID
-  let str = oidToByteString oid
+  oid' <- peekArrayT oidlen oidptr :: Trouble RawOID
+  let str = oidToByteString oid'
   descr <- rawvar2cstring rv
-  return (OID descr str (map fromIntegral oid))
+  return (OID descr str (map fromIntegral oid'))
 
 extractTimeTicks rv = do
   intptr <- peekVariableValInt rv
@@ -529,15 +529,15 @@
 showASNValue v = case v of
   OctetString s _     -> show s
   IpAddress   s _     -> show s
-  Counter32   c       -> show c 
-  Gauge32     c       -> show c 
-  OID         d os ol -> show os
+  Counter32   c       -> show c
+  Gauge32     c       -> show c
+  OID         _ os _  -> show os
   Opaque      cs      -> show cs
   Integer32   c       -> show c
-  Unsigned32  c       -> show c 
-  Counter64   c       -> show c 
+  Unsigned32  c       -> show c
+  Counter64   c       -> show c
   Integer64   c       -> show c
-  Unsigned64  c       -> show c 
+  Unsigned64  c       -> show c
   TimeTicks   s _     -> show s
   Boolean     c       -> show c
   IEEEDouble  c       -> show c
@@ -553,14 +553,14 @@
   -> Ptr OIDpart  -- OIDpart array passed in b/c I don't know when it dallocs
   -> SnmpVersion  -- eg. snmp_version_1 or snmp_version_2c
   -> Trouble (Ptr SnmpPDU) -- returns pdu and oid length
-buildPDU pdutype oid oids version =
-  withCStringT (showOid oid) $ \oid_cstr   ->
-  allocaT                    $ \oidlen_ptr -> do
+buildPDU pdutype oid' oids version =
+  withCStringT (showOid oid') $ \oid_cstr   ->
+  allocaT                     $ \oidlen_ptr -> do
     pdu_req <- t_snmp_pdu_create pdutype
     pokePDUVersion pdu_req (unSnmpVersion version)
     pokePDUCommand pdu_req (unSnmpPDUType pdutype)
     pokeT oidlen_ptr (fromIntegral max_oid_len)
-    t_read_objid oid_cstr oids oidlen_ptr    -- or t_get_node
+    _ <- t_read_objid oid_cstr oids oidlen_ptr    -- or t_get_node
     oidlen <- peekT oidlen_ptr
     t_snmp_add_null_var pdu_req oids oidlen
     return pdu_req
@@ -568,8 +568,8 @@
 rawvar2cstring :: Ptr CVarList -> Trouble ByteString
 rawvar2cstring rv =
   allocaArray0T max_string_len $ \buf -> do
-  rc <- t_snprint_by_type buf (fromIntegral max_string_len) rv
-          nullPtr nullPtr nullPtr
+  _ <- t_snprint_by_type buf (fromIntegral max_string_len) rv
+         nullPtr nullPtr nullPtr
   peekCStringT buf
 
 allocaT :: (Storable a) => (Ptr a -> Trouble b) -> Trouble b
@@ -710,13 +710,13 @@
   c_snmp_pdu_create
 
 -- Parse string argument as OID; populate OIDpart array and size
-foreign import ccall unsafe "net-snmp/net-snmp-includes.h get_node"
-    c_get_node :: CString -> Ptr OIDpart -> Ptr CSize -> IO CInt
+-- foreign import ccall unsafe "net-snmp/net-snmp-includes.h get_node"
+--     c_get_node :: CString -> Ptr OIDpart -> Ptr CSize -> IO CInt
 
-t_get_node = hoistTE3
-  (predToMaybe (not . (>0)) "get_node failed")
-  -- (\i -> if (i <= 0) then Just "get_node failed" else Nothing)
-  c_get_node
+-- t_get_node = hoistTE3
+--   (predToMaybe (not . (>0)) "get_node failed")
+--   -- (\i -> if (i <= 0) then Just "get_node failed" else Nothing)
+--   c_get_node
 
 -- OID parser/builder script.  How does this differ from get_node?
 foreign import ccall unsafe "net-snmp/net-snmp-includes.h read_objid"
@@ -728,13 +728,13 @@
   c_read_objid
 
 -- OID parser/builder script.  How does this differ from get_node?
-foreign import ccall unsafe "net-snmp/net-snmp-includes.h snmp_parse_oid"
-    c_snmp_parse_oid :: CString -> Ptr OIDpart -> Ptr CSize -> IO CInt
+-- foreign import ccall unsafe "net-snmp/net-snmp-includes.h snmp_parse_oid"
+--     c_snmp_parse_oid :: CString -> Ptr OIDpart -> Ptr CSize -> IO CInt
 
-t_snmp_parse_oid = hoistTE3
-  (predToMaybe (not . (>0)) "snmp_parse_oid failed")
-  -- (\i -> if (i <= 0) then Just "snmp_parse_oid failed" else Nothing)
-  c_snmp_parse_oid
+-- t_snmp_parse_oid = hoistTE3
+--   (predToMaybe (not . (>0)) "snmp_parse_oid failed")
+--   -- (\i -> if (i <= 0) then Just "snmp_parse_oid failed" else Nothing)
+--   c_snmp_parse_oid
 
 -- Add oid with void result; suitable for building a query
 foreign import ccall unsafe "net-snmp/net-snmp-includes.h snmp_add_null_var"
@@ -766,21 +766,18 @@
 foreign import ccall unsafe "net-snmp/net-snmp-includes.h snmp_sess_close"
     c_snmp_sess_close :: Ptr SnmpSession -> IO ()
 
-t_snmp_sess_close = hoistT1 c_snmp_sess_close
+-- t_snmp_sess_close = hoistT1 c_snmp_sess_close
 
 -- Send and enqueue request PDU for asynch use, not currently supported.
 -- foreign import ccall unsafe "net-snmp/net-snmp-includes.h snmp_sess_send"
 --     c_snmp_sess_send :: Ptr SnmpSession -> Ptr SnmpPDU -> IO CInt
 
 -- Print result value to stdout
-foreign import ccall safe "net-snmp/net-snmp-includes.h print_variable"
-    c_print_variable :: Ptr OIDpart -> CSize -> Ptr CVarList -> IO ()
-
-t_print_variable = hoistT3 c_print_variable
+-- foreign import ccall safe "net-snmp/net-snmp-includes.h print_variable"
+--     c_print_variable :: Ptr OIDpart -> CSize -> Ptr CVarList -> IO ()
 
 -- t_print_variable :: Ptr OIDpart -> CSize -> Ptr CVarList -> Trouble ()
--- t_print_variable o s r = Trouble $ Right <$> c_print_variable o s r
-
+-- t_print_variable = hoistT3 c_print_variable
 
 -- Return library error description
 -- This one should only be used for failure of snmp_sess_open; use
@@ -810,9 +807,9 @@
 -- snmp_sess_open failure.  
 -- library/snmp_api.h
 -- void snmp_sess_error(void *, int *, int *, char **);
-foreign import ccall unsafe "net-snmp/net-snmp-includes.h snmp_sess_error"
-    c_snmp_sess_error :: Ptr SnmpSession -> Ptr CInt -> Ptr CInt
-      -> Ptr CString -> IO ()
+-- foreign import ccall unsafe "net-snmp/net-snmp-includes.h snmp_sess_error"
+--     c_snmp_sess_error :: Ptr SnmpSession -> Ptr CInt -> Ptr CInt
+--       -> Ptr CString -> IO ()
 
 -- int snprint_by_type(char *buf, size_t buf_len, netsnmp_variable_list * var,
 --   const struct enum_list *enums, const char *hint, const char *units);
@@ -860,24 +857,16 @@
 catchT m h = Trouble $ do
   r <- runTrouble m
   case r of (Left s)  -> runTrouble (h s)
-            (Right v) -> return r
+            (Right _) -> return r
 
 handleT :: (String -> Trouble a) -> Trouble a -> Trouble a
 handleT = flip catchT
 
--- _bracketT :: Trouble a -> (a -> Trouble b) -> (a -> Trouble c) -> Trouble c
--- _bracketT before after thing = do
---   a <- before
---   handleT (\s -> after a >> throwT s) $ do
---     result <- thing a
---     after a
---     return result
-
 bracketT :: Trouble a -> (a -> Trouble b) -> (a -> Trouble c) -> Trouble c
 bracketT before after thing = do
   a <- before
   result <- handleT (\s -> after a >> throwT s) (thing a)
-  after a
+  _ <- after a
   return result
 
 -- Routines to 'hoist' anything with IO return type into the
@@ -903,9 +892,9 @@
 hoistTE1 e f a = hoistTE0 e (f a)
 hoistTE2 e f a = hoistTE1 e (f a)
 hoistTE3 e f a = hoistTE2 e (f a)
-hoistTE4 e f a = hoistTE3 e (f a)
-hoistTE5 e f a = hoistTE4 e (f a)
-hoistTE6 e f a = hoistTE5 e (f a)
+--hoistTE4 e f a = hoistTE3 e (f a)
+--hoistTE5 e f a = hoistTE4 e (f a)
+--hoistTE6 e f a = hoistTE5 e (f a)
 
 predToMaybe :: (a -> Bool) -> b -> a -> Maybe b
 predToMaybe p b a = if p a then Just b else Nothing
diff --git a/tests/RunTests.hs b/tests/RunTests.hs
--- a/tests/RunTests.hs
+++ b/tests/RunTests.hs
@@ -1,6 +1,5 @@
 module Main where
 
-import Network.Protocol.NetSNMP
 import System.Exit
 import SystemTest.Platform (tests)
 import Test.HUnit
