diff --git a/README b/README
--- a/README
+++ b/README
@@ -8,7 +8,9 @@
   http://haskell.org/
   http://opensoundcontrol.org/
 
-(c) rohan drape and others, 2006-2010
+(c) rohan drape and others, 2006-2011
     gpl, http://gnu.org/copyleft/
     with contributions by alex mclean
+                        & stefan kersten
+                        & henning thielemann
     see darcs history for details
diff --git a/Setup.hs b/Setup.hs
new file mode 100644
--- /dev/null
+++ b/Setup.hs
@@ -0,0 +1,3 @@
+#!/usr/bin/env runhaskell
+import Distribution.Simple
+main = defaultMain
diff --git a/Setup.lhs b/Setup.lhs
deleted file mode 100644
--- a/Setup.lhs
+++ /dev/null
@@ -1,3 +0,0 @@
-#!/usr/bin/env runhaskell
-> import Distribution.Simple
-> main = defaultMain
diff --git a/Sound/OpenSoundControl/Byte.hs b/Sound/OpenSoundControl/Byte.hs
--- a/Sound/OpenSoundControl/Byte.hs
+++ b/Sound/OpenSoundControl/Byte.hs
@@ -3,6 +3,7 @@
 
 import Data.Binary
 import qualified Data.ByteString.Lazy as B
+import qualified Data.ByteString.Lazy.Char8 as BC
 import Data.Char
 import Data.Int
 import Sound.OpenSoundControl.Cast
@@ -77,4 +78,4 @@
 
 -- | Decode an ASCII string.
 decode_str :: B.ByteString -> String
-decode_str = map (chr . fromIntegral) . B.unpack
+decode_str = BC.unpack
diff --git a/Sound/OpenSoundControl/OSC.hs b/Sound/OpenSoundControl/OSC.hs
--- a/Sound/OpenSoundControl/OSC.hs
+++ b/Sound/OpenSoundControl/OSC.hs
@@ -2,6 +2,8 @@
 --   functions.
 module Sound.OpenSoundControl.OSC ( OSC(..)
                                   , Datum(..)
+                                  , message
+                                  , bundle
                                   , encodeOSC
                                   , decodeOSC ) where
 
@@ -20,6 +22,7 @@
            | String String
            | Blob [Word8]
            | TimeStamp Time
+           | Midi (Word8,Word8,Word8,Word8)
              deriving (Eq, Show)
 
 -- | An OSC packet.
@@ -27,7 +30,8 @@
          | Bundle Time [OSC]
            deriving (Eq, Show)
 
--- | OSC bundles can be ordered (time ascending).
+-- | OSC bundles can be ordered (time ascending).  Bundles and
+--   messages compare EQ.
 instance Ord OSC where
     compare (Bundle a _) (Bundle b _) = compare a b
     compare _ _ = EQ
@@ -40,6 +44,7 @@
 tag (String _) = 's'
 tag (Blob _) = 'b'
 tag (TimeStamp _) = 't'
+tag (Midi _) = 'm'
 
 -- Command argument types are given by a descriptor.
 descriptor :: [Datum] -> Datum
@@ -60,6 +65,7 @@
 encode_datum (Double d) = encode_f64 d
 encode_datum (TimeStamp t) = encode_u64 $ as_ntpi t
 encode_datum (String s) = B.pack (extend 0 (str_cstr s))
+encode_datum (Midi (b0,b1,b2,b3)) = B.pack [b0,b1,b2,b3]
 encode_datum (Blob b) = B.concat [encode_i32 (length b), B.pack (extend 0 b)]
 
 -- Encode an OSC message.
@@ -150,6 +156,18 @@
 decodeOSC b | bundle_header `B.isPrefixOf` b = decode_bundle b
             | otherwise = decode_message b
 
+bundle :: Time -> [OSC] -> OSC
+bundle t xs =
+    case xs of
+      [] -> error "bundle: empty?"
+      _ -> Bundle t xs
+
+message :: String -> [Datum] -> OSC
+message a xs =
+    case a of
+      ('/':_) -> Message a xs
+      _ -> error "message: ill-formed address"
+
 b_take :: Int -> B.ByteString -> B.ByteString
 b_take = B.take . fromIntegral
 
@@ -158,4 +176,3 @@
 
 bundle_header :: B.ByteString
 bundle_header = encode_datum (String "#bundle")
-
diff --git a/Sound/OpenSoundControl/Transport/UDP.hs b/Sound/OpenSoundControl/Transport/UDP.hs
--- a/Sound/OpenSoundControl/Transport/UDP.hs
+++ b/Sound/OpenSoundControl/Transport/UDP.hs
@@ -22,31 +22,33 @@
 
 -- | Make a UDP connection.
 openUDP :: String -> Int -> IO UDP
-openUDP host port = do fd <- N.socket N.AF_INET N.Datagram 0
-                       a  <- N.inet_addr host
-                       let sa = N.SockAddrInet (fromIntegral port) a
-                       N.connect fd sa
-                       -- N.setSocketOption fd N.RecvTimeOut 1000
-                       return (UDP fd)
+openUDP host port = do
+  fd <- N.socket N.AF_INET N.Datagram 0
+  a  <- N.inet_addr host
+  let sa = N.SockAddrInet (fromIntegral port) a
+  N.connect fd sa
+  -- N.setSocketOption fd N.RecvTimeOut 1000
+  return (UDP fd)
 
 -- | Trivial udp server.
 udpServer :: String -> Int -> IO UDP
-udpServer host port = do fd <- N.socket N.AF_INET N.Datagram 0
-                         a  <- N.inet_addr host
-                         let sa = N.SockAddrInet (fromIntegral port) a
-                         N.bindSocket fd sa
-                         return (UDP fd)
+udpServer host port = do
+  fd <- N.socket N.AF_INET N.Datagram 0
+  a  <- N.inet_addr host
+  let sa = N.SockAddrInet (fromIntegral port) a
+  N.bindSocket fd sa
+  return (UDP fd)
 
 sendTo :: UDP -> OSC -> N.SockAddr -> IO ()
-sendTo (UDP fd) o a =
-    do N.sendTo fd (decode_str (encodeOSC o)) a
-       return ()
+sendTo (UDP fd) o a = do
+  _ <- N.sendTo fd (decode_str (encodeOSC o)) a
+  return ()
 
 recvFrom :: UDP -> IO (OSC, N.SockAddr)
-recvFrom (UDP fd) = 
-    do (s, _, a) <- N.recvFrom fd 8192
-       let o = (decodeOSC . encode_str) s
-       return (o, a)
+recvFrom (UDP fd) = do
+  (s, _, a) <- N.recvFrom fd 8192
+  let o = (decodeOSC . encode_str) s
+  return (o, a)
 
 udpPort :: Integral n => UDP -> IO n
 udpPort (UDP fd) = fmap fromIntegral (N.socketPort fd)
diff --git a/hosc.cabal b/hosc.cabal
--- a/hosc.cabal
+++ b/hosc.cabal
@@ -1,17 +1,17 @@
 Name:              hosc
-Version:           0.8
+Version:           0.9
 Synopsis:          Haskell Open Sound Control
 Description:       hosc provides Sound.OpenSoundControl, a haskell
                    module implementing a subset of the Open Sound
                    Control byte protocol.
 License:           GPL
 Category:          Sound
-Copyright:         (c) Rohan Drape, 2006-2010
+Copyright:         (c) Rohan Drape and others, 2006-2011
 Author:            Rohan Drape
 Maintainer:        rd@slavepianos.org
 Stability:         Experimental
 Homepage:          http://slavepianos.org/rd/?t=hosc
-Tested-With:       GHC == 6.10.3
+Tested-With:       GHC == 6.12.1
 Build-Type:        Simple
 Cabal-Version:     >= 1.6
 Data-Files:        README
@@ -37,4 +37,4 @@
 
 Source-Repository  head
   Type:            darcs
-  Location:        http://slavepianos.org/~rd/sw/hosc/
+  Location:        http://slavepianos.org/rd/sw/hosc/
