diff --git a/tmf/org.eclipse.tracecompass.tmf.ui.swtbot.tests/src/org/eclipse/tracecompass/tmf/ui/swtbot/tests/views/TimeGraphViewStub.java b/tmf/org.eclipse.tracecompass.tmf.ui.swtbot.tests/src/org/eclipse/tracecompass/tmf/ui/swtbot/tests/views/TimeGraphViewStub.java
index 82de041..cfa722f 100644
--- a/tmf/org.eclipse.tracecompass.tmf.ui.swtbot.tests/src/org/eclipse/tracecompass/tmf/ui/swtbot/tests/views/TimeGraphViewStub.java
+++ b/tmf/org.eclipse.tracecompass.tmf.ui.swtbot.tests/src/org/eclipse/tracecompass/tmf/ui/swtbot/tests/views/TimeGraphViewStub.java
@@ -20,6 +20,7 @@
 import org.eclipse.jdt.annotation.NonNull;
 import org.eclipse.jdt.annotation.Nullable;
 import org.eclipse.swt.graphics.RGBA;
+import org.eclipse.tracecompass.tmf.core.model.timegraph.IFilterProperty;
 import org.eclipse.tracecompass.tmf.core.timestamp.TmfTimeRange;
 import org.eclipse.tracecompass.tmf.core.timestamp.TmfTimestamp;
 import org.eclipse.tracecompass.tmf.core.trace.ITmfTrace;
@@ -33,6 +34,8 @@
 import org.eclipse.tracecompass.tmf.ui.widgets.timegraph.model.TimeGraphEntry;
 import org.eclipse.tracecompass.tmf.ui.widgets.timegraph.model.TimeLinkEvent;
 
+import com.google.common.collect.Multimap;
+
 /**
  * Time graph stub.
  *
@@ -76,6 +79,8 @@
     private final @NonNull TimeGraphEntry fRow4;
     private StubPresentationProvider fPresentationProvider;
 
+    private String fFilterRegex;
+
     /**
      * Constructor
      */
@@ -142,6 +147,25 @@
     }
 
     @Override
+    protected @NonNull Multimap<@NonNull Integer, @NonNull String> getRegexes() {
+        Multimap<@NonNull Integer, @NonNull String> regexes = super.getRegexes();
+        if (regexes.containsKey(IFilterProperty.BOUND) && (fFilterRegex == null || fFilterRegex.isEmpty())) {
+            regexes.removeAll(IFilterProperty.BOUND);
+        }
+        if (!regexes.containsKey(IFilterProperty.BOUND) && fFilterRegex != null && !fFilterRegex.isEmpty()) {
+            regexes.put(IFilterProperty.BOUND, fFilterRegex);
+        }
+        return regexes;
+    }
+
+    /**
+     * Set the regex to highlight on
+     */
+    public void setFilterRegex(String filterRegex) {
+        fFilterRegex = filterRegex;
+    }
+
+    @Override
     protected void buildEntryList(@NonNull ITmfTrace trace, @NonNull ITmfTrace parentTrace, @NonNull IProgressMonitor monitor) {
         List<@NonNull TimeGraphEntry> entryList = getEntryList(trace);
         if (entryList == null || entryList.isEmpty()) {
@@ -163,7 +187,7 @@
      * Set the presentation provider
      *
      * @param presentaitonProvider
-     *                                 the presentation provider
+     *            the presentation provider
      */
     public void setPresentationProvider(StubPresentationProvider presentaitonProvider) {
         fPresentationProvider = presentaitonProvider;
diff --git a/tmf/org.eclipse.tracecompass.tmf.ui.swtbot.tests/src/org/eclipse/tracecompass/tmf/ui/swtbot/tests/views/TimeGraphViewTest.java b/tmf/org.eclipse.tracecompass.tmf.ui.swtbot.tests/src/org/eclipse/tracecompass/tmf/ui/swtbot/tests/views/TimeGraphViewTest.java
index e514c97..aa3dc3b 100644
--- a/tmf/org.eclipse.tracecompass.tmf.ui.swtbot.tests/src/org/eclipse/tracecompass/tmf/ui/swtbot/tests/views/TimeGraphViewTest.java
+++ b/tmf/org.eclipse.tracecompass.tmf.ui.swtbot.tests/src/org/eclipse/tracecompass/tmf/ui/swtbot/tests/views/TimeGraphViewTest.java
@@ -225,7 +225,8 @@
         TmfWindowRangeUpdatedSignal signal = new TmfWindowRangeUpdatedSignal(this, smallerRange);
 
         TimeGraphViewStub view = getView();
-        // This is an oddity: the signals may be lost if a view is not initialized, so
+        // This is an oddity: the signals may be lost if a view is not
+        // initialized, so
         // they are send in the condition.
         //
         // NOTE: maybe use a shorter poll delay?
@@ -269,8 +270,8 @@
     }
 
     /**
-     * Clean up after a test, reset the views and reset the states of the timegraph
-     * by pressing reset on all the resets of the legend
+     * Clean up after a test, reset the views and reset the states of the
+     * timegraph by pressing reset on all the resets of the legend
      */
     @After
     public void after() {
@@ -356,8 +357,39 @@
     }
 
     /**
-     * Test the legend operation. Change sliders and reset, do not change colors as
-     * there is not mock of the color picker yet
+     * Test the event styling methods, should put a box around the events.
+     */
+    @Test
+    public void testEventStyling() {
+        SWTWorkbenchBot bot = new SWTWorkbenchBot();
+        resetTimeRange(bot);
+        Rectangle bounds = fBounds;
+        ImageHelper precollapse = ImageHelper.grabImage(bounds);
+        SWTBotTimeGraph tg = new SWTBotTimeGraph(fViewBot.bot());
+        tg.getEntry("Plumber guy").collapse();
+        TimeGraphViewStub view = getView();
+        // take a first saved picture, the original is pre-collapse
+        ImageHelper ref = ImageHelper.waitForNewImage(bounds, precollapse);
+        /*
+         * Regex, not a question
+         */
+        view.setFilterRegex("row?");
+        UIThreadRunnable.syncExec(() -> view.restartZoomThread());
+        // Take another picture/
+        ImageHelper highlighted = ImageHelper.waitForNewImage(bounds, ref);
+        view.setFilterRegex(null);
+        UIThreadRunnable.syncExec(() -> view.restartZoomThread());
+        // take a third picture
+        ImageHelper reset = ImageHelper.waitForNewImage(bounds, highlighted);
+        assertEquals(ref.getHistogram(), reset.getHistogram());
+        ImageHelper delta = highlighted.diff(reset);
+        tg.expandAll();
+        assertTrue("Some highlighting", delta.getHistogram().elementSet().size() > 1);
+    }
+
+    /**
+     * Test the legend operation. Change sliders and reset, do not change colors
+     * as there is not mock of the color picker yet
      *
      * TODO: mock color picker
      */
@@ -406,14 +438,15 @@
     }
 
     /**
-     * Test the legend and export operations. Resize states, take screenshots and
-     * compare, they should be different. then reset the sizes and compare, they
-     * should be the same.
+     * Test the legend and export operations. Resize states, take screenshots
+     * and compare, they should be different. then reset the sizes and compare,
+     * they should be the same.
      *
      * NOTE: This utterly fails in GTK3.
      *
      * @throws IOException
-     *             file not found, someone deleted files while the test is running
+     *             file not found, someone deleted files while the test is
+     *             running
      */
     @Test
     public void testExport() throws IOException {
@@ -455,7 +488,8 @@
         /* Compare with the original, they should be different */
         int refCount = refImage.getHistogram().count(HAIR);
         int skinnyCount = skinnyImage.getHistogram().count(HAIR);
-        assertTrue(String.format("Count of \"\"HAIR\"\" (%s) did not get change despite change of width before: %d after:%d histogram:%s", HAIR, refCount, skinnyCount, Multisets.copyHighestCountFirst(skinnyImage.getHistogram())), skinnyCount < refCount);
+        assertTrue(String.format("Count of \"\"HAIR\"\" (%s) did not get change despite change of width before: %d after:%d histogram:%s", HAIR, refCount, skinnyCount, Multisets.copyHighestCountFirst(skinnyImage.getHistogram())),
+                skinnyCount < refCount);
 
         /* reset all */
         fViewBot.toolbarButton(SHOW_LEGEND).click();
@@ -477,13 +511,12 @@
         assertEquals("Count of \"HAIR\" did not get change despite reset of width", refCount, resetCount);
     }
 
-    private static class PaletteIsPresent extends DefaultCondition  {
+    private static class PaletteIsPresent extends DefaultCondition {
 
         private String fFailureMessage;
         private List<RGB> fRgbs;
         private Rectangle fRect;
 
-
         public PaletteIsPresent(List<RGB> rgbs, Rectangle bounds) {
             fRgbs = rgbs;
             fRect = bounds;
@@ -512,7 +545,6 @@
         }
     }
 
-
     /**
      * Test time graph with color palettes
      */
@@ -530,7 +562,7 @@
                 return paletteBlue;
             }
         }));
-        List<RGB> rgbs = Lists.transform(paletteBlue.get(), a->RGBAUtil.fromInt(a.toInt()).rgb);
+        List<RGB> rgbs = Lists.transform(paletteBlue.get(), a -> RGBAUtil.fromInt(a.toInt()).rgb);
         fViewBot.bot().waitUntil(new PaletteIsPresent(rgbs, bounds));
 
         IPaletteProvider paletteGreen = SequentialPaletteProvider.create(new RGBAColor(0x23, 0xf3, 0x67, 0xff), 5);
@@ -540,7 +572,7 @@
                 return paletteGreen;
             }
         }));
-        rgbs = Lists.transform(paletteGreen.get(), a->RGBAUtil.fromInt(a.toInt()).rgb);
+        rgbs = Lists.transform(paletteGreen.get(), a -> RGBAUtil.fromInt(a.toInt()).rgb);
         fViewBot.bot().waitUntil(new PaletteIsPresent(rgbs, bounds));
 
         IPaletteProvider rotating = new QualitativePaletteProvider.Builder().setAttenuation(0.5f).setBrightness(1.0f).setNbColors(4).build();
@@ -550,7 +582,7 @@
                 return rotating;
             }
         }));
-        rgbs = Lists.transform(rotating.get(), a->RGBAUtil.fromInt(a.toInt()).rgb);
+        rgbs = Lists.transform(rotating.get(), a -> RGBAUtil.fromInt(a.toInt()).rgb);
         fViewBot.bot().waitUntil(new PaletteIsPresent(rgbs, bounds));
     }
 
@@ -572,7 +604,7 @@
         ImageHelper ref = ImageHelper.grabImage(bounds);
 
         timegraph.setFocus();
-        //Press '/' to open the filter dialog
+        // Press '/' to open the filter dialog
         timegraph.pressShortcut(KeyStroke.getInstance('/'));
 
         SWTBotShell dialogShell = viewBot.shell("Time Event Filter").activate();
