diff --git a/Bustle/Diagram.hs b/Bustle/Diagram.hs
--- a/Bustle/Diagram.hs
+++ b/Bustle/Diagram.hs
@@ -53,13 +53,13 @@
 
 import Control.Monad.Reader
 
-import Graphics.Rendering.Cairo
+import Graphics.Rendering.Cairo (Operator(..), Render, arc, curveTo, fill, getCurrentPoint, lineTo, moveTo, newPath, paint, rectangle, restore, save, setDash, setLineWidth, setOperator, setSourceRGB, stroke)
 import Graphics.UI.Gtk.Cairo (cairoCreateContext, showLayout)
 import Graphics.Rendering.Pango.Layout
 import Graphics.Rendering.Pango.Font
 
-import qualified Bustle.Markup as Markup
-import Bustle.Markup (Markup)
+import qualified Bustle.Marquee as Marquee
+import Bustle.Marquee (Marquee)
 import Bustle.Util
 import Bustle.Types (ObjectPath, InterfaceName, MemberName)
 
@@ -430,7 +430,7 @@
     stroke
 
     setSourceRGB 0 0 0
-    l <- mkLayout (Markup.escape cap) EllipsizeNone AlignLeft
+    l <- mkLayout (Marquee.escape cap) EllipsizeNone AlignLeft
     (PangoRectangle _ _ textWidth _, _) <- liftIO $ layoutGetExtents l
     let tx = min x2 dx + abs (x2 - dx) / 2
     moveTo (if x1 > cx then tx - textWidth else tx) (y2 - 5)
@@ -445,12 +445,18 @@
 {-# NOINLINE font #-}
 
 mkLayout :: (MonadIO m)
-         => Markup -> EllipsizeMode -> LayoutAlignment
+         => Marquee -> EllipsizeMode -> LayoutAlignment
          -> m PangoLayout
 mkLayout s e a = liftIO $ do
     ctx <- cairoCreateContext Nothing
     layout <- layoutEmpty ctx
-    layoutSetMarkup layout (Markup.unMarkup s)
+    -- layoutSetMarkup returns the un-marked-up text. We don't care about it,
+    -- but recent versions of Pango give it the type
+    --    GlibString string => ... -> IO string
+    -- which we need to disambiguate between Text and String. Old versions were
+    --    .. -> IO String
+    -- so go with that.
+    layoutSetMarkup layout (Marquee.toPangoMarkup s) :: IO String
     layoutSetFontDescription layout (Just font)
     layoutSetEllipsize layout e
     layoutSetAlignment layout a
@@ -464,7 +470,7 @@
 
 drawHeader :: [String] -> Double -> Double -> Render ()
 drawHeader names x y = forM_ (zip [0..] names) $ \(i, name) -> do
-    l <- mkLayout (Markup.escape name) EllipsizeEnd AlignCenter `withWidth` columnWidth
+    l <- mkLayout (Marquee.escape name) EllipsizeEnd AlignCenter `withWidth` columnWidth
     moveTo (x - (columnWidth / 2)) (y + i * h)
     showLayout l
   where h = 10
@@ -485,14 +491,14 @@
       moveTo (x - memberWidth / 2) y'
       showLayout l
 
-    path = (if isReturn then id else Markup.b) $ Markup.escape p
+    path = (if isReturn then id else Marquee.b) $ Marquee.escape p
     fullMethod =
-        (if isReturn then Markup.i else id) $ Markup.formatMember i m
+        (if isReturn then Marquee.i else id) $ Marquee.formatMember i m
 
 drawTimestamp :: String -> Double -> Double -> Render ()
 drawTimestamp ts x y = do
     moveTo (x - timestampWidth / 2) (y - 10)
-    showLayout =<< mkLayout (Markup.escape ts) EllipsizeNone AlignLeft `withWidth` timestampWidth
+    showLayout =<< mkLayout (Marquee.escape ts) EllipsizeNone AlignLeft `withWidth` timestampWidth
 
 drawClientLines :: NonEmpty Double -> Double -> Double -> Render ()
 drawClientLines xs y1 y2 = saved $ do
diff --git a/Bustle/Markup.hs b/Bustle/Markup.hs
deleted file mode 100644
--- a/Bustle/Markup.hs
+++ /dev/null
@@ -1,112 +0,0 @@
-{-# LANGUAGE TypeSynonymInstances, FlexibleInstances #-}
-{-
-Bustle.Diagram: My First Type-Safe Markup Library
-Copyright © 2011 Will Thompson
-
-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.Markup
-  ( Markup
-  , unMarkup
-  , tag
-  , b
-  , i
-  , light
-  , red
-  , a
-  , escape
-
-  , formatMember
-  )
-where
-
-import Data.Monoid
-import Data.Text (Text)
-import qualified Data.Text as T
-
-import Graphics.Rendering.Pango.BasicTypes (Weight(..))
-import Graphics.Rendering.Pango.Layout (escapeMarkup)
-import Graphics.Rendering.Pango.Markup (markSpan, SpanAttribute(..))
-
-import Bustle.Types (ObjectPath, formatObjectPath, InterfaceName, formatInterfaceName, MemberName, formatMemberName)
-
-newtype Markup = Markup { unMarkup :: String }
-    deriving (Show, Read, Ord, Eq)
-
-instance Monoid Markup where
-    mempty = Markup ""
-    mappend x y = Markup (unMarkup x `mappend` unMarkup y)
-    mconcat = Markup . mconcat . map unMarkup
-
---raw :: String -> Markup
---raw = Markup
-
-tag :: String -> Markup -> Markup
-tag name contents =
-    Markup $ concat [ "<", name, ">"
-                    , unMarkup contents
-                    , "</", name, ">"
-                    ]
-
-b, i :: Markup -> Markup
-b = tag "b"
-i = tag "i"
-
-a :: String
-  -> String
-  -> Markup
-a href contents =
-  Markup $ concat [ "<a href=\"", escapeMarkup href, "\">"
-                  , escapeMarkup contents
-                  , "</a>"
-                  ]
-
-span_ :: [SpanAttribute] -> Markup -> Markup
-span_ attrs = Markup . markSpan attrs . unMarkup
-
-light :: Markup -> Markup
-light = span_ [FontWeight WeightLight]
-
-red :: Markup -> Markup
-red = span_ [FontForeground "#ff0000"]
-
--- Kind of a transitional measure because some strings are Strings, and some are Text.
-class Unescaped s where
-    toString :: s -> String
-
-instance Unescaped String where
-    toString = id
-
-instance Unescaped Text where
-    toString = T.unpack
-
-instance Unescaped InterfaceName where
-    toString = formatInterfaceName
-
-instance Unescaped ObjectPath where
-    toString = formatObjectPath
-
-instance Unescaped MemberName where
-    toString = formatMemberName
-
-escape :: Unescaped s => s -> Markup
-escape = Markup . escapeMarkup . toString
-
-formatMember :: Maybe InterfaceName -> MemberName -> Markup
-formatMember iface member = iface' `mappend` b (escape member)
-  where
-    iface' = case iface of
-        Just ifaceName -> escape ifaceName `mappend` Markup "."
-        Nothing        -> light (escape "(no interface) ")
diff --git a/Bustle/Marquee.hs b/Bustle/Marquee.hs
new file mode 100644
--- /dev/null
+++ b/Bustle/Marquee.hs
@@ -0,0 +1,114 @@
+{-# LANGUAGE TypeSynonymInstances, FlexibleInstances #-}
+{-
+Bustle.Marquee: My First Type-Safe Markup Library With A Cutesy Name To Not Collide With Pango's 'Markup' Which Is A Synonym For String
+Copyright © 2011 Will Thompson
+
+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.Marquee
+  ( Marquee
+  , toPangoMarkup
+  , tag
+  , b
+  , i
+  , light
+  , red
+  , a
+  , escape
+
+  , formatMember
+
+  , toString
+  )
+where
+
+import Data.Monoid
+import Data.Text (Text)
+import qualified Data.Text as T
+
+import Graphics.Rendering.Pango.BasicTypes (Weight(..))
+import Graphics.Rendering.Pango.Layout (escapeMarkup)
+import Graphics.Rendering.Pango.Markup (markSpan, SpanAttribute(..))
+
+import Bustle.Types (ObjectPath, formatObjectPath, InterfaceName, formatInterfaceName, MemberName, formatMemberName)
+
+newtype Marquee = Marquee { unMarquee :: String }
+    deriving (Show, Read, Ord, Eq)
+
+toPangoMarkup :: Marquee -> String
+toPangoMarkup = unMarquee
+
+instance Monoid Marquee where
+    mempty = Marquee ""
+    mappend x y = Marquee (unMarquee x `mappend` unMarquee y)
+    mconcat = Marquee . mconcat . map unMarquee
+
+tag :: String -> Marquee -> Marquee
+tag name contents =
+    Marquee $ concat [ "<", name, ">"
+                    , unMarquee contents
+                    , "</", name, ">"
+                    ]
+
+b, i :: Marquee -> Marquee
+b = tag "b"
+i = tag "i"
+
+a :: String
+  -> String
+  -> Marquee
+a href contents =
+  Marquee $ concat [ "<a href=\"", escapeMarkup href, "\">"
+                  , escapeMarkup contents
+                  , "</a>"
+                  ]
+
+span_ :: [SpanAttribute] -> Marquee -> Marquee
+span_ attrs = Marquee . markSpan attrs . unMarquee
+
+light :: Marquee -> Marquee
+light = span_ [FontWeight WeightLight]
+
+red :: Marquee -> Marquee
+red = span_ [FontForeground "#ff0000"]
+
+-- Kind of a transitional measure because some strings are Strings, and some are Text.
+class Unescaped s where
+    toString :: s -> String
+
+instance Unescaped String where
+    toString = id
+
+instance Unescaped Text where
+    toString = T.unpack
+
+instance Unescaped InterfaceName where
+    toString = formatInterfaceName
+
+instance Unescaped ObjectPath where
+    toString = formatObjectPath
+
+instance Unescaped MemberName where
+    toString = formatMemberName
+
+escape :: Unescaped s => s -> Marquee
+escape = Marquee . escapeMarkup . toString
+
+formatMember :: Maybe InterfaceName -> MemberName -> Marquee
+formatMember iface member = iface' `mappend` b (escape member)
+  where
+    iface' = case iface of
+        Just ifaceName -> escape ifaceName `mappend` Marquee "."
+        Nothing        -> light (escape "(no interface) ")
diff --git a/Bustle/StatisticsPane.hs b/Bustle/StatisticsPane.hs
--- a/Bustle/StatisticsPane.hs
+++ b/Bustle/StatisticsPane.hs
@@ -26,12 +26,12 @@
 import Control.Applicative ((<$>))
 import Control.Monad (forM_)
 import Text.Printf
-import Graphics.UI.Gtk hiding (Markup)
+import Graphics.UI.Gtk
 import Bustle.Stats
 import Bustle.Translation (__)
 import Bustle.Types (Log)
-import qualified Bustle.Markup as Markup
-import Bustle.Markup (Markup)
+import qualified Bustle.Marquee as Marquee
+import Bustle.Marquee (Marquee)
 import Data.Monoid
 
 data StatsPane =
@@ -83,20 +83,20 @@
 addTextRenderer :: TreeViewColumn
                 -> ListStore a
                 -> Bool
-                -> (a -> Markup)
+                -> (a -> Marquee)
                 -> IO CellRendererText
 addTextRenderer col store expand f = do
     renderer <- cellRendererTextNew
     cellLayoutPackStart col renderer expand
     set renderer [ cellTextSizePoints := 7 ]
     cellLayoutSetAttributes col renderer store $ \x ->
-        [ cellTextMarkup := (Just . Markup.unMarkup) $ f x ]
+        [ cellTextMarkup := (Just . Marquee.toPangoMarkup) $ f x ]
     return renderer
 
 addMemberRenderer :: TreeViewColumn
                   -> ListStore a
                   -> Bool
-                  -> (a -> Markup)
+                  -> (a -> Marquee)
                   -> IO CellRendererText
 addMemberRenderer col store expand f = do
     renderer <- addTextRenderer col store expand f
@@ -110,7 +110,7 @@
 addStatColumn :: TreeView
               -> ListStore a
               -> String
-              -> (a -> Markup)
+              -> (a -> Marquee)
               -> IO ()
 addStatColumn view store title f = do
     col <- treeViewColumnNew
@@ -126,7 +126,7 @@
                   -> (a -> String)
                   -> IO ()
 addTextStatColumn view store title f =
-    addStatColumn view store title (Markup.escape . f)
+    addStatColumn view store title (Marquee.escape . f)
 
 -- If we managed to load the method and signal icons...
 maybeAddTypeIconColumn :: CellLayoutClass layout
@@ -164,7 +164,7 @@
           TallySignal -> False
 
   addMemberRenderer nameColumn countStore True $ \fi ->
-      Markup.formatMember (fiInterface fi) (fiMember fi)
+      Marquee.formatMember (fiInterface fi) (fiMember fi)
   treeViewAppendColumn countView nameColumn
 
   countColumn <- treeViewColumnNew
@@ -203,7 +203,7 @@
                  ]
 
   addMemberRenderer nameColumn timeStore True $ \ti ->
-      Markup.formatMember (tiInterface ti) (tiMethodName ti)
+      Marquee.formatMember (tiInterface ti) (tiMethodName ti)
   treeViewAppendColumn timeView nameColumn
 
   addTextStatColumn timeView timeStore (__ "Total")
@@ -214,16 +214,16 @@
 
   return (timeStore, timeView)
 
-formatSizeInfoMember :: SizeInfo -> Markup
+formatSizeInfoMember :: SizeInfo -> Marquee
 formatSizeInfoMember si =
-    f (Markup.formatMember (siInterface si) (siName si))
+    f (Marquee.formatMember (siInterface si) (siName si))
   where
     f = case siType si of
-            SizeReturn -> Markup.i
-            SizeError  -> Markup.red
+            SizeReturn -> Marquee.i
+            SizeError  -> Marquee.red
             _          -> id
 
-formatSize :: Int -> Markup
+formatSize :: Int -> Marquee
 formatSize s
     | s < maxB = value 1 `mappend` units (__ "B")
     | s < maxKB = value 1024 `mappend` units (__ "KB")
@@ -232,9 +232,9 @@
     maxB = 10000
     maxKB = 10000 * 1024
 
-    units = Markup.escape . (' ':)
+    units = Marquee.escape . (' ':)
 
-    value factor = Markup.escape (show (s `div` factor))
+    value factor = Marquee.escape (show (s `div` factor))
 
 newSizeView :: Maybe Pixbuf
             -> Maybe Pixbuf
diff --git a/Bustle/UI.hs b/Bustle/UI.hs
--- a/Bustle/UI.hs
+++ b/Bustle/UI.hs
@@ -38,6 +38,7 @@
 import Bustle.Renderer
 import Bustle.Types
 import Bustle.Diagram
+import Bustle.Marquee (toString)
 import Bustle.Util
 import Bustle.UI.AboutDialog
 import Bustle.UI.Canvas
@@ -281,7 +282,7 @@
     case mdetails of
         Just (RecordedLog tempFilePath) -> do
             let tempFileName = takeFileName tempFilePath
-                title = printf (__ "Save log '%s' before closing?") tempFileName
+                title = printf (__ "Save log '%s' before closing?") tempFileName :: String
             prompt <- messageDialogNew (Just (wiWindow wi))
                                        [DialogModal]
                                        MessageWarning
@@ -459,7 +460,8 @@
                 -> IO ()
 wiSetLogDetails wi logDetails = do
     writeIORef (wiLogDetails wi) (Just logDetails)
-    windowSetTitle (wiWindow wi) (printf (__ "%s - Bustle") (logWindowTitle logDetails))
+    windowSetTitle (wiWindow wi)
+        (printf (__ "%s - Bustle") (logWindowTitle logDetails) :: String)
 
 setPage :: MonadIO io
         => WindowInfo
@@ -525,7 +527,7 @@
 loadPixbuf filename = do
   iconName <- getDataFileName $ "data/" ++ filename
   C.catch (fmap Just (pixbufNewFromFile iconName))
-          (\(GError _ _ msg) -> warn msg >> return Nothing)
+          (\(GError _ _ msg) -> warn (toString msg) >> return Nothing)
 
 openDialogue :: Window -> B ()
 openDialogue window = embedIO $ \r -> do
diff --git a/Bustle/UI/Canvas.hs b/Bustle/UI/Canvas.hs
--- a/Bustle/UI/Canvas.hs
+++ b/Bustle/UI/Canvas.hs
@@ -16,6 +16,7 @@
 License along with this library; if not, write to the Free Software
 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 -}
+{-# LANGUAGE OverloadedStrings #-}
 module Bustle.UI.Canvas
   (
     Canvas
@@ -58,7 +59,7 @@
           -> (Maybe a -> IO ())
           -> IO (Canvas a)
 canvasNew builder showBounds selectionChangedCb = do
-    layout <- builderGetObject builder castToLayout "diagramLayout"
+    layout <- builderGetObject builder castToLayout ("diagramLayout" :: String)
     idRef <- newIORef Nothing
     shapesRef <- newIORef []
     widthRef <- newIORef 0
diff --git a/Bustle/UI/DetailsView.hs b/Bustle/UI/DetailsView.hs
--- a/Bustle/UI/DetailsView.hs
+++ b/Bustle/UI/DetailsView.hs
@@ -25,13 +25,13 @@
 where
 
 import Data.List (intercalate)
-import Graphics.UI.Gtk hiding (Signal, Markup)
+import Graphics.UI.Gtk hiding (Signal)
 
 import qualified DBus as D
 
 import Bustle.Translation (__)
 import Bustle.Types
-import Bustle.Markup
+import Bustle.Marquee
 import Bustle.VariantFormatter
 
 data DetailsView =
@@ -55,7 +55,7 @@
          -> Int
          -> IO Label
 addValue table row = do
-    label <- labelNew Nothing
+    label <- labelNew (Nothing :: Maybe String)
     miscSetAlignment label 0 0
     labelSetEllipsize label EllipsizeStart
     labelSetSelectable label True
@@ -77,7 +77,7 @@
                 , tableColumnSpacing := 6
                 ]
 
-    title <- labelNew Nothing
+    title <- labelNew (Nothing :: Maybe String)
     miscSetAlignment title 0 0
     tableAttach table title 0 2 0 1 [Fill] [Fill] 0 0
 
@@ -99,7 +99,7 @@
     widgetShowAll table
     return $ DetailsView table title pathLabel memberLabel view
 
-pickTitle :: Detailed Message -> Markup
+pickTitle :: Detailed Message -> Marquee
 pickTitle (Detailed _ m _) = case m of
     MethodCall {} -> b (escape (__ "Method call"))
     MethodReturn {} -> b (escape (__ "Method return"))
@@ -111,7 +111,7 @@
 
 getMemberMarkup :: Member -> String
 getMemberMarkup m =
-    unMarkup $ formatMember (iface m) (membername m)
+    toPangoMarkup $ formatMember (iface m) (membername m)
 
 getMember :: Detailed Message -> Maybe Member
 getMember (Detailed _ m _) = case m of
@@ -140,7 +140,7 @@
 detailsViewUpdate d m = do
     buf <- textViewGetBuffer $ detailsBodyView d
     let member_ = getMember m
-    labelSetMarkup (detailsTitle d) (unMarkup $ pickTitle m)
+    labelSetMarkup (detailsTitle d) (toPangoMarkup $ pickTitle m)
     labelSetText (detailsPath d) (maybe unknown (D.formatObjectPath . path) member_)
     labelSetMarkup (detailsMember d) (maybe unknown getMemberMarkup member_)
     textBufferSetText buf $ formatMessage m
diff --git a/Bustle/UI/FilterDialog.hs b/Bustle/UI/FilterDialog.hs
--- a/Bustle/UI/FilterDialog.hs
+++ b/Bustle/UI/FilterDialog.hs
@@ -99,7 +99,7 @@
     nameStore <- makeStore names currentlyHidden
     sw <- makeView nameStore
 
-    instructions <- labelNew Nothing
+    instructions <- labelNew (Nothing :: Maybe String)
     widgetSetSizeRequest instructions 600 (-1)
     labelSetMarkup instructions
         (__ "Unticking a service hides its column in the diagram, \
diff --git a/Bustle/UI/Recorder.hs b/Bustle/UI/Recorder.hs
--- a/Bustle/UI/Recorder.hs
+++ b/Bustle/UI/Recorder.hs
@@ -36,6 +36,7 @@
 
 import Bustle.Loader.Pcap (convert)
 import Bustle.Loader (isRelevant)
+import Bustle.Marquee (toString)
 import Bustle.Monitor
 import Bustle.Renderer
 import Bustle.Translation (__)
@@ -78,7 +79,7 @@
                 i <- takeMVar n
                 let j = i + (length pending)
                 labelSetMarkup label $
-                    printf (__ "Logged <b>%u</b> messages…") j
+                    (printf (__ "Logged <b>%u</b> messages…") j :: String)
                 putMVar n j
 
                 incoming rr'
@@ -97,8 +98,9 @@
     maybe (return ()) (windowSetTransientFor dialog) mwindow
     dialog `set` [ windowModal := True ]
 
-    label <- labelNew Nothing
-    labelSetMarkup label $ printf (__ "Logged <b>%u</b> messages…") (0 :: Int)
+    label <- labelNew (Nothing :: Maybe String)
+    labelSetMarkup label $
+        (printf (__ "Logged <b>%u</b> messages…") (0 :: Int) :: String)
     loaderStateRef <- newMVar Map.empty
     pendingRef <- newMVar []
     let updateLabel µs body = do
@@ -142,7 +144,7 @@
     widgetShowAll dialog
   where
     newFailed (GError _ _ message) = do
-        displayError mwindow message Nothing
+        displayError mwindow (toString message) Nothing
 
 recorderChooseFile :: FilePath
                    -> Maybe Window
diff --git a/HACKING b/HACKING
deleted file mode 100644
--- a/HACKING
+++ /dev/null
@@ -1,14 +0,0 @@
-Want to get involved? Great!
-============================
-
-Grab the latest code from git:
-
-    git clone git://anongit.freedesktop.org/bustle
-
-and get stuck in! Please submit patches, or links to git branches, as
-bugs on <https://bugs.freedesktop.org/enter_bug.cgi?product=Bustle>.
-
-In new code, try to follow
-<https://github.com/tibbe/haskell-style-guide/blob/master/haskell-style.md>.
-Certain authors did not follow it in the past but it seems like a good kind of
-thing to aim for.
diff --git a/HACKING.md b/HACKING.md
new file mode 100644
--- /dev/null
+++ b/HACKING.md
@@ -0,0 +1,14 @@
+Want to get involved? Great!
+============================
+
+Grab the latest code from git:
+
+    git clone git://anongit.freedesktop.org/bustle
+
+and get stuck in! Please submit patches, or links to git branches, as
+bugs on <https://bugs.freedesktop.org/enter_bug.cgi?product=Bustle>.
+
+In new code, try to follow
+<https://github.com/tibbe/haskell-style-guide/blob/master/haskell-style.md>.
+Certain authors did not follow it in the past but it seems like a good kind of
+thing to aim for.
diff --git a/INSTALL b/INSTALL
deleted file mode 100644
--- a/INSTALL
+++ /dev/null
@@ -1,48 +0,0 @@
-Building from source
-====================
-
-First, make sure the Haskell Platform is installed, preferably along with the
-Gtk+ bindings for Haskell, and some other dependencies. On Debian-flavoured
-systems, well, actually just `apt-get build-dep bustle`, but:
-
-    sudo apt-get install \
-        pkg-config \
-        libdbus-1-dev \
-        libglib2.0-dev \
-        libpcap0.8-dev \
-        haskell-platform \
-        libghc-mtl-dev \
-        libghc-cairo-dev \
-        libghc-gtk-dev \
-        libghc-parsec3-dev \
-        libghc-glade-dev \
-        libghc-dbus-dev \
-        libghc-pcap-dev \
-        help2man
-
-(If you can't get the Haskell Platform via your package manager, see
-<http://hackage.haskell.org/platform/>. If you can't get the Gtk+ binding for
-Haskell via your package manager, you'll need to run:
-
-    cabal install gtk2hs-buildtools
-
-and ensure that ~/.cabal/bin is in your PATH before continuing.)
-
-Got that? Great!
-
-    export PREFIX=/opt/bustle
-
-    # Build and install Bustle itself.
-    cabal install --prefix=$PREFIX
-
-    # Build and install the stand-alone logger binary, plus the icons, desktop
-    # file, etc. etc.
-    make install PREFIX=$PREFIX
-
-If the Haskell Platform is not available on the platform you want to do
-some D-Bus profiling on, that's fine: the logger is written in C, and
-you can view logs generated on your fancy embedded hardware on your more
-pedestrian Linux laptop. The logger only depends on a few widely-available
-libraries:
-
-    sudo apt-get install libglib2.0-dev libpcap-dev
diff --git a/INSTALL.md b/INSTALL.md
new file mode 100644
--- /dev/null
+++ b/INSTALL.md
@@ -0,0 +1,48 @@
+Building from source
+====================
+
+First, make sure the Haskell Platform is installed, preferably along with the
+Gtk+ bindings for Haskell, and some other dependencies. On Debian-flavoured
+systems, well, actually just `apt-get build-dep bustle`, but:
+
+    sudo apt-get install \
+        pkg-config \
+        libdbus-1-dev \
+        libglib2.0-dev \
+        libpcap0.8-dev \
+        haskell-platform \
+        libghc-mtl-dev \
+        libghc-cairo-dev \
+        libghc-gtk-dev \
+        libghc-parsec3-dev \
+        libghc-glade-dev \
+        libghc-dbus-dev \
+        libghc-pcap-dev \
+        help2man
+
+(If you can't get the Haskell Platform via your package manager, see
+<http://hackage.haskell.org/platform/>. If you can't get the Gtk+ binding for
+Haskell via your package manager, you'll need to run:
+
+    cabal install gtk2hs-buildtools
+
+and ensure that ~/.cabal/bin is in your PATH before continuing.)
+
+Got that? Great!
+
+    export PREFIX=/opt/bustle
+
+    # Build and install Bustle itself.
+    cabal install --prefix=$PREFIX
+
+    # Build and install the stand-alone logger binary, plus the icons, desktop
+    # file, etc. etc.
+    make install PREFIX=$PREFIX
+
+If the Haskell Platform is not available on the platform you want to do
+some D-Bus profiling on, that's fine: the logger is written in C, and
+you can view logs generated on your fancy embedded hardware on your more
+pedestrian Linux laptop. The logger only depends on a few widely-available
+libraries:
+
+    sudo apt-get install libglib2.0-dev libpcap-dev
diff --git a/Makefile b/Makefile
--- a/Makefile
+++ b/Makefile
@@ -18,6 +18,7 @@
 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) \
 	$(NULL)
 
@@ -58,6 +59,8 @@
 	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; )
+	mkdir -p $(DATADIR)/icons/hicolor/scalable/apps
+	cp data/icons/scalable/bustle-symbolic.svg $(DATADIR)/icons/hicolor/scalable/apps
 	$(MAKE) update-icon-cache
 
 uninstall:
@@ -66,6 +69,7 @@
 	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
 	$(MAKE) update-icon-cache
 
 clean:
@@ -95,10 +99,10 @@
 	mkdir -p $(TARBALL_FULL_DIR)
 	cabal-dev install --prefix=$(TOP)/$(TARBALL_FULL_DIR) \
 		--datadir=$(TOP)/$(TARBALL_FULL_DIR) --datasubdir=.
-	cp bustle.sh README $(TARBALL_FULL_DIR)
+	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
+		$(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
@@ -108,3 +112,10 @@
 
 maintainer-update-messages-pot:
 	find Bustle -name '*.hs' -print0 | xargs -0 hgettext -k __ -o po/messages.pot
+
+maintainer-make-release: bustle.cabal
+	cabal test
+	cabal sdist
+	git tag -s -m 'Bustle '`perl -nle 'm/^Version:\s+(.*)$$/ and print qq($$1)' bustle.cabal` \
+		bustle-`perl -nle 'm/^Version:\s+(.*)$$/ and print qq($$1)' bustle.cabal`
+	make maintainer-binary-tarball
diff --git a/NEWS b/NEWS
deleted file mode 100644
--- a/NEWS
+++ /dev/null
@@ -1,301 +0,0 @@
-Bustle 0.4.7 (2014-07-19)
--------------------------
-
-* Ship the icons in the tarball! Thanks again, Sergei Trofimovich.
-
-
-Bustle 0.4.6 (2014-07-17)
--------------------------
-
-* Icons! Thanks to Αποστολίδου Χρυσαφή for redrawing the icon as an SVG, and to
-  Philip Withnall for the build system goop.
-* More appdata! Thanks again, Philip.
-
-Bustle 0.4.5 (2014-02-26)
--------------------------
-
-* Fix build failure with tests enabled due to translation files.
-* Distribute appdata and desktop files in source tarballs.
-
-Thanks to Sergei Trofimovich for catching and fixing these!
-
-
-Bustle 0.4.4 (2014-01-30)
--------------------------
-
-Wow, I can't believe the first release was in 2008!
-
-* Bustle's now translatable. It only ships with an English translation,
-  but others are more than welcome! Thanks to Philip Withnall for
-  getting this started.
-* Add an AppData and .desktop file. (Philip Withnall)
-
-
-Bustle 0.4.3 (2013-12-05)
--------------------------
-
-I think you mean ‘fewer crashy’.
-
-* Don't crash on i386 when opening the stats pane. Thanks to Sujith
-  Sudhi for reporting this issue.
-* [#54237][]: Don't crash if we can't connect to the bus.
-* Don't crash the second time you try to record a log. I swear this
-  didn't happen before.
-
-[#54237]: https://bugs.freedesktop.org/show_bug.cgi?id=54237
-
-Bustle 0.4.2 (2012-11-14)
--------------------------
-
-This release is all about build fixes; nothing user-visible has changed.
-
-* The Makefile now respects the `DESTDIR` variable.
-* No more deprecation warnings about `g_thread_create()`!
-* We explicitly check for GLib ≥ 2.26.
-
-Also, there's now a `threaded` Cabal flag you can turn off if you're
-building for some platform where the threaded GHC runtime isn't
-available (such as S/390, MIPS or Sparc). This is the same approach used
-to make several other packages build for those architectures in Debian,
-as per [bug 541848][]. You can do something like this in your packaging:
-
-    DEB_SETUP_GHC_CONFIGURE_ARGS := $(shell test -e /usr/lib/ghc-$(GHC_VERSION)/libHSrts_thr.a || echo --flags=-threaded)
-
-Bustle doesn't directly use Haskell-land threads, but I don't trust it
-not to break in this configuration, so it's not the default.
-
-[bug 541848]: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=541848#33
-
-Bustle 0.4.1 (2012-08-29)
--------------------------
-
-Some dependency changes:
-
-* Gtk2HS ≥ 0.12 is now required.
-* Bustle now uses the [dbus][] Haskell library (≥ 0.10), which
-  supersedes the [dbus-core][] package.
-* `binary` is no longer required.
-
-Some user-visible changes:
-
-* The front page now has two big buttons rather than some [lame
-  instructions][fdo44889].
-* Memory usage should be a bit better, particularly for wide logs
-  showing lots of applications.
-
-Some plumbing changes:
-
-* You can now make a symlink to the launcher script and have it work
-  properly.
-* Bustle [builds with GHC 7.4.1][fdo47013] (courtesy of Sergei
-  Trofimovich).
-* `make clean` [works][fdo47908] in source tarballs.
-* `bustle-pcap` now has a man page (courtesy of Alex Merry).
-
-[dbus]: http://hackage.haskell.org/package/dbus-0.10
-[fdo44889]: https://bugs.freedesktop.org/show_bug.cgi?id=44889
-[fdo47013]: https://bugs.freedesktop.org/show_bug.cgi?id=47013
-[fdo47908]: https://bugs.freedesktop.org/show_bug.cgi?id=47908
-
-
-Bustle 0.4.0 (2012-01-18)
--------------------------
-
-The “let's hope my attention span lasts long enough” release.
-
-You can now record D-Bus logs from within Bustle itself. No more faffing
-around with command-line tools: just click **File → New**, and watch
-the diagram being drawn as the messages trickle (or fly) in.
-
-(If you want to capture logs from your embedded platform *du
-jour*, don't fear: `bustle-pcap` is still provided as a standalone
-program for your enjoyment.)
-
-Bustle no longer [crashes when it encounters messages containing file
-handles][crash-on-h]. (Those messages are now dropped; which is not
-perfect, but is at least an improvement.)
-
-Directed signals—signals with a specified destination, which are unusual
-but do appear—are now shown differently to normal, undirected signals,
-with an arrow pointing to the signal's recipient. Relatedly, the
-monitors now [explicitly eavesdrop on messages][eavesdrop] when using
-D-Bus 1.5.x, courtesy of Cosimo Alfarano.
-
-[crash-on-h]: https://bugs.freedesktop.org/show_bug.cgi?id=44714
-[eavesdrop]: https://bugs.freedesktop.org/show_bug.cgi?id=39140
-
-
-Bustle 0.3.1 (2012-01-09)
--------------------------
-
-The “How do I dress up as shared global mutable state?” release.
-
-This release finally allows you to record complete D-Bus sessions,
-including message bodies, and browse them in the user interface!
-
-As a result, there is a new logger, `bustle-pcap`, which logs D-Bus
-traffic to Pcap files; and Bustle itself now depends on the [pcap][] and
-[dbus-core][] packages. Your old logs should still be loaded just fine,
-but since they don't contain message body data, you won't be able to see
-it in the UI.
-
-Also, as of this release binary tarballs will be provided for those not
-interested in compiling Bustle themselves.
-
-[pcap]: http://hackage.haskell.org/package/pcap
-[dbus-core]: http://hackage.haskell.org/package/dbus-core
-
-
-Bustle 0.3.0
-------------
-
-You can't prove anything.
-
-
-Bustle 0.2.5 (2011-06-25)
--------------------------
-
-The “Why go all the way to Glastonbury to not watch U2 when you can just
-not turn on the BBC at any point this weekend to not watch them?”
-release.
-
-This adds a sidebar with statistics about the log: namely, method call
-and signal emission frequency, and total/mean times spent in method
-calls. This code has mostly been sitting around unreleased since
-November. Sorry, dear users!
-
-
-Bustle 0.2.4 (2011-06-06)
--------------------------
-
-The “I think I'm a panda” release. There's just a few bits and pieces of
-clean-up along with a couple of bug fixes in this release. Hopefully
-there will be more interesting stuff in the next release.
-
-While we're here, Bustle's git repository has moved to freedesktop.org,
-and it now has a bug tracker there too. Browse the source at
-<http://cgit.freedesktop.org/bustle/>; see open bugs at
-<http://wjt.me.uk/bustle/bugs>; file new ones at
-<http://wjt.me.uk/bustle/new-bug>. Astonishing!
-
-* The viewer is now much more tolerant of inconsistencies in log files.
-  (Thanks to Marco Barisione for the [bug report][fdo35297].)
-* The linking order for bustle-dbus-monitor is fixed. (Thanks to Sergei
-  Trofimovich.)
-* Miscellaneous clean-up.
-
-[fdo35297]: https://bugs.freedesktop.org/show_bug.cgi?id=35297
-
-
-Bustle 0.2.3 (2010-10-29)
--------------------------
-
-The “Will it be a scone? Or will it be a lecture in category theory?”
-release.
-
-<div>[[!img bustle-0.2.3.png size="200x143" alt="screenshot of side-by-side session and system bus logs" class="floated screenshot"]]</div>
-
-You can now show a session bus log and a system bus log side-by-side, with the
-same time scale and with events interleaved as they happened. This might come
-in useful for full-system profiling, or for frameworks where actions on one bus
-lead to reactions on another.
-
-Record the two logs as normal, by running something like:
-
-> <kbd>% bustle-dbus-monitor --session \> session.bustle &<br/>
-> % bustle-dbus-monitor --system \> system.bustle &</kbd>
-
-Then go do whatever you want to profile. When you're done, kill the two
-loggers. In Bustle, choose **File → Open a pair of logs…** to show them
-side-by-side. You can save the diagram to a PDF as normal.
-
-
-Bustle 0.2.2 (2010-06-29)
--------------------------
-
-The “Shepherded” release.
-
-Fixes:
-
-*  Suppress messages sent to the bus by bus name, rather than object
-   path. This prevents Bustle blowing up when (buggy) clients call
-   methods on / rather than on /org/freedesktop/DBus. (Thanks to
-   Guillaume Desmottes for reporting the issue.)
-
-*  Build against the re-namespaced Pango in Gtk2HS 0.11, and clean up a
-   tonne of warnings. I think I've kept backwards compatibility with old
-   enough Gtk2HSes and GHCs for this to work with the versions in Ubuntu
-   10.04 and other recent-but-not-futuristic distros, but haven't
-   actually tried it. Drop me a mail in the event of landing on water.
-   (Thanks to Chris Lamb for upstreaming this from Debian bug #587132.)
-
-
-Bustle 0.2.1 (2009-12-02)
--------------------------
-
-The “Going down where the Firefly goes” release.
-
-Enhancements:
-
-*  The handling of services with multiple well-known names has improved.
-   Whereas previously one name was (essentially) randomly-chosen, now
-   all names owned by a service are shown in the diagram.
-
-*  When a service falls off the bus, its column goes away to indicate
-   that.
-
-*  Strings are now ellipsized if necessary.
-
-*  Method returns now include the object path and method name so you
-   don't have to look it up yourself.
-
-*  The UI is less spartan: you can open files, and launch it without
-   passing at least one filename as a command-line argument.
-
-Fixes:
-
-*  The UI handles parse errors gracefully rather than, uhm, throwing an
-   exception and dying.
-
-*  bustle-dbus-monitor now has rudimentary cross-compilation support, by
-   respecting $CC and friends. (Marc Kleine-Budde)
-
-*  You can now kill the monitor immediately with ^C, rather than waiting
-   for another message to arrive. (Lennart Poettering, from a patch for
-   dbus-monitor)
-
-Notes:
-
-*  While your old logs should continue to work with the new viewer, the
-   reverse is not true: the changes to name handling required modifying
-   the log format.
-
-
-Bustle 0.2.0 (2009-04-03)
--------------------------
-
-The "new monkey makes me sad :-(" release.
-
-Enhancements:
-
-*  Add a menu item to save a PDF of the diagram.
-
-*  Show the elapsed time between a method call and its return.
-
-*  Add new tools to count method calls and signals, sum the total time
-   spent per method call, and generate .dot graphs (Dafydd Harries).
-
-Fixes:
-
-*  Don't crash on empty logs, or logs containing calls on interface
-   "<none>".
-
-*  Compile with new Gtk2HS and GHC 6.10 (Chris Lamb).
-
-
-Bustle 0.1 (2008-11-13)
------------------------
-
-Initial release.
-
-vim: tw=72
diff --git a/NEWS.md b/NEWS.md
new file mode 100644
--- /dev/null
+++ b/NEWS.md
@@ -0,0 +1,312 @@
+Bustle 0.4.8 (2015-03-22)
+-------------------------
+
+* Be compatible with recent versions of Gtk2HS which use Text rather
+  than Strings in many places. Should still build against older
+  releases. Let me know if not.
+* [#89712][]: Add symbolic icon. (Arnaud Bonatti)
+
+[#89712]: https://bugs.freedesktop.org/show_bug.cgi?id=89712
+
+
+Bustle 0.4.7 (2014-07-19)
+-------------------------
+
+* Ship the icons in the tarball! Thanks again, Sergei Trofimovich.
+
+
+Bustle 0.4.6 (2014-07-17)
+-------------------------
+
+* Icons! Thanks to Αποστολίδου Χρυσαφή for redrawing the icon as an SVG, and to
+  Philip Withnall for the build system goop.
+* More appdata! Thanks again, Philip.
+
+Bustle 0.4.5 (2014-02-26)
+-------------------------
+
+* Fix build failure with tests enabled due to translation files.
+* Distribute appdata and desktop files in source tarballs.
+
+Thanks to Sergei Trofimovich for catching and fixing these!
+
+
+Bustle 0.4.4 (2014-01-30)
+-------------------------
+
+Wow, I can't believe the first release was in 2008!
+
+* Bustle's now translatable. It only ships with an English translation,
+  but others are more than welcome! Thanks to Philip Withnall for
+  getting this started.
+* Add an AppData and .desktop file. (Philip Withnall)
+
+
+Bustle 0.4.3 (2013-12-05)
+-------------------------
+
+I think you mean ‘fewer crashy’.
+
+* Don't crash on i386 when opening the stats pane. Thanks to Sujith
+  Sudhi for reporting this issue.
+* [#54237][]: Don't crash if we can't connect to the bus.
+* Don't crash the second time you try to record a log. I swear this
+  didn't happen before.
+
+[#54237]: https://bugs.freedesktop.org/show_bug.cgi?id=54237
+
+Bustle 0.4.2 (2012-11-14)
+-------------------------
+
+This release is all about build fixes; nothing user-visible has changed.
+
+* The Makefile now respects the `DESTDIR` variable.
+* No more deprecation warnings about `g_thread_create()`!
+* We explicitly check for GLib ≥ 2.26.
+
+Also, there's now a `threaded` Cabal flag you can turn off if you're
+building for some platform where the threaded GHC runtime isn't
+available (such as S/390, MIPS or Sparc). This is the same approach used
+to make several other packages build for those architectures in Debian,
+as per [bug 541848][]. You can do something like this in your packaging:
+
+    DEB_SETUP_GHC_CONFIGURE_ARGS := $(shell test -e /usr/lib/ghc-$(GHC_VERSION)/libHSrts_thr.a || echo --flags=-threaded)
+
+Bustle doesn't directly use Haskell-land threads, but I don't trust it
+not to break in this configuration, so it's not the default.
+
+[bug 541848]: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=541848#33
+
+Bustle 0.4.1 (2012-08-29)
+-------------------------
+
+Some dependency changes:
+
+* Gtk2HS ≥ 0.12 is now required.
+* Bustle now uses the [dbus][] Haskell library (≥ 0.10), which
+  supersedes the [dbus-core][] package.
+* `binary` is no longer required.
+
+Some user-visible changes:
+
+* The front page now has two big buttons rather than some [lame
+  instructions][fdo44889].
+* Memory usage should be a bit better, particularly for wide logs
+  showing lots of applications.
+
+Some plumbing changes:
+
+* You can now make a symlink to the launcher script and have it work
+  properly.
+* Bustle [builds with GHC 7.4.1][fdo47013] (courtesy of Sergei
+  Trofimovich).
+* `make clean` [works][fdo47908] in source tarballs.
+* `bustle-pcap` now has a man page (courtesy of Alex Merry).
+
+[dbus]: http://hackage.haskell.org/package/dbus-0.10
+[fdo44889]: https://bugs.freedesktop.org/show_bug.cgi?id=44889
+[fdo47013]: https://bugs.freedesktop.org/show_bug.cgi?id=47013
+[fdo47908]: https://bugs.freedesktop.org/show_bug.cgi?id=47908
+
+
+Bustle 0.4.0 (2012-01-18)
+-------------------------
+
+The “let's hope my attention span lasts long enough” release.
+
+You can now record D-Bus logs from within Bustle itself. No more faffing
+around with command-line tools: just click **File → New**, and watch
+the diagram being drawn as the messages trickle (or fly) in.
+
+(If you want to capture logs from your embedded platform *du
+jour*, don't fear: `bustle-pcap` is still provided as a standalone
+program for your enjoyment.)
+
+Bustle no longer [crashes when it encounters messages containing file
+handles][crash-on-h]. (Those messages are now dropped; which is not
+perfect, but is at least an improvement.)
+
+Directed signals—signals with a specified destination, which are unusual
+but do appear—are now shown differently to normal, undirected signals,
+with an arrow pointing to the signal's recipient. Relatedly, the
+monitors now [explicitly eavesdrop on messages][eavesdrop] when using
+D-Bus 1.5.x, courtesy of Cosimo Alfarano.
+
+[crash-on-h]: https://bugs.freedesktop.org/show_bug.cgi?id=44714
+[eavesdrop]: https://bugs.freedesktop.org/show_bug.cgi?id=39140
+
+
+Bustle 0.3.1 (2012-01-09)
+-------------------------
+
+The “How do I dress up as shared global mutable state?” release.
+
+This release finally allows you to record complete D-Bus sessions,
+including message bodies, and browse them in the user interface!
+
+As a result, there is a new logger, `bustle-pcap`, which logs D-Bus
+traffic to Pcap files; and Bustle itself now depends on the [pcap][] and
+[dbus-core][] packages. Your old logs should still be loaded just fine,
+but since they don't contain message body data, you won't be able to see
+it in the UI.
+
+Also, as of this release binary tarballs will be provided for those not
+interested in compiling Bustle themselves.
+
+[pcap]: http://hackage.haskell.org/package/pcap
+[dbus-core]: http://hackage.haskell.org/package/dbus-core
+
+
+Bustle 0.3.0
+------------
+
+You can't prove anything.
+
+
+Bustle 0.2.5 (2011-06-25)
+-------------------------
+
+The “Why go all the way to Glastonbury to not watch U2 when you can just
+not turn on the BBC at any point this weekend to not watch them?”
+release.
+
+This adds a sidebar with statistics about the log: namely, method call
+and signal emission frequency, and total/mean times spent in method
+calls. This code has mostly been sitting around unreleased since
+November. Sorry, dear users!
+
+
+Bustle 0.2.4 (2011-06-06)
+-------------------------
+
+The “I think I'm a panda” release. There's just a few bits and pieces of
+clean-up along with a couple of bug fixes in this release. Hopefully
+there will be more interesting stuff in the next release.
+
+While we're here, Bustle's git repository has moved to freedesktop.org,
+and it now has a bug tracker there too. Browse the source at
+<http://cgit.freedesktop.org/bustle/>; see open bugs at
+<http://wjt.me.uk/bustle/bugs>; file new ones at
+<http://wjt.me.uk/bustle/new-bug>. Astonishing!
+
+* The viewer is now much more tolerant of inconsistencies in log files.
+  (Thanks to Marco Barisione for the [bug report][fdo35297].)
+* The linking order for bustle-dbus-monitor is fixed. (Thanks to Sergei
+  Trofimovich.)
+* Miscellaneous clean-up.
+
+[fdo35297]: https://bugs.freedesktop.org/show_bug.cgi?id=35297
+
+
+Bustle 0.2.3 (2010-10-29)
+-------------------------
+
+The “Will it be a scone? Or will it be a lecture in category theory?”
+release.
+
+<div>[[!img bustle-0.2.3.png size="200x143" alt="screenshot of side-by-side session and system bus logs" class="floated screenshot"]]</div>
+
+You can now show a session bus log and a system bus log side-by-side, with the
+same time scale and with events interleaved as they happened. This might come
+in useful for full-system profiling, or for frameworks where actions on one bus
+lead to reactions on another.
+
+Record the two logs as normal, by running something like:
+
+> <kbd>% bustle-dbus-monitor --session \> session.bustle &<br/>
+> % bustle-dbus-monitor --system \> system.bustle &</kbd>
+
+Then go do whatever you want to profile. When you're done, kill the two
+loggers. In Bustle, choose **File → Open a pair of logs…** to show them
+side-by-side. You can save the diagram to a PDF as normal.
+
+
+Bustle 0.2.2 (2010-06-29)
+-------------------------
+
+The “Shepherded” release.
+
+Fixes:
+
+*  Suppress messages sent to the bus by bus name, rather than object
+   path. This prevents Bustle blowing up when (buggy) clients call
+   methods on / rather than on /org/freedesktop/DBus. (Thanks to
+   Guillaume Desmottes for reporting the issue.)
+
+*  Build against the re-namespaced Pango in Gtk2HS 0.11, and clean up a
+   tonne of warnings. I think I've kept backwards compatibility with old
+   enough Gtk2HSes and GHCs for this to work with the versions in Ubuntu
+   10.04 and other recent-but-not-futuristic distros, but haven't
+   actually tried it. Drop me a mail in the event of landing on water.
+   (Thanks to Chris Lamb for upstreaming this from Debian bug #587132.)
+
+
+Bustle 0.2.1 (2009-12-02)
+-------------------------
+
+The “Going down where the Firefly goes” release.
+
+Enhancements:
+
+*  The handling of services with multiple well-known names has improved.
+   Whereas previously one name was (essentially) randomly-chosen, now
+   all names owned by a service are shown in the diagram.
+
+*  When a service falls off the bus, its column goes away to indicate
+   that.
+
+*  Strings are now ellipsized if necessary.
+
+*  Method returns now include the object path and method name so you
+   don't have to look it up yourself.
+
+*  The UI is less spartan: you can open files, and launch it without
+   passing at least one filename as a command-line argument.
+
+Fixes:
+
+*  The UI handles parse errors gracefully rather than, uhm, throwing an
+   exception and dying.
+
+*  bustle-dbus-monitor now has rudimentary cross-compilation support, by
+   respecting $CC and friends. (Marc Kleine-Budde)
+
+*  You can now kill the monitor immediately with ^C, rather than waiting
+   for another message to arrive. (Lennart Poettering, from a patch for
+   dbus-monitor)
+
+Notes:
+
+*  While your old logs should continue to work with the new viewer, the
+   reverse is not true: the changes to name handling required modifying
+   the log format.
+
+
+Bustle 0.2.0 (2009-04-03)
+-------------------------
+
+The "new monkey makes me sad :-(" release.
+
+Enhancements:
+
+*  Add a menu item to save a PDF of the diagram.
+
+*  Show the elapsed time between a method call and its return.
+
+*  Add new tools to count method calls and signals, sum the total time
+   spent per method call, and generate .dot graphs (Dafydd Harries).
+
+Fixes:
+
+*  Don't crash on empty logs, or logs containing calls on interface
+   "<none>".
+
+*  Compile with new Gtk2HS and GHC 6.10 (Chris Lamb).
+
+
+Bustle 0.1 (2008-11-13)
+-----------------------
+
+Initial release.
+
+vim: tw=72
diff --git a/README b/README
deleted file mode 100644
--- a/README
+++ /dev/null
@@ -1,47 +0,0 @@
-Bustle draws sequence diagrams of D-Bus activity, showing signal
-emissions, method calls and their corresponding returns, with timestamps
-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.
-
-
-Using Bustle
-============
-
-Run it:
-
-    bustle
-
-Now click **File → New…** to start recording session bus traffic. When you're
-done, click **Stop**, and explore the log.
-
-If you want to record traffic without running the UI (maybe on an embedded
-platform which doesn't have Gtk+ and/or a Haskell compiler), you can use the
-stand-alone logger:
-
-    bustle-pcap logfile.bustle
-
-You can then open `logfile.bustle` in Bustle.
-
-You can also get some ASCII-art
-version of the statistics shown in the UI:
-
-    bustle --count logfile.bustle
-    bustle --time logfile.bustle
-
-If you want to log all system bus traffic, you need to edit
-`/etc/dbus/system.conf` to enable eavesdropping, and then remove the include of
-`/etc/dbus-1/system.conf.d` which seems to re-enable strictness. Then you can run
-the stand-alone logger against the system bus:
-
-    bustle-pcap --system system-log.bustle
-
-Please remember to **undo these changes** when you're done.
-
-
-More information
-================
-
-See <http://wjt.me.uk/bustle/>.
diff --git a/README.md b/README.md
new file mode 100644
--- /dev/null
+++ b/README.md
@@ -0,0 +1,47 @@
+Bustle draws sequence diagrams of D-Bus activity, showing signal
+emissions, method calls and their corresponding returns, with timestamps
+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.
+
+
+Using Bustle
+============
+
+Run it:
+
+    bustle
+
+Now click **File → New…** to start recording session bus traffic. When you're
+done, click **Stop**, and explore the log.
+
+If you want to record traffic without running the UI (maybe on an embedded
+platform which doesn't have Gtk+ and/or a Haskell compiler), you can use the
+stand-alone logger:
+
+    bustle-pcap logfile.bustle
+
+You can then open `logfile.bustle` in Bustle.
+
+You can also get some ASCII-art
+version of the statistics shown in the UI:
+
+    bustle --count logfile.bustle
+    bustle --time logfile.bustle
+
+If you want to log all system bus traffic, you need to edit
+`/etc/dbus/system.conf` to enable eavesdropping, and then remove the include of
+`/etc/dbus-1/system.conf.d` which seems to re-enable strictness. Then you can run
+the stand-alone logger against the system bus:
+
+    bustle-pcap --system system-log.bustle
+
+Please remember to **undo these changes** when you're done.
+
+
+More information
+================
+
+See <http://wjt.me.uk/bustle/>.
diff --git a/Test/Regions.hs b/Test/Regions.hs
--- a/Test/Regions.hs
+++ b/Test/Regions.hs
@@ -4,23 +4,27 @@
 
 import Data.List (sort, group)
 import Data.Maybe (isNothing, isJust)
+import Control.Applicative ((<$>), (<*>))
 
 import Bustle.Regions
 
-instance Arbitrary Stripe where
-    arbitrary = do
-        top <- fmap abs arbitrary
-        bottom <- arbitrary `suchThat` (>= top)
-        return $ Stripe top bottom
-
 newtype NonOverlappingStripes = NonOverlappingStripes [Stripe]
   deriving
     (Show, Eq, Ord)
 
 instance Arbitrary NonOverlappingStripes where
     arbitrary = do
-        -- there is no orderedList1 sadly
-        stripes <- fmap sort (listOf1 arbitrary) `suchThat` nonOverlapping
+        -- listOf2
+        tops <- sort <$> ((:) <$> arbitrary <*> (listOf1 arbitrary))
+
+        -- Generate dense stripes sometimes
+        let g :: Gen Double
+            g = frequency [(1, return 1.0), (7, choose (0.0, 1.0))]
+
+        rs <- vectorOf (length tops) (choose (0.0, 1.0))
+
+        let stripes = zipWith3 (\t1 t2 r -> Stripe t1 (t1 + ((t2 - t1) * r)))
+                               tops (tail tops) rs
         return $ NonOverlappingStripes stripes
 
 newtype ValidRegions a = ValidRegions (Regions a)
@@ -39,6 +43,8 @@
     arbitrary = do
         ValidRegions rs <- arbitrary
         return $ regionSelectionNew rs
+
+prop_NonOverlapping_generator_works (NonOverlappingStripes ss) = nonOverlapping ss
 
 prop_InitiallyUnselected = \rs -> isNothing $ rsCurrent rs
 prop_UpDoesNothing = \rs -> isNothing $ rsCurrent $ regionSelectionUp rs
diff --git a/bustle.cabal b/bustle.cabal
--- a/bustle.cabal
+++ b/bustle.cabal
@@ -1,9 +1,9 @@
 Name:           bustle
 Category:       Network, Desktop
-Version:        0.4.7
+Version:        0.4.8
 Cabal-Version:  >= 1.8
-Synopsis:       Draw pretty sequence diagrams of D-Bus traffic
-Description:    Draw pretty sequence diagrams of D-Bus traffic
+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>
@@ -21,10 +21,10 @@
                     Makefile,
 
                   -- Stuff for nerds
-                    README,
-                    NEWS,
-                    HACKING,
-                    INSTALL,
+                    README.md,
+                    NEWS.md,
+                    HACKING.md,
+                    INSTALL.md,
                     run-uninstalled.sh
                   , Test/data/log-with-h.bustle
 
@@ -48,6 +48,7 @@
                   , data/icons/48x48/bustle.png
                   , data/icons/256x256/bustle.png
                   , data/icons/scalable/bustle.svg
+                  , data/icons/scalable/bustle-symbolic.svg
 
 x-gettext-po-files:     po/*.po
 x-gettext-domain-name:  bustle
@@ -71,7 +72,7 @@
                , Bustle.Loader
                , Bustle.Loader.OldSkool
                , Bustle.Loader.Pcap
-               , Bustle.Markup
+               , Bustle.Marquee
                , Bustle.Monitor
                , Bustle.Noninteractive
                , Bustle.Regions
diff --git a/data/icons/scalable/bustle-symbolic.svg b/data/icons/scalable/bustle-symbolic.svg
new file mode 100644
--- /dev/null
+++ b/data/icons/scalable/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/bustle.svg b/data/icons/scalable/bustle.svg
--- a/data/icons/scalable/bustle.svg
+++ b/data/icons/scalable/bustle.svg
@@ -203,10 +203,7 @@
        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"
-       inkscape:export-filename="/home/ziz-2/Desktop/kkkkkkkk.png"
-       inkscape:export-xdpi="8.2586517"
-       inkscape:export-ydpi="8.2586517" />
+       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"
@@ -217,9 +214,7 @@
        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)"
-       inkscape:export-filename="/home/ziz-2/Desktop/kkkkkkkk.png"
-       inkscape:export-xdpi="8.2586517"
-       inkscape:export-ydpi="8.2586517" />
+       />
     <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"
@@ -227,9 +222,7 @@
        inkscape:path-effect="#path-effect3759-7"
        inkscape:original-d="m 417.41556,287.80173 211.44171,0"
        inkscape:connector-curvature="0"
-       inkscape:export-filename="/home/ziz-2/Desktop/kkkkkkkk.png"
-       inkscape:export-xdpi="8.2586517"
-       inkscape:export-ydpi="8.2586517" />
+       />
     <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"
@@ -237,9 +230,7 @@
        inkscape:path-effect="#path-effect3763-2"
        inkscape:original-d="m 294.08479,287.66116 -211.718251,0.2812"
        inkscape:connector-curvature="0"
-       inkscape:export-filename="/home/ziz-2/Desktop/kkkkkkkk.png"
-       inkscape:export-xdpi="8.2586517"
-       inkscape:export-ydpi="8.2586517" />
+       />
     <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"
@@ -248,9 +239,7 @@
        inkscape:original-d="M 200.97285,226.67532 77.897224,289.6408 200.97285,348.92819"
        inkscape:connector-curvature="0"
        sodipodi:nodetypes="ccc"
-       inkscape:export-filename="/home/ziz-2/Desktop/kkkkkkkk.png"
-       inkscape:export-xdpi="8.2586517"
-       inkscape:export-ydpi="8.2586517" />
+       />
     <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"
@@ -259,8 +248,6 @@
        inkscape:original-d="M 520.66838,225.39683 643.74401,288.36232 520.66838,347.6497"
        inkscape:connector-curvature="0"
        sodipodi:nodetypes="ccc"
-       inkscape:export-filename="/home/ziz-2/Desktop/kkkkkkkk.png"
-       inkscape:export-xdpi="8.2586517"
-       inkscape:export-ydpi="8.2586517" />
+       />
   </g>
 </svg>
