diff --git a/src/org/openstreetmap/josm/tools/bugreport/BugReport.java b/src/org/openstreetmap/josm/tools/bugreport/BugReport.java
index d47586f..2aa38e1 100644
--- a/src/org/openstreetmap/josm/tools/bugreport/BugReport.java
+++ b/src/org/openstreetmap/josm/tools/bugreport/BugReport.java
@@ -122,7 +122,11 @@ public final class BugReport implements Serializable {
         StringWriter stringWriter = new StringWriter();
         PrintWriter out = new PrintWriter(stringWriter);
         if (isIncludeStatusReport()) {
-            out.println(ShowStatusReportAction.getReportHeader());
+            try {
+                out.println(ShowStatusReportAction.getReportHeader());
+            } catch (RuntimeException e) {
+                out.println("Could not generate status report: " + e.getMessage());
+            }
         }
         if (isIncludeData()) {
             exception.printReportDataTo(out);
diff --git a/src/org/openstreetmap/josm/tools/bugreport/BugReportQueue.java b/src/org/openstreetmap/josm/tools/bugreport/BugReportQueue.java
index e7a5e09..e1105de 100644
--- a/src/org/openstreetmap/josm/tools/bugreport/BugReportQueue.java
+++ b/src/org/openstreetmap/josm/tools/bugreport/BugReportQueue.java
@@ -4,7 +4,9 @@ package org.openstreetmap.josm.tools.bugreport;
 import java.awt.GraphicsEnvironment;
 import java.util.ArrayList;
 import java.util.LinkedList;
+import java.util.concurrent.CopyOnWriteArrayList;
 import java.util.function.BiFunction;
+import java.util.function.Predicate;
 
 import org.openstreetmap.josm.Main;
 
@@ -22,6 +24,7 @@ public class BugReportQueue {
     private ArrayList<ReportedException> suppressFor = new ArrayList<>();
     private Thread displayThread;
     private final BiFunction<ReportedException, Integer, SuppressionMode> bugReportHandler = getBestHandler();
+    private final CopyOnWriteArrayList<Predicate<ReportedException>> handlers = new CopyOnWriteArrayList<>();
     private int displayedErrors;
 
     private boolean inReportDialog;
@@ -96,6 +99,10 @@ public class BugReportQueue {
     }
 
     private SuppressionMode displayFor(ReportedException e) {
+        if (handlers.stream().anyMatch(p -> p.test(e))) {
+            Main.trace("Intercepted by handler.");
+            return SuppressionMode.NONE;
+        }
         return bugReportHandler.apply(e, getDisplayedErrors());
     }
 
@@ -122,6 +129,18 @@ public class BugReportQueue {
         }
     }
 
+    /**
+     * Allows you to peek or even intersect the bug reports.
+     * @param handler The handler. It can return false to stop all further handling of the exception.
+     */
+    public void addBugReportHandler(Predicate<ReportedException> handler) {
+        handlers.add(handler);
+    }
+
+    /**
+     * Gets the global bug report queue
+     * @return The queue
+     */
     public static BugReportQueue getInstance() {
         return INSTANCE;
     }
diff --git a/test/unit/org/openstreetmap/josm/tools/bugreport/BugReportExceptionHandlerTest.java b/test/unit/org/openstreetmap/josm/tools/bugreport/BugReportExceptionHandlerTest.java
index a030600..0440be2 100644
--- a/test/unit/org/openstreetmap/josm/tools/bugreport/BugReportExceptionHandlerTest.java
+++ b/test/unit/org/openstreetmap/josm/tools/bugreport/BugReportExceptionHandlerTest.java
@@ -1,31 +1,34 @@
 // License: GPL. For details, see LICENSE file.
 package org.openstreetmap.josm.tools.bugreport;
 
-import static org.junit.Assert.assertFalse;
+import java.util.concurrent.CountDownLatch;
 
-import org.junit.Before;
+import org.junit.Rule;
 import org.junit.Test;
-import org.openstreetmap.josm.JOSMFixture;
+import org.openstreetmap.josm.testutils.JOSMTestRules;
+
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 
 /**
  * Unit tests of {@link BugReportExceptionHandler} class.
  */
 public class BugReportExceptionHandlerTest {
-
     /**
-     * Setup tests.
+     * No dependcies
      */
-    @Before
-    public void setUp() {
-        JOSMFixture.createUnitTestFixture().init(true);
-    }
+    @Rule
+    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
+    public JOSMTestRules test = new JOSMTestRules();
 
     /**
      * Unit test for {@link BugReportExceptionHandler#handleException} method.
+     * @throws InterruptedException
      */
     @Test
-    public void testHandleException() {
+    public void testHandleException() throws InterruptedException {
+        CountDownLatch latch = new CountDownLatch(1);
+        BugReportQueue.getInstance().addBugReportHandler(e -> {latch.countDown(); return false;});
         BugReportExceptionHandler.handleException(new Exception("testHandleException"));
-        assertFalse(BugReportExceptionHandler.exceptionHandlingInProgress());
+        latch.await();
     }
 }
diff --git a/test/unit/org/openstreetmap/josm/tools/bugreport/BugReportTest.java b/test/unit/org/openstreetmap/josm/tools/bugreport/BugReportTest.java
index ab9cf76..451910c 100644
--- a/test/unit/org/openstreetmap/josm/tools/bugreport/BugReportTest.java
+++ b/test/unit/org/openstreetmap/josm/tools/bugreport/BugReportTest.java
@@ -2,8 +2,18 @@
 package org.openstreetmap.josm.tools.bugreport;
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertSame;
+import static org.junit.Assert.assertTrue;
 
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.io.StringWriter;
+
+import org.junit.Rule;
 import org.junit.Test;
+import org.openstreetmap.josm.testutils.JOSMTestRules;
+
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 
 /**
  * Tests the bug report class.
@@ -11,6 +21,48 @@ import org.junit.Test;
  * @since 10285
  */
 public class BugReportTest {
+    /**
+     * Preferences for the report text
+     */
+    @Rule
+    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
+    public JOSMTestRules test = new JOSMTestRules().preferences();
+
+    /**
+     * Test {@link BugReport#getReportText()}
+     */
+    @Test
+    public void testReportText() {
+        ReportedException e = interceptInChildMethod(new IOException("test-exception-message"));
+        e.put("test-key", "test-value");
+        String text = new BugReport(e).getReportText();
+
+        assertTrue(text.contains("test-exception-message"));
+        assertTrue(text.contains("interceptInChildMethod"));
+        assertTrue(text.contains("testReportText")); // stack trace
+        assertTrue(text.contains("test-key: test-value"));
+    }
+
+    /**
+     * Test {@link BugReport#intercept(Throwable)}
+     */
+    @Test
+    public void testIntercept() {
+        IOException base = new IOException("test");
+        ReportedException intercepted = interceptInChildMethod(base);
+        assertEquals(intercepted.getCause(), base);
+
+        StringWriter out = new StringWriter();
+        intercepted.printReportDataTo(new PrintWriter(out));
+
+        assertTrue(out.toString().contains("interceptInChildMethod")); // calling method.
+
+        assertSame(intercepted, BugReport.intercept(intercepted));
+    }
+
+    private ReportedException interceptInChildMethod(IOException base) {
+        return BugReport.intercept(base);
+    }
 
     /**
      * Test {@link BugReport#getCallingMethod(int)}
@@ -19,6 +71,7 @@ public class BugReportTest {
     public void testGetCallingMethod() {
         assertEquals("BugReportTest#testGetCallingMethod", BugReport.getCallingMethod(1));
         assertEquals("BugReportTest#testGetCallingMethod", testGetCallingMethod2());
+        assertEquals("?", BugReport.getCallingMethod(100));
     }
 
     private String testGetCallingMethod2() {
