diff --git a/Bustle/UI.hs b/Bustle/UI.hs
--- a/Bustle/UI.hs
+++ b/Bustle/UI.hs
@@ -343,7 +343,7 @@
     let yyyy_mm_dd_hh_mm_ss = takeWhile (/= '.') (show zt)
 
     cacheDir <- io getCacheDir
-    let filename = cacheDir </> yyyy_mm_dd_hh_mm_ss <.> "bustle"
+    let filename = cacheDir </> yyyy_mm_dd_hh_mm_ss <.> "pcap"
 
     let title = printf (__ "Recording %s&#8230;") $ case target of
             Left BusTypeNone    -> error "whoops, this value shouldn't exist"
diff --git a/Bustle/UI/AboutDialog.hs b/Bustle/UI/AboutDialog.hs
--- a/Bustle/UI/AboutDialog.hs
+++ b/Bustle/UI/AboutDialog.hs
@@ -46,7 +46,7 @@
     dialog `set` [ aboutDialogName := __ "Bustle"
                  , aboutDialogVersion := showVersion version
                  , aboutDialogComments := __ "Someone's favourite D-Bus profiler"
-                 , aboutDialogWebsite := "https://www.freedesktop.org/wiki/Software/Bustle/"
+                 , aboutDialogWebsite := "https://gitlab.freedesktop.org/bustle/bustle#readme"
                  , aboutDialogAuthors := authors
                  , aboutDialogCopyright := "© 2008–2017 Will Thompson, Collabora Ltd. and contributors"
                  , aboutDialogLicense := license
diff --git a/Bustle/UI/DetailsView.hs b/Bustle/UI/DetailsView.hs
--- a/Bustle/UI/DetailsView.hs
+++ b/Bustle/UI/DetailsView.hs
@@ -28,19 +28,23 @@
 import Graphics.UI.Gtk hiding (Signal)
 
 import qualified DBus as D
+import DBus.Internal.Message (MethodError(..))
+import DBus.Internal.Types (ErrorName(..))
 
 import Bustle.Types
 import Bustle.Marquee
 import Bustle.VariantFormatter
 
+type OptionalRow = (Label, Label)
+
 data DetailsView =
     DetailsView { detailsGrid :: Grid
                 , detailsType :: Stack
                 , detailsSender :: Label
-                , detailsDestinationCaption :: Label
-                , detailsDestination :: Label
+                , detailsDestination :: OptionalRow
                 , detailsPath :: Label
                 , detailsMember :: Label
+                , detailsErrorName :: OptionalRow
                 , detailsBodyView :: TextView
                 }
 
@@ -50,12 +54,17 @@
     <$> builderGetObject builder castToGrid "detailsGrid"
     <*> builderGetObject builder castToStack "detailsType"
     <*> builderGetObject builder castToLabel "detailsSender"
-    <*> builderGetObject builder castToLabel "detailsDestinationCaption"
-    <*> builderGetObject builder castToLabel "detailsDestination"
+    <*> optionalRow "detailsDestination"
     <*> builderGetObject builder castToLabel "detailsPath"
     <*> builderGetObject builder castToLabel "detailsMember"
+    <*> optionalRow "detailsErrorName"
     <*> builderGetObject builder castToTextView "detailsArguments"
+  where
+    optionalRow labelId = (,)
+        <$> builderGetObject builder castToLabel (labelId ++ "Caption")
+        <*> builderGetObject builder castToLabel labelId
 
+
 pickType :: Detailed Message -> String
 pickType (Detailed _ m _ _) = case m of
     MethodCall {} -> "methodCall"
@@ -82,15 +91,42 @@
     Signal { signalDestination = d } -> d
     _                                -> Just (destination m)
 
+getErrorName :: Detailed a -> Maybe String
+getErrorName (Detailed _ _ _ rm) = case rm of
+    (D.ReceivedMethodError _ (MethodError { methodErrorName = ErrorName en})) -> Just en
+    _                                                                         -> Nothing
+
+getErrorMessage :: Detailed a
+                -> Maybe String
+getErrorMessage (Detailed _ _ _ (D.ReceivedMethodError _ (MethodError _ _ _ _ body))) =
+    case D.fromVariant <$> body of
+        [message] -> message
+        _         -> Nothing
+getErrorMessage _ = Nothing
+
 formatMessage :: Detailed Message -> String
 formatMessage (Detailed _ _ _ rm) =
     formatArgs $ D.receivedMessageBody rm
   where
     formatArgs = intercalate "\n" . map (format_Variant VariantStyleSignature)
+-- TODO: suppress escaping and type sig for errors, which are always (s)
 
 detailsViewGetTop :: DetailsView -> Widget
 detailsViewGetTop = toWidget . detailsGrid
 
+setOptionalRow :: OptionalRow
+               -> Maybe String
+               -> IO ()
+setOptionalRow (caption, label) s_ = do
+    case s_ of
+        Just s -> do
+            labelSetText label s
+            widgetShow label
+            widgetShow caption
+        Nothing -> do
+            widgetHide label
+            widgetHide caption
+
 detailsViewUpdate :: DetailsView
                   -> Detailed Message
                   -> IO ()
@@ -102,17 +138,13 @@
     -- TODO: these would be a lot more useful if we could resolve unique names
     -- to/from well-known names and show both
     labelSetText (detailsSender d) (unBusName . sender . deEvent $ m)
-    case getDestination m of
-        Just n -> do
-            labelSetText (detailsDestination d) (unBusName n)
-            widgetShow (detailsDestination d)
-            widgetShow (detailsDestinationCaption d)
-        Nothing -> do
-            widgetHide (detailsDestination d)
-            widgetHide (detailsDestinationCaption d)
+    setOptionalRow (detailsDestination d) (unBusName <$> getDestination m)
+    setOptionalRow (detailsErrorName d) (getErrorName m)
 
     labelSetText (detailsPath d) (maybe unknown (D.formatObjectPath . path) member_)
     labelSetMarkup (detailsMember d) (maybe unknown getMemberMarkup member_)
-    textBufferSetText buf $ formatMessage m
+    textBufferSetText buf $ case getErrorMessage m of
+        Just message -> message
+        Nothing      -> formatMessage m
   where
     unknown = ""
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -48,7 +48,10 @@
 scp -r x.y.z annarchy.freedesktop.org:/srv/www.freedesktop.org/www/software/bustle/
 
 # Upload source to Hackage
-stack upload
+stack upload .
 
 git push origin --tags master
 ```
+
+* Add `.1` to version number in `bustle.cabal`
+* Update <https://github.com/flathub/org.freedesktop.Bustle>
diff --git a/NEWS.md b/NEWS.md
--- a/NEWS.md
+++ b/NEWS.md
@@ -1,3 +1,22 @@
+Bustle 0.7.4 (2018-12-07)
+-------------------------
+
+User-facing changes:
+
+* In the details for an error reply, the error name is now shown, and
+  the error message is formatted more legibly.
+* The default file extension for log files is now `.pcap`, reflecting
+  what they actually are.
+
+Internal changes:
+
+* When you stop monitoring the system bus, the privileged dbus-monitor
+  process is now terminated promptly, rather than dying with “Broken
+  pipe” the next time a message is sent on the bus.
+* Update all links to <https://gitlab.freedesktop.org/bustle/bustle> or
+  <https://gitlab.freedesktop.org/bustle/bustle#readme> depending on
+  context.
+
 Bustle 0.7.3 (2018-11-15)
 -------------------------
 
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -34,9 +34,3 @@
 
     bustle --count logfile.bustle
     bustle --time logfile.bustle
-
-
-More information
-================
-
-See <https://www.freedesktop.org/wiki/Software/Bustle/>.
diff --git a/bustle.cabal b/bustle.cabal
--- a/bustle.cabal
+++ b/bustle.cabal
@@ -1,6 +1,6 @@
 Name:           bustle
 Category:       Network, Desktop
-Version:        0.7.3
+Version:        0.7.4
 Cabal-Version:  2.0
 Tested-With:    GHC == 8.4.3
 Synopsis:       Draw sequence diagrams of D-Bus traffic
@@ -9,7 +9,7 @@
 License-file:   LICENSE
 Author:         Will Thompson <will@willthompson.co.uk>
 Maintainer:     Will Thompson <will@willthompson.co.uk>
-Homepage:       https://www.freedesktop.org/wiki/Software/Bustle/
+Homepage:       https://gitlab.freedesktop.org/bustle/bustle#readme
 Data-files:     data/bustle.ui,
                 data/OpenTwoDialog.ui,
                 data/RecordAddressDialog.ui,
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
@@ -208,7 +208,7 @@
   GMainLoop *loop = user_data;
 
   if (!(domain == G_IO_ERROR && code == G_IO_ERROR_CANCELLED))
-    fprintf (stderr, "Error: %s %d %s", g_quark_to_string (domain), code, message);
+    g_printerr ("Error while monitoring: %s\n", message);
 
   g_main_loop_quit (loop);
 }
@@ -230,7 +230,7 @@
 {
   GMainLoop *loop;
   gchar *filename;
-  GError *error = NULL;
+  g_autoptr(GError) error = NULL;
   BustlePcapMonitor *pcap;
 
   parse_arguments (&argc, &argv, &filename);
@@ -238,9 +238,8 @@
   pcap = bustle_pcap_monitor_new (bus_type, address, filename, &error);
   if (pcap == NULL)
     {
-      fprintf (stderr, "%s %d %s",
-          g_quark_to_string (error->domain), error->code, error->message);
-      g_clear_error (&error);
+      g_printerr ("Failed to start monitor: %s\n",
+                  error->message);
       exit (1);
     }
 
diff --git a/c-sources/pcap-monitor.c b/c-sources/pcap-monitor.c
--- a/c-sources/pcap-monitor.c
+++ b/c-sources/pcap-monitor.c
@@ -18,17 +18,29 @@
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
+#define _GNU_SOURCE
+
 #include "config.h"
 #include "pcap-monitor.h"
 
 #include <errno.h>
+#include <fcntl.h>
 #include <signal.h>
 #include <string.h>
+#include <sys/ioctl.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+
 #include <pcap/pcap.h>
+
+#include <glib.h>
+#include <glib/gstdio.h>
 #include <gio/gunixinputstream.h>
 
+
 /* Prefix of name claimed by the connection that collects name owners. */
 const char *BUSTLE_MONITOR_NAME_PREFIX = "org.freedesktop.Bustle.Monitor.";
+static gboolean RUNNING_IN_FLATPAK = FALSE;
 
 /*
  * Transitions:
@@ -85,6 +97,8 @@
 
     /* input */
     GSubprocess *dbus_monitor;
+    /* If >= 0, master side of controlling terminal for dbus_monitor */
+    int pt_master;
     GSource *dbus_monitor_source;
     pcap_t *pcap_in;
 
@@ -121,12 +135,24 @@
     G_IMPLEMENT_INTERFACE (G_TYPE_INITABLE, initable_iface_init);
     )
 
+/* A sad echo of the functions in libglnx. */
+static inline void *
+throw_errno (GError **error,
+             const gchar *prefix)
+{
+  int errsv = errno;
+  g_set_error (error, G_IO_ERROR, g_io_error_from_errno (errsv),
+               "%s: %s", prefix, g_strerror (errsv));
+  return NULL;
+}
+
 static void
 bustle_pcap_monitor_init (BustlePcapMonitor *self)
 {
   self->bus_type = G_BUS_TYPE_SESSION;
   self->state = STATE_NEW;
   self->cancellable = g_cancellable_new ();
+  self->pt_master = -1;
 }
 
 static void
@@ -224,6 +250,12 @@
   g_clear_error (&self->pcap_error);
   g_clear_error (&self->subprocess_error);
 
+  if (self->pt_master >= 0)
+    {
+      g_close (self->pt_master, NULL);
+      self->pt_master = -1;
+    }
+
   if (parent_class->finalize != NULL)
     parent_class->finalize (object);
 }
@@ -298,6 +330,8 @@
       G_TYPE_UINT,
       G_TYPE_INT,
       G_TYPE_STRING);
+
+  RUNNING_IN_FLATPAK = g_file_test ("/.flatpak-info", G_FILE_TEST_EXISTS);
 }
 
 static void
@@ -580,6 +614,36 @@
   g_task_run_in_thread (task, dump_names_thread_func);
 }
 
+/**
+ * send_sigint:
+ *
+ * Send SIGINT to the dbus-monitor subprocess, in as many ways as possible.
+ */
+static void
+send_sigint (BustlePcapMonitor *self)
+{
+  /* Send the signal directly; this has no effect on the privileged subprocess
+   * used on the system bus.
+   */
+  if (self->dbus_monitor != NULL)
+    g_subprocess_send_signal (self->dbus_monitor, SIGINT);
+
+  /* Send it via the PTY that we set as the subprocess's controlling terminal;
+   * this works even for a privileged child.
+   */
+  if (self->pt_master >= 0)
+    {
+      char ctrl_c = '\x03';
+
+      if (write (self->pt_master, &ctrl_c, 1) != 1)
+        {
+          g_autoptr(GError) local_error = NULL;
+          throw_errno (&local_error, "write to pt_master failed");
+          g_warning ("%s: %s", G_STRFUNC, local_error->message);
+        }
+    }
+}
+
 static gboolean
 start_pcap (
     BustlePcapMonitor *self,
@@ -599,9 +663,10 @@
   dbus_monitor_filep = fdopen (stdout_fd, "r");
   if (dbus_monitor_filep == NULL)
     {
-      g_set_error (error, G_IO_ERROR, g_io_error_from_errno (errno), "fdopen");
+      throw_errno (error, "fdopen failed");
       return FALSE;
     }
+
   /* fd is owned by the FILE * now */
   g_unix_input_stream_set_close_fd (G_UNIX_INPUT_STREAM (stdout_pipe), FALSE);
 
@@ -619,10 +684,8 @@
       /* Cause dbus-monitor to exit next time it tries to write a message */
       g_clear_pointer (&dbus_monitor_filep, fclose);
 
-      /* And try to terminate it immediately. When spawning via pkexec we may
-       * not be able to kill it.
-       */
-      g_subprocess_force_exit (self->dbus_monitor);
+      /* And try to terminate it immediately. */
+      send_sigint (self);
 
       return FALSE;
     }
@@ -737,9 +800,7 @@
 
   /* cases:
    * - G_SPAWN_ERROR / G_SPAWN_ERROR_FAILED / "Child process killed by signal N":
-   *   dbus-monitor was killed, possibly by us calling
-   *   g_subprocess_force_exit(), though this doesn't work for pkexec'd
-   *   dbus-monitor
+   *   dbus-monitor was killed, presumably by send_sigint()
    * - G_SPAWN_EXIT_ERROR:
    *   - 0: bus itself went away (assuming pkexec/flatpak-spawn propagate
    *        errors correctly)
@@ -765,27 +826,17 @@
    */
   g_clear_pointer (&self->pcap_in, pcap_close);
 
-  if (self->dbus_monitor != NULL)
-    {
-      /* Try to make it stop sooner; this has no effect on a privileged
-       * dbus-monitor.
-       */
-      g_subprocess_force_exit (self->dbus_monitor);
-    }
+  /* And try to terminate it immediately. */
+  send_sigint (self);
 }
 
-static gboolean
-initable_init (
-    GInitable *initable,
-    GCancellable *cancellable,
-    GError **error)
+static const char **
+build_argv (BustlePcapMonitor *self,
+            GError **error)
 {
-  BustlePcapMonitor *self = BUSTLE_PCAP_MONITOR (initable);
-  gboolean in_flatpak = g_file_test ("/.flatpak-info", G_FILE_TEST_EXISTS);
   g_autoptr(GPtrArray) dbus_monitor_argv = g_ptr_array_sized_new (8);
-  GInputStream *stdout_pipe = NULL;
 
-  if (in_flatpak)
+  if (RUNNING_IN_FLATPAK)
     {
       g_ptr_array_add (dbus_monitor_argv, "flatpak-spawn");
       g_ptr_array_add (dbus_monitor_argv, "--host");
@@ -818,11 +869,82 @@
       default:
         g_set_error (error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED,
             "Can only log the session bus, system bus, or a given address");
-        return FALSE;
+        return NULL;
     }
 
   g_ptr_array_add (dbus_monitor_argv, NULL);
+  return (const char **) g_ptr_array_free (g_steal_pointer (&dbus_monitor_argv), FALSE);
+}
 
+/**
+ * set_controlling_tty_to_stdin:
+ *
+ * child_setup function for the dbus-monitor subprocess which arranges for its
+ * controlling TTY to be a PTY, so we can send SIGINT to it even if it's
+ * privileged.
+ */
+static void
+set_controlling_tty_to_stdin (void *user_data G_GNUC_UNUSED)
+{
+  /* Move this child process to a new session, unsetting any existing
+   * controlling terminal.
+   */
+  setsid ();
+
+  /* Make stdin (the worker end of a PTY pair) the controlling terminal for
+   * this child process.
+   */
+  ioctl (STDIN_FILENO, TIOCSCTTY, 0);
+}
+
+static GSubprocess *
+spawn_monitor (BustlePcapMonitor *self,
+               const char *const *argv,
+               GError **error)
+{
+  g_autoptr(GSubprocessLauncher) launcher =
+    g_subprocess_launcher_new (G_SUBPROCESS_FLAGS_STDOUT_PIPE);
+
+  self->pt_master = posix_openpt (O_RDWR | O_NOCTTY | O_CLOEXEC);
+  if (self->pt_master < 0)
+    return throw_errno (error, "posix_openpt failed");
+
+  if (unlockpt (self->pt_master) < 0)
+    return throw_errno (error, "unlockpt failed");
+
+  char sname[PATH_MAX] = { 0 };
+  if (ptsname_r (self->pt_master, sname, G_N_ELEMENTS (sname)) != 0)
+    return throw_errno (error, "ptsname_r failed");
+
+  int pt_slave = open (sname, O_RDWR);
+  if (pt_slave < 0)
+    return throw_errno (error, "open(sname) failed");
+
+  g_subprocess_launcher_take_stdin_fd (launcher, pt_slave);
+  if (!RUNNING_IN_FLATPAK)
+    g_subprocess_launcher_set_child_setup (launcher, set_controlling_tty_to_stdin, NULL, NULL);
+  /* otherwise, the session-helper process already does this for us */
+
+  GSubprocess *child = g_subprocess_launcher_spawnv (launcher, argv, error);
+
+  g_close (pt_slave, NULL);
+  return child;
+}
+
+static gboolean
+initable_init (
+    GInitable *initable,
+    GCancellable *cancellable,
+    GError **error)
+{
+  BustlePcapMonitor *self = BUSTLE_PCAP_MONITOR (initable);
+  g_autofree const char **argv = NULL;
+  GInputStream *stdout_pipe = NULL;
+
+  argv = build_argv (self, error);
+  if (NULL == argv)
+    return FALSE;
+
   if (self->filename == NULL)
     {
       g_set_error (error, G_IO_ERROR, G_IO_ERROR_INVALID_ARGUMENT,
@@ -851,13 +973,9 @@
       return FALSE;
     }
 
-  self->dbus_monitor = g_subprocess_newv (
-      (const gchar * const *) dbus_monitor_argv->pdata,
-      G_SUBPROCESS_FLAGS_STDOUT_PIPE, error);
+  self->dbus_monitor = spawn_monitor (self, (const char * const *) argv, error);
   if (self->dbus_monitor == NULL)
-    {
-      return FALSE;
-    }
+    return FALSE;
 
   stdout_pipe = g_subprocess_get_stdout_pipe (self->dbus_monitor);
   g_return_val_if_fail (stdout_pipe != NULL, FALSE);
diff --git a/data/bustle.ui b/data/bustle.ui
--- a/data/bustle.ui
+++ b/data/bustle.ui
@@ -726,7 +726,7 @@
                           </object>
                           <packing>
                             <property name="left_attach">0</property>
-                            <property name="top_attach">5</property>
+                            <property name="top_attach">6</property>
                           </packing>
                         </child>
                         <child>
@@ -747,7 +747,7 @@
                           </object>
                           <packing>
                             <property name="left_attach">1</property>
-                            <property name="top_attach">5</property>
+                            <property name="top_attach">6</property>
                           </packing>
                         </child>
                         <child>
@@ -886,6 +886,38 @@
                           <packing>
                             <property name="left_attach">1</property>
                             <property name="top_attach">2</property>
+                          </packing>
+                        </child>
+                        <child>
+                          <object class="GtkLabel" id="detailsErrorNameCaption">
+                            <property name="visible">True</property>
+                            <property name="can_focus">False</property>
+                            <property name="hexpand">False</property>
+                            <property name="label" translatable="yes">Error</property>
+                            <property name="xalign">1</property>
+                            <style>
+                              <class name="dim-label"/>
+                            </style>
+                          </object>
+                          <packing>
+                            <property name="left_attach">0</property>
+                            <property name="top_attach">5</property>
+                          </packing>
+                        </child>
+                        <child>
+                          <object class="GtkLabel" id="detailsErrorName">
+                            <property name="name">detailsMember</property>
+                            <property name="visible">True</property>
+                            <property name="can_focus">False</property>
+                            <property name="hexpand">True</property>
+                            <property name="label">com.example.Placeholder.Error.OhNo</property>
+                            <property name="selectable">True</property>
+                            <property name="ellipsize">start</property>
+                            <property name="xalign">0</property>
+                          </object>
+                          <packing>
+                            <property name="left_attach">1</property>
+                            <property name="top_attach">5</property>
                           </packing>
                         </child>
                       </object>
diff --git a/data/org.freedesktop.Bustle.appdata.xml.in b/data/org.freedesktop.Bustle.appdata.xml.in
--- a/data/org.freedesktop.Bustle.appdata.xml.in
+++ b/data/org.freedesktop.Bustle.appdata.xml.in
@@ -2,7 +2,9 @@
 <!-- Copyright 2014 Philip Withnall <philip@tecnocode.co.uk> -->
 <!-- Copyright 2016–2018 Will Thompson <will@willthompson.co.uk> -->
 <component type="desktop-application">
-	<id>org.freedesktop.Bustle.desktop</id>
+	<id>org.freedesktop.Bustle</id>
+	<launchable type="desktop-id">org.freedesktop.Bustle.desktop</launchable>
+	<content_rating type="oars-1.1" />
 	<metadata_license>CC-BY-SA-3.0</metadata_license>
 	<name>Bustle</name>
 	<summary>Draw sequence diagrams of D-Bus activity</summary>
@@ -32,13 +34,19 @@
 			<caption>Relax with this soothing greyscale welcome page</caption>
 		</screenshot>
 	</screenshots>
-	<url type="homepage">https://www.freedesktop.org/wiki/Software/Bustle/</url>
+	<url type="homepage">https://gitlab.freedesktop.org/bustle/bustle#readme</url>
 	<update_contact>will_at_willthompson.co.uk</update_contact>
 	<translation type="gettext">bustle</translation>
 	<provides>
 		<id>bustle.desktop</id>
 	</provides>
 	<releases>
+		<release date="2018-12-07" version="0.7.4">
+			<description>
+				<p>In the details for an error reply, the error name is now shown, and the error message is formatted more legibly.</p>
+				<p>The default file extension for log files is now ‘.pcap’, reflecting what they actually are.</p>
+			</description>
+		</release>
 		<release date="2018-11-15" version="0.7.3">
 			<description>
 				<p>Bustle now handles the application/vnd.tcpdump.pcap MIME type, which in practice means that your file manager will offer to open pcap files with Bustle.</p>
diff --git a/po/en_GB.po b/po/en_GB.po
new file mode 100644
--- /dev/null
+++ b/po/en_GB.po
@@ -0,0 +1,327 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# 
+# Translators:
+# Will Thompson <wjt@endlessm.com>, 2018
+# 
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2018-11-15 08:51+0000\n"
+"PO-Revision-Date: 2018-11-15 09:57+0000\n"
+"Last-Translator: Will Thompson <wjt@endlessm.com>, 2018\n"
+"Language-Team: English (United Kingdom) (https://www.transifex.com/bustle/teams/6754/en_GB/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: en_GB\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: Bustle/StatisticsPane.hs:189 Bustle/StatisticsPane.hs:192
+msgid "%.1f ms"
+msgstr ""
+
+#: Bustle/Noninteractive.hs:55
+msgid "(no interface)"
+msgstr ""
+
+#: Bustle/UI/AboutDialog.hs:46 data/bustle.ui:101
+#: data/org.freedesktop.Bustle.desktop.in:3
+#: data/org.freedesktop.Bustle.appdata.xml.in:6
+msgid "Bustle"
+msgstr ""
+
+#: Bustle/StatisticsPane.hs:190
+msgid "Calls"
+msgstr ""
+
+#: Bustle/UI.hs:456
+msgid "Close _Without Saving"
+msgstr ""
+
+#: Bustle/UI.hs:226
+msgid "Could not read '%s'"
+msgstr "Could not read ‘%s’"
+
+#: Bustle/UI.hs:763
+msgid "Couldn't export log as PDF: "
+msgstr "Couldn’t export log as PDF: OH NO"
+
+#: Bustle/Noninteractive.hs:48
+msgid "Couldn't parse '%s': %s"
+msgstr "Couldn’t parse ‘%s’: %s"
+
+#: Bustle/UI.hs:431
+msgid "Couldn't save log: "
+msgstr "Couldn’t save log: "
+
+#: Bustle/StatisticsPane.hs:222 data/bustle.ui:787
+msgid "Error"
+msgstr ""
+
+#: Bustle/StatisticsPane.hs:150
+msgid "Frequency"
+msgstr ""
+
+#: Bustle/UI.hs:455
+msgid "If you don't save, this log will be lost forever."
+msgstr "If you don’t save, this log will be lost forever."
+
+#: Bustle/StatisticsPane.hs:229
+msgid "Largest"
+msgstr ""
+
+#: Bustle/UI.hs:239
+msgid "Logged <b>%u</b> messages"
+msgstr ""
+
+#: Bustle/StatisticsPane.hs:191 Bustle/StatisticsPane.hs:228
+msgid "Mean"
+msgstr ""
+
+#: Bustle/StatisticsPane.hs:135 Bustle/StatisticsPane.hs:213
+#: data/bustle.ui:688
+msgid "Member"
+msgstr ""
+
+#: Bustle/StatisticsPane.hs:142 Bustle/StatisticsPane.hs:179
+msgid "Method"
+msgstr ""
+
+#: Bustle/StatisticsPane.hs:220 data/bustle.ui:762
+msgid "Method call"
+msgstr ""
+
+#: Bustle/StatisticsPane.hs:221 data/bustle.ui:774
+msgid "Method return"
+msgstr ""
+
+#: Bustle/UI.hs:348
+msgid "Recording %s&#8230;"
+msgstr ""
+
+#: Bustle/UI.hs:448
+msgid "Save log '%s' before closing?"
+msgstr ""
+
+#: Bustle/StatisticsPane.hs:143 Bustle/StatisticsPane.hs:223
+#: data/bustle.ui:800
+msgid "Signal"
+msgstr ""
+
+#: Bustle/StatisticsPane.hs:227
+msgid "Smallest"
+msgstr ""
+
+#: Bustle/UI/AboutDialog.hs:48
+msgid "Someone's favourite D-Bus profiler"
+msgstr "Someone’s favourite D-Bus profiler"
+
+#: Bustle/StatisticsPane.hs:188
+msgid "Total"
+msgstr ""
+
+#: Bustle/UI/FilterDialog.hs:123
+msgid ""
+"Unticking a service hides its column in the diagram, and all messages it is "
+"involved in. That is, all methods it calls or are called on it, the "
+"corresponding returns, and all signals it emits will be hidden."
+msgstr ""
+
+#: Bustle/Util.hs:48
+msgid "Warning: "
+msgstr ""
+
+#: Bustle/UI.hs:433
+msgid ""
+"You might want to manually recover the log from the temporary file at "
+"\"%s\"."
+msgstr ""
+
+#: data/bustle.ui:14
+msgid "_Filter Visible Services…"
+msgstr ""
+
+#: data/bustle.ui:24
+msgid "_Statistics"
+msgstr ""
+
+#: data/bustle.ui:62
+msgid ""
+"Display two logs—one for the session bus, one for the system bus—side by "
+"side."
+msgstr ""
+
+#: data/bustle.ui:63
+msgid "O_pen a Pair of Logs…"
+msgstr ""
+
+#: data/bustle.ui:75
+msgid "Record S_ession Bus"
+msgstr ""
+
+#: data/bustle.ui:84
+msgid "Record S_ystem Bus"
+msgstr ""
+
+#: data/bustle.ui:93
+msgid "Record _Address…"
+msgstr ""
+
+#: data/bustle.ui:138
+msgid "Record a new log"
+msgstr ""
+
+#: data/bustle.ui:149
+msgid "_Record"
+msgstr ""
+
+#: data/bustle.ui:182
+msgid "_Stop"
+msgstr ""
+
+#: data/bustle.ui:200
+msgid "Open an existing log"
+msgstr ""
+
+#: data/bustle.ui:310
+msgid "Export as PDF"
+msgstr ""
+
+#: data/bustle.ui:334
+msgid "Save"
+msgstr ""
+
+#: data/bustle.ui:493
+msgid ""
+"Start recording D-Bus activity with the <b>Record</b> button above\n"
+" You can also run <i>dbus-monitor --pcap</i> from the command line"
+msgstr ""
+
+#: data/bustle.ui:512
+msgid "Welcome to Bustle"
+msgstr ""
+
+#: data/bustle.ui:537
+msgid "<big><b>Waiting for D-Bus traffic; please hold…</b></big>"
+msgstr ""
+
+#: data/bustle.ui:564
+msgid "Frequencies"
+msgstr ""
+
+#: data/bustle.ui:578
+msgid "Durations"
+msgstr ""
+
+#: data/bustle.ui:593
+msgid "Sizes"
+msgstr ""
+
+#: data/bustle.ui:640
+msgid "Type"
+msgstr ""
+
+#: data/bustle.ui:656
+msgid "Path"
+msgstr ""
+
+#: data/bustle.ui:720
+msgid "Arguments"
+msgstr ""
+
+#: data/bustle.ui:813
+msgid "Directed signal"
+msgstr ""
+
+#: data/bustle.ui:832
+msgid "Sender"
+msgstr ""
+
+#: data/bustle.ui:848
+msgid "Destination"
+msgstr ""
+
+#: data/org.freedesktop.Bustle.desktop.in:4
+#: data/org.freedesktop.Bustle.appdata.xml.in:7
+msgid "Draw sequence diagrams of D-Bus activity"
+msgstr ""
+
+#: data/org.freedesktop.Bustle.desktop.in:6
+msgid "org.freedesktop.Bustle"
+msgstr ""
+
+#: data/org.freedesktop.Bustle.desktop.in:11
+msgid "debug;profile;d-bus;dbus;sequence;monitor;"
+msgstr ""
+
+#. Translators: These are the application description paragraphs in the
+#. AppData file.
+#: data/org.freedesktop.Bustle.appdata.xml.in:10
+msgid ""
+"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 is not performing as well as you like. It also provides "
+"statistics like signal frequencies and average method call times."
+msgstr ""
+
+#: data/org.freedesktop.Bustle.appdata.xml.in:23
+msgid "Explore sequence diagrams of D-Bus activity"
+msgstr ""
+
+#: data/org.freedesktop.Bustle.appdata.xml.in:27
+msgid "See statistics summarizing the log"
+msgstr ""
+
+#: data/org.freedesktop.Bustle.appdata.xml.in:31
+msgid "Relax with this soothing greyscale welcome page"
+msgstr ""
+
+#: data/org.freedesktop.Bustle.appdata.xml.in:43
+msgid ""
+"Bustle now handles the application/vnd.tcpdump.pcap MIME type, which in "
+"practice means that your file manager will offer to open pcap files with "
+"Bustle."
+msgstr ""
+
+#: data/org.freedesktop.Bustle.appdata.xml.in:48
+msgid ""
+"You can now explore messages while they're being recorded. (Filtering, "
+"statistics and exporting are still only available once you stop recording.)"
+msgstr ""
+"You can now explore messages while they’re being recorded. (Filtering, "
+"statistics and exporting are still only available once you stop recording.)"
+
+#: data/org.freedesktop.Bustle.appdata.xml.in:49
+msgid ""
+"The raw sender and destination for each message is now shown in the details "
+"pane."
+msgstr ""
+
+#: data/org.freedesktop.Bustle.appdata.xml.in:50
+msgid ""
+"Bytestrings with embedded NULs which are otherwise ASCII are now shown as "
+"ASCII strings."
+msgstr ""
+
+#: data/org.freedesktop.Bustle.appdata.xml.in:55
+msgid ""
+"It's now possible to monitor the system bus (from the user interface and "
+"with the bustle-pcap command-line tool), with no need to reconfigure the "
+"system bus. It's also possible to monitor an arbitrary bus by address."
+msgstr ""
+"It’s now possible to monitor the system bus (from the user interface and "
+"with the bustle-pcap command-line tool), with no need to reconfigure the "
+"system bus. It’s also possible to monitor an arbitrary bus by address."
+
+#: data/org.freedesktop.Bustle.appdata.xml.in:56
+msgid ""
+"Bustle now requires that dbus-monitor (≥ 1.9.10) and pkexec are installed on"
+" your system."
+msgstr ""
diff --git a/po/messages.pot b/po/messages.pot
--- a/po/messages.pot
+++ b/po/messages.pot
@@ -8,7 +8,7 @@
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2018-11-15 08:51+0000\n"
+"POT-Creation-Date: 2018-12-07 09:43+0000\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -27,7 +27,7 @@
 
 #: Bustle/UI/AboutDialog.hs:46 data/bustle.ui:101
 #: data/org.freedesktop.Bustle.desktop.in:3
-#: data/org.freedesktop.Bustle.appdata.xml.in:6
+#: data/org.freedesktop.Bustle.appdata.xml.in:9
 msgid "Bustle"
 msgstr ""
 
@@ -55,7 +55,7 @@
 msgid "Couldn't save log: "
 msgstr ""
 
-#: Bustle/StatisticsPane.hs:222 data/bustle.ui:787
+#: Bustle/StatisticsPane.hs:222 data/bustle.ui:787 data/bustle.ui:896
 msgid "Error"
 msgstr ""
 
@@ -240,7 +240,7 @@
 msgstr ""
 
 #: data/org.freedesktop.Bustle.desktop.in:4
-#: data/org.freedesktop.Bustle.appdata.xml.in:7
+#: data/org.freedesktop.Bustle.appdata.xml.in:10
 msgid "Draw sequence diagrams of D-Bus activity"
 msgstr ""
 
@@ -253,7 +253,7 @@
 msgstr ""
 
 #. Translators: These are the application description paragraphs in the AppData file.
-#: data/org.freedesktop.Bustle.appdata.xml.in:10
+#: data/org.freedesktop.Bustle.appdata.xml.in:13
 msgid ""
 "Bustle draws sequence diagrams of D-Bus activity. It shows signal emissions, "
 "method calls and their corresponding returns, with time stamps for each "
@@ -263,51 +263,63 @@
 "statistics like signal frequencies and average method call times."
 msgstr ""
 
-#: data/org.freedesktop.Bustle.appdata.xml.in:23
+#: data/org.freedesktop.Bustle.appdata.xml.in:26
 msgid "Explore sequence diagrams of D-Bus activity"
 msgstr ""
 
-#: data/org.freedesktop.Bustle.appdata.xml.in:27
+#: data/org.freedesktop.Bustle.appdata.xml.in:30
 msgid "See statistics summarizing the log"
 msgstr ""
 
-#: data/org.freedesktop.Bustle.appdata.xml.in:31
+#: data/org.freedesktop.Bustle.appdata.xml.in:34
 msgid "Relax with this soothing greyscale welcome page"
 msgstr ""
 
-#: data/org.freedesktop.Bustle.appdata.xml.in:43
+#: data/org.freedesktop.Bustle.appdata.xml.in:46
 msgid ""
+"In the details for an error reply, the error name is now shown, and the "
+"error message is formatted more legibly."
+msgstr ""
+
+#: data/org.freedesktop.Bustle.appdata.xml.in:47
+msgid ""
+"The default file extension for log files is now ‘.pcap’, reflecting what "
+"they actually are."
+msgstr ""
+
+#: data/org.freedesktop.Bustle.appdata.xml.in:52
+msgid ""
 "Bustle now handles the application/vnd.tcpdump.pcap MIME type, which in "
 "practice means that your file manager will offer to open pcap files with "
 "Bustle."
 msgstr ""
 
-#: data/org.freedesktop.Bustle.appdata.xml.in:48
+#: data/org.freedesktop.Bustle.appdata.xml.in:57
 msgid ""
 "You can now explore messages while they're being recorded. (Filtering, "
 "statistics and exporting are still only available once you stop recording.)"
 msgstr ""
 
-#: data/org.freedesktop.Bustle.appdata.xml.in:49
+#: data/org.freedesktop.Bustle.appdata.xml.in:58
 msgid ""
 "The raw sender and destination for each message is now shown in the details "
 "pane."
 msgstr ""
 
-#: data/org.freedesktop.Bustle.appdata.xml.in:50
+#: data/org.freedesktop.Bustle.appdata.xml.in:59
 msgid ""
 "Bytestrings with embedded NULs which are otherwise ASCII are now shown as "
 "ASCII strings."
 msgstr ""
 
-#: data/org.freedesktop.Bustle.appdata.xml.in:55
+#: data/org.freedesktop.Bustle.appdata.xml.in:64
 msgid ""
 "It's now possible to monitor the system bus (from the user interface and "
 "with the bustle-pcap command-line tool), with no need to reconfigure the "
 "system bus. It's also possible to monitor an arbitrary bus by address."
 msgstr ""
 
-#: data/org.freedesktop.Bustle.appdata.xml.in:56
+#: data/org.freedesktop.Bustle.appdata.xml.in:65
 msgid ""
 "Bustle now requires that dbus-monitor (≥ 1.9.10) and pkexec are installed on "
 "your system."
