diff --git a/Bustle.hs b/Bustle.hs
--- a/Bustle.hs
+++ b/Bustle.hs
@@ -24,6 +24,7 @@
 import System.Environment (getArgs)
 import System.Exit (exitFailure)
 import Control.Monad (when)
+import System.Glib.Utils (setApplicationName)
 import Bustle.Noninteractive
 import Bustle.Translation
 import Bustle.UI
@@ -51,6 +52,7 @@
 main :: IO ()
 main = do
     initTranslation
+    setApplicationName (__ "Bustle")
     args <- getArgs
 
     case args of
diff --git a/Bustle/Loader.hs b/Bustle/Loader.hs
--- a/Bustle/Loader.hs
+++ b/Bustle/Loader.hs
@@ -25,17 +25,11 @@
   )
 where
 
-import Control.Exception
 import Control.Monad.Except
 import Control.Arrow ((***))
 
-import Text.Printf
-
-import qualified Bustle.Loader.OldSkool as Old
 import qualified Bustle.Loader.Pcap as Pcap
-import Bustle.Upgrade (upgrade)
 import Bustle.Types
-import Bustle.Translation (__)
 import Bustle.Util (io)
 
 data LoadError = LoadError FilePath String
@@ -48,27 +42,15 @@
         -> ExceptT LoadError io ([String], Log)
 readLog f = do
     pcapResult <- io $ Pcap.readPcap f
-    liftM (id *** filter (isRelevant . deEvent)) $ case pcapResult of
-        Right ms -> return ms
-        Left _ -> liftM ((,) []) readOldLogFile
-  where
-    readOldLogFile = do
-        result <- liftIO $ try $ readFile f
-        case result of
-            Left e      -> throwError $ LoadError f (show (e :: IOException))
-            Right input -> do
-                let oldResult = fmap upgrade $ Old.readLog input
-                case oldResult of
-                    Left e  -> throwError $ LoadError f (printf (__ "Parse error %s") (show e))
-                    Right r -> return r
+    case pcapResult of
+        Right ms -> return $ (id *** filter (isRelevant . deEvent)) ms
+        Left ioe -> throwError $ LoadError f (show ioe)
 
 isRelevant :: Event
            -> Bool
 isRelevant (NOCEvent _) = True
 isRelevant (MessageEvent m) = case m of
-    Signal {}       -> none [ senderIsBus
-                            , isDisconnected
-                            ]
+    Signal {}       -> not senderIsBus
     MethodCall {}   -> none3
     MethodReturn {} -> none3
     Error {}        -> none3
@@ -79,11 +61,7 @@
     destIsBus = destination m == busDriver
     busDriver = O (OtherName dbusName)
 
-    -- When the monitor is forcibly disconnected from the bus, the
-    -- Disconnected message has no sender; the old logger spat out <none>.
-    isDisconnected = sender m == O (OtherName Old.senderWhenDisconnected)
-
     none bs = not $ or bs
-    none3 = none [senderIsBus, destIsBus, isDisconnected]
+    none3 = none [senderIsBus, destIsBus]
 
 
diff --git a/Bustle/Loader/OldSkool.hs b/Bustle/Loader/OldSkool.hs
deleted file mode 100644
--- a/Bustle/Loader/OldSkool.hs
+++ /dev/null
@@ -1,248 +0,0 @@
-{-# LANGUAGE OverloadedStrings #-}
-{-
-Bustle.Loader.OldSkool: reads the output of bustle-dbus-monitor
-Copyright © 2008–2011 Collabora Ltd.
-
-This library is free software; you can redistribute it and/or
-modify it under the terms of the GNU Lesser General Public
-License as published by the Free Software Foundation; either
-version 2.1 of the License, or (at your option) any later version.
-
-This library is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-Lesser General Public License for more details.
-
-You should have received a copy of the GNU Lesser General Public
-License along with this library; if not, write to the Free Software
-Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
--}
-module Bustle.Loader.OldSkool
-  ( readLog
-  , senderWhenDisconnected
-  )
-where
-
-import Bustle.Types
-import qualified DBus as D
-import Text.ParserCombinators.Parsec hiding (Parser)
-import Data.Map (Map)
-import Data.Maybe (isJust)
-import qualified Data.Map as Map
-import Control.Monad (when, guard)
-import Control.Applicative ((<$>), (<*>), (<*))
-
-type Parser a = GenParser Char (Map (TaggedBusName, Serial) (Detailed Message)) a
-
-t :: Parser Char
-t = char '\t'
-
-nameChars :: Parser String
-nameChars = many1 (noneOf "\t\n")
--- this should be
---   nameChars = many1 (oneOf "._-" <|> alphaNum)
--- but making it more tolerant lets us shoehorn misc into this field until the
--- log format is less shit.
-
-parseUniqueName :: Parser UniqueName
-parseUniqueName = do
-    char ':'
-    rest <- nameChars
-    case D.parseBusName (':':rest) of
-        Just n  -> return $ UniqueName n
-        Nothing -> fail $ "':" ++ rest ++ "' is not a valid unique name"
-  <?> "unique name"
-
--- FIXME: this shouldn't exist.
-senderWhenDisconnected :: D.BusName
-senderWhenDisconnected = D.busName_ "org.freedesktop.DBus.Local"
-
-parseMissingName :: Parser OtherName
-parseMissingName = do
-    none
-    return $ OtherName senderWhenDisconnected
-
-parseSpecifiedOtherName :: Parser OtherName
-parseSpecifiedOtherName = do
-    x <- nameChars
-    case D.parseBusName x of
-        Just n  -> return $ OtherName n
-        Nothing -> fail $ "'" ++ x ++ "' is not a valid name"
-
-parseOtherName :: Parser OtherName
-parseOtherName = parseMissingName <|> parseSpecifiedOtherName
-  <?>
-    "non-unique name"
-
-parseBusName :: Parser TaggedBusName
-parseBusName = (fmap U parseUniqueName) <|> (fmap O parseOtherName)
-
-parseSerial :: Parser Serial
-parseSerial = read <$> many1 digit <?> "serial"
-
-parseTimestamp :: Parser Microseconds
-parseTimestamp = do
-    seconds <- i
-    t
-    µs <- i
-    return $ µsFromPair seconds µs
-  where i = read <$> many1 digit <?> "timestamp"
-
-none :: Parser (Maybe a)
-none = do
-    string "<none>"
-    return Nothing
-
-pathify :: String -> D.ObjectPath
-pathify s = case D.parseObjectPath s of
-    Just p -> p
-    Nothing -> D.objectPath_ "/unparseable/object/path"
-
-interfacify :: String -> Maybe D.InterfaceName
-interfacify = D.parseInterfaceName
-
-memberNamify :: String -> D.MemberName
-memberNamify s = case D.parseMemberName s of
-    Just m -> m
-    Nothing -> D.memberName_ "UnparseableMemberName"
-
-entireMember :: Parser Member
-entireMember = do
-    let p = pathify <$> many1 (oneOf "/_" <|> alphaNum) <?> "path"
-        i = none <|> fmap interfacify (many1 (oneOf "._" <|> alphaNum)) <?> "iface"
-        m = memberNamify <$> many1 (oneOf "_" <|> alphaNum) <?> "membername"
-    Member <$> p <* t <*> i <* t <*> m
-  <?> "member"
-
-addPendingCall :: Detailed Message -> Parser ()
-addPendingCall dm = updateState $ Map.insert (sender m, serial m) dm
-  where
-    m = deEvent dm
-
-findPendingCall :: TaggedBusName -> Serial -> Parser (Maybe (Detailed Message))
-findPendingCall dest s = do
-    pending <- getState
-    let key = (dest, s)
-        ret = Map.lookup key pending
-    when (isJust ret) $ updateState (Map.delete key)
-    return ret
-
-methodCall :: Parser DetailedEvent
-methodCall = do
-    char 'c'
-    t
-    µs <- parseTimestamp
-    t
-    m <- MethodCall <$> parseSerial <* t
-                    <*> parseBusName <* t <*> parseBusName <* t <*> entireMember
-    let dm = Detailed µs m Nothing
-    addPendingCall dm
-    return $ fmap MessageEvent dm
-  <?> "method call"
-
-parseReturnOrError :: String
-                   -> (Maybe (Detailed Message) -> TaggedBusName -> TaggedBusName -> Message)
-                   -> Parser DetailedEvent
-parseReturnOrError prefix constructor = do
-    string prefix <* t
-    ts <- parseTimestamp <* t
-    parseSerial <* t
-    replySerial <- parseSerial <* t
-    s <- parseBusName <* t
-    d <- parseBusName
-    call <- findPendingCall d replySerial
-    -- If we can see a call, use its sender and destination as the destination
-    -- and sender for the reply. This might prove unnecessary in the event of
-    -- moving the name collapsing into the UI.
-    let (s', d') = case call of
-            Just (Detailed _ m _) -> (destination m, sender m)
-            Nothing               -> (s, d)
-        message = constructor call s' d'
-    return $ Detailed ts (MessageEvent message) Nothing
- <?> "method return or error"
-
-methodReturn, parseError :: Parser DetailedEvent
-methodReturn = parseReturnOrError "r" MethodReturn <?> "method return"
-parseError = parseReturnOrError "err" Error <?> "error"
-
-signal :: Parser DetailedEvent
-signal = do
-    string "sig"
-    t
-    µs <- parseTimestamp
-    t
-    -- Ignore serial
-    m <- Signal <$> (parseSerial >> t >> parseBusName) <* t
-                <*> return Nothing
-                <*> entireMember
-    return $ Detailed µs (MessageEvent m) Nothing
-  <?> "signal"
-
-method :: Parser DetailedEvent
-method = char 'm' >> (methodCall <|> methodReturn)
-  <?> "method call or return"
-
-noName :: Parser ()
-noName = char '!' >> return ()
-  <?> "the empty name '!'"
-
-perhaps :: Parser a -> Parser (Maybe a)
-perhaps act = (noName >> return Nothing) <|> fmap Just act
-
-sameUnique :: UniqueName -> UniqueName -> Parser ()
-sameUnique u u' = guard (u == u')
-  <?> "owner to be " ++ unUniqueName u ++ ", not " ++ unUniqueName u'
-
-atLeastOne :: OtherName -> Parser a
-atLeastOne n = fail ""
-  <?> unOtherName n ++ " to gain or lose an owner"
-
-nameOwnerChanged :: Parser DetailedEvent
-nameOwnerChanged = do
-    string "nameownerchanged"
-    t
-    ts <- parseTimestamp
-    t
-    n <- parseBusName
-    t
-    m <- parseNOCDetails n
-    return $ Detailed ts (NOCEvent m) Nothing
-
-parseNOCDetails :: TaggedBusName
-                -> Parser NOC
-parseNOCDetails n =
-    case n of
-        U u -> do
-            old <- perhaps parseUniqueName
-            case old of
-                Nothing -> do
-                    t
-                    u' <- parseUniqueName
-                    sameUnique u u'
-                    return $ Connected u
-                Just u' -> do
-                    sameUnique u u'
-                    t
-                    noName
-                    return $ Disconnected u
-        O o -> do
-            old <- perhaps parseUniqueName
-            t
-            new <- perhaps parseUniqueName
-            c <- case (old, new) of
-                (Nothing, Nothing) -> atLeastOne o
-                (Just  a, Nothing) -> return $ Released a
-                (Nothing, Just  b) -> return $ Claimed b
-                (Just  a, Just  b) -> return $ Stolen a b
-            return $ NameChanged o c
-
-event :: Parser DetailedEvent
-event = method <|> signal <|> nameOwnerChanged <|> parseError
-
-events :: Parser [DetailedEvent]
-events = sepEndBy event (char '\n') <* eof
-
-readLog :: String -> Either ParseError [DetailedEvent]
-readLog filename = runParser events Map.empty "" filename
-
--- vim: sw=2 sts=2
diff --git a/Bustle/Loader/Pcap.hs b/Bustle/Loader/Pcap.hs
--- a/Bustle/Loader/Pcap.hs
+++ b/Bustle/Loader/Pcap.hs
@@ -156,7 +156,7 @@
          -> StateT PendingMessages m B.DetailedEvent
 bustlify µs bytes m = do
     bm <- buildBustledMessage
-    return $ B.Detailed µs bm (Just (bytes, m))
+    return $ B.Detailed µs bm bytes m
   where
     sender = receivedMessageSender m
     -- FIXME: can we do away with the un-Maybe-ing and just push that Nothing
@@ -173,7 +173,7 @@
                              }
             -- FIXME: we shouldn't need to construct almost the same thing here
             -- and 10 lines above maybe?
-            insertPending sender serial mc (B.Detailed µs call (Just (bytes, m)))
+            insertPending sender serial mc (B.Detailed µs call bytes m)
             return $ B.MessageEvent call
 
         (ReceivedMethodReturn _serial mr) -> do
diff --git a/Bustle/Renderer.hs b/Bustle/Renderer.hs
--- a/Bustle/Renderer.hs
+++ b/Bustle/Renderer.hs
@@ -376,12 +376,15 @@
             ai <- lookupUniqueName bus u
             return (u, ai)
 
-        -- … but more than one match means we're screwed.
-        several   -> error $ concat [ "internal error: "
-                                    , show o
-                                    , " in several apps: "
-                                    , show several
-                                    ]
+        -- … but more than one match means we've messed up. This can happen
+        -- with logs generated by dbus-monitor --pcap, which doesn't perform
+        -- an initial dump of all names on the bus.
+        (d:ds)    -> do
+            warn $ concat [ unOtherName o
+                          , " owned by several apps: "
+                          , show (d:ds)
+                          ]
+            return d
 
 -- Finds a TaggedBusName in a map of applications
 lookupApp :: Bus
@@ -661,7 +664,7 @@
 processMessage :: Bus
                -> Detailed Message
                -> Renderer ()
-processMessage bus dm@(Detailed _ m _) = do
+processMessage bus dm@(Detailed _ m _ _) = do
     orly <- shouldShow bus m
     when orly $ case m of
         Signal {}       -> do
diff --git a/Bustle/Stats.hs b/Bustle/Stats.hs
--- a/Bustle/Stats.hs
+++ b/Bustle/Stats.hs
@@ -45,8 +45,8 @@
 
 repr :: DetailedEvent
      -> Maybe (TallyType, Maybe InterfaceName, MemberName)
-repr (Detailed _ (NOCEvent _) _) = Nothing
-repr (Detailed _ (MessageEvent msg) _) =
+repr (Detailed _ (NOCEvent _) _ _) = Nothing
+repr (Detailed _ (MessageEvent msg) _ _) =
     case msg of
         MethodCall { member = m } -> Just (TallyMethod, iface m, membername m)
         Signal     { member = m } -> Just (TallySignal, iface m, membername m)
@@ -72,8 +72,7 @@
 
 mean :: (Eq a, Fractional a) => [a] -> a
 mean = acc 0 0
-   where acc 0 _ [] = error "mean of empty list"
-         acc n t [] = t / n
+   where acc n t [] = t / n
          acc n t (x:xs) = acc (n + 1) (t + x) xs
 
 data TimeInfo =
@@ -109,7 +108,7 @@
           methodReturn dm = do
               let m = deEvent dm
               guard (isReturn m)
-              Detailed start (call@(MethodCall {})) _ <- inReplyTo m
+              Detailed start (call@(MethodCall {})) _ _ <- inReplyTo m
               return ( iface (member call)
                      , membername (member call)
                      , deTimestamp dm - start
@@ -159,14 +158,14 @@
     f :: Detailed Message
       -> Map (SizeType, Maybe InterfaceName, MemberName) [Int]
       -> Map (SizeType, Maybe InterfaceName, MemberName) [Int]
-    f dm = case (sizeKeyRepr dm, deDetails dm) of
-        (Just key, Just (size, _)) -> Map.insertWith' (++) key [size]
-        _                          -> id
+    f dm = case sizeKeyRepr dm of
+        Just key -> Map.insertWith' (++) key [deMessageSize dm]
+        _        -> id
 
     callDetails :: Message
                 -> Maybe (Maybe InterfaceName, MemberName)
     callDetails msg = do
-        Detailed _ msg' _ <- inReplyTo msg
+        Detailed _ msg' _ _ <- inReplyTo msg
         return (iface (member msg'), membername (member msg'))
 
     sizeKeyRepr :: Detailed Message
diff --git a/Bustle/Translation.hs b/Bustle/Translation.hs
--- a/Bustle/Translation.hs
+++ b/Bustle/Translation.hs
@@ -1,3 +1,4 @@
+{-# LANGUAGE CPP #-}
 module Bustle.Translation
     (
       initTranslation
@@ -5,13 +6,18 @@
     )
 where
 
+#ifdef USE_HGETTEXT
 import Text.I18N.GetText
 import System.Locale.SetLocale
 import System.IO.Unsafe
 
 import GetText_bustle
+#endif
 
 initTranslation :: IO ()
+__ :: String -> String
+
+#ifdef USE_HGETTEXT
 initTranslation = do
     setLocale LC_ALL (Just "")
     domain <- getMessageCatalogDomain
@@ -21,5 +27,8 @@
     return ()
 
 -- FIXME: I do not like this unsafePerformIO one little bit.
-__ :: String -> String
 __ = unsafePerformIO . getText
+#else
+initTranslation = return ()
+__ = id
+#endif
diff --git a/Bustle/Types.hs b/Bustle/Types.hs
--- a/Bustle/Types.hs
+++ b/Bustle/Types.hs
@@ -165,14 +165,15 @@
 data Detailed e =
     Detailed { deTimestamp :: Microseconds
              , deEvent :: e
-             , deDetails :: Maybe (MessageSize, ReceivedMessage)
+             , deMessageSize :: MessageSize
+             , deReceivedMessage :: ReceivedMessage
              }
   deriving (Show, Eq, Functor)
 
 type DetailedEvent = Detailed Event
 
 instance Ord e => Ord (Detailed e) where
-    compare (Detailed µs x _) (Detailed µs' y _)
+    compare (Detailed µs x _ _) (Detailed µs' y _ _)
         = compare (µs, x) (µs', y)
 
 data Change = Claimed UniqueName
@@ -184,10 +185,10 @@
                    -> ([Detailed NOC], [Detailed Message])
 partitionDetaileds = partitionEithers . map f
   where
-    f (Detailed µs e details) =
+    f (Detailed µs e size rm) =
         case e of
-            NOCEvent n -> Left $ Detailed µs n details
-            MessageEvent m -> Right $ Detailed µs m details
+            NOCEvent n -> Left $ Detailed µs n size rm
+            MessageEvent m -> Right $ Detailed µs m size rm
 
 mentionedNames :: Message -> [TaggedBusName]
 mentionedNames m = sender m:dest
diff --git a/Bustle/UI/AboutDialog.hs b/Bustle/UI/AboutDialog.hs
--- a/Bustle/UI/AboutDialog.hs
+++ b/Bustle/UI/AboutDialog.hs
@@ -46,11 +46,11 @@
     dialog `set` [ aboutDialogName := __ "Bustle"
                  , aboutDialogVersion := showVersion version
                  , aboutDialogComments := __ "Someone's favourite D-Bus profiler"
-                 , aboutDialogWebsite := "http://www.freedesktop.org/wiki/Software/Bustle/"
+                 , aboutDialogWebsite := "https://www.freedesktop.org/wiki/Software/Bustle/"
                  , aboutDialogAuthors := authors
-                 , aboutDialogCopyright := "© 2008–2015 Will Thompson, Collabora Ltd. and contributors"
+                 , aboutDialogCopyright := "© 2008–2017 Will Thompson, Collabora Ltd. and contributors"
                  , aboutDialogLicense := license
-                 , aboutDialogLogoIconName := Just "bustle"
+                 , aboutDialogLogoIconName := Just "org.freedesktop.Bustle"
                  , windowModal := True
                  , windowTransientFor := window
                  ]
@@ -68,4 +68,5 @@
           , "Sergei Trofimovich"
           , "Alex Merry"
           , "Philip Withnall"
+          , "Jonny Lamb"
           ]
diff --git a/Bustle/UI/DetailsView.hs b/Bustle/UI/DetailsView.hs
--- a/Bustle/UI/DetailsView.hs
+++ b/Bustle/UI/DetailsView.hs
@@ -100,7 +100,7 @@
     return $ DetailsView table title pathLabel memberLabel view
 
 pickTitle :: Detailed Message -> Marquee
-pickTitle (Detailed _ m _) = case m of
+pickTitle (Detailed _ m _ _) = case m of
     MethodCall {} -> b (escape (__ "Method call"))
     MethodReturn {} -> b (escape (__ "Method return"))
     Error {} -> b (escape (__ "Error"))
@@ -114,7 +114,7 @@
     toPangoMarkup $ formatMember (iface m) (membername m)
 
 getMember :: Detailed Message -> Maybe Member
-getMember (Detailed _ m _) = case m of
+getMember (Detailed _ m _ _) = case m of
     MethodCall {}   -> Just $ member m
     Signal {}       -> Just $ member m
     MethodReturn {} -> callMember
@@ -123,10 +123,7 @@
     callMember = fmap (member . deEvent) $ inReplyTo m
 
 formatMessage :: Detailed Message -> String
-formatMessage (Detailed _ _ Nothing) =
-    __ "No message body information is available. Please capture a fresh log \
-       \using a recent version of Bustle!"
-formatMessage (Detailed _ _ (Just (_size, rm))) =
+formatMessage (Detailed _ _ _ rm) =
     formatArgs $ D.receivedMessageBody rm
   where
     formatArgs = intercalate "\n" . map (format_Variant VariantStyleSignature)
diff --git a/Bustle/Upgrade.hs b/Bustle/Upgrade.hs
deleted file mode 100644
--- a/Bustle/Upgrade.hs
+++ /dev/null
@@ -1,63 +0,0 @@
-{-# LANGUAGE OverloadedStrings #-}
-{-
-Bustle.Upgrade: synthesise information missing from old logs
-Copyright (C) 2009 Collabora Ltd.
-
-This library is free software; you can redistribute it and/or
-modify it under the terms of the GNU Lesser General Public
-License as published by the Free Software Foundation; either
-version 2.1 of the License, or (at your option) any later version.
-
-This library is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-Lesser General Public License for more details.
-
-You should have received a copy of the GNU Lesser General Public
-License along with this library; if not, write to the Free Software
-Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
--}
-module Bustle.Upgrade (upgrade) where
-
-import Control.Monad.State
-import Data.Set (Set)
-import qualified Data.Set as Set
-
-import Bustle.Types
-
--- Bustle <0.2.0 did not log NameOwnerChanged; this adds fake ones to logs
--- lacking them
-upgrade :: [DetailedEvent] -> [DetailedEvent]
-upgrade es =
-    case partitionDetaileds es of
-        ([], ms) -> concat $ evalState (mapM synthesiseNOC ms) Set.empty
-        _        -> es
-
-synthesiseNOC :: Detailed Message -> State (Set TaggedBusName) [DetailedEvent]
-synthesiseNOC de@(Detailed µs m _) = do
-    fakes <- mapM synthDM $ mentionedNames m
-    return ( concat fakes ++ [fmap MessageEvent de] )
-  where
-    synthDM :: TaggedBusName -> State (Set TaggedBusName) [DetailedEvent]
-    synthDM n = do
-        fakes <- synth n
-        return $ map (\fake -> Detailed µs (NOCEvent fake) Nothing) fakes
-
-synth :: TaggedBusName
-      -> State (Set TaggedBusName) [NOC]
-synth n = do
-    b <- gets (Set.member n)
-    if b
-      then return []
-      else do
-        modify (Set.insert n)
-        return $ case n of
-          U u -> [ Connected u ]
-          O o -> [ Connected (fakeName o)
-                 , NameChanged o (Claimed (fakeName o))
-                 ]
-
-fakeName :: OtherName -> UniqueName
-fakeName = fakeUniqueName . unOtherName
-
--- vim: sw=2 sts=2
diff --git a/INSTALL.md b/INSTALL.md
--- a/INSTALL.md
+++ b/INSTALL.md
@@ -14,7 +14,6 @@
         libghc-mtl-dev \
         libghc-cairo-dev \
         libghc-gtk-dev \
-        libghc-parsec3-dev \
         libghc-glade-dev \
         libghc-dbus-dev \
         libghc-pcap-dev \
diff --git a/LICENSE.bundled-libraries b/LICENSE.bundled-libraries
deleted file mode 100644
--- a/LICENSE.bundled-libraries
+++ /dev/null
@@ -1,238 +0,0 @@
-Shipping these libraries in the tarball is monstrous, and I'm sorry. I just
-wanted to ship this thing. Anyway, these libraries are slurped right out of the
-OS packages on the system the tarball was built on. Here are some licenses:
-
-libffi:
-
-    libffi - Copyright (c) 1996-2010  Red Hat, Inc and others.
-    See source files for details.
-
-    Permission is hereby granted, free of charge, to any person obtaining
-    a copy of this software and associated documentation files (the
-    ``Software''), to deal in the Software without restriction, including
-    without limitation the rights to use, copy, modify, merge, publish,
-    distribute, sublicense, and/or sell copies of the Software, and to
-    permit persons to whom the Software is furnished to do so, subject to
-    the following conditions:
-
-    The above copyright notice and this permission notice shall be included
-    in all copies or substantial portions of the Software.
-
-    THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
-    EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-    MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-    IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
-    CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
-    TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
-    SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-libpcap:
-
-    Copyright (C) 1993-2008 The Regents of the University of California.
-
-    Redistribution and use in source and binary forms, with or without
-    modification, are permitted provided that the following conditions
-    are met:
-
-      1. Redistributions of source code must retain the above copyright
-         notice, this list of conditions and the following disclaimer.
-      2. Redistributions in binary form must reproduce the above copyright
-         notice, this list of conditions and the following disclaimer in
-         the documentation and/or other materials provided with the
-         distribution.
-      3. The names of the authors may not be used to endorse or promote
-         products derived from this software without specific prior
-         written permission.
-
-    THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
-    IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
-    WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
-
-libgmp:
-
-    Copyright 1991, 1993, 1994, 1995, 1996, 1997, 1999, 2000, 2001, 2002, 2003,
-    2004, 2005, 2006, 2007 Free Software Foundation, Inc.
-
-    This file is part of the GNU MP Library.
-
-    The GNU MP Library is free software; you can redistribute it and/or modify
-    it under the terms of the GNU Lesser General Public License as published by
-    the Free Software Foundation; either version 3 of the License, or (at your
-    option) any later version.
-
-    The GNU MP Library is distributed in the hope that it will be useful, but
-    WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
-    or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
-    License for more details.
-
-    You should have received a copy of the GNU Lesser General Public License
-    along with the GNU MP Library.  If not, see http://www.gnu.org/licenses/.
-
-The source code is available from http://www.freedesktop.org/software/bustle/
-Your complimentary copy of the GNU Lesser General Public License follows:
-
-                   GNU LESSER GENERAL PUBLIC LICENSE
-                       Version 3, 29 June 2007
-
- Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
-
-  This version of the GNU Lesser General Public License incorporates
-the terms and conditions of version 3 of the GNU General Public
-License, supplemented by the additional permissions listed below.
-
-  0. Additional Definitions.
-
-  As used herein, "this License" refers to version 3 of the GNU Lesser
-General Public License, and the "GNU GPL" refers to version 3 of the GNU
-General Public License.
-
-  "The Library" refers to a covered work governed by this License,
-other than an Application or a Combined Work as defined below.
-
-  An "Application" is any work that makes use of an interface provided
-by the Library, but which is not otherwise based on the Library.
-Defining a subclass of a class defined by the Library is deemed a mode
-of using an interface provided by the Library.
-
-  A "Combined Work" is a work produced by combining or linking an
-Application with the Library.  The particular version of the Library
-with which the Combined Work was made is also called the "Linked
-Version".
-
-  The "Minimal Corresponding Source" for a Combined Work means the
-Corresponding Source for the Combined Work, excluding any source code
-for portions of the Combined Work that, considered in isolation, are
-based on the Application, and not on the Linked Version.
-
-  The "Corresponding Application Code" for a Combined Work means the
-object code and/or source code for the Application, including any data
-and utility programs needed for reproducing the Combined Work from the
-Application, but excluding the System Libraries of the Combined Work.
-
-  1. Exception to Section 3 of the GNU GPL.
-
-  You may convey a covered work under sections 3 and 4 of this License
-without being bound by section 3 of the GNU GPL.
-
-  2. Conveying Modified Versions.
-
-  If you modify a copy of the Library, and, in your modifications, a
-facility refers to a function or data to be supplied by an Application
-that uses the facility (other than as an argument passed when the
-facility is invoked), then you may convey a copy of the modified
-version:
-
-   a) under this License, provided that you make a good faith effort to
-   ensure that, in the event an Application does not supply the
-   function or data, the facility still operates, and performs
-   whatever part of its purpose remains meaningful, or
-
-   b) under the GNU GPL, with none of the additional permissions of
-   this License applicable to that copy.
-
-  3. Object Code Incorporating Material from Library Header Files.
-
-  The object code form of an Application may incorporate material from
-a header file that is part of the Library.  You may convey such object
-code under terms of your choice, provided that, if the incorporated
-material is not limited to numerical parameters, data structure
-layouts and accessors, or small macros, inline functions and templates
-(ten or fewer lines in length), you do both of the following:
-
-   a) Give prominent notice with each copy of the object code that the
-   Library is used in it and that the Library and its use are
-   covered by this License.
-
-   b) Accompany the object code with a copy of the GNU GPL and this license
-   document.
-
-  4. Combined Works.
-
-  You may convey a Combined Work under terms of your choice that,
-taken together, effectively do not restrict modification of the
-portions of the Library contained in the Combined Work and reverse
-engineering for debugging such modifications, if you also do each of
-the following:
-
-   a) Give prominent notice with each copy of the Combined Work that
-   the Library is used in it and that the Library and its use are
-   covered by this License.
-
-   b) Accompany the Combined Work with a copy of the GNU GPL and this license
-   document.
-
-   c) For a Combined Work that displays copyright notices during
-   execution, include the copyright notice for the Library among
-   these notices, as well as a reference directing the user to the
-   copies of the GNU GPL and this license document.
-
-   d) Do one of the following:
-
-       0) Convey the Minimal Corresponding Source under the terms of this
-       License, and the Corresponding Application Code in a form
-       suitable for, and under terms that permit, the user to
-       recombine or relink the Application with a modified version of
-       the Linked Version to produce a modified Combined Work, in the
-       manner specified by section 6 of the GNU GPL for conveying
-       Corresponding Source.
-
-       1) Use a suitable shared library mechanism for linking with the
-       Library.  A suitable mechanism is one that (a) uses at run time
-       a copy of the Library already present on the user's computer
-       system, and (b) will operate properly with a modified version
-       of the Library that is interface-compatible with the Linked
-       Version.
-
-   e) Provide Installation Information, but only if you would otherwise
-   be required to provide such information under section 6 of the
-   GNU GPL, and only to the extent that such information is
-   necessary to install and execute a modified version of the
-   Combined Work produced by recombining or relinking the
-   Application with a modified version of the Linked Version. (If
-   you use option 4d0, the Installation Information must accompany
-   the Minimal Corresponding Source and Corresponding Application
-   Code. If you use option 4d1, you must provide the Installation
-   Information in the manner specified by section 6 of the GNU GPL
-   for conveying Corresponding Source.)
-
-  5. Combined Libraries.
-
-  You may place library facilities that are a work based on the
-Library side by side in a single library together with other library
-facilities that are not Applications and are not covered by this
-License, and convey such a combined library under terms of your
-choice, if you do both of the following:
-
-   a) Accompany the combined library with a copy of the same work based
-   on the Library, uncombined with any other library facilities,
-   conveyed under the terms of this License.
-
-   b) Give prominent notice with the combined library that part of it
-   is a work based on the Library, and explaining where to find the
-   accompanying uncombined form of the same work.
-
-  6. Revised Versions of the GNU Lesser General Public License.
-
-  The Free Software Foundation may publish revised and/or new versions
-of the GNU Lesser General Public License from time to time. Such new
-versions will be similar in spirit to the present version, but may
-differ in detail to address new problems or concerns.
-
-  Each version is given a distinguishing version number. If the
-Library as you received it specifies that a certain numbered version
-of the GNU Lesser General Public License "or any later version"
-applies to it, you have the option of following the terms and
-conditions either of that published version or of any later version
-published by the Free Software Foundation. If the Library as you
-received it does not specify a version number of the GNU Lesser
-General Public License, you may choose any version of the GNU Lesser
-General Public License ever published by the Free Software Foundation.
-
-  If the Library as you received it specifies that a proxy can decide
-whether future versions of the GNU Lesser General Public License shall
-apply, that proxy's public statement of acceptance of any version is
-permanent authorization for you to choose that version for the
-Library.
diff --git a/Makefile b/Makefile
--- a/Makefile
+++ b/Makefile
@@ -13,13 +13,13 @@
 	$(NULL)
 
 MANPAGE = bustle-pcap.1
-DESKTOP_FILE = bustle.desktop
-APPDATA_FILE = bustle.appdata.xml
+DESKTOP_FILE = org.freedesktop.Bustle.desktop
+APPDATA_FILE = org.freedesktop.Bustle.appdata.xml
 ICON_SIZES = 16x16 22x22 32x32 48x48 256x256
 ICONS = \
-	data/icons/scalable/bustle.svg \
-	data/icons/scalable/bustle-symbolic.svg \
-	$(foreach size,$(ICON_SIZES),data/icons/$(size)/bustle.png) \
+	data/icons/scalable/org.freedesktop.Bustle.svg \
+	data/icons/scalable/org.freedesktop.Bustle-symbolic.svg \
+	$(foreach size,$(ICON_SIZES),data/icons/$(size)/org.freedesktop.Bustle.png) \
 	$(NULL)
 
 all: $(BINARIES) $(MANPAGE) $(DESKTOP_FILE) $(APPDATA_FILE) $(ICONS)
@@ -31,12 +31,20 @@
 bustle-pcap.1: dist/build/bustle-pcap
 	help2man --output=$@ --no-info --name='Generate D-Bus logs for bustle' $<
 
-bustle.desktop: data/bustle.desktop.in
+org.freedesktop.Bustle.desktop: data/org.freedesktop.Bustle.desktop.in
 	LC_ALL=C intltool-merge -d -u po $< $@
 
-bustle.appdata.xml: data/bustle.appdata.xml.in
+org.freedesktop.Bustle.appdata.xml: data/org.freedesktop.Bustle.appdata.xml.in
 	LC_ALL=C intltool-merge -x -u po $< $@
 
+# https://github.com/flathub/flathub/wiki/Review-Guidelines
+validate-metadata: org.freedesktop.Bustle.desktop org.freedesktop.Bustle.appdata.xml
+	desktop-file-validate org.freedesktop.Bustle.desktop
+	appstream-util validate-relax org.freedesktop.Bustle.appdata.xml
+	# This is only a SHOULD. Screenshots currently violate it because they
+	# are hidpi.
+	appstream-util validate org.freedesktop.Bustle.appdata.xml || true
+
 dist/build/bustle-pcap: $(BUSTLE_PCAP_SOURCES) $(BUSTLE_PCAP_HEADERS)
 	@mkdir -p dist/build
 	$(CC) -Idist/build/autogen $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) \
@@ -61,9 +69,9 @@
 	mkdir -p $(DATADIR)/appdata
 	cp $(APPDATA_FILE) $(DATADIR)/appdata
 	$(foreach size,$(ICON_SIZES),mkdir -p $(DATADIR)/icons/hicolor/$(size)/apps; )
-	$(foreach size,$(ICON_SIZES),cp data/icons/$(size)/bustle.png $(DATADIR)/icons/hicolor/$(size)/apps; )
+	$(foreach size,$(ICON_SIZES),cp data/icons/$(size)/org.freedesktop.Bustle.png $(DATADIR)/icons/hicolor/$(size)/apps; )
 	mkdir -p $(DATADIR)/icons/hicolor/scalable/apps
-	cp data/icons/scalable/bustle-symbolic.svg $(DATADIR)/icons/hicolor/scalable/apps
+	cp data/icons/scalable/org.freedesktop.Bustle-symbolic.svg $(DATADIR)/icons/hicolor/scalable/apps
 	$(MAKE) update-icon-cache
 
 uninstall:
@@ -71,8 +79,8 @@
 	rm -f $(MAN1DIR)/$(MANPAGE)
 	rm -f $(DATADIR)/applications/$(DESKTOP_FILE)
 	rm -f $(DATADIR)/appdata/$(APPDATA_FILE)
-	$(foreach size,$(ICON_SIZES),rm -f $(DATADIR)/icons/hicolor/$(size)/apps/bustle.png)
-	rm -f $(DATADIR)/icons/hicolor/scalable/apps/bustle-symbolic.svg
+	$(foreach size,$(ICON_SIZES),rm -f $(DATADIR)/icons/hicolor/$(size)/apps/org.freedesktop.Bustle.png)
+	rm -f $(DATADIR)/icons/hicolor/scalable/apps/org.freedesktop.Bustle-symbolic.svg
 	$(MAKE) update-icon-cache
 
 clean:
@@ -92,28 +100,13 @@
 		echo "***   $(gtk_update_icon_cache)"; \
 	fi
 
-# Binary tarball stuff. Please ignore this unless you're making a release.
-TOP := $(shell pwd)
-TARBALL_PARENT_DIR := dist
-TARBALL_DIR := $(shell git describe --tags)-$(shell gcc -dumpmachine | perl -pe 's/-.*//')
-TARBALL_FULL_DIR := $(TARBALL_PARENT_DIR)/$(TARBALL_DIR)
-TARBALL := $(TARBALL_DIR).tar.bz2
-maintainer-binary-tarball: all
-	mkdir -p $(TARBALL_FULL_DIR)
-	cabal install --prefix=$(TOP)/$(TARBALL_FULL_DIR) \
-		--datadir=$(TOP)/$(TARBALL_FULL_DIR) --datasubdir=.
-	cp bustle.sh README.md $(TARBALL_FULL_DIR)
-	perl -pi -e 's{^    bustle-pcap}{    ./bustle-pcap};' \
-		-e  's{^    bustle}     {    ./bustle.sh};' \
-		$(TARBALL_FULL_DIR)/README.md
-	cp $(BINARIES) $(MANPAGE) $(DESKTOP_FILE) $(APPDATA_FILE) $(TARBALL_FULL_DIR)
-	mkdir -p $(TARBALL_FULL_DIR)/lib
-	cp LICENSE.bundled-libraries $(TARBALL_FULL_DIR)/lib
-	./ldd-me-up.sh $(TARBALL_FULL_DIR)/bin/bustle \
-		| xargs -I XXX cp XXX $(TARBALL_FULL_DIR)/lib
-	cd $(TARBALL_PARENT_DIR) && tar cjf $(TARBALL) $(TARBALL_DIR)
-	rm -r $(TARBALL_FULL_DIR)
+# Flatpak stuff
+org.freedesktop.Bustle.flatpak: flatpak/org.freedesktop.Bustle.json
+	rm -rf _build
+	flatpak-builder --repo=repo -v _build $<
+	flatpak build-bundle repo org.freedesktop.Bustle.flatpak org.freedesktop.Bustle
 
+# Maintainer stuff
 maintainer-update-messages-pot:
 	find Bustle -name '*.hs' -print0 | xargs -0 hgettext -k __ -o po/messages.pot
 
@@ -122,9 +115,7 @@
 	cabal sdist
 	git tag -s -m 'Bustle '`cat dist/build/autogen/version.txt` \
 		bustle-`cat dist/build/autogen/version.txt`
-	make maintainer-binary-tarball
 	gpg --detach-sign --armor dist/bustle-`cat dist/build/autogen/version.txt`.tar.gz
-	gpg --detach-sign --armor dist/bustle-`cat dist/build/autogen/version.txt`-x86_64.tar.bz2
 
 .travis.yml: bustle.cabal make_travis_yml.hs
 	./make_travis_yml.hs $< libpcap-dev libgtk-3-dev libcairo2-dev happy-1.19.4 alex-3.1.3 > $@
diff --git a/NEWS.md b/NEWS.md
--- a/NEWS.md
+++ b/NEWS.md
@@ -1,3 +1,22 @@
+Bustle 0.6.1 (2017-07-27)
+-------------------------
+
+* Trivial fix to bustle.cabal.
+
+Bustle 0.6.0 (2017-07-26)
+-------------------------
+
+* Fix leaks in bustle-pcap.c. (Jonny Lamb, <https://bugs.freedesktop.org/show_bug.cgi?id=93904>)
+* Add a Flatpak build manifest.
+* Don't crash if reading a file with libpcap fails. <https://bugs.freedesktop.org/show_bug.cgi?id=100220>
+* Note that libpcap 1.8.0 and 1.8.1 (and hence Bustle) will still refuse to read log files generated by Bustle. This is fixed in libpcap Git by commits [1a6b088](https://github.com/the-tcpdump-group/libpcap/commit/1a6b088a88886eac782008f37a7219a32b86da45) and [42c3865](https://github.com/the-tcpdump-group/libpcap/commit/42c3865d71a3d3ad3fc61ee382ad3b5113d40552).
+* Add a Flatpak build manifest, which bundles a new-enough Git snapshot of libpcap.
+* Remove scripts to build artisan binary tarballs.
+* Drop support for pre-0.3.1 text-only log files. If you still have any valuable logs from before 2012, I can only apologise.
+* Add a Cabal flag to disable hgettext support. Since there are no non-English translations, the only user-visible impact is that some ‘curly quotes’ in three dialog boxes become 'legacy quotes'.
+* Rename bustle.desktop (etc.) to org.freedesktop.Bustle.desktop (etc.).
+* Fix a crash when reading logs generated with `dbus-monitor --pcap`.
+
 Bustle 0.5.4 (2016-01-27)
 -------------------------
 
diff --git a/bustle.cabal b/bustle.cabal
--- a/bustle.cabal
+++ b/bustle.cabal
@@ -1,15 +1,15 @@
 Name:           bustle
 Category:       Network, Desktop
-Version:        0.5.4
-Cabal-Version:  >= 1.18
-Tested-With:    GHC >= 7.8.4 && < 7.11
+Version:        0.6.1
+Cabal-Version:  >= 1.24
+Tested-With:    GHC == 7.8.*, GHC == 7.10.*
 Synopsis:       Draw sequence diagrams of D-Bus traffic
 Description:    Draw sequence diagrams of D-Bus traffic
 License:        OtherLicense
 License-file:   LICENSE
 Author:         Will Thompson <will@willthompson.co.uk>
 Maintainer:     Will Thompson <will@willthompson.co.uk>
-Homepage:       http://www.freedesktop.org/wiki/Software/Bustle/
+Homepage:       https://www.freedesktop.org/wiki/Software/Bustle/
 Data-files:     data/dfeet-method.png,
                 data/dfeet-signal.png,
                 data/bustle.ui,
@@ -31,11 +31,6 @@
                     run-uninstalled.sh
                   , Test/data/log-with-h.bustle
 
-                  -- Stuff for the stupid binary tarballs
-                  , bustle.sh
-                  , ldd-me-up.sh
-                  , LICENSE.bundled-libraries
-
                   -- inlined copy of the Cabal hooks from hgettext;
                   -- see https://github.com/fpco/stackage/issues/746
                   , GetText.hs
@@ -45,25 +40,37 @@
                   , po/*.pot
 
                   -- intl bits
-                  , data/bustle.appdata.xml.in
-                  , data/bustle.desktop.in
+                  , data/org.freedesktop.Bustle.appdata.xml.in
+                  , data/org.freedesktop.Bustle.desktop.in
 
                   -- icons
-                  , data/icons/16x16/bustle.png
-                  , data/icons/22x22/bustle.png
-                  , data/icons/32x32/bustle.png
-                  , data/icons/48x48/bustle.png
-                  , data/icons/256x256/bustle.png
-                  , data/icons/scalable/bustle.svg
-                  , data/icons/scalable/bustle-symbolic.svg
+                  , data/icons/16x16/org.freedesktop.Bustle.png
+                  , data/icons/22x22/org.freedesktop.Bustle.png
+                  , data/icons/32x32/org.freedesktop.Bustle.png
+                  , data/icons/48x48/org.freedesktop.Bustle.png
+                  , data/icons/256x256/org.freedesktop.Bustle.png
+                  , data/icons/scalable/org.freedesktop.Bustle.svg
+                  , data/icons/scalable/org.freedesktop.Bustle-symbolic.svg
 
 x-gettext-po-files:     po/*.po
 x-gettext-domain-name:  bustle
 
+custom-setup
+  setup-depends:
+    base >= 4 && < 5,
+    Cabal >= 1.24,
+    filepath,
+    directory,
+    process
+
 Source-Repository head
   Type:           git
   Location:       git://anongit.freedesktop.org/bustle
 
+Flag hgettext
+  Description:    Enable translations. Since there are no translations this is currently rather pointless.
+  Default:        True
+
 Flag InteractiveTests
   Description:    Build interactive test programs
   Default:        False
@@ -72,19 +79,11 @@
   Description:    Build with the multi-threaded runtime
   Default:        True
 
-Flag WithGtk2HsBuildTools
-  Description:    Build-depend on gtk2hs-buildtools. They aren't (currently)
-                  used to build Bustle itself but are needed to build
-                  dependencies like gtk3, which for whatever reason do not
-                  Build-Depend on the tools.
-  Default:        False
-
 Executable bustle
   Main-is:       Bustle.hs
   Other-modules: Bustle.Application.Monad
                , Bustle.Diagram
                , Bustle.Loader
-               , Bustle.Loader.OldSkool
                , Bustle.Loader.Pcap
                , Bustle.Marquee
                , Bustle.Monitor
@@ -103,7 +102,6 @@
                , Bustle.UI.OpenTwoDialog
                , Bustle.UI.Recorder
                , Bustle.UI.Util
-               , Bustle.Upgrade
                , Bustle.Util
                , Bustle.VariantFormatter
   default-language: Haskell2010
@@ -124,18 +122,16 @@
                , glib
                , gio
                , gtk3
-               , hgettext >= 0.1.5
                , mtl >= 2.2.1
                , pango
-               , parsec
                , pcap
                , process
-               , setlocale
                , text
                , time
-
-  if flag(WithGtk2HsBuildTools)
-    Build-Depends: gtk2hs-buildtools
+  if flag(hgettext)
+    Build-Depends: hgettext >= 0.1.5
+                 , setlocale
+    cpp-options: -DUSE_HGETTEXT
 
 Executable test-monitor
   if flag(InteractiveTests)
@@ -161,14 +157,12 @@
                -- 0.13.6 doesn't compile with GCC 5: https://github.com/gtk2hs/gtk2hs/issues/104
                , gtk3 >= 0.13.7
                , glib
-               , hgettext
                , mtl
                , pango
-               , parsec
                , pcap
-               , setlocale
                , text
 
+
 Executable dump-messages
   if flag(InteractiveTests)
     buildable: True
@@ -221,8 +215,6 @@
                  , mtl
                  , text
                  , pango
-                 , hgettext
-                 , setlocale
                  , test-framework
                  , test-framework-hunit
                  , HUnit
diff --git a/bustle.sh b/bustle.sh
deleted file mode 100644
--- a/bustle.sh
+++ /dev/null
@@ -1,17 +0,0 @@
-#!/bin/sh
-set -e
-
-root="$(dirname $(readlink -f ${0}))"
-
-bustle_datadir="${root}"
-export bustle_datadir
-
-bustle_localedir="${root}/locale"
-export bustle_localedir
-
-LD_LIBRARY_PATH="${root}/lib:${LD_LIBRARY_PATH}"
-export LD_LIBRARY_PATH
-
-bustle="${root}"/bin/bustle
-
-exec $bustle "${@}"
diff --git a/c-sources/bustle-pcap.c b/c-sources/bustle-pcap.c
--- a/c-sources/bustle-pcap.c
+++ b/c-sources/bustle-pcap.c
@@ -109,6 +109,7 @@
   gchar *usage;
   GError *error = NULL;
   gboolean ret;
+  gint exit_status = -1;
 
   context = g_option_context_new ("FILENAME");
   g_option_context_add_main_entries (context, entries, NULL);
@@ -121,7 +122,9 @@
     {
       fprintf (stderr, "%s\n", error->message);
       fprintf (stderr, "%s", usage);
-      exit (2);
+
+      exit_status = 2;
+      goto out;
     }
 
   if (version)
@@ -130,13 +133,17 @@
       fprintf (stdout, "Copyright 2011 Will Thompson <will@willthompson.co.uk>\n");
       fprintf (stdout, "This is free software; see the source for copying conditions.  There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\n");
       fprintf (stdout, "Written by Will Thompson <will@willthompson.co.uk>\n");
-      exit (0);
+
+      exit_status = 0;
+      goto out;
     }
   else if (session_specified && system_specified)
     {
       fprintf (stderr, "You may only specify one of --session and --system\n");
       fprintf (stderr, "%s", usage);
-      exit (2);
+
+      exit_status = 2;
+      goto out;
     }
   else if (system_specified)
     {
@@ -153,10 +160,21 @@
     {
       fprintf (stderr, "You must specify exactly one output filename\n");
       fprintf (stderr, "%s", usage);
-      exit (2);
+
+      exit_status = 2;
+      goto out;
     }
 
-  *filename = filenames[0];
+  *filename = g_strdup (filenames[0]);
+
+out:
+  g_free (usage);
+  g_strfreev (filenames);
+  g_option_context_free (context);
+  g_clear_error (&error);
+
+  if (exit_status > -1)
+    exit (exit_status);
 }
 
 static void
@@ -196,6 +214,7 @@
   if (pcap == NULL)
     {
       fprintf (stderr, "%s", error->message);
+      g_clear_error (&error);
       exit (1);
     }
 
@@ -214,6 +233,7 @@
 
   bustle_pcap_monitor_stop (pcap);
   g_object_unref (pcap);
+  g_free (filename);
 
   return 0;
 }
diff --git a/data/OpenTwoDialog.ui b/data/OpenTwoDialog.ui
--- a/data/OpenTwoDialog.ui
+++ b/data/OpenTwoDialog.ui
@@ -8,7 +8,7 @@
     <property name="resizable">False</property>
     <property name="modal">True</property>
     <property name="type_hint">dialog</property>
-    <property name="icon-name">bustle</property>
+    <property name="icon-name">org.freedesktop.Bustle</property>
     <child internal-child="vbox">
       <object class="GtkBox" id="dialog-vbox1">
         <property name="visible">True</property>
diff --git a/data/bustle.appdata.xml.in b/data/bustle.appdata.xml.in
deleted file mode 100644
--- a/data/bustle.appdata.xml.in
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2014 Philip Withnall <philip@tecnocode.co.uk> -->
-<application>
-	<id type="desktop">bustle.desktop</id>
-	<metadata_license>CC-BY-SA-3.0</metadata_license>
-	<project_license>LGPL-2.1+ and GPL-2.0+ and GPL-3.0</project_license>
-	<description>
-		<!-- Translators: These are the application description paragraphs in the AppData file. -->
-		<_p>Bustle draws sequence diagrams of D-Bus activity.</_p>
-		<_p>It shows signal emissions, method calls and their
-		    corresponding returns, with time stamps for each individual
-		    event and the duration of each method call. This can help
-		    you check for unwanted D-Bus traffic, and pinpoint why your
-		    D-Bus-based application isn't performing as well as you
-		    like. It also provides statistics like signal frequencies
-		    and average method call times.</_p>
-	</description>
-	<screenshots>
-		<screenshot type="default">
-			<!-- Translators: This should be the URI of a 2400×1350, pixel screenshot of Bustle in your language. If you can't take a screenshot, leave the string as the English screenshot. -->
-			<_image type="source">https://wiki.freedesktop.org/www/Software/Bustle/bustle-0.5.2-1.png</_image>
-			</screenshot>
-		<screenshot>
-			<!-- Translators: This should be the URI of a 2400×1350, pixel screenshot of Bustle in your language. If you can't take a screenshot, leave the string as the English screenshot. -->
-			<_image type="source">https://wiki.freedesktop.org/www/Software/Bustle/bustle-0.5.2-2.png</_image>
-		</screenshot>
-	</screenshots>
-	<url type="homepage">http://willthompson.co.uk/bustle/</url>
-	<updatecontact>philip_at_tecnocode.co.uk</updatecontact>
-</application>
diff --git a/data/bustle.desktop.in b/data/bustle.desktop.in
deleted file mode 100644
--- a/data/bustle.desktop.in
+++ /dev/null
@@ -1,10 +0,0 @@
-[Desktop Entry]
-_Name=Bustle
-_Comment=Draw sequence diagrams of D-Bus activity
-Exec=bustle
-Icon=bustle
-Terminal=false
-Type=Application
-Categories=GTK;Development;Debugger;Profiling;
-StartupNotify=true
-_Keywords=debug;profile;d-bus;dbus;sequence;monitor;
diff --git a/data/bustle.ui b/data/bustle.ui
--- a/data/bustle.ui
+++ b/data/bustle.ui
@@ -5,7 +5,7 @@
     <property name="can_focus">False</property>
     <property name="default_width">900</property>
     <property name="default_height">700</property>
-    <property name="icon-name">bustle</property>
+    <property name="icon-name">org.freedesktop.Bustle</property>
     <property name="title" translatable="yes">Bustle</property>
     <child type="titlebar">
         <object class="GtkHeaderBar" id="header">
diff --git a/data/icons/16x16/bustle.png b/data/icons/16x16/bustle.png
deleted file mode 100644
Binary files a/data/icons/16x16/bustle.png and /dev/null differ
diff --git a/data/icons/16x16/org.freedesktop.Bustle.png b/data/icons/16x16/org.freedesktop.Bustle.png
new file mode 100644
Binary files /dev/null and b/data/icons/16x16/org.freedesktop.Bustle.png differ
diff --git a/data/icons/22x22/bustle.png b/data/icons/22x22/bustle.png
deleted file mode 100644
Binary files a/data/icons/22x22/bustle.png and /dev/null differ
diff --git a/data/icons/22x22/org.freedesktop.Bustle.png b/data/icons/22x22/org.freedesktop.Bustle.png
new file mode 100644
Binary files /dev/null and b/data/icons/22x22/org.freedesktop.Bustle.png differ
diff --git a/data/icons/256x256/bustle.png b/data/icons/256x256/bustle.png
deleted file mode 100644
Binary files a/data/icons/256x256/bustle.png and /dev/null differ
diff --git a/data/icons/256x256/org.freedesktop.Bustle.png b/data/icons/256x256/org.freedesktop.Bustle.png
new file mode 100644
Binary files /dev/null and b/data/icons/256x256/org.freedesktop.Bustle.png differ
diff --git a/data/icons/32x32/bustle.png b/data/icons/32x32/bustle.png
deleted file mode 100644
Binary files a/data/icons/32x32/bustle.png and /dev/null differ
diff --git a/data/icons/32x32/org.freedesktop.Bustle.png b/data/icons/32x32/org.freedesktop.Bustle.png
new file mode 100644
Binary files /dev/null and b/data/icons/32x32/org.freedesktop.Bustle.png differ
diff --git a/data/icons/48x48/bustle.png b/data/icons/48x48/bustle.png
deleted file mode 100644
Binary files a/data/icons/48x48/bustle.png and /dev/null differ
diff --git a/data/icons/48x48/org.freedesktop.Bustle.png b/data/icons/48x48/org.freedesktop.Bustle.png
new file mode 100644
Binary files /dev/null and b/data/icons/48x48/org.freedesktop.Bustle.png differ
diff --git a/data/icons/scalable/bustle-symbolic.svg b/data/icons/scalable/bustle-symbolic.svg
deleted file mode 100644
--- a/data/icons/scalable/bustle-symbolic.svg
+++ /dev/null
@@ -1,104 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://creativecommons.org/ns#"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   width="600"
-   height="600"
-   id="svg2"
-   version="1.1"
-   inkscape:version="0.91 r13725"
-   sodipodi:docname="bustle-symbolic.svg">
-  <defs
-     id="defs4" />
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="1.18"
-     inkscape:cx="296.02826"
-     inkscape:cy="407.83651"
-     inkscape:document-units="px"
-     inkscape:current-layer="layer1"
-     showgrid="false"
-     inkscape:window-width="1440"
-     inkscape:window-height="824"
-     inkscape:window-x="0"
-     inkscape:window-y="27"
-     inkscape:window-maximized="1"
-     fit-margin-top="0"
-     fit-margin-left="0"
-     fit-margin-right="0"
-     fit-margin-bottom="0"
-     showguides="true"
-     inkscape:guide-bbox="true">
-    <inkscape:grid
-       type="xygrid"
-       id="grid3834"
-       empspacing="5"
-       visible="true"
-       enabled="true"
-       snapvisiblegridlinesonly="true"
-       originx="-56.941089px"
-       originy="-465.18127px" />
-  </sodipodi:namedview>
-  <metadata
-     id="metadata7">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-        <dc:title></dc:title>
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer"
-     id="layer1"
-     transform="translate(-56.941089,12.819102)">
-    <path
-       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#dedede;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:57.94400024;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:5.19999981;stroke-dasharray:115.88800049, 57.94400024;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
-       d="m 349.58008,-12.728516 c -19.78034,0.499891 -39.51808,2.890348 -58.82031,7.2539096 4.10872,18.8723954 8.21745,37.7447914 12.32617,56.6171874 33.74925,-7.665785 69.12626,-7.971229 103.02539,-1.0293 3.71633,-18.821141 8.65912,-38.435398 11.61328,-56.7636714 -22.39128,-4.5980686 -45.29405,-6.6135646 -68.14453,-6.0781256 z m 105.80078,78.716797 c 31.47813,14.008295 59.87299,34.867319 82.70703,60.664059 14.44727,-12.81901 28.89453,-25.63802 43.3418,-38.457028 C 553.05494,56.141376 517.74279,30.253699 478.60547,12.900391 470.86393,30.596354 463.1224,48.292318 455.38086,65.988281 Z M 227.18164,16.626953 C 189.51961,34.723972 155.71119,60.77538 128.625,92.591797 c 14.7487,12.470703 29.49739,24.941413 44.24609,37.412113 22.37137,-26.20404 50.37565,-47.593699 81.60157,-62.169926 -8.17123,-17.501302 -16.34245,-35.002604 -24.51368,-52.503906 -0.92578,0.432292 -1.85156,0.864583 -2.77734,1.296875 z M 568.0293,168.66016 c 16.99699,30.09909 27.33124,63.91871 30.12695,98.36914 19.23893,-1.70833 38.47787,-3.41667 57.7168,-5.125 -3.5014,-42.55686 -16.29754,-84.32012 -37.26568,-121.51953 -16.85936,9.42513 -33.71871,18.85026 -50.57807,28.27539 z M 89.939453,150.27539 c -18.701268,36.38678 -29.811885,76.6502 -32.357428,117.48438 19.276042,1.22135 38.552083,2.44271 57.828125,3.66406 2.15345,-34.4883 11.88032,-68.47463 28.29492,-98.88281 -17.08268,-9.01302 -34.16536,-18.02605 -51.248045,-27.03907 -0.839191,1.59115 -1.678381,3.18229 -2.517572,4.77344 z"
-       id="path4626"
-       inkscape:connector-curvature="0" />
-    <circle
-       style="fill:none;stroke:#bebebe;stroke-width:75.08624021;stroke-miterlimit:5.19999981;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="path2985-7"
-       cx="381.42856"
-       cy="433.79074"
-       transform="matrix(0.50880116,0,0,0.55776489,164.13818,45.848517)"
-       ry="118.57143"
-       rx="130" />
-    <path
-       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:60;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:5.19999981;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
-       d="m 430,220 30,55 -85,0 0,50 85,0 -30,55 170,-80 z"
-       transform="translate(56.941089,-12.819102)"
-       id="path3757-7"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cccccccc" />
-    <path
-       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:60;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:5.19999981;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
-       d="m 170,220 -170,80 170,80 -30,-55 85,0 0,-50 -85,0 z"
-       transform="translate(56.941089,-12.819102)"
-       id="path3761-7"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cccccccc" />
-    <path
-       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:34.40008163;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:5.19999981;stroke-dasharray:none;stroke-dashoffset:94.40000153;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
-       d="m 356.94141,187.18164 c -55.02475,0 -100.00001,44.97526 -100,100 -1e-5,55.02475 44.97525,100 100,100 55.02475,0 100,-44.97525 100,-100 0,-55.02475 -44.97525,-100 -100,-100 z m 0,34.39844 c 36.43357,0 65.59961,29.168 65.59961,65.60156 0,36.43356 -29.16604,65.59961 -65.59961,65.59961 -36.43357,0 -65.59961,-29.16605 -65.59961,-65.59961 0,-36.43356 29.16604,-65.60156 65.59961,-65.60156 z"
-       id="path4619"
-       inkscape:connector-curvature="0" />
-  </g>
-</svg>
diff --git a/data/icons/scalable/bustle.svg b/data/icons/scalable/bustle.svg
deleted file mode 100644
--- a/data/icons/scalable/bustle.svg
+++ /dev/null
@@ -1,253 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://creativecommons.org/ns#"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   width="605.06"
-   height="605.06"
-   id="svg2"
-   version="1.1"
-   inkscape:version="0.48.4 r9939"
-   sodipodi:docname="bustle.svg">
-  <defs
-     id="defs4">
-    <inkscape:path-effect
-       is_visible="true"
-       id="path-effect4126"
-       effect="spiro" />
-    <inkscape:path-effect
-       is_visible="true"
-       id="path-effect4123"
-       effect="spiro" />
-    <inkscape:path-effect
-       is_visible="true"
-       id="path-effect4120"
-       effect="spiro" />
-    <inkscape:path-effect
-       is_visible="true"
-       id="path-effect4117"
-       effect="spiro" />
-    <inkscape:path-effect
-       effect="spiro"
-       id="path-effect3770"
-       is_visible="true" />
-    <inkscape:path-effect
-       effect="spiro"
-       id="path-effect3763"
-       is_visible="true" />
-    <inkscape:path-effect
-       effect="spiro"
-       id="path-effect3759"
-       is_visible="true" />
-    <inkscape:path-effect
-       effect="spiro"
-       id="path-effect3770-1"
-       is_visible="true" />
-    <inkscape:path-effect
-       effect="spiro"
-       id="path-effect3770-3"
-       is_visible="true" />
-    <inkscape:path-effect
-       effect="spiro"
-       id="path-effect3759-7"
-       is_visible="true" />
-    <inkscape:path-effect
-       effect="spiro"
-       id="path-effect3763-2"
-       is_visible="true" />
-    <inkscape:path-effect
-       effect="spiro"
-       id="path-effect3770-6"
-       is_visible="true" />
-    <inkscape:path-effect
-       effect="spiro"
-       id="path-effect3770-3-1"
-       is_visible="true" />
-    <inkscape:path-effect
-       effect="spiro"
-       id="path-effect3770-6-2"
-       is_visible="true" />
-    <inkscape:path-effect
-       effect="spiro"
-       id="path-effect3763-2-7"
-       is_visible="true" />
-    <inkscape:path-effect
-       effect="spiro"
-       id="path-effect3770-3-1-2"
-       is_visible="true" />
-    <inkscape:path-effect
-       effect="spiro"
-       id="path-effect3759-7-2"
-       is_visible="true" />
-    <filter
-       id="filter4104"
-       inkscape:label="Chalk and sponge"
-       inkscape:menu="Distort"
-       inkscape:menu-tooltip="Low turbulence gives sponge look and high turbulence chalk"
-       width="1.6"
-       height="2"
-       y="-0.5"
-       x="-0.30000001"
-       color-interpolation-filters="sRGB">
-      <feTurbulence
-         id="feTurbulence4106"
-         baseFrequency="0.4"
-         type="fractalNoise"
-         seed="0"
-         numOctaves="5"
-         result="result1" />
-      <feOffset
-         id="feOffset4108"
-         dx="-5"
-         dy="-5"
-         result="result2" />
-      <feDisplacementMap
-         id="feDisplacementMap4110"
-         in2="result1"
-         xChannelSelector="R"
-         yChannelSelector="G"
-         scale="30"
-         in="SourceGraphic" />
-    </filter>
-    <filter
-       id="filter4183"
-       inkscape:label="Chalk and sponge"
-       inkscape:menu="Distort"
-       inkscape:menu-tooltip="Low turbulence gives sponge look and high turbulence chalk"
-       width="1.6"
-       height="2"
-       y="-0.5"
-       x="-0.30000001"
-       color-interpolation-filters="sRGB">
-      <feTurbulence
-         id="feTurbulence4185"
-         baseFrequency="0.4"
-         type="fractalNoise"
-         seed="0"
-         numOctaves="5"
-         result="result1" />
-      <feOffset
-         id="feOffset4187"
-         dx="-5"
-         dy="-5"
-         result="result2" />
-      <feDisplacementMap
-         id="feDisplacementMap4189"
-         in2="result1"
-         xChannelSelector="R"
-         yChannelSelector="G"
-         scale="30"
-         in="SourceGraphic" />
-    </filter>
-    <inkscape:path-effect
-       is_visible="true"
-       id="path-effect4117-2"
-       effect="spiro" />
-  </defs>
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="0.59"
-     inkscape:cx="351.05408"
-     inkscape:cy="216.30891"
-     inkscape:document-units="px"
-     inkscape:current-layer="layer1"
-     showgrid="false"
-     inkscape:window-width="1388"
-     inkscape:window-height="833"
-     inkscape:window-x="50"
-     inkscape:window-y="223"
-     inkscape:window-maximized="0"
-     fit-margin-top="0"
-     fit-margin-left="0"
-     fit-margin-right="0"
-     fit-margin-bottom="0">
-    <inkscape:grid
-       type="xygrid"
-       id="grid3834"
-       empspacing="5"
-       visible="true"
-       enabled="true"
-       snapvisiblegridlinesonly="true"
-       originx="-56.941089px"
-       originy="-465.18127px" />
-  </sodipodi:namedview>
-  <metadata
-     id="metadata7">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-        <dc:title />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer"
-     id="layer1"
-     transform="translate(-56.941089,17.879098)">
-    <path
-       style="fill:none;stroke:#74b674;stroke-width:27.59247017;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:82.77741051, 27.59247017;stroke-dashoffset:27.59247017"
-       d="m 70.761814,288.36996 c -0.01207,-1.2669 -0.02449,-2.53589 -0.02449,-3.80671 0,-159.41492 129.271656,-288.6461129 288.736206,-288.6461129 159.46457,0 288.73621,129.2311929 288.73621,288.6461129 l 0,0 0,0 c 0,1.27082 -0.009,2.53969 -0.0245,3.80671"
-       id="path3802-8"
-       inkscape:connector-curvature="0" />
-    <path
-       sodipodi:type="arc"
-       style="fill:none;stroke:#000000;stroke-width:34.42315674;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
-       id="path2985-7"
-       sodipodi:cx="381.42856"
-       sodipodi:cy="433.79074"
-       sodipodi:rx="130"
-       sodipodi:ry="118.57143"
-       d="m 511.42856,433.79074 a 130,118.57143 0 1 1 -260,0 130,118.57143 0 1 1 260,0 z"
-       transform="matrix(0.50880116,0,0,0.55776489,164.13818,45.848517)"
-       />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:18.45480156;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
-       d="m 417.41556,287.80173 211.44171,0"
-       id="path3757-7"
-       inkscape:path-effect="#path-effect3759-7"
-       inkscape:original-d="m 417.41556,287.80173 211.44171,0"
-       inkscape:connector-curvature="0"
-       />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:18.17925262;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
-       d="m 294.08479,287.66116 -211.718251,0.2812"
-       id="path3761-7"
-       inkscape:path-effect="#path-effect3763-2"
-       inkscape:original-d="m 294.08479,287.66116 -211.718251,0.2812"
-       inkscape:connector-curvature="0"
-       />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:18.33793068;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
-       d="M 200.97285,226.67532 77.897224,289.6408 200.97285,348.92819"
-       id="path3768-2"
-       inkscape:path-effect="#path-effect3770-6"
-       inkscape:original-d="M 200.97285,226.67532 77.897224,289.6408 200.97285,348.92819"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="ccc"
-       />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:18.33793068;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
-       d="M 520.66838,225.39683 643.74401,288.36232 520.66838,347.6497"
-       id="path3768-9-7"
-       inkscape:path-effect="#path-effect3770-3-1"
-       inkscape:original-d="M 520.66838,225.39683 643.74401,288.36232 520.66838,347.6497"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="ccc"
-       />
-  </g>
-</svg>
diff --git a/data/icons/scalable/org.freedesktop.Bustle-symbolic.svg b/data/icons/scalable/org.freedesktop.Bustle-symbolic.svg
new file mode 100644
--- /dev/null
+++ b/data/icons/scalable/org.freedesktop.Bustle-symbolic.svg
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="600"
+   height="600"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.91 r13725"
+   sodipodi:docname="bustle-symbolic.svg">
+  <defs
+     id="defs4" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="1.18"
+     inkscape:cx="296.02826"
+     inkscape:cy="407.83651"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     inkscape:window-width="1440"
+     inkscape:window-height="824"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1"
+     fit-margin-top="0"
+     fit-margin-left="0"
+     fit-margin-right="0"
+     fit-margin-bottom="0"
+     showguides="true"
+     inkscape:guide-bbox="true">
+    <inkscape:grid
+       type="xygrid"
+       id="grid3834"
+       empspacing="5"
+       visible="true"
+       enabled="true"
+       snapvisiblegridlinesonly="true"
+       originx="-56.941089px"
+       originy="-465.18127px" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-56.941089,12.819102)">
+    <path
+       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#dedede;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:57.94400024;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:5.19999981;stroke-dasharray:115.88800049, 57.94400024;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+       d="m 349.58008,-12.728516 c -19.78034,0.499891 -39.51808,2.890348 -58.82031,7.2539096 4.10872,18.8723954 8.21745,37.7447914 12.32617,56.6171874 33.74925,-7.665785 69.12626,-7.971229 103.02539,-1.0293 3.71633,-18.821141 8.65912,-38.435398 11.61328,-56.7636714 -22.39128,-4.5980686 -45.29405,-6.6135646 -68.14453,-6.0781256 z m 105.80078,78.716797 c 31.47813,14.008295 59.87299,34.867319 82.70703,60.664059 14.44727,-12.81901 28.89453,-25.63802 43.3418,-38.457028 C 553.05494,56.141376 517.74279,30.253699 478.60547,12.900391 470.86393,30.596354 463.1224,48.292318 455.38086,65.988281 Z M 227.18164,16.626953 C 189.51961,34.723972 155.71119,60.77538 128.625,92.591797 c 14.7487,12.470703 29.49739,24.941413 44.24609,37.412113 22.37137,-26.20404 50.37565,-47.593699 81.60157,-62.169926 -8.17123,-17.501302 -16.34245,-35.002604 -24.51368,-52.503906 -0.92578,0.432292 -1.85156,0.864583 -2.77734,1.296875 z M 568.0293,168.66016 c 16.99699,30.09909 27.33124,63.91871 30.12695,98.36914 19.23893,-1.70833 38.47787,-3.41667 57.7168,-5.125 -3.5014,-42.55686 -16.29754,-84.32012 -37.26568,-121.51953 -16.85936,9.42513 -33.71871,18.85026 -50.57807,28.27539 z M 89.939453,150.27539 c -18.701268,36.38678 -29.811885,76.6502 -32.357428,117.48438 19.276042,1.22135 38.552083,2.44271 57.828125,3.66406 2.15345,-34.4883 11.88032,-68.47463 28.29492,-98.88281 -17.08268,-9.01302 -34.16536,-18.02605 -51.248045,-27.03907 -0.839191,1.59115 -1.678381,3.18229 -2.517572,4.77344 z"
+       id="path4626"
+       inkscape:connector-curvature="0" />
+    <circle
+       style="fill:none;stroke:#bebebe;stroke-width:75.08624021;stroke-miterlimit:5.19999981;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       id="path2985-7"
+       cx="381.42856"
+       cy="433.79074"
+       transform="matrix(0.50880116,0,0,0.55776489,164.13818,45.848517)"
+       ry="118.57143"
+       rx="130" />
+    <path
+       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:60;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:5.19999981;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+       d="m 430,220 30,55 -85,0 0,50 85,0 -30,55 170,-80 z"
+       transform="translate(56.941089,-12.819102)"
+       id="path3757-7"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccccccc" />
+    <path
+       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:60;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:5.19999981;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+       d="m 170,220 -170,80 170,80 -30,-55 85,0 0,-50 -85,0 z"
+       transform="translate(56.941089,-12.819102)"
+       id="path3761-7"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccccccc" />
+    <path
+       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:34.40008163;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:5.19999981;stroke-dasharray:none;stroke-dashoffset:94.40000153;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+       d="m 356.94141,187.18164 c -55.02475,0 -100.00001,44.97526 -100,100 -1e-5,55.02475 44.97525,100 100,100 55.02475,0 100,-44.97525 100,-100 0,-55.02475 -44.97525,-100 -100,-100 z m 0,34.39844 c 36.43357,0 65.59961,29.168 65.59961,65.60156 0,36.43356 -29.16604,65.59961 -65.59961,65.59961 -36.43357,0 -65.59961,-29.16605 -65.59961,-65.59961 0,-36.43356 29.16604,-65.60156 65.59961,-65.60156 z"
+       id="path4619"
+       inkscape:connector-curvature="0" />
+  </g>
+</svg>
diff --git a/data/icons/scalable/org.freedesktop.Bustle.svg b/data/icons/scalable/org.freedesktop.Bustle.svg
new file mode 100644
--- /dev/null
+++ b/data/icons/scalable/org.freedesktop.Bustle.svg
@@ -0,0 +1,253 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="605.06"
+   height="605.06"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.48.4 r9939"
+   sodipodi:docname="bustle.svg">
+  <defs
+     id="defs4">
+    <inkscape:path-effect
+       is_visible="true"
+       id="path-effect4126"
+       effect="spiro" />
+    <inkscape:path-effect
+       is_visible="true"
+       id="path-effect4123"
+       effect="spiro" />
+    <inkscape:path-effect
+       is_visible="true"
+       id="path-effect4120"
+       effect="spiro" />
+    <inkscape:path-effect
+       is_visible="true"
+       id="path-effect4117"
+       effect="spiro" />
+    <inkscape:path-effect
+       effect="spiro"
+       id="path-effect3770"
+       is_visible="true" />
+    <inkscape:path-effect
+       effect="spiro"
+       id="path-effect3763"
+       is_visible="true" />
+    <inkscape:path-effect
+       effect="spiro"
+       id="path-effect3759"
+       is_visible="true" />
+    <inkscape:path-effect
+       effect="spiro"
+       id="path-effect3770-1"
+       is_visible="true" />
+    <inkscape:path-effect
+       effect="spiro"
+       id="path-effect3770-3"
+       is_visible="true" />
+    <inkscape:path-effect
+       effect="spiro"
+       id="path-effect3759-7"
+       is_visible="true" />
+    <inkscape:path-effect
+       effect="spiro"
+       id="path-effect3763-2"
+       is_visible="true" />
+    <inkscape:path-effect
+       effect="spiro"
+       id="path-effect3770-6"
+       is_visible="true" />
+    <inkscape:path-effect
+       effect="spiro"
+       id="path-effect3770-3-1"
+       is_visible="true" />
+    <inkscape:path-effect
+       effect="spiro"
+       id="path-effect3770-6-2"
+       is_visible="true" />
+    <inkscape:path-effect
+       effect="spiro"
+       id="path-effect3763-2-7"
+       is_visible="true" />
+    <inkscape:path-effect
+       effect="spiro"
+       id="path-effect3770-3-1-2"
+       is_visible="true" />
+    <inkscape:path-effect
+       effect="spiro"
+       id="path-effect3759-7-2"
+       is_visible="true" />
+    <filter
+       id="filter4104"
+       inkscape:label="Chalk and sponge"
+       inkscape:menu="Distort"
+       inkscape:menu-tooltip="Low turbulence gives sponge look and high turbulence chalk"
+       width="1.6"
+       height="2"
+       y="-0.5"
+       x="-0.30000001"
+       color-interpolation-filters="sRGB">
+      <feTurbulence
+         id="feTurbulence4106"
+         baseFrequency="0.4"
+         type="fractalNoise"
+         seed="0"
+         numOctaves="5"
+         result="result1" />
+      <feOffset
+         id="feOffset4108"
+         dx="-5"
+         dy="-5"
+         result="result2" />
+      <feDisplacementMap
+         id="feDisplacementMap4110"
+         in2="result1"
+         xChannelSelector="R"
+         yChannelSelector="G"
+         scale="30"
+         in="SourceGraphic" />
+    </filter>
+    <filter
+       id="filter4183"
+       inkscape:label="Chalk and sponge"
+       inkscape:menu="Distort"
+       inkscape:menu-tooltip="Low turbulence gives sponge look and high turbulence chalk"
+       width="1.6"
+       height="2"
+       y="-0.5"
+       x="-0.30000001"
+       color-interpolation-filters="sRGB">
+      <feTurbulence
+         id="feTurbulence4185"
+         baseFrequency="0.4"
+         type="fractalNoise"
+         seed="0"
+         numOctaves="5"
+         result="result1" />
+      <feOffset
+         id="feOffset4187"
+         dx="-5"
+         dy="-5"
+         result="result2" />
+      <feDisplacementMap
+         id="feDisplacementMap4189"
+         in2="result1"
+         xChannelSelector="R"
+         yChannelSelector="G"
+         scale="30"
+         in="SourceGraphic" />
+    </filter>
+    <inkscape:path-effect
+       is_visible="true"
+       id="path-effect4117-2"
+       effect="spiro" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="0.59"
+     inkscape:cx="351.05408"
+     inkscape:cy="216.30891"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     inkscape:window-width="1388"
+     inkscape:window-height="833"
+     inkscape:window-x="50"
+     inkscape:window-y="223"
+     inkscape:window-maximized="0"
+     fit-margin-top="0"
+     fit-margin-left="0"
+     fit-margin-right="0"
+     fit-margin-bottom="0">
+    <inkscape:grid
+       type="xygrid"
+       id="grid3834"
+       empspacing="5"
+       visible="true"
+       enabled="true"
+       snapvisiblegridlinesonly="true"
+       originx="-56.941089px"
+       originy="-465.18127px" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-56.941089,17.879098)">
+    <path
+       style="fill:none;stroke:#74b674;stroke-width:27.59247017;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:82.77741051, 27.59247017;stroke-dashoffset:27.59247017"
+       d="m 70.761814,288.36996 c -0.01207,-1.2669 -0.02449,-2.53589 -0.02449,-3.80671 0,-159.41492 129.271656,-288.6461129 288.736206,-288.6461129 159.46457,0 288.73621,129.2311929 288.73621,288.6461129 l 0,0 0,0 c 0,1.27082 -0.009,2.53969 -0.0245,3.80671"
+       id="path3802-8"
+       inkscape:connector-curvature="0" />
+    <path
+       sodipodi:type="arc"
+       style="fill:none;stroke:#000000;stroke-width:34.42315674;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+       id="path2985-7"
+       sodipodi:cx="381.42856"
+       sodipodi:cy="433.79074"
+       sodipodi:rx="130"
+       sodipodi:ry="118.57143"
+       d="m 511.42856,433.79074 a 130,118.57143 0 1 1 -260,0 130,118.57143 0 1 1 260,0 z"
+       transform="matrix(0.50880116,0,0,0.55776489,164.13818,45.848517)"
+       />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:18.45480156;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       d="m 417.41556,287.80173 211.44171,0"
+       id="path3757-7"
+       inkscape:path-effect="#path-effect3759-7"
+       inkscape:original-d="m 417.41556,287.80173 211.44171,0"
+       inkscape:connector-curvature="0"
+       />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:18.17925262;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       d="m 294.08479,287.66116 -211.718251,0.2812"
+       id="path3761-7"
+       inkscape:path-effect="#path-effect3763-2"
+       inkscape:original-d="m 294.08479,287.66116 -211.718251,0.2812"
+       inkscape:connector-curvature="0"
+       />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:18.33793068;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       d="M 200.97285,226.67532 77.897224,289.6408 200.97285,348.92819"
+       id="path3768-2"
+       inkscape:path-effect="#path-effect3770-6"
+       inkscape:original-d="M 200.97285,226.67532 77.897224,289.6408 200.97285,348.92819"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccc"
+       />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:18.33793068;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       d="M 520.66838,225.39683 643.74401,288.36232 520.66838,347.6497"
+       id="path3768-9-7"
+       inkscape:path-effect="#path-effect3770-3-1"
+       inkscape:original-d="M 520.66838,225.39683 643.74401,288.36232 520.66838,347.6497"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccc"
+       />
+  </g>
+</svg>
diff --git a/data/org.freedesktop.Bustle.appdata.xml.in b/data/org.freedesktop.Bustle.appdata.xml.in
new file mode 100644
--- /dev/null
+++ b/data/org.freedesktop.Bustle.appdata.xml.in
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright 2014 Philip Withnall <philip@tecnocode.co.uk> -->
+<application>
+	<id type="desktop">org.freedesktop.Bustle.desktop</id>
+	<metadata_license>CC-BY-SA-3.0</metadata_license>
+	<project_license>LGPL-2.1+ and GPL-2.0+ and GPL-3.0</project_license>
+	<_name>Bustle</_name>
+	<_summary>Draw sequence diagrams of D-Bus activity</_summary>
+	<description>
+		<!-- Translators: These are the application description paragraphs in the AppData file. -->
+		<_p>Bustle draws sequence diagrams of D-Bus activity.
+		    It shows signal emissions, method calls and their
+		    corresponding returns, with time stamps for each individual
+		    event and the duration of each method call. This can help
+		    you check for unwanted D-Bus traffic, and pinpoint why your
+		    D-Bus-based application isn't performing as well as you
+		    like. It also provides statistics like signal frequencies
+		    and average method call times.</_p>
+	</description>
+	<screenshots>
+		<screenshot type="default">
+			<!-- Translators: This should be the URI of a 2400×1350, pixel screenshot of Bustle in your language. If you can't take a screenshot, leave the string as the English screenshot. -->
+			<_image type="source">https://wiki.freedesktop.org/www/Software/Bustle/bustle-0.5.2-1.png</_image>
+			</screenshot>
+		<screenshot>
+			<!-- Translators: This should be the URI of a 2400×1350, pixel screenshot of Bustle in your language. If you can't take a screenshot, leave the string as the English screenshot. -->
+			<_image type="source">https://wiki.freedesktop.org/www/Software/Bustle/bustle-0.5.2-2.png</_image>
+		</screenshot>
+	</screenshots>
+	<url type="homepage">https://www.freedesktop.org/wiki/Software/Bustle/</url>
+	<updatecontact>will_at_willthompson.co.uk</updatecontact>
+	<translation type="gettext">bustle</translation>
+	<provides>
+		<id>bustle.desktop</id>
+	</provides>
+</application>
diff --git a/data/org.freedesktop.Bustle.desktop.in b/data/org.freedesktop.Bustle.desktop.in
new file mode 100644
--- /dev/null
+++ b/data/org.freedesktop.Bustle.desktop.in
@@ -0,0 +1,10 @@
+[Desktop Entry]
+_Name=Bustle
+_Comment=Draw sequence diagrams of D-Bus activity
+Exec=bustle
+Icon=org.freedesktop.Bustle
+Terminal=false
+Type=Application
+Categories=GTK;Development;Debugger;Profiling;
+StartupNotify=true
+_Keywords=debug;profile;d-bus;dbus;sequence;monitor;
diff --git a/ldd-me-up.sh b/ldd-me-up.sh
deleted file mode 100644
--- a/ldd-me-up.sh
+++ /dev/null
@@ -1,4 +0,0 @@
-#!/bin/sh
-set -e
-
-ldd $1 | perl -lne 'm{(lib(?:ffi|gmp|pcap)\S+) => (\S+) } and print $2'
