diff --git a/DBus/Notify.hs b/DBus/Notify.hs
--- a/DBus/Notify.hs
+++ b/DBus/Notify.hs
@@ -5,7 +5,7 @@
 --
 -- This library does not yet support receiving events relating to notifications,
 -- or images in notifications: if you need that functionality please contact the maintainer.
-module DBus.Notify 
+module DBus.Notify
     (
     -- * Usage
     -- $usage
@@ -13,6 +13,7 @@
     -- * Displaying notifications
       notify
     , replace
+    , Notification
     , mkSessionClient
     , Client
     -- * Constructing notifications
@@ -26,8 +27,9 @@
     , Category (..)
     , UrgencyLevel (..)
     , Hint (..)
-    -- * Handles to displayed notifications
-    , Notification
+    -- * Capabilities
+    , getCapabilities
+    , Capability (..)
     ) where
 
 import DBus.Message
@@ -78,7 +80,7 @@
 -- Note that this opens a socket and spawns a thread,
 -- so it's best to reuse a single client.
 mkSessionClient :: IO Client
-mkSessionClient = mkClient getSessionBus
+mkSessionClient = mkClient =<< getSessionBus
 
 -- |A 'Note' with default values.
 -- All fields are blank except for 'expiry', which is 'Dependent'.
@@ -94,9 +96,9 @@
 
 proxy = Proxy (RemoteObject busname path) iface
     where
-        busname = mkBusName' "org.freedesktop.Notifications"
-        path = mkObjectPath' "/org/freedesktop/Notifications"
-        iface = mkInterfaceName' "org.freedesktop.Notifications"
+        busname = "org.freedesktop.Notifications"
+        path = "/org/freedesktop/Notifications"
+        iface = "org.freedesktop.Notifications"
 
 -- |Contents of a notification
 data Note = Note { appName :: String
@@ -157,24 +159,11 @@
 data Category =   Device | DeviceAdded | DeviceError | DeviceRemoved
                 | Email | EmailArrived | EmailBounced
                 | Im | ImError | ImReceived
-                | Network | NetworkConnected | NetworkDisconnected | NetworkError 
+                | Network | NetworkConnected | NetworkDisconnected | NetworkError
                 | Presence | PresenceOffline | PresenceOnline
                 | Transfer | TransferComplete | TransferError
     deriving (Eq, Show)
 
-notifyArgs :: Note -> Word32 -> [Variant]
-notifyArgs note replaceId = map ($ note) args
-    where
-        args = [ toVariant . appName
-               , const $ toVariant (replaceId::Word32)
-               , toVariant . fromMaybe "" .fmap bitmap . appImage
-               , toVariant . summary
-               , toVariant . fromMaybe "" . fmap flattenBody . body
-               , toVariant . actionsArray . actions
-               , toVariant . hintsDict . hints
-               , toVariant . timeoutInt . expiry
-               ]
-
 data ClosedReason = Expired | Dismissed | CloseNotificationCalled
 data NotificationEvent = ActionInvoked Action | Closed ClosedReason
 
@@ -193,12 +182,46 @@
 replace :: Client -> Notification -> Note -> IO Notification
 replace cl (Notification { notificationId=replaceId }) note =
     Notification . fromJust . fromVariant . head . methodReturnBody <$>
-        callBlocking cl proxy (mkMemberName' "Notify") [] (notifyArgs note replaceId)
+        callProxyBlocking_ cl proxy "Notify" [] args
+    where
+        args = map ($ note)
+            [ toVariant . appName
+               , const $ toVariant (replaceId::Word32)
+               , toVariant . fromMaybe "" .fmap bitmap . appImage
+               , toVariant . summary
+               , toVariant . fromMaybe "" . fmap flattenBody . body
+               , toVariant . actionsArray . actions
+               , toVariant . hintsDict . hints
+               , toVariant . timeoutInt . expiry
+               ]
 
+data Capability =   ActionsCap | BodyCap | BodyHyperlinksCap | BodyImagesCap
+                  | BodyMarkupCap | IconMultiCap | IconStaticCap | SoundCap
+                  | UnknownCap String
+    deriving (Eq, Read, Show)
+
+-- |Determine the server's capabilities
+getCapabilities :: Client -> IO [Capability]
+getCapabilities cl = map readCapability . fromJust . fromArray . fromJust
+                    . fromVariant . head . methodReturnBody
+                    <$> callProxyBlocking_ cl proxy "GetCapabilities" [] []
+
+readCapability :: String -> Capability
+readCapability s = case s of
+                    "actions" -> ActionsCap
+                    "body" -> BodyCap
+                    "body-hyperlinks" -> BodyHyperlinksCap
+                    "body-images" -> BodyImagesCap
+                    "body-markup" -> BodyMarkupCap
+                    "icon-multi" -> IconMultiCap
+                    "icon-static" -> IconStaticCap
+                    "sound" -> SoundCap
+                    s -> UnknownCap s
+
 timeoutInt :: Timeout -> Int32
 timeoutInt Never = 0
 timeoutInt Dependent = -1
-timeoutInt (Milliseconds n) 
+timeoutInt (Milliseconds n)
     | n > 0     = n
     | otherwise = error "notification timeout not positive"
 
@@ -209,7 +232,6 @@
         escape '<' = "&lt;"
         escape '&' = "&amp;"
         escape x = [x]
-
 flattenBody (Bold b) = "<b>" ++ flattenBody b ++ "</b>"
 flattenBody (Italic b) = "<i>" ++ flattenBody b ++ "</i>"
 flattenBody (Underline b) = "<u>" ++ flattenBody b ++ "</u>"
@@ -235,7 +257,7 @@
         hint (X x) = ("x", toVariant x)
         hint (Y y) = ("x", toVariant y)
 
--- HACK: Assumes the constructor for category foo.bar.baz is FooBarBaz and
+-- HACK: Assumes the constructor for category foo.bar is FooBar and
 -- categories have no capital letters
 catName :: Category -> String
 catName c = catName' (show c)
diff --git a/LICENSE b/LICENSE
--- a/LICENSE
+++ b/LICENSE
@@ -14,7 +14,7 @@
    may be used to endorse or promote products derived from this software
    without specific prior written permission.
 
-THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS ``AS IS'' AND
 ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE
diff --git a/Setup.hs b/Setup.hs
deleted file mode 100644
--- a/Setup.hs
+++ /dev/null
@@ -1,2 +0,0 @@
-import Distribution.Simple
-main = defaultMain
diff --git a/Setup.lhs b/Setup.lhs
new file mode 100644
--- /dev/null
+++ b/Setup.lhs
@@ -0,0 +1,3 @@
+#!/usr/bin/env runhaskell
+> import Distribution.Simple
+> main = defaultMain
diff --git a/fdo-notify.cabal b/fdo-notify.cabal
--- a/fdo-notify.cabal
+++ b/fdo-notify.cabal
@@ -1,5 +1,5 @@
 name:               fdo-notify
-version:            0.1
+version:            0.2
 synopsis:           Desktop Notifications client
 description:
     A library for issuing notifications using FreeDesktop.org's Desktop
@@ -10,6 +10,7 @@
 license-file:       LICENSE
 author:             Max Rabkin
 maintainer:         max.rabkin@gmail.com
+homepage:           http://bitbucket.org/taejo/fdo-notify/
 cabal-version:      >= 1.2.1
 build-type:         Simple
 
@@ -17,6 +18,9 @@
     examples/fib.hs
 
 library
-    build-depends: base >= 3 && < 5, dbus-core >= 0.5 && < 0.6, dbus-client >= 0.1 && < 0.2
+    build-depends:
+        base >= 3 && < 5
+      , dbus-client >= 0.3 && < 0.4
+      , dbus-core >= 0.8 && < 0.9
 
     exposed-modules: DBus.Notify
