diff --git a/analysis/org.eclipse.tracecompass.analysis.counters.ui.swtbot.tests/META-INF/MANIFEST.MF b/analysis/org.eclipse.tracecompass.analysis.counters.ui.swtbot.tests/META-INF/MANIFEST.MF
index 7421508..a7478ac 100644
--- a/analysis/org.eclipse.tracecompass.analysis.counters.ui.swtbot.tests/META-INF/MANIFEST.MF
+++ b/analysis/org.eclipse.tracecompass.analysis.counters.ui.swtbot.tests/META-INF/MANIFEST.MF
@@ -29,7 +29,6 @@
 Import-Package: org.apache.commons.io,
  org.eclipse.swt.graphics,
  org.eclipse.swtchart,
- org.eclipse.tracecompass.analysis.counters.core,
- org.swtchart
+ org.eclipse.tracecompass.analysis.counters.core
 Automatic-Module-Name: org.eclipse.tracecompass.analysis.counters.ui.swtbot.tests
 Export-Package: org.eclipse.tracecompass.analysis.counters.ui.swtbot.tests;x-internal:=true
diff --git a/analysis/org.eclipse.tracecompass.analysis.counters.ui.swtbot.tests/src/org/eclipse/tracecompass/analysis/counters/ui/swtbot/tests/CounterViewPinAndCloneTest.java b/analysis/org.eclipse.tracecompass.analysis.counters.ui.swtbot.tests/src/org/eclipse/tracecompass/analysis/counters/ui/swtbot/tests/CounterViewPinAndCloneTest.java
deleted file mode 100644
index 0012c27..0000000
--- a/analysis/org.eclipse.tracecompass.analysis.counters.ui.swtbot.tests/src/org/eclipse/tracecompass/analysis/counters/ui/swtbot/tests/CounterViewPinAndCloneTest.java
+++ /dev/null
@@ -1,304 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2018, 2019 Ericsson
- *
- * All rights reserved. This program and the accompanying materials are
- * made available under the terms of the Eclipse Public License 2.0 which
- * accompanies this distribution, and is available at
- * https://www.eclipse.org/legal/epl-2.0/
- *
- * SPDX-License-Identifier: EPL-2.0
- *******************************************************************************/
-
-package org.eclipse.tracecompass.analysis.counters.ui.swtbot.tests;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-
-import org.eclipse.jdt.annotation.NonNull;
-import org.eclipse.swt.widgets.Widget;
-import org.eclipse.swtbot.eclipse.finder.widgets.SWTBotEditor;
-import org.eclipse.swtbot.eclipse.finder.widgets.SWTBotView;
-import org.eclipse.swtbot.swt.finder.exceptions.WidgetNotFoundException;
-import org.eclipse.swtbot.swt.finder.waits.DefaultCondition;
-import org.eclipse.swtbot.swt.finder.widgets.SWTBotMenu;
-import org.eclipse.swtbot.swt.finder.widgets.SWTBotToolbarDropDownButton;
-import org.eclipse.tracecompass.testtraces.ctf.CtfTestTrace;
-import org.eclipse.tracecompass.tmf.core.signal.TmfSignalManager;
-import org.eclipse.tracecompass.tmf.core.signal.TmfWindowRangeUpdatedSignal;
-import org.eclipse.tracecompass.tmf.core.timestamp.TmfTimeRange;
-import org.eclipse.tracecompass.tmf.core.timestamp.TmfTimestamp;
-import org.eclipse.tracecompass.tmf.core.trace.ITmfTrace;
-import org.eclipse.tracecompass.tmf.core.trace.TmfTraceManager;
-import org.eclipse.tracecompass.tmf.ctf.core.tests.shared.CtfTmfTestTraceUtils;
-import org.eclipse.tracecompass.tmf.ui.swtbot.tests.XYDataProviderBaseTest;
-import org.eclipse.tracecompass.tmf.ui.swtbot.tests.shared.ConditionHelpers;
-import org.eclipse.tracecompass.tmf.ui.swtbot.tests.shared.SWTBotUtils;
-import org.eclipse.tracecompass.tmf.ui.tests.shared.WaitUtils;
-import org.eclipse.tracecompass.tmf.ui.viewers.xycharts.linecharts.TmfCommonXAxisChartViewer;
-import org.eclipse.tracecompass.tmf.ui.views.TmfChartView;
-import org.eclipse.ui.IViewPart;
-import org.junit.Test;
-
-/**
- * SWTBot tests for pin & clone for xy-charts using Counters view example.
- *
- * @author Bernd Hufmann
- * @deprecated replaced by {@link NewCounterViewPinAndCloneTest}
- */
-@Deprecated
-public class CounterViewPinAndCloneTest extends XYDataProviderBaseTest {
-
-    private static final String TRACETYPE_ID = "org.eclipse.linuxtools.lttng2.kernel.tracetype";
-    private static final String TRACE_NAME = "kernel_vm";
-    private static final @NonNull String COUNTERS_VIEW_TITLE = "Counters (Legacy)";
-    private static final @NonNull String MAIN_SERIES_NAME = "kernel_vm/Ungrouped/minor_faults";
-    private static final @NonNull String COUNTERS_VIEW_ID = "org.eclipse.tracecompass.analysis.counters.ui.view.counters";
-    private static final String PINNED_TO_TRACE_COUNTERS_VIEW_TITLE = COUNTERS_VIEW_TITLE + " <" + TRACE_NAME + ">";
-    private static final String PINNED_TO_CTX_SWITCH_VIEW_TITLE = COUNTERS_VIEW_TITLE + " <context-switches-kernel>";
-
-    private static final String PIN_VIEW_BUTTON_NAME = "Pin View";
-    private static final String UNPIN_VIEW_BUTTON_NAME = "Unpin View";
-    private static final String PIN_TO_PREFIX = "Pin to ";
-    private static final String NEW_COUNTER_STACK_MENU = "New " + COUNTERS_VIEW_TITLE + " view";
-    private static final String PINNED_TO_PREFIX = "pinned to ";
-    private static final String CLONED_TRACE_SUFFIX = " | 2";
-    private static final String CLONED_VIEW_TITLE_NAME = COUNTERS_VIEW_TITLE + " <" + TRACE_NAME + " | 2>";
-
-    private static final int SECOND = 1000000000;
-    private static final long KERNEL_START = 1363700740555978750L;
-    private static final long KERNEL_TEST_START = KERNEL_START + SECOND;
-    private static final long KERNEL_TEST_END = KERNEL_START + 2 * SECOND;
-    private static final long KERNEL_TEST_INITIAL_END = KERNEL_START + 100000000L;
-
-    private static final long KERNEL_INITIAL_END = KERNEL_START + 100000000L;
-
-    private static final @NonNull TmfTimeRange RANGE = new TmfTimeRange(TmfTimestamp.fromNanos(KERNEL_TEST_START), TmfTimestamp.fromNanos(KERNEL_TEST_END));
-
-    /**
-     * Ensure the data displayed in the chart viewer reflects the tree viewer's
-     * selected entries.
-     */
-    @Test
-    public void testPinSingleTrace() {
-        SWTBotView originalViewBot = getSWTBotView();
-
-        // ensure that the view name is correct before
-        assertEquals(COUNTERS_VIEW_TITLE, originalViewBot.getTitle());
-
-        // ensure that the pin drop down is present, pin the view.
-        fBot.waitUntil(new DefaultCondition() {
-            WidgetNotFoundException fException;
-
-            @Override
-            public boolean test() throws Exception {
-                try {
-                    SWTBotToolbarDropDownButton toolbarDropDownButton = originalViewBot.toolbarDropDownButton(PIN_VIEW_BUTTON_NAME);
-                    toolbarDropDownButton.menuItem(PIN_TO_PREFIX + getTestTrace().getName()).click();
-                    return true;
-                } catch (WidgetNotFoundException e) {
-                    fException = e;
-                    return false;
-                }
-            }
-
-            @Override
-            public String getFailureMessage() {
-                return "Traces not available in toolbar drop down menu: " + fException;
-            }
-        });
-
-        // Ensure that the view has been renamed. Get the view by title and ensure i    private static final int SECOND = 1000000000;
-        // has the same widget as there is a renaming bug.
-        assertOriginalViewTitle(PINNED_TO_TRACE_COUNTERS_VIEW_TITLE);
-
-        originalViewBot.toolbarButton(UNPIN_VIEW_BUTTON_NAME).click();
-
-        // Ensure that the view has been renamed. Get the view by title and ensure it
-        // has the same widget as there is a renaming bug.
-        assertOriginalViewTitle(COUNTERS_VIEW_TITLE);
-
-        // Ensure that the pin button is present, pin the view.
-        originalViewBot.toolbarButton(PIN_VIEW_BUTTON_NAME).click();
-
-        // Ensure that the view has been renamed. Get the view by title and ensure it
-        // has the same widget as there is a renaming bug.
-        assertOriginalViewTitle(PINNED_TO_TRACE_COUNTERS_VIEW_TITLE);
-
-        // Ensure that the pin button is present, unpin the view.
-        originalViewBot.toolbarButton(UNPIN_VIEW_BUTTON_NAME).click();
-        assertOriginalViewTitle(COUNTERS_VIEW_TITLE);
-    }
-
-    /**
-     * Test the behavior with two traces.
-     */
-    @Test
-    public void testPinTwoTraces() {
-        SWTBotView originalViewBot = getSWTBotView();
-
-        ITmfTrace activeTrace = TmfTraceManager.getInstance().getActiveTrace();
-        assertNotNull(activeTrace);
-        ITmfTrace kernelTestTrace = CtfTmfTestTraceUtils.getTrace(CtfTestTrace.CONTEXT_SWITCHES_KERNEL);
-        SWTBotUtils.openTrace(TRACE_PROJECT_NAME, kernelTestTrace.getPath(), TRACETYPE_ID);
-
-        /// Finish waiting for the trace to index
-        WaitUtils.waitForJobs();
-        // wait for the editor to be ready.
-        fBot.editorByTitle(kernelTestTrace.getName());
-
-        // Assert that the pin to drop down menuItems are present for both traces.
-        fBot.waitUntil(new DefaultCondition() {
-            WidgetNotFoundException fException;
-
-            @Override
-            public boolean test() throws Exception {
-                try {
-                    SWTBotToolbarDropDownButton toolbarDropDownButton = originalViewBot.toolbarDropDownButton(PIN_VIEW_BUTTON_NAME);
-                    toolbarDropDownButton.menuItem(PIN_TO_PREFIX + kernelTestTrace.getName());
-                    toolbarDropDownButton.menuItem(PIN_TO_PREFIX + getTestTrace().getName()).click();
-                    return true;
-                } catch (WidgetNotFoundException e) {
-                    fException = e;
-                    return false;
-                }
-            }
-
-            @Override
-            public String getFailureMessage() {
-                return "Traces not available in toolbar drop down menu: " + fException;
-            }
-        });
-
-        /*
-         * Assert that the pinned view is the kernel_vm trace despite the active trace being
-         * the context-switch trace.
-         */
-        assertOriginalViewTitle(PINNED_TO_TRACE_COUNTERS_VIEW_TITLE);
-        activeTrace = TmfTraceManager.getInstance().getActiveTrace();
-        assertNotNull("There should be an active trace", activeTrace);
-        assertEquals("context-switches-kernel should be the active trace", kernelTestTrace.getName(), activeTrace.getName());
-
-        // Get the window range of the kernel trace
-        TmfTraceManager traceManager = TmfTraceManager.getInstance();
-        ITmfTrace kernelTrace = traceManager.getActiveTrace();
-        assertNotNull(kernelTrace);
-
-        // Switch back and forth
-        SWTBotUtils.activateEditor(fBot, getTestTrace().getName());
-        assertOriginalViewTitle(PINNED_TO_TRACE_COUNTERS_VIEW_TITLE);
-
-        SWTBotUtils.activateEditor(fBot, kernelTestTrace.getName());
-        assertOriginalViewTitle(PINNED_TO_TRACE_COUNTERS_VIEW_TITLE);
-
-        IViewPart viewPart = originalViewBot.getViewReference().getView(false);
-        assertTrue(viewPart instanceof TmfChartView);
-        final TmfCommonXAxisChartViewer chartViewer = (TmfCommonXAxisChartViewer) getChartViewer(viewPart);
-        assertNotNull(chartViewer);
-        TmfSignalManager.dispatchSignal(new TmfWindowRangeUpdatedSignal(this, RANGE, kernelTrace));
-
-        // Assert that the original views trace's window range did not change
-        SWTBotUtils.activateEditor(fBot, getTestTrace().getName());
-        SWTBotUtils.waitUntil(v -> (v.getWindowStartTime() == KERNEL_START && v.getWindowEndTime() == KERNEL_TEST_INITIAL_END), chartViewer, "Range of cloned view changed");
-
-        // Unpin from active trace
-        SWTBotUtils.activateEditor(fBot, kernelTrace.getName());
-        originalViewBot.toolbarButton(UNPIN_VIEW_BUTTON_NAME).click();
-        assertOriginalViewTitle(COUNTERS_VIEW_TITLE);
-
-        originalViewBot.toolbarButton(PIN_VIEW_BUTTON_NAME).click();
-
-        assertOriginalViewTitle(PINNED_TO_CTX_SWITCH_VIEW_TITLE);
-
-        // Close the pinned trace
-        SWTBotEditor kernelTable = fBot.editorByTitle(kernelTestTrace.getName());
-        kernelTable.close();
-
-        // Verify that view title is reset
-        SWTBotUtils.waitUntil(v -> v.getReference().getPartName().equals(COUNTERS_VIEW_TITLE), originalViewBot, "View name didn't change");
-        kernelTestTrace.dispose();
-    }
-
-    /**
-     * Test the cloning feature.
-     */
-    @Test
-    public void testCloneSingleTrace() {
-        SWTBotView originalViewBot = getSWTBotView();
-        SWTBotMenu cloneMenu = originalViewBot.viewMenu().menu(NEW_COUNTER_STACK_MENU);
-
-        /*
-         * Assert that the original editor was not renamed and that the cloned one
-         * exists and is pinned to the kernel_vm trace.
-         */
-        cloneMenu.menu(PINNED_TO_PREFIX + getTestTrace().getName()).click();
-        assertOriginalViewTitle(COUNTERS_VIEW_TITLE);
-        SWTBotView clonedView = fBot.viewByTitle(PINNED_TO_TRACE_COUNTERS_VIEW_TITLE);
-        assertEquals("Should not have created a new instance", 1, fBot.editors().size());
-        clonedView.close();
-
-         // Assert that a new instance is created.
-        cloneMenu.menu(PINNED_TO_PREFIX + getTestTrace().getName() + " | new instance").click();
-        assertOriginalViewTitle(COUNTERS_VIEW_TITLE);
-        clonedView = fBot.viewByTitle(CLONED_VIEW_TITLE_NAME);
-        assertEquals("Should have created a new instance", 2, fBot.editors().size());
-        SWTBotEditor cloneEditor = fBot.editorByTitle(getTestTrace().getName() + CLONED_TRACE_SUFFIX);
-
-        // Get the window range of the cloned trace
-        TmfTraceManager traceManager = TmfTraceManager.getInstance();
-        ITmfTrace cloneTrace = traceManager.getActiveTrace();
-        assertNotNull(cloneTrace);
-
-        // Go back to original trace, pin it
-        SWTBotUtils.activateEditor(fBot, getTestTrace().getName());
-        originalViewBot.toolbarButton(PIN_VIEW_BUTTON_NAME).click();
-
-        // Assert that the cloned trace's window range did not change
-        SWTBotUtils.activateEditor(fBot, cloneTrace.getName() + CLONED_TRACE_SUFFIX);
-        IViewPart viewPart = clonedView.getViewReference().getView(false);
-        assertTrue(viewPart instanceof TmfChartView);
-        final TmfCommonXAxisChartViewer chartViewer = (TmfCommonXAxisChartViewer) getChartViewer(viewPart);
-        assertNotNull(chartViewer);
-
-        fBot.waitUntil(ConditionHelpers.xyViewerIsReadyCondition(chartViewer));
-        TmfSignalManager.dispatchSignal(new TmfWindowRangeUpdatedSignal(this, RANGE, getTestTrace()));
-        fBot.waitUntil(ConditionHelpers.xyViewerIsReadyCondition(chartViewer));
-        SWTBotUtils.waitUntil(v -> (v.getWindowStartTime() == KERNEL_START && v.getWindowEndTime() == KERNEL_INITIAL_END), chartViewer, "Range of cloned view changed");
-
-        cloneEditor.close();
-    }
-
-    private void assertOriginalViewTitle(String newName) {
-        Widget expectedWidget = getSWTBotView().getWidget();
-        assertNotNull(expectedWidget);
-        SWTBotView actualView = fBot.viewByTitle(newName);
-        Widget actualWidget = actualView.getWidget();
-        assertNotNull(actualWidget);
-        assertEquals(expectedWidget, actualWidget);
-    }
-
-    @Override
-    protected @NonNull String getMainSeriesName() {
-        return MAIN_SERIES_NAME;
-    }
-
-    @Override
-    protected @NonNull String getTitle() {
-        return COUNTERS_VIEW_TITLE;
-    }
-
-    @Override
-    protected String getViewID() {
-        return COUNTERS_VIEW_ID;
-    }
-
-    @Override
-    protected ITmfTrace getTestTrace() {
-        return CtfTmfTestTraceUtils.getTrace(CtfTestTrace.KERNEL_VM);
-    }
-
-    @Override
-    protected void disposeTestTrace() {
-        CtfTmfTestTraceUtils.dispose(CtfTestTrace.KERNEL_VM);
-    }
-}
diff --git a/analysis/org.eclipse.tracecompass.analysis.counters.ui.swtbot.tests/src/org/eclipse/tracecompass/analysis/counters/ui/swtbot/tests/CounterViewTest.java b/analysis/org.eclipse.tracecompass.analysis.counters.ui.swtbot.tests/src/org/eclipse/tracecompass/analysis/counters/ui/swtbot/tests/CounterViewTest.java
deleted file mode 100644
index 07587d0..0000000
--- a/analysis/org.eclipse.tracecompass.analysis.counters.ui.swtbot.tests/src/org/eclipse/tracecompass/analysis/counters/ui/swtbot/tests/CounterViewTest.java
+++ /dev/null
@@ -1,165 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2017, 2019 Ericsson
- *
- * All rights reserved. This program and the accompanying materials are
- * made available under the terms of the Eclipse Public License 2.0 which
- * accompanies this distribution, and is available at
- * https://www.eclipse.org/legal/epl-2.0/
- *
- * SPDX-License-Identifier: EPL-2.0
- *******************************************************************************/
-
-package org.eclipse.tracecompass.analysis.counters.ui.swtbot.tests;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-
-import org.eclipse.jdt.annotation.NonNull;
-import org.eclipse.jdt.annotation.Nullable;
-import org.eclipse.swt.graphics.RGB;
-import org.eclipse.swtbot.swt.finder.widgets.SWTBotTree;
-import org.eclipse.swtbot.swt.finder.widgets.SWTBotTreeItem;
-import org.eclipse.tracecompass.analysis.counters.ui.CounterView;
-import org.eclipse.tracecompass.testtraces.ctf.CtfTestTrace;
-import org.eclipse.tracecompass.tmf.core.trace.ITmfTrace;
-import org.eclipse.tracecompass.tmf.ctf.core.tests.shared.CtfTmfTestTraceUtils;
-import org.eclipse.tracecompass.tmf.ui.swtbot.tests.XYDataProviderBaseTest;
-import org.eclipse.tracecompass.tmf.ui.swtbot.tests.shared.ConditionHelpers;
-import org.eclipse.tracecompass.tmf.ui.tests.shared.WaitUtils;
-import org.eclipse.tracecompass.tmf.ui.viewers.xycharts.linecharts.TmfCommonXAxisChartViewer;
-import org.eclipse.ui.IViewPart;
-import org.junit.Test;
-import org.swtchart.Chart;
-import org.swtchart.ISeries;
-import org.swtchart.LineStyle;
-
-/**
- * SWTBot tests for Counters view.
- *
- * @author Mikael Ferland
- * @deprecated replaced by {@link NewCounterViewTest}
- */
-@Deprecated
-public class CounterViewTest extends XYDataProviderBaseTest {
-
-    private static final int NUMBER_OF_POINTS = 50;
-    private static final RGB BLUE = new RGB(0, 0, 255);
-    private static final @NonNull String TRACE_NAME = "kernel_vm";
-    private static final @NonNull String COUNTER_NAME = "minor_faults";
-    private static final @NonNull String COUNTERS_VIEW_TITLE = "Counters (Legacy)";
-    private static final @NonNull String MAIN_SERIES_NAME = "kernel_vm/Ungrouped/minor_faults";
-    private static final @NonNull String COUNTERS_VIEW_ID = "org.eclipse.tracecompass.analysis.counters.ui.view.counters";
-
-    /**
-     * Ensure the data displayed in the chart viewer reflects the tree viewer's
-     * selected entries.
-     */
-    @Test
-    public void testManipulatingTreeViewer() {
-        final Chart chart = getChart();
-        assertNotNull(chart);
-        assertEquals(0, chart.getSeriesSet().getSeries().length);
-
-        SWTBotTree treeBot = getSWTBotView().bot().tree();
-        WaitUtils.waitUntil(tree -> tree.rowCount() >= 1, treeBot, "The tree viewer did not finish loading.");
-        SWTBotTreeItem root = treeBot.getTreeItem(TRACE_NAME);
-        assertNotNull(root);
-        SWTBotTreeItem counter = retrieveTreeItem(root, COUNTER_NAME);
-        assertNotNull(counter);
-
-        // Check all elements of the tree
-        root.check();
-        WaitUtils.waitUntil(SWTBotTreeItem::isChecked, root, "Root entry was not checked");
-        assertTrue(counter.isChecked());
-        assertFalse(root.isGrayed());
-        assertFalse(counter.isGrayed());
-        WaitUtils.waitUntil(c -> c.getSeriesSet().getSeries().length >= 3, chart, "The data series did not load.");
-
-        // Uncheck a leaf of the tree
-        counter.uncheck();
-        assertTrue(root.isChecked());
-        assertTrue(root.isGrayed());
-        assertFalse(counter.isChecked());
-        assertFalse(counter.isGrayed());
-        WaitUtils.waitUntil(c -> c.getSeriesSet().getSeries().length >= 2, chart,
-                "A data series has not been removed.");
-    }
-
-    /**
-     * Validate the Counters view data model.
-     */
-    @Test
-    public void testDisplayingDataSeries() {
-        // Setup the chart viewer
-        IViewPart viewPart = getSWTBotView().getViewReference().getView(true);
-        assertTrue(viewPart instanceof CounterView);
-        final TmfCommonXAxisChartViewer chartViewer = (TmfCommonXAxisChartViewer) getChartViewer(viewPart);
-        assertNotNull(chartViewer);
-        fBot.waitUntil(ConditionHelpers.xyViewerIsReadyCondition(chartViewer));
-        chartViewer.setNbPoints(NUMBER_OF_POINTS);
-        fBot.waitUntil(ConditionHelpers.xyViewerIsReadyCondition(chartViewer));
-
-        final Chart chart = getChart();
-        assertNotNull(chart);
-        assertEquals(0, chart.getSeriesSet().getSeries().length);
-
-        // Check the counter entry
-        SWTBotTree treeBot = getSWTBotView().bot().tree();
-        WaitUtils.waitUntil(tree -> tree.rowCount() >= 1, treeBot, "The tree viewer did not finish loading.");
-        SWTBotTreeItem root = treeBot.getTreeItem(TRACE_NAME);
-        SWTBotTreeItem counter = retrieveTreeItem(root, COUNTER_NAME);
-        assertNotNull(counter);
-        counter.check();
-        fBot.waitUntil(ConditionHelpers.xyViewerIsReadyCondition(chartViewer));
-        WaitUtils.waitUntil(c -> c.getSeriesSet().getSeries().length >= 1, chart, "The data series did not load.");
-
-        // Ensure the data series has the correct styling
-        verifySeriesStyle(MAIN_SERIES_NAME, ISeries.SeriesType.LINE, BLUE, LineStyle.SOLID, false);
-
-        // Ensure the data model is valid
-        WaitUtils.waitUntil(json -> isChartDataValid(chart, json, MAIN_SERIES_NAME),
-                "resources/minor_faults-res50.json", "The chart data is not valid.");
-    }
-
-    private @Nullable SWTBotTreeItem retrieveTreeItem(SWTBotTreeItem rootItem, @NonNull String id) {
-        if (rootItem.getNodes().contains(id)) {
-            return rootItem.getNode(id);
-        }
-
-        for (SWTBotTreeItem child : rootItem.getItems()) {
-            SWTBotTreeItem grandChild = retrieveTreeItem(child, id);
-            if (grandChild != null) {
-                return grandChild;
-            }
-        }
-
-        return null;
-    }
-
-    @Override
-    protected @NonNull String getMainSeriesName() {
-        return MAIN_SERIES_NAME;
-    }
-
-    @Override
-    protected @NonNull String getTitle() {
-        return COUNTERS_VIEW_TITLE;
-    }
-
-    @Override
-    protected String getViewID() {
-        return COUNTERS_VIEW_ID;
-    }
-
-    @Override
-    protected ITmfTrace getTestTrace() {
-        return CtfTmfTestTraceUtils.getTrace(CtfTestTrace.KERNEL_VM);
-    }
-
-    @Override
-    protected void disposeTestTrace() {
-        CtfTmfTestTraceUtils.dispose(CtfTestTrace.KERNEL_VM);
-    }
-}
diff --git a/analysis/org.eclipse.tracecompass.analysis.counters.ui/META-INF/MANIFEST.MF b/analysis/org.eclipse.tracecompass.analysis.counters.ui/META-INF/MANIFEST.MF
index 669cf9a..55c6a3b 100644
--- a/analysis/org.eclipse.tracecompass.analysis.counters.ui/META-INF/MANIFEST.MF
+++ b/analysis/org.eclipse.tracecompass.analysis.counters.ui/META-INF/MANIFEST.MF
@@ -3,7 +3,7 @@
 Bundle-Name: %Bundle-Name
 Bundle-Vendor: %Bundle-Vendor
 Bundle-SymbolicName: org.eclipse.tracecompass.analysis.counters.ui;singleton:=true
-Bundle-Version: 1.0.1.qualifier
+Bundle-Version: 2.0.0.qualifier
 Bundle-Localization: plugin
 Bundle-Activator: org.eclipse.tracecompass.internal.analysis.counters.ui.Activator
 Bundle-ActivationPolicy: lazy
@@ -19,10 +19,8 @@
 Import-Package: com.google.common.base,
  com.google.common.collect,
  com.google.common.primitives,
- org.apache.commons.lang3,
- org.swtchart
-Export-Package: org.eclipse.tracecompass.analysis.counters.ui,
- org.eclipse.tracecompass.analysis.counters.ui.views,
+ org.apache.commons.lang3
+Export-Package: org.eclipse.tracecompass.analysis.counters.ui.views,
  org.eclipse.tracecompass.internal.analysis.counters.ui;x-internal:=true
 Automatic-Module-Name: org.eclipse.tracecompass.analysis.counters.ui
 
diff --git a/analysis/org.eclipse.tracecompass.analysis.counters.ui/src/org/eclipse/tracecompass/analysis/counters/ui/CounterChartViewer.java b/analysis/org.eclipse.tracecompass.analysis.counters.ui/src/org/eclipse/tracecompass/analysis/counters/ui/CounterChartViewer.java
deleted file mode 100644
index aae7ca9..0000000
--- a/analysis/org.eclipse.tracecompass.analysis.counters.ui/src/org/eclipse/tracecompass/analysis/counters/ui/CounterChartViewer.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2017, 2018 Ericsson
- *
- * All rights reserved. This program and the accompanying materials are
- * made available under the terms of the Eclipse Public License 2.0 which
- * accompanies this distribution, and is available at
- * https://www.eclipse.org/legal/epl-2.0/
- *
- * SPDX-License-Identifier: EPL-2.0
- *******************************************************************************/
-
-package org.eclipse.tracecompass.analysis.counters.ui;
-
-import java.util.Map;
-
-import org.eclipse.jdt.annotation.NonNull;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.tracecompass.internal.analysis.counters.core.CounterDataProvider;
-import org.eclipse.tracecompass.internal.tmf.core.model.filters.FetchParametersUtils;
-import org.eclipse.tracecompass.tmf.core.model.filters.SelectionTimeQueryFilter;
-import org.eclipse.tracecompass.tmf.ui.viewers.xycharts.linecharts.TmfFilteredXYChartViewer;
-import org.eclipse.tracecompass.tmf.ui.viewers.xycharts.linecharts.TmfXYChartSettings;
-
-/**
- * XY line chart which displays the counters data.
- *
- * @author Matthew Khouzam
- * @author Mikael Ferland
- * @deprecated use {@link org.eclipse.tracecompass.analysis.counters.ui.views.CounterChartViewer}
- */
-@Deprecated
-public final class CounterChartViewer extends TmfFilteredXYChartViewer {
-
-    private boolean fIsCumulative = false;
-
-    /**
-     * Constructor
-     *
-     * @param parent
-     *            Parent composite
-     * @param settings
-     *            See {@link TmfXYChartSettings} to know what it contains
-     */
-    public CounterChartViewer(Composite parent, TmfXYChartSettings settings) {
-        // Avoid displaying chart title and axis titles (to reduce wasted space)
-        super(parent, settings, CounterDataProvider.ID);
-    }
-
-    /**
-     * Display the counters data cumulatively or not.
-     */
-    public void toggleCumulative() {
-        cancelUpdate();
-        fIsCumulative ^= true;
-        updateContent();
-    }
-
-    @Override
-    protected @NonNull Map<String, Object> createQueryParameters(long start, long end, int nb) {
-        Map<@NonNull String, @NonNull Object> parameters = FetchParametersUtils.selectionTimeQueryToMap(new SelectionTimeQueryFilter(start, end, nb, getSelected()));
-        parameters.put(CounterDataProvider.CUMULATIVE_COUNTER_KEY, fIsCumulative);
-        return parameters;
-    }
-}
diff --git a/analysis/org.eclipse.tracecompass.analysis.counters.ui/src/org/eclipse/tracecompass/analysis/counters/ui/CounterTreeViewer.java b/analysis/org.eclipse.tracecompass.analysis.counters.ui/src/org/eclipse/tracecompass/analysis/counters/ui/CounterTreeViewer.java
deleted file mode 100644
index 016896a..0000000
--- a/analysis/org.eclipse.tracecompass.analysis.counters.ui/src/org/eclipse/tracecompass/analysis/counters/ui/CounterTreeViewer.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2017, 2018 Ericsson
- *
- * All rights reserved. This program and the accompanying materials are
- * made available under the terms of the Eclipse Public License 2.0 which
- * accompanies this distribution, and is available at
- * https://www.eclipse.org/legal/epl-2.0/
- *
- * SPDX-License-Identifier: EPL-2.0
- *******************************************************************************/
-
-package org.eclipse.tracecompass.analysis.counters.ui;
-
-import java.util.Comparator;
-
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.tracecompass.internal.analysis.counters.core.CounterDataProvider;
-import org.eclipse.tracecompass.tmf.core.model.tree.TmfTreeDataModel;
-import org.eclipse.tracecompass.tmf.ui.viewers.tree.AbstractSelectTreeViewer;
-import org.eclipse.tracecompass.tmf.ui.viewers.tree.ITmfTreeColumnDataProvider;
-import org.eclipse.tracecompass.tmf.ui.viewers.tree.TmfGenericTreeEntry;
-import org.eclipse.tracecompass.tmf.ui.viewers.tree.TmfTreeColumnData;
-
-import com.google.common.collect.Lists;
-
-/**
- * Display the state system as a filtered checkbox tree:
- *
- * <pre>
- * {trace name}
- *   +- Grouped
- *   |   +- {group id}
- *   |   |   +- {group element}
- *   |   |       +- ...
- *   |   +- {group id}
- *   |       +- ...
- *   +- Ungrouped
- *       +- {counter}
- *       +- ...
- * </pre>
- *
- * @author Matthew Khouzam
- * @author Mikael Ferland
- * @deprecated use {@link org.eclipse.tracecompass.analysis.counters.ui.views.CounterTreeViewer}
- */
-@Deprecated
-public class CounterTreeViewer extends AbstractSelectTreeViewer {
-
-    private final class CounterTreeLabelProvider extends DataProviderTreeLabelProvider {
-
-        @Override
-        public Image getColumnImage(Object element, int columnIndex) {
-            if (columnIndex == 1 && element instanceof TmfGenericTreeEntry && isChecked(element)) {
-                TmfGenericTreeEntry<TmfTreeDataModel> genericEntry = (TmfGenericTreeEntry<TmfTreeDataModel>) element;
-                if (genericEntry.hasChildren()) {
-                    return null;
-                }
-                return getLegendImage(genericEntry.getModel().getId());
-            }
-            return null;
-        }
-    }
-
-    /**
-     * Constructor
-     *
-     * @param parent
-     *            Parent composite
-     */
-    public CounterTreeViewer(Composite parent) {
-        super(parent, 1, CounterDataProvider.ID);
-        setLabelProvider(new CounterTreeLabelProvider());
-    }
-
-    @Override
-    protected ITmfTreeColumnDataProvider getColumnDataProvider() {
-        return () -> Lists.newArrayList(createColumn("Counters", Comparator.comparing(TmfGenericTreeEntry::getName)), new TmfTreeColumnData("Legend")); //$NON-NLS-1$ //$NON-NLS-2$
-    }
-
-}
diff --git a/analysis/org.eclipse.tracecompass.analysis.counters.ui/src/org/eclipse/tracecompass/analysis/counters/ui/CounterView.java b/analysis/org.eclipse.tracecompass.analysis.counters.ui/src/org/eclipse/tracecompass/analysis/counters/ui/CounterView.java
deleted file mode 100644
index 72f0a3c..0000000
--- a/analysis/org.eclipse.tracecompass.analysis.counters.ui/src/org/eclipse/tracecompass/analysis/counters/ui/CounterView.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2017 Ericsson
- *
- * All rights reserved. This program and the accompanying materials are
- * made available under the terms of the Eclipse Public License 2.0 which
- * accompanies this distribution, and is available at
- * https://www.eclipse.org/legal/epl-2.0/
- *
- * SPDX-License-Identifier: EPL-2.0
- *******************************************************************************/
-
-package org.eclipse.tracecompass.analysis.counters.ui;
-
-import org.eclipse.jdt.annotation.NonNull;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.tracecompass.internal.analysis.counters.ui.Messages;
-import org.eclipse.tracecompass.tmf.ui.viewers.TmfViewer;
-import org.eclipse.tracecompass.tmf.ui.viewers.xycharts.TmfXYChartViewer;
-import org.eclipse.tracecompass.tmf.ui.viewers.xycharts.linecharts.TmfXYChartSettings;
-import org.eclipse.tracecompass.tmf.ui.views.TmfChartView;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.IWorkbenchActionConstants;
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-
-/**
- * Main implementation for the counters view.
- *
- * <p>
- * The view is composed of two parts:
- * <ol>
- * <li>CounterTreeViewer (left-hand side)</li>
- * <li>CounterChartViewer (right-hand side)</li>
- * </ol>
- * </p>
- *
- * @author Matthew Khouzam
- * @author Mikael Ferland
- * @deprecated use {@link org.eclipse.tracecompass.analysis.counters.ui.views.CounterView}
- */
-@Deprecated
-public class CounterView extends TmfChartView {
-
-    /** View ID. */
-    public static final String ID = "org.eclipse.tracecompass.analysis.counters.ui.view.counters"; //$NON-NLS-1$
-
-    /**
-     * Title of the chart viewer
-     */
-    public static final String VIEW_TITLE = "Counters (Legacy)"; //$NON-NLS-1$
-
-    /**
-     * Constructor
-     */
-    public CounterView() {
-        super(VIEW_TITLE);
-    }
-
-    @Override
-    public void createPartControl(Composite parent) {
-        super.createPartControl(parent);
-
-        // Add a tool bar button to display counters data cumulatively
-        IActionBars bars = getViewSite().getActionBars();
-        bars.getToolBarManager().appendToGroup(IWorkbenchActionConstants.MB_ADDITIONS, getCumulativeAction());
-    }
-
-    @Override
-    protected TmfXYChartViewer createChartViewer(Composite parent) {
-        return new CounterChartViewer(parent, new TmfXYChartSettings(null, null, null, 1));
-    }
-
-    @Override
-    protected @NonNull TmfViewer createLeftChildViewer(Composite parent) {
-        return new CounterTreeViewer(parent);
-    }
-
-    private Action getCumulativeAction() {
-        Action action = new Action(Messages.CounterView_CumulativeAction_Text, IAction.AS_CHECK_BOX) {
-
-            @Override
-            public void run() {
-                boolean isCumulative = isChecked();
-                setToolTipText(isCumulative ? Messages.CounterView_CumulativeAction_DifferentialTooltipText : Messages.CounterView_CumulativeAction_CumulativeTooltipText);
-                TmfXYChartViewer chart = getChartViewer();
-                if (chart instanceof CounterChartViewer) {
-                    ((CounterChartViewer) chart).toggleCumulative();
-                }
-            }
-        };
-
-        action.setToolTipText(Messages.CounterView_CumulativeAction_CumulativeTooltipText);
-        action.setImageDescriptor(AbstractUIPlugin.imageDescriptorFromPlugin("org.eclipse.tracecompass.tmf.ui", "icons/elcl16/sigma.gif")); //$NON-NLS-1$ //$NON-NLS-2$
-        return action;
-    }
-
-}
diff --git a/analysis/org.eclipse.tracecompass.analysis.lami.ui/META-INF/MANIFEST.MF b/analysis/org.eclipse.tracecompass.analysis.lami.ui/META-INF/MANIFEST.MF
index 9aab563b..3634dfe 100644
--- a/analysis/org.eclipse.tracecompass.analysis.lami.ui/META-INF/MANIFEST.MF
+++ b/analysis/org.eclipse.tracecompass.analysis.lami.ui/META-INF/MANIFEST.MF
@@ -23,6 +23,5 @@
  org.eclipse.tracecompass.internal.provisional.analysis.lami.ui.handler;x-internal:=true,
  org.eclipse.tracecompass.internal.provisional.analysis.lami.ui.viewers;x-internal:=true,
  org.eclipse.tracecompass.internal.provisional.analysis.lami.ui.views;x-friends:="org.eclipse.tracecompass.analysis.lami.ui.swtbot.tests"
-Import-Package: com.google.common.collect,
- org.swtchart
+Import-Package: com.google.common.collect
 Automatic-Module-Name: org.eclipse.tracecompass.analysis.lami.ui
diff --git a/analysis/org.eclipse.tracecompass.analysis.os.linux.ui.swtbot.tests/META-INF/MANIFEST.MF b/analysis/org.eclipse.tracecompass.analysis.os.linux.ui.swtbot.tests/META-INF/MANIFEST.MF
index 77435a0..e584b9e 100644
--- a/analysis/org.eclipse.tracecompass.analysis.os.linux.ui.swtbot.tests/META-INF/MANIFEST.MF
+++ b/analysis/org.eclipse.tracecompass.analysis.os.linux.ui.swtbot.tests/META-INF/MANIFEST.MF
@@ -38,6 +38,5 @@
 Import-Package: com.google.common.collect,
  org.apache.commons.io,
  org.eclipse.swtchart,
- org.eclipse.tracecompass.testtraces.ctf,
- org.swtchart
+ org.eclipse.tracecompass.testtraces.ctf
 Automatic-Module-Name: org.eclipse.tracecompass.analysis.os.linux.ui.swtbot.tests
diff --git a/analysis/org.eclipse.tracecompass.analysis.os.linux.ui/META-INF/MANIFEST.MF b/analysis/org.eclipse.tracecompass.analysis.os.linux.ui/META-INF/MANIFEST.MF
index 379c043..b2d93ce 100644
--- a/analysis/org.eclipse.tracecompass.analysis.os.linux.ui/META-INF/MANIFEST.MF
+++ b/analysis/org.eclipse.tracecompass.analysis.os.linux.ui/META-INF/MANIFEST.MF
@@ -24,8 +24,7 @@
 Import-Package: com.google.common.annotations,
  com.google.common.base,
  com.google.common.collect,
- org.eclipse.swtchart,
- org.swtchart
+ org.eclipse.swtchart
 Export-Package: org.eclipse.tracecompass.internal.analysis.os.linux.ui;x-friends:="org.eclipse.tracecompass.analysis.os.linux.ui.swtbot.tests",
  org.eclipse.tracecompass.internal.analysis.os.linux.ui.actions;x-internal:=true,
  org.eclipse.tracecompass.internal.analysis.os.linux.ui.perspectives;x-internal:=true,
diff --git a/analysis/org.eclipse.tracecompass.analysis.os.linux.ui/src/org/eclipse/tracecompass/internal/analysis/os/linux/ui/views/memory/MemoryUsageTreeViewer.java b/analysis/org.eclipse.tracecompass.analysis.os.linux.ui/src/org/eclipse/tracecompass/internal/analysis/os/linux/ui/views/memory/MemoryUsageTreeViewer.java
deleted file mode 100644
index 1efb2dd..0000000
--- a/analysis/org.eclipse.tracecompass.analysis.os.linux.ui/src/org/eclipse/tracecompass/internal/analysis/os/linux/ui/views/memory/MemoryUsageTreeViewer.java
+++ /dev/null
@@ -1,157 +0,0 @@
-/**********************************************************************
- * Copyright (c) 2016, 2018 Polytechnique de Montréal
- *
- * All rights reserved. This program and the accompanying materials are
- * made available under the terms of the Eclipse Public License 2.0 which
- * accompanies this distribution, and is available at
- * https://www.eclipse.org/legal/epl-2.0/
- *
- * SPDX-License-Identifier: EPL-2.0
- **********************************************************************/
-package org.eclipse.tracecompass.internal.analysis.os.linux.ui.views.memory;
-
-import java.util.Comparator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.jdt.annotation.NonNull;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.tracecompass.analysis.os.linux.core.memory.MemoryUsageTreeModel;
-import org.eclipse.tracecompass.internal.tmf.core.model.filters.FetchParametersUtils;
-import org.eclipse.tracecompass.tmf.core.model.filters.FilterTimeQueryFilter;
-import org.eclipse.tracecompass.tmf.core.model.tree.ITmfTreeDataModel;
-import org.eclipse.tracecompass.tmf.core.signal.TmfSignalHandler;
-import org.eclipse.tracecompass.tmf.core.signal.TmfTraceOpenedSignal;
-import org.eclipse.tracecompass.tmf.core.signal.TmfTraceSelectedSignal;
-import org.eclipse.tracecompass.tmf.ui.viewers.tree.AbstractSelectTreeViewer;
-import org.eclipse.tracecompass.tmf.ui.viewers.tree.ITmfTreeColumnDataProvider;
-import org.eclipse.tracecompass.tmf.ui.viewers.tree.ITmfTreeViewerEntry;
-import org.eclipse.tracecompass.tmf.ui.viewers.tree.TmfGenericTreeEntry;
-import org.eclipse.tracecompass.tmf.ui.viewers.tree.TmfTreeColumnData;
-
-import com.google.common.collect.ImmutableList;
-
-/**
- * Tree viewer to select which process to display in the kernel memory usage
- * chart.
- *
- * @since 2.2
- * @author Mahdi Zolnouri
- * @author Wassim Nasrallah
- * @author Najib Arbaoui
- *
- * @deprecated use {@link MemoryUsageTreeViewer2} instead
- */
-@Deprecated
-public class MemoryUsageTreeViewer extends AbstractSelectTreeViewer {
-
-    /** Provides label for the Kernel memory usage tree viewer cells */
-    private class MemoryLabelProvider extends DataProviderTreeLabelProvider {
-
-        @Override
-        public String getColumnText(Object element, int columnIndex) {
-            if (!(element instanceof TmfGenericTreeEntry)) {
-                return null;
-            }
-            TmfGenericTreeEntry<MemoryUsageTreeModel> obj = (TmfGenericTreeEntry<MemoryUsageTreeModel>) element;
-            if (columnIndex == 0) {
-                return obj.getName();
-            } else if (columnIndex == 1) {
-                int tid = obj.getModel().getTid();
-                if (obj.getModel().getParentId() == -1) {
-                    // FIXME: Series total have different style than others. This should come from the data provider
-                    return Messages.MemoryUsageTree_Total;
-                }
-                return Integer.toString(tid);
-            }
-            return null;
-        }
-
-        @Override
-        public Image getColumnImage(Object element, int columnIndex) {
-            if (columnIndex != 2 || !(element instanceof TmfGenericTreeEntry)) {
-                return null;
-            }
-            TmfGenericTreeEntry<MemoryUsageTreeModel> obj = (TmfGenericTreeEntry<MemoryUsageTreeModel>) element;
-            if (isChecked(element) || obj.getModel().getParentId() == -1) {
-                TmfGenericTreeEntry<MemoryUsageTreeModel> entry = (TmfGenericTreeEntry<MemoryUsageTreeModel>) element;
-                return getLegendImage(entry.getModel().getId());
-            }
-            return null;
-        }
-    }
-
-    // view is filtered by default
-    private boolean fFiltered = true;
-    private MemoryPresentationProvider fPresentationProvider;
-
-    /**
-     * Constructor
-     *
-     * @param parent
-     *            The parent composite that holds this viewer
-     * @param id
-     *            The memory usage data provider ID.
-     */
-    public MemoryUsageTreeViewer(Composite parent, String id) {
-        super(parent, 2, id);
-        setLabelProvider(new MemoryLabelProvider());
-    }
-
-    @Override
-    protected @NonNull Map<String, Object> getParameters(long start, long end, boolean isSelection) {
-        return FetchParametersUtils.filteredTimeQueryToMap(new FilterTimeQueryFilter(Long.min(start, end), Long.max(start, end), 2, fFiltered));
-    }
-
-    @Override
-    protected ITmfTreeColumnDataProvider getColumnDataProvider() {
-        return () -> {
-            Comparator<TmfGenericTreeEntry<MemoryUsageTreeModel>> compareTid = Comparator.comparingInt(c -> c.getModel().getTid());
-            return ImmutableList.of(
-                    createColumn(Messages.MemoryUsageTree_ColumnProcess, Comparator.comparing(TmfGenericTreeEntry::getName)),
-                    createColumn(Messages.MemoryUsageTree_ColumnTID, compareTid),
-                    new TmfTreeColumnData(Messages.MemoryUsageTree_Legend));
-        };
-    }
-
-    /**
-     * Set the view to filter active threads or not.
-     *
-     * @param isFiltered
-     *            if we filter the active threads or not.
-     */
-    public void setFiltered(boolean isFiltered) {
-        fFiltered = isFiltered;
-        updateContent(getWindowStartTime(), getWindowEndTime(), false);
-    }
-
-    @Override
-    @TmfSignalHandler
-    public void traceSelected(TmfTraceSelectedSignal signal) {
-        super.traceSelected(signal);
-        fPresentationProvider = MemoryPresentationProvider.getForTrace(signal.getTrace());
-    }
-
-    @Override
-    @TmfSignalHandler
-    public void traceOpened(TmfTraceOpenedSignal signal) {
-        super.traceOpened(signal);
-        fPresentationProvider = MemoryPresentationProvider.getForTrace(signal.getTrace());
-    }
-
-    @Override
-    protected ITmfTreeViewerEntry modelToTree(long start, long end, List<ITmfTreeDataModel> model) {
-        // FIXME: Series total have different style than others. This should
-        // come from the data provider
-        for (ITmfTreeDataModel entryModel : model) {
-            if (entryModel.getParentId() == -1) {
-                // FIXME: Series total have different style than others. This
-                // should come from the data provider
-                fPresentationProvider.addTotalSeries(entryModel.getId());
-            }
-        }
-
-        return super.modelToTree(start, end, model);
-    }
-}
\ No newline at end of file
diff --git a/analysis/org.eclipse.tracecompass.analysis.os.linux.ui/src/org/eclipse/tracecompass/internal/analysis/os/linux/ui/views/memory/MemoryUsageView.java b/analysis/org.eclipse.tracecompass.analysis.os.linux.ui/src/org/eclipse/tracecompass/internal/analysis/os/linux/ui/views/memory/MemoryUsageView.java
deleted file mode 100644
index 33d978f..0000000
--- a/analysis/org.eclipse.tracecompass.analysis.os.linux.ui/src/org/eclipse/tracecompass/internal/analysis/os/linux/ui/views/memory/MemoryUsageView.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/**********************************************************************
- * Copyright (c) 2016, 2018 École Polytechnique de Montréal and others
- *
- * All rights reserved. This program and the accompanying materials are
- * made available under the terms of the Eclipse Public License 2.0 which
- * accompanies this distribution, and is available at
- * https://www.eclipse.org/legal/epl-2.0/
- *
- * SPDX-License-Identifier: EPL-2.0
- **********************************************************************/
-package org.eclipse.tracecompass.internal.analysis.os.linux.ui.views.memory;
-
-import org.eclipse.jdt.annotation.NonNull;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.tracecompass.common.core.format.DataSizeWithUnitFormat;
-import org.eclipse.tracecompass.internal.provisional.tmf.ui.viewers.xychart.BaseXYPresentationProvider;
-import org.eclipse.tracecompass.tmf.core.model.OutputElementStyle;
-import org.eclipse.tracecompass.tmf.core.trace.ITmfTrace;
-import org.eclipse.tracecompass.tmf.ui.viewers.TmfViewer;
-import org.eclipse.tracecompass.tmf.ui.viewers.xycharts.TmfXYChartViewer;
-import org.eclipse.tracecompass.tmf.ui.viewers.xycharts.linecharts.TmfFilteredXYChartViewer;
-import org.eclipse.tracecompass.tmf.ui.viewers.xycharts.linecharts.TmfXYChartSettings;
-import org.eclipse.tracecompass.tmf.ui.views.TmfChartView;
-import org.eclipse.ui.IWorkbenchActionConstants;
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-
-/**
- * Memory usage view
- *
- * @since 2.2
- * @author Samuel Gagnon
- * @author Mahdi Zolnouri
- * @author Wassim Nasrallah
- * @deprecated use @{link {@link MemoryUsageView2}
- */
-@Deprecated
-public class MemoryUsageView extends TmfChartView {
-    private final String fProviderId;
-    private final TmfXYChartSettings fSettings;
-
-    /**
-     * Constructor
-     *
-     * @param title
-     *            the Memory view's name.
-     * @param providerId
-     *            the ID of the provider to use for this view.
-     * @param settings
-     *            See {@link TmfXYChartSettings} to know what it contains
-     */
-    public MemoryUsageView(String title, String providerId, TmfXYChartSettings settings) {
-        super(title);
-        fProviderId = providerId;
-        fSettings = settings;
-    }
-
-    @Override
-    protected TmfXYChartViewer createChartViewer(Composite parent) {
-        TmfFilteredXYChartViewer viewer = new TmfFilteredXYChartViewer(parent, fSettings, fProviderId) {
-            @Override
-            public @NonNull OutputElementStyle getSeriesStyle(Long seriesId) {
-                return getPresentationProvider().getSeriesStyle(seriesId);            }
-
-            @Override
-            protected BaseXYPresentationProvider createPresentationProvider(ITmfTrace trace) {
-                return MemoryPresentationProvider.getForTrace(trace);
-            }
-
-        };
-        viewer.getSwtChart().getAxisSet().getYAxis(0).getTick().setFormat(DataSizeWithUnitFormat.getInstance());
-        return viewer;
-    }
-
-    @Override
-    protected @NonNull TmfViewer createLeftChildViewer(Composite parent) {
-        return new MemoryUsageTreeViewer(parent, fProviderId);
-    }
-
-    @Override
-    public void createPartControl(Composite parent) {
-        super.createPartControl(parent);
-
-        // Add a tool bar button to filter active threads.
-        getViewSite().getActionBars().getToolBarManager().appendToGroup(IWorkbenchActionConstants.MB_ADDITIONS, getFilterAction());
-    }
-
-    private Action getFilterAction() {
-        Action action = new Action(Messages.MemoryView_FilterAction_Text, IAction.AS_CHECK_BOX) {
-            // memory view is filtered by default.
-            private boolean isFiltered = true;
-
-            @Override
-            public void run() {
-                isFiltered ^= true;
-                setToolTipText(isFiltered ? Messages.MemoryView_FilterAction_FilteredTooltipText : Messages.MemoryView_FilterAction_UnfilteredTooltipText);
-                TmfViewer tree = getLeftChildViewer();
-                if (tree instanceof MemoryUsageTreeViewer) {
-                    MemoryUsageTreeViewer memoryUsageTreeViewer = (MemoryUsageTreeViewer) tree;
-                    memoryUsageTreeViewer.setFiltered(isFiltered);
-                }
-            }
-        };
-        action.setToolTipText(Messages.MemoryView_FilterAction_FilteredTooltipText);
-        action.setImageDescriptor(AbstractUIPlugin.imageDescriptorFromPlugin("org.eclipse.tracecompass.tmf.ui", "icons/elcl16/filter_items.gif")); //$NON-NLS-1$ //$NON-NLS-2$
-        // filtered by default, to not change the default behavior
-        action.setChecked(true);
-        return action;
-    }
-
-}
diff --git a/analysis/org.eclipse.tracecompass.analysis.profiling.ui.swtbot.tests/META-INF/MANIFEST.MF b/analysis/org.eclipse.tracecompass.analysis.profiling.ui.swtbot.tests/META-INF/MANIFEST.MF
index 7a3913f..08ca031 100644
--- a/analysis/org.eclipse.tracecompass.analysis.profiling.ui.swtbot.tests/META-INF/MANIFEST.MF
+++ b/analysis/org.eclipse.tracecompass.analysis.profiling.ui.swtbot.tests/META-INF/MANIFEST.MF
@@ -37,6 +37,5 @@
  org.eclipse.tracecompass.analysis.profiling.ui,
  org.eclipse.tracecompass.analysis.profiling.core.tests,
  org.eclipse.jdt.annotation;bundle-version="[2.0.0,3.0.0)";resolution:=optional
-Import-Package: com.google.common.collect,
- org.swtchart
+Import-Package: com.google.common.collect
 Automatic-Module-Name: org.eclipse.tracecompass.analysis.profiling.ui.swtbot.tests
diff --git a/analysis/org.eclipse.tracecompass.analysis.profiling.ui/META-INF/MANIFEST.MF b/analysis/org.eclipse.tracecompass.analysis.profiling.ui/META-INF/MANIFEST.MF
index 47868cf..13466e72 100644
--- a/analysis/org.eclipse.tracecompass.analysis.profiling.ui/META-INF/MANIFEST.MF
+++ b/analysis/org.eclipse.tracecompass.analysis.profiling.ui/META-INF/MANIFEST.MF
@@ -20,7 +20,6 @@
  org.eclipse.tracecompass.tmf.ui,
  org.eclipse.tracecompass.analysis.timing.core,
  org.eclipse.tracecompass.analysis.timing.ui,
- org.swtchart,
  org.eclipse.tracecompass.segmentstore.core,
  org.eclipse.tracecompass.datastore.core,
  org.eclipse.jdt.annotation;bundle-version="[2.0.0,3.0.0)";resolution:=optional
diff --git a/analysis/org.eclipse.tracecompass.analysis.timing.ui.swtbot.tests/META-INF/MANIFEST.MF b/analysis/org.eclipse.tracecompass.analysis.timing.ui.swtbot.tests/META-INF/MANIFEST.MF
index 3c02ded..8465aa1 100644
--- a/analysis/org.eclipse.tracecompass.analysis.timing.ui.swtbot.tests/META-INF/MANIFEST.MF
+++ b/analysis/org.eclipse.tracecompass.analysis.timing.ui.swtbot.tests/META-INF/MANIFEST.MF
@@ -32,6 +32,5 @@
  org.eclipse.tracecompass.segmentstore.core,
  org.eclipse.tracecompass.datastore.core,
  org.eclipse.jdt.annotation;bundle-version="[2.0.0,3.0.0)";resolution:=optional
-Import-Package: com.google.common.collect,
- org.swtchart
+Import-Package: com.google.common.collect
 Automatic-Module-Name: org.eclipse.tracecompass.analysis.timing.ui.swtbot.tests
diff --git a/analysis/org.eclipse.tracecompass.analysis.timing.ui/META-INF/MANIFEST.MF b/analysis/org.eclipse.tracecompass.analysis.timing.ui/META-INF/MANIFEST.MF
index d802b50..2848236 100644
--- a/analysis/org.eclipse.tracecompass.analysis.timing.ui/META-INF/MANIFEST.MF
+++ b/analysis/org.eclipse.tracecompass.analysis.timing.ui/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: %Bundle-Name
 Bundle-Vendor: %Bundle-Vendor
-Bundle-Version: 4.1.2.qualifier
+Bundle-Version: 5.0.0.qualifier
 Bundle-Localization: plugin
 Bundle-SymbolicName: org.eclipse.tracecompass.analysis.timing.ui;singleton:=true
 Bundle-Activator: org.eclipse.tracecompass.internal.analysis.timing.ui.Activator
@@ -17,21 +17,17 @@
  org.eclipse.tracecompass.segmentstore.core,
  org.eclipse.tracecompass.tmf.core,
  org.eclipse.tracecompass.tmf.ui,
- org.swtchart,
  org.eclipse.tracecompass.analysis.timing.ui,
  org.eclipse.jface,
  org.eclipse.jdt.annotation;bundle-version="[2.0.0,3.0.0)";resolution:=optional,
  org.eclipse.swtchart
 Export-Package: org.eclipse.tracecompass.analysis.timing.ui.views.segmentstore,
- org.eclipse.tracecompass.analysis.timing.ui.views.segmentstore.density,
  org.eclipse.tracecompass.analysis.timing.ui.views.segmentstore.density2,
  org.eclipse.tracecompass.analysis.timing.ui.views.segmentstore.scatter,
  org.eclipse.tracecompass.analysis.timing.ui.views.segmentstore.statistics,
  org.eclipse.tracecompass.analysis.timing.ui.views.segmentstore.table,
  org.eclipse.tracecompass.internal.analysis.timing.ui,
- org.eclipse.tracecompass.internal.analysis.timing.ui.views.segmentstore.density;x-internal:=true,
  org.eclipse.tracecompass.internal.analysis.timing.ui.views.segmentstore.density2;x-internal:=true,
- org.eclipse.tracecompass.internal.analysis.timing.ui.views.segmentstore.scatter;x-internal:=true,
  org.eclipse.tracecompass.internal.analysis.timing.ui.views.segmentstore.statistics;x-internal:=true,
  org.eclipse.tracecompass.internal.analysis.timing.ui.views.segmentstore.table;x-internal:=true,
  org.eclipse.tracecompass.internal.analysis.timing.ui.views.segmentstore.xyscatter;x-internal:=true
diff --git a/analysis/org.eclipse.tracecompass.analysis.timing.ui/src/org/eclipse/tracecompass/analysis/timing/ui/views/segmentstore/density/AbstractSegmentStoreDensityView.java b/analysis/org.eclipse.tracecompass.analysis.timing.ui/src/org/eclipse/tracecompass/analysis/timing/ui/views/segmentstore/density/AbstractSegmentStoreDensityView.java
deleted file mode 100644
index 439bb98..0000000
--- a/analysis/org.eclipse.tracecompass.analysis.timing.ui/src/org/eclipse/tracecompass/analysis/timing/ui/views/segmentstore/density/AbstractSegmentStoreDensityView.java
+++ /dev/null
@@ -1,183 +0,0 @@
-/******************************************************************************
- * Copyright (c) 2015, 2016 Ericsson
- *
- * All rights reserved. This program and the accompanying materials are
- * made available under the terms of the Eclipse Public License 2.0 which
- * accompanies this distribution, and is available at
- * https://www.eclipse.org/legal/epl-2.0/
- *
- * SPDX-License-Identifier: EPL-2.0
- *******************************************************************************/
-
-package org.eclipse.tracecompass.analysis.timing.ui.views.segmentstore.density;
-
-import org.eclipse.jdt.annotation.NonNull;
-import org.eclipse.jdt.annotation.Nullable;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.action.IToolBarManager;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.SashForm;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.tracecompass.analysis.timing.ui.views.segmentstore.table.AbstractSegmentStoreTableViewer;
-import org.eclipse.tracecompass.segmentstore.core.ISegment;
-import org.eclipse.tracecompass.tmf.core.signal.TmfTraceSelectedSignal;
-import org.eclipse.tracecompass.tmf.core.trace.ITmfTrace;
-import org.eclipse.tracecompass.tmf.core.trace.TmfTraceManager;
-import org.eclipse.tracecompass.tmf.core.util.Pair;
-import org.eclipse.tracecompass.tmf.ui.views.SaveImageUtil;
-import org.eclipse.tracecompass.tmf.ui.views.TmfView;
-
-import com.google.common.annotations.VisibleForTesting;
-
-/**
- * Displays the segment store analysis data in a density chart and a table
- * corresponding to the selected latencies.
- *
- * @author Matthew Khouzam
- * @author Marc-Andre Laperle
- * @deprecated use {@link org.eclipse.tracecompass.analysis.timing.ui.views.segmentstore.density2.AbstractSegmentStoreDensityViewer}
- */
-@Deprecated
-public abstract class AbstractSegmentStoreDensityView extends TmfView {
-
-    private static final int[] DEFAULT_WEIGHTS = new int[] { 4, 6 };
-
-    /**
-     * Default zoom range
-     * @since 4.1
-     */
-    public static final Pair<Double, Double> DEFAULT_RANGE = new Pair<>(Double.POSITIVE_INFINITY, Double.NEGATIVE_INFINITY);
-
-    private @Nullable AbstractSegmentStoreDensityViewer fDensityViewer;
-    private @Nullable AbstractSegmentStoreTableViewer fTableViewer;
-
-    /**
-     * Constructs a segment store density view
-     *
-     * @param viewName
-     *            the name of the view
-     */
-    public AbstractSegmentStoreDensityView(String viewName) {
-        super(viewName);
-    }
-
-    /**
-     * Used to keep the table in sync with the density viewer.
-     */
-    private final class DataChangedListener implements ISegmentStoreDensityViewerDataListener {
-
-        private void updateTableModel(@Nullable Iterable<? extends ISegment> data) {
-            final AbstractSegmentStoreTableViewer viewer = fTableViewer;
-            if (viewer != null && data != null) {
-                viewer.updateModel(data);
-            }
-        }
-
-        @Override
-        public void viewDataChanged(@NonNull Iterable<? extends @NonNull ISegment> newData) {
-            updateTableModel(newData);
-        }
-
-        @Override
-        public void selectedDataChanged(@Nullable Iterable<? extends @NonNull ISegment> newSelectionData) {
-            updateTableModel(newSelectionData);
-        }
-
-    }
-
-    @Override
-    public void createPartControl(@Nullable Composite parent) {
-        super.createPartControl(parent);
-        final SashForm sashForm = new SashForm(parent, SWT.NONE);
-
-        fTableViewer = createSegmentStoreTableViewer(sashForm);
-        fDensityViewer = createSegmentStoreDensityViewer(sashForm);
-        fDensityViewer.addDataListener(new DataChangedListener());
-
-        sashForm.setWeights(DEFAULT_WEIGHTS);
-
-        Action zoomOut = new ZoomOutAction(this);
-        IToolBarManager toolBar = getViewSite().getActionBars().getToolBarManager();
-        toolBar.add(zoomOut);
-        ITmfTrace trace = TmfTraceManager.getInstance().getActiveTrace();
-        if (trace != null) {
-            TmfTraceSelectedSignal signal = new TmfTraceSelectedSignal(this, trace);
-            if (fDensityViewer != null) {
-                fDensityViewer.traceSelected(signal);
-            }
-            if (fTableViewer != null) {
-                fTableViewer.traceSelected(signal);
-            }
-        }
-    }
-
-    @Override
-    protected @NonNull IAction createSaveAction() {
-        return SaveImageUtil.createSaveAction(getName(), this::getDensityViewer);
-    }
-
-    /**
-     * Create a table viewer suitable for displaying the segment store content.
-     *
-     * @param parent
-     *            the parent composite
-     * @return the table viewer
-     */
-    protected abstract AbstractSegmentStoreTableViewer createSegmentStoreTableViewer(Composite parent);
-
-    /**
-     * Create a density viewer suitable for displaying the segment store
-     * content.
-     *
-     * @param parent
-     *            the parent composite
-     * @return the density viewer
-     */
-    protected abstract AbstractSegmentStoreDensityViewer createSegmentStoreDensityViewer(Composite parent);
-
-    @Override
-    public void setFocus() {
-        final AbstractSegmentStoreDensityViewer viewer = fDensityViewer;
-        if (viewer != null) {
-            viewer.getControl().setFocus();
-        }
-    }
-
-    @Override
-    public void dispose() {
-        final AbstractSegmentStoreDensityViewer densityViewer = fDensityViewer;
-        if (densityViewer != null) {
-            densityViewer.dispose();
-        }
-
-        final AbstractSegmentStoreTableViewer tableViewer = fTableViewer;
-        if (tableViewer != null) {
-            tableViewer.dispose();
-        }
-
-        super.dispose();
-    }
-
-    /**
-     * Get the density viewer
-     *
-     * @return the density viewer
-     * @since 1.2
-     */
-    @VisibleForTesting
-    public @Nullable AbstractSegmentStoreDensityViewer getDensityViewer() {
-        return fDensityViewer;
-    }
-
-    /**
-     * Get the table viewer
-     *
-     * @return the table viewer
-     * @since 1.2
-     */
-    @VisibleForTesting
-    public @Nullable AbstractSegmentStoreTableViewer getTableViewer() {
-        return fTableViewer;
-    }
-}
\ No newline at end of file
diff --git a/analysis/org.eclipse.tracecompass.analysis.timing.ui/src/org/eclipse/tracecompass/analysis/timing/ui/views/segmentstore/density/AbstractSegmentStoreDensityViewer.java b/analysis/org.eclipse.tracecompass.analysis.timing.ui/src/org/eclipse/tracecompass/analysis/timing/ui/views/segmentstore/density/AbstractSegmentStoreDensityViewer.java
deleted file mode 100644
index 2616e2f..0000000
--- a/analysis/org.eclipse.tracecompass.analysis.timing.ui/src/org/eclipse/tracecompass/analysis/timing/ui/views/segmentstore/density/AbstractSegmentStoreDensityViewer.java
+++ /dev/null
@@ -1,660 +0,0 @@
-/******************************************************************************
- * Copyright (c) 2015, 2018 Ericsson
- *
- * All rights reserved. This program and the accompanying materials are
- * made available under the terms of the Eclipse Public License 2.0 which
- * accompanies this distribution, and is available at
- * https://www.eclipse.org/legal/epl-2.0/
- *
- * SPDX-License-Identifier: EPL-2.0
- *******************************************************************************/
-
-package org.eclipse.tracecompass.analysis.timing.ui.views.segmentstore.density;
-
-import static org.eclipse.tracecompass.common.core.NonNullUtils.nullToEmptyString;
-
-import java.text.Format;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Objects;
-import java.util.Set;
-import java.util.concurrent.CompletableFuture;
-import java.util.function.Predicate;
-
-import org.eclipse.jdt.annotation.NonNull;
-import org.eclipse.jdt.annotation.Nullable;
-import org.eclipse.jface.resource.ColorRegistry;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.RGB;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.tracecompass.analysis.timing.core.segmentstore.IAnalysisProgressListener;
-import org.eclipse.tracecompass.analysis.timing.core.segmentstore.ISegmentStoreProvider;
-import org.eclipse.tracecompass.common.core.NonNullUtils;
-import org.eclipse.tracecompass.common.core.format.SubSecondTimeWithUnitFormat;
-import org.eclipse.tracecompass.internal.analysis.timing.ui.views.segmentstore.density.MouseDragZoomProvider;
-import org.eclipse.tracecompass.internal.analysis.timing.ui.views.segmentstore.density.MouseSelectionProvider;
-import org.eclipse.tracecompass.internal.analysis.timing.ui.views.segmentstore.density.SimpleTooltipProvider;
-import org.eclipse.tracecompass.internal.analysis.timing.ui.views.segmentstore.table.SegmentStoreContentProvider.SegmentStoreWithRange;
-import org.eclipse.tracecompass.segmentstore.core.ISegment;
-import org.eclipse.tracecompass.segmentstore.core.ISegmentStore;
-import org.eclipse.tracecompass.segmentstore.core.SegmentComparators;
-import org.eclipse.tracecompass.tmf.core.analysis.IAnalysisModule;
-import org.eclipse.tracecompass.tmf.core.presentation.IYAppearance;
-import org.eclipse.tracecompass.tmf.core.presentation.IYAppearance.Type;
-import org.eclipse.tracecompass.tmf.core.presentation.RotatingPaletteProvider;
-import org.eclipse.tracecompass.tmf.core.signal.TmfSignalHandler;
-import org.eclipse.tracecompass.tmf.core.signal.TmfTraceClosedSignal;
-import org.eclipse.tracecompass.tmf.core.signal.TmfTraceOpenedSignal;
-import org.eclipse.tracecompass.tmf.core.signal.TmfTraceSelectedSignal;
-import org.eclipse.tracecompass.tmf.core.signal.TmfWindowRangeUpdatedSignal;
-import org.eclipse.tracecompass.tmf.core.timestamp.TmfTimeRange;
-import org.eclipse.tracecompass.tmf.core.trace.ITmfTrace;
-import org.eclipse.tracecompass.tmf.core.trace.TmfTraceContext;
-import org.eclipse.tracecompass.tmf.core.trace.TmfTraceManager;
-import org.eclipse.tracecompass.tmf.ui.colors.RGBAUtil;
-import org.eclipse.tracecompass.tmf.ui.viewers.IImageSave;
-import org.eclipse.tracecompass.tmf.ui.viewers.TmfViewer;
-import org.eclipse.tracecompass.tmf.ui.widgets.timegraph.widgets.TimeGraphColorScheme;
-import org.swtchart.Chart;
-import org.swtchart.IAxis;
-import org.swtchart.IBarSeries;
-import org.swtchart.ILegend;
-import org.swtchart.ILineSeries;
-import org.swtchart.ILineSeries.PlotSymbolType;
-import org.swtchart.ISeries;
-import org.swtchart.ISeries.SeriesType;
-import org.swtchart.ISeriesSet;
-import org.swtchart.LineStyle;
-import org.swtchart.Range;
-
-import com.google.common.annotations.VisibleForTesting;
-
-/**
- * Displays the segment store provider data in a density chart.
- *
- * @author Matthew Khouzam
- * @author Marc-Andre Laperle
- *
- * @since 2.0
- */
-@Deprecated
-public abstract class AbstractSegmentStoreDensityViewer extends TmfViewer implements IImageSave {
-
-    private static final Format DENSITY_TIME_FORMATTER = SubSecondTimeWithUnitFormat.getInstance();
-    private static final RGB BAR_COLOR = new RGB(0x42, 0x85, 0xf4);
-    private static final ColorRegistry COLOR_REGISTRY = new ColorRegistry();
-    private static final RotatingPaletteProvider PALETTE = new RotatingPaletteProvider.Builder().setSaturation(0.73f).setBrightness(0.957f).setNbColors(60).build();
-
-    /** The color scheme for the chart */
-    private TimeGraphColorScheme fColorScheme = new TimeGraphColorScheme();
-    private final Chart fChart;
-    private final MouseDragZoomProvider fDragZoomProvider;
-    private final MouseSelectionProvider fDragProvider;
-    private final SimpleTooltipProvider fTooltipProvider;
-
-    private @Nullable ITmfTrace fTrace;
-    private Map<@NonNull String, @NonNull IAnalysisProgressListener> fProgressListeners = new HashMap<>();
-    private final Map<@NonNull String, @NonNull ISegmentStoreProvider> fSegmentStoreProviders = new HashMap<>();
-    private Range fCurrentDurationRange = new Range(AbstractSegmentStoreDensityView.DEFAULT_RANGE.getFirst(), AbstractSegmentStoreDensityView.DEFAULT_RANGE.getSecond());
-    private TmfTimeRange fCurrentTimeRange = TmfTimeRange.NULL_RANGE;
-    private final List<ISegmentStoreDensityViewerDataListener> fListeners;
-    private int fOverrideNbPoints;
-    private String fSeriesType;
-    private final Set<@NonNull ITmfTrace> fTraces = new HashSet<>();
-
-    /**
-     * Constructs a new density viewer.
-     *
-     * @param parent
-     *            the parent of the viewer
-     */
-    public AbstractSegmentStoreDensityViewer(Composite parent) {
-        super(parent);
-        fListeners = new ArrayList<>();
-        fChart = new Chart(parent, SWT.NONE);
-        Color backgroundColor = fColorScheme.getColor(TimeGraphColorScheme.TOOL_BACKGROUND);
-        fChart.setBackground(backgroundColor);
-        backgroundColor = fColorScheme.getColor(TimeGraphColorScheme.BACKGROUND);
-        fChart.setBackgroundInPlotArea(backgroundColor);
-        parent.setBackground(backgroundColor);
-        Color foregroundColor = fColorScheme.getColor(TimeGraphColorScheme.TOOL_FOREGROUND);
-        fChart.setForeground(foregroundColor);
-        fChart.getLegend().setVisible(false);
-        fChart.getTitle().setVisible(false);
-        IAxis xAxis = fChart.getAxisSet().getXAxis(0);
-        IAxis yAxis = fChart.getAxisSet().getYAxis(0);
-        xAxis.getTitle().setText(nullToEmptyString(Messages.AbstractSegmentStoreDensityViewer_TimeAxisLabel));
-        yAxis.getTitle().setText(nullToEmptyString(Messages.AbstractSegmentStoreDensityViewer_CountAxisLabel));
-        xAxis.getTitle().setForeground(foregroundColor);
-        yAxis.getTitle().setForeground(foregroundColor);
-        xAxis.getTick().setForeground(foregroundColor);
-        yAxis.getTick().setForeground(foregroundColor);
-        xAxis.getGrid().setStyle(LineStyle.DOT);
-        yAxis.getGrid().setStyle(LineStyle.DOT);
-        fSeriesType = IYAppearance.Type.BAR;
-
-        fDragZoomProvider = new MouseDragZoomProvider(this);
-        fDragZoomProvider.register();
-        fDragProvider = new MouseSelectionProvider(this);
-        fDragProvider.register();
-        fTooltipProvider = new SimpleTooltipProvider(this);
-        fTooltipProvider.register();
-
-        fChart.addDisposeListener(e -> internalDispose());
-    }
-
-    /**
-     * Returns the segment store provider
-     *
-     * @param trace
-     *            The trace to consider
-     * @return the
-     */
-    protected abstract @Nullable ISegmentStoreProvider getSegmentStoreProvider(ITmfTrace trace);
-
-    @Nullable
-    private static ITmfTrace getTrace() {
-        return TmfTraceManager.getInstance().getActiveTrace();
-    }
-
-    /**
-     * Set the type of series you want
-     * @param type the type, bar or area
-     * @since 4.1
-     */
-    protected void setType(String type) {
-        switch (type) {
-        case Type.BAR:
-            fSeriesType = Type.BAR;
-            break;
-        case Type.AREA:
-            fSeriesType = Type.AREA;
-            break;
-        default:
-            break;
-        }
-    }
-
-    private synchronized void updateDisplay(String name, SegmentStoreWithRange<ISegment> data) {
-        ISeries series = fSeriesType.equals(Type.BAR) ? createSeries() : createAreaSeries(name);
-        int barWidth = 4;
-        int preWidth = fOverrideNbPoints == 0 ? fChart.getPlotArea().getBounds().width / barWidth : fOverrideNbPoints;
-        if (!fSeriesType.equals(Type.BAR)) {
-            preWidth += 2;
-        }
-        final int width = preWidth;
-        double[] xOrigSeries = new double[width];
-        double[] yOrigSeries = new double[width];
-        // Set a positive value that is greater than 0 and less than 1.0
-        Arrays.fill(yOrigSeries, Double.MIN_VALUE);
-        data.setComparator(SegmentComparators.INTERVAL_LENGTH_COMPARATOR);
-        ISegment maxSegment = data.getElement(SegmentStoreWithRange.LAST);
-        long maxLength = Long.MIN_VALUE;
-        if (maxSegment != null) {
-            maxLength = maxSegment.getLength();
-        } else {
-            for (ISegment segment : data) {
-                maxLength = Math.max(maxLength, segment.getLength());
-            }
-            if (maxLength == Long.MIN_VALUE) {
-                maxLength = 1;
-            }
-        }
-        double maxFactor = 1.0 / (maxLength + 1.0);
-        long minX = Long.MAX_VALUE;
-        for (ISegment segment : data) {
-            double xBox = segment.getLength() * maxFactor * width;
-            if (yOrigSeries[(int) xBox] < 1) {
-                yOrigSeries[(int) xBox] = 1;
-            } else {
-                yOrigSeries[(int) xBox]++;
-            }
-            minX = Math.min(minX, segment.getLength());
-        }
-        double timeWidth = (double) maxLength / (double) width;
-        for (int i = 0; i < width; i++) {
-            xOrigSeries[i] = i * timeWidth;
-            if (!fSeriesType.equals(Type.BAR)) {
-                xOrigSeries[i] += timeWidth / 2;
-            }
-        }
-        double maxY = Double.NEGATIVE_INFINITY;
-        for (int i = 0; i < width; i++) {
-            maxY = Math.max(maxY, yOrigSeries[i]);
-        }
-        if (minX == maxLength) {
-            maxLength++;
-            minX--;
-        }
-        series.setYSeries(yOrigSeries);
-        series.setXSeries(xOrigSeries);
-        final IAxis xAxis = fChart.getAxisSet().getXAxis(0);
-        /*
-         * adjustrange appears to bring origin back since we pad the series with
-         * 0s, not interesting.
-         */
-        Range currentDurationRange = fCurrentDurationRange;
-        if (Double.isFinite(currentDurationRange.lower) && Double.isFinite(currentDurationRange.upper)) {
-            xAxis.setRange(currentDurationRange);
-        } else {
-            xAxis.adjustRange();
-        }
-
-        xAxis.getTick().setFormat(DENSITY_TIME_FORMATTER);
-        ILegend legend = fChart.getLegend();
-        legend.setVisible(fSegmentStoreProviders.size() > 1);
-        legend.setPosition(SWT.BOTTOM);
-        /*
-         * Clamp range lower to 0.9 to make it log, 0.1 would be scientifically
-         * accurate, but we cannot have partial counts.
-         */
-        for (ISeries internalSeries : fChart.getSeriesSet().getSeries()) {
-            double[] ySeries = internalSeries.getYSeries();
-            for (int i = 0; i < ySeries.length; i++) {
-                maxY = Math.max(maxY, ySeries[i]);
-            }
-        }
-        fChart.getAxisSet().getYAxis(0).setRange(new Range(0.9, Math.max(1.0, maxY)));
-        fChart.getAxisSet().getYAxis(0).enableLogScale(true);
-        fChart.redraw();
-        new Thread(() -> {
-            for (ISegmentStoreDensityViewerDataListener l : fListeners) {
-                l.chartUpdated();
-            }
-        }).start();
-
-    }
-
-    private ISeries createSeries() {
-        IBarSeries series = (IBarSeries) fChart.getSeriesSet().createSeries(SeriesType.BAR, Messages.AbstractSegmentStoreDensityViewer_SeriesLabel);
-        series.setVisible(true);
-        series.setBarPadding(0);
-        series.setBarColor(getColorForRGB(BAR_COLOR));
-        return series;
-    }
-
-    private ISeries createAreaSeries(String name) {
-        ILineSeries series = (ILineSeries) fChart.getSeriesSet().createSeries(SeriesType.LINE, name);
-        series.setVisible(true);
-        series.enableStep(true);
-        series.enableArea(true);
-        series.setSymbolType(PlotSymbolType.NONE);
-        RGB rgb = getColorForItem(name);
-        Color color = getColorForRGB(rgb);
-        series.setLineColor(color);
-        return series;
-    }
-
-    private static Color getColorForRGB(RGB rgb) {
-        String rgbString = rgb.toString();
-        Color color = COLOR_REGISTRY.get(rgbString);
-        if (color == null) {
-            COLOR_REGISTRY.put(rgbString, rgb);
-            color = Objects.requireNonNull(COLOR_REGISTRY.get(rgbString));
-        }
-        return color;
-    }
-
-    /**
-     * Get the color for a series
-     *
-     * @param name
-     *            the series name
-     * @return The color in RGB
-     * @since 4.1
-     */
-    public RGB getColorForItem(String name) {
-        if (fSegmentStoreProviders.size() == 1) {
-            return BAR_COLOR;
-        }
-        Set<String> keys = fSegmentStoreProviders.keySet();
-        int i = 0;
-        for (String key : keys) {
-            if (key.equals(name)) {
-                break;
-            }
-            i++;
-        }
-        float pos = (float) i / keys.size();
-        int index = Math.max((int) (PALETTE.getNbColors() * pos), 0) % PALETTE.getNbColors();
-        return Objects.requireNonNull(RGBAUtil.fromRGBAColor(PALETTE.get().get(index)).rgb);
-    }
-
-    @Override
-    public Chart getControl() {
-        return fChart;
-    }
-
-    /**
-     * Select a range of latency durations in the viewer.
-     *
-     * @param durationRange
-     *            a range of latency durations
-     */
-    public void select(final Range durationRange) {
-        fCurrentDurationRange = durationRange;
-        final TmfTimeRange timeRange = fCurrentTimeRange;
-        computeDataAsync(timeRange, durationRange).thenAccept(data -> {
-            synchronized (fListeners) {
-                if (fCurrentTimeRange.equals(timeRange) && fCurrentDurationRange.equals(durationRange)) {
-                    for (ISegmentStoreDensityViewerDataListener listener : fListeners) {
-                        for (SegmentStoreWithRange<ISegment> value : data.values()) {
-                            listener.selectedDataChanged(value);
-                        }
-                    }
-                }
-            }
-        });
-    }
-
-    /**
-     * Zoom to a range of latency durations in the viewer.
-     *
-     * @param durationRange
-     *            a range of latency durations
-     */
-    public void zoom(final Range durationRange) {
-        fCurrentDurationRange = durationRange;
-        final TmfTimeRange timeRange = fCurrentTimeRange;
-        computeDataAsync(timeRange, durationRange).thenAccept(data -> {
-            synchronized (fListeners) {
-                if (fCurrentTimeRange.equals(timeRange) && fCurrentDurationRange.equals(durationRange)) {
-                    applyData(data);
-                }
-            }
-        });
-    }
-
-    private CompletableFuture<Map<String, SegmentStoreWithRange<ISegment>>> computeDataAsync(final TmfTimeRange timeRange, final Range durationRange) {
-        return CompletableFuture.supplyAsync(() -> computeData(timeRange, durationRange));
-    }
-
-    private @Nullable Map<String, SegmentStoreWithRange<ISegment>> computeData(final TmfTimeRange timeRange, final Range durationRange) {
-        Map<String, SegmentStoreWithRange<ISegment>> retVal = new HashMap<>();
-        for (Entry<String, ISegmentStoreProvider> entry : fSegmentStoreProviders.entrySet()) {
-            final ISegmentStoreProvider segmentProvider = Objects.requireNonNull(entry.getValue());
-            final ISegmentStore<ISegment> segStore = segmentProvider.getSegmentStore();
-            if (segStore == null) {
-                continue;
-            }
-
-            // Filter on the segment duration if necessary
-            if (durationRange.lower > Double.MIN_VALUE || durationRange.upper < Double.MAX_VALUE) {
-                Predicate<ISegment> predicate = segment -> segment.getLength() >= durationRange.lower && segment.getLength() <= durationRange.upper;
-                retVal.put(entry.getKey(), new SegmentStoreWithRange<>(segStore, timeRange, predicate));
-            } else {
-                retVal.put(entry.getKey(), new SegmentStoreWithRange<>(segStore, timeRange));
-            }
-        }
-        return retVal;
-    }
-
-    private void applyData(final Map<String, SegmentStoreWithRange<ISegment>> map) {
-        Set<Entry<String, SegmentStoreWithRange<ISegment>>> entrySet = map.entrySet();
-        entrySet.parallelStream().forEach(entry -> {
-            SegmentStoreWithRange<ISegment> data = Objects.requireNonNull(entry.getValue());
-            data.setComparator(SegmentComparators.INTERVAL_LENGTH_COMPARATOR);
-            Display.getDefault().asyncExec(() -> updateDisplay(entry.getKey(), data));
-            if (fSegmentStoreProviders.size() > 1) {
-                setType(Type.AREA);
-            } else {
-                setType(Type.BAR);
-            }
-            for (ISegmentStoreDensityViewerDataListener l : fListeners) {
-                l.viewDataChanged(data);
-            }
-        });
-    }
-
-    /**
-     * Sets the segment store provider
-     *
-     * @param ssp
-     *            The segment store provider to give to this view
-     *
-     * @since 1.2
-     */
-    @VisibleForTesting
-    public void setSegmentProvider(@Nullable ISegmentStoreProvider ssp) {
-        fSegmentStoreProviders.clear();
-        if (ssp != null) {
-            fSegmentStoreProviders.put("", ssp); //$NON-NLS-1$
-        }
-    }
-
-    /**
-     * Signal handler for handling of the window range signal.
-     *
-     * @param signal
-     *            The {@link TmfWindowRangeUpdatedSignal}
-     */
-    @TmfSignalHandler
-    public void windowRangeUpdated(@Nullable TmfWindowRangeUpdatedSignal signal) {
-        if (signal == null) {
-            return;
-        }
-        ITmfTrace parent = getTrace();
-        if (parent == null) {
-            return;
-        }
-        fCurrentTimeRange = NonNullUtils.checkNotNull(signal.getCurrentRange());
-        updateWindowRange(fCurrentTimeRange, false);
-        updateWithRange(fCurrentTimeRange);
-    }
-
-    /**
-     * Update the display range
-     *
-     * @param timeRange
-     *            the range
-     * @since 1.2
-     */
-    @VisibleForTesting
-    public void updateWithRange(final TmfTimeRange timeRange) {
-        fCurrentTimeRange = timeRange;
-        final Range durationRange = getDefaultRange();
-        fCurrentDurationRange = durationRange;
-        computeDataAsync(timeRange, durationRange).thenAccept(data -> {
-            synchronized (fListeners) {
-                if (fCurrentTimeRange.equals(timeRange) && fCurrentDurationRange.equals(durationRange)) {
-                    applyData(data);
-                }
-            }
-        });
-    }
-
-    @Override
-    public void refresh() {
-        fChart.redraw();
-    }
-
-    @Override
-    public void dispose() {
-        if (!fChart.isDisposed()) {
-            fChart.dispose();
-        }
-    }
-
-    private void internalDispose() {
-        fSegmentStoreProviders.entrySet().forEach(entry -> {
-            IAnalysisProgressListener listener = fProgressListeners.get(entry.getKey());
-            if (listener != null) {
-                Objects.requireNonNull(entry.getValue()).removeListener(listener);
-            }
-        });
-        fProgressListeners.clear();
-        fDragZoomProvider.deregister();
-        fTooltipProvider.deregister();
-        fDragProvider.deregister();
-        super.dispose();
-    }
-
-    /**
-     * Signal handler for handling of the trace opened signal.
-     *
-     * @param signal
-     *            The trace opened signal {@link TmfTraceOpenedSignal}
-     */
-    @TmfSignalHandler
-    public void traceOpened(TmfTraceOpenedSignal signal) {
-        if (fTrace != signal.getTrace()) {
-            loadTrace(getTrace());
-            fTrace = signal.getTrace();
-        }
-    }
-
-    /**
-     * Signal handler for handling of the trace selected signal.
-     *
-     * @param signal
-     *            The trace selected signal {@link TmfTraceSelectedSignal}
-     */
-    @TmfSignalHandler
-    public void traceSelected(TmfTraceSelectedSignal signal) {
-        if (fTrace != signal.getTrace()) {
-            loadTrace(getTrace());
-            fTrace = signal.getTrace();
-        }
-    }
-
-    /**
-     * Signal handler for handling of the trace closed signal.
-     *
-     * @param signal
-     *            The trace closed signal {@link TmfTraceClosedSignal}
-     */
-    @TmfSignalHandler
-    public void traceClosed(TmfTraceClosedSignal signal) {
-
-        if (signal.getTrace() != fTrace) {
-            return;
-        }
-
-        fTrace = null;
-        clearContent();
-    }
-
-    /**
-     * A Method to load a trace into the viewer.
-     *
-     * @param trace
-     *            A trace to apply in the viewer
-     */
-    protected void loadTrace(@Nullable ITmfTrace trace) {
-        clearContent();
-        TmfTraceContext ctx = TmfTraceManager.getInstance().getCurrentTraceContext();
-        TmfTimeRange windowRange = ctx.getWindowRange();
-        innerLoadTrace(trace);
-        updateWindowRange(windowRange, true);
-        fTrace = trace;
-        fCurrentTimeRange = windowRange;
-        zoom(getDefaultRange());
-    }
-
-    private void innerLoadTrace(@Nullable ITmfTrace trace) {
-        Set<ISegmentStoreProvider> sps = new HashSet<>();
-
-        if (trace != null) {
-            boolean newTrace = !Objects.equals(trace, fTrace) || fSegmentStoreProviders.isEmpty();
-            if (newTrace) {
-                fTraces.clear();
-                fSegmentStoreProviders.clear();
-                for (ITmfTrace child : TmfTraceManager.getTraceSet(trace)) {
-                    fTraces.add(child);
-                    ISegmentStoreProvider segmentStoreProvider = getSegmentStoreProvider(child);
-                    String name = child.getName();
-                    if (segmentStoreProvider != null && name != null) {
-                        fSegmentStoreProviders.put(name, segmentStoreProvider);
-                        sps.add(segmentStoreProvider);
-                    }
-                }
-                ISegmentStoreProvider segmentStoreProvider = getSegmentStoreProvider(trace);
-                String name = trace.getName();
-                if (segmentStoreProvider != null && name != null && !sps.contains(segmentStoreProvider)) {
-                    fSegmentStoreProviders.put(name, segmentStoreProvider);
-                }
-            }
-        }
-    }
-
-    private void updateWindowRange(TmfTimeRange windowRange, boolean updateListeners) {
-
-        for (Entry<@NonNull String, @NonNull ISegmentStoreProvider> entry : fSegmentStoreProviders.entrySet()) {
-            ISegmentStoreProvider provider = Objects.requireNonNull(entry.getValue());
-            if (updateListeners) {
-                IAnalysisProgressListener listener = (segmentProvider, data) -> updateWithRange(windowRange);
-                provider.addListener(listener);
-                fProgressListeners.put(entry.getKey(), listener);
-            }
-            if (provider instanceof IAnalysisModule) {
-                ((IAnalysisModule) provider).schedule();
-            }
-        }
-    }
-
-    private static Range getDefaultRange() {
-        return new Range(AbstractSegmentStoreDensityView.DEFAULT_RANGE.getFirst(), AbstractSegmentStoreDensityView.DEFAULT_RANGE.getSecond());
-    }
-
-    /**
-     * Clears the view content.
-     */
-    private void clearContent() {
-        final Chart chart = fChart;
-        if (!chart.isDisposed()) {
-            ISeriesSet set = chart.getSeriesSet();
-            ISeries[] series = set.getSeries();
-            for (int i = 0; i < series.length; i++) {
-                set.deleteSeries(series[i].getId());
-            }
-            for (IAxis axis : chart.getAxisSet().getAxes()) {
-                axis.setRange(new Range(0, 1));
-            }
-            chart.redraw();
-        }
-    }
-
-    /**
-     * Force the number of points to a fixed value
-     *
-     * @param nbPoints
-     *            The number of points to display, cannot be negative. 0 means use
-     *            native resolution. any positive integer means that number of
-     *            points
-     * @since 2.2
-     */
-    public synchronized void setNbPoints(int nbPoints) {
-        if (nbPoints < 0) {
-            throw new IllegalArgumentException("Number of points cannot be negative"); //$NON-NLS-1$
-        }
-        fOverrideNbPoints = nbPoints;
-        updateWithRange(fCurrentTimeRange);
-    }
-
-    /**
-     * Add a data listener.
-     *
-     * @param dataListener
-     *            the data listener to add
-     */
-    public void addDataListener(ISegmentStoreDensityViewerDataListener dataListener) {
-        fListeners.add(dataListener);
-    }
-
-    /**
-     * Remove a data listener.
-     *
-     * @param dataListener
-     *            the data listener to remove
-     */
-    public void removeDataListener(ISegmentStoreDensityViewerDataListener dataListener) {
-        fListeners.remove(dataListener);
-    }
-}
\ No newline at end of file
diff --git a/analysis/org.eclipse.tracecompass.analysis.timing.ui/src/org/eclipse/tracecompass/analysis/timing/ui/views/segmentstore/density/ISegmentStoreDensityViewerDataListener.java b/analysis/org.eclipse.tracecompass.analysis.timing.ui/src/org/eclipse/tracecompass/analysis/timing/ui/views/segmentstore/density/ISegmentStoreDensityViewerDataListener.java
deleted file mode 100644
index 6bd2c8e..0000000
--- a/analysis/org.eclipse.tracecompass.analysis.timing.ui/src/org/eclipse/tracecompass/analysis/timing/ui/views/segmentstore/density/ISegmentStoreDensityViewerDataListener.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/******************************************************************************
- * Copyright (c) 2015, 2018 Ericsson
- *
- * All rights reserved. This program and the accompanying materials are
- * made available under the terms of the Eclipse Public License 2.0 which
- * accompanies this distribution, and is available at
- * https://www.eclipse.org/legal/epl-2.0/
- *
- * SPDX-License-Identifier: EPL-2.0
- *******************************************************************************/
-
-package org.eclipse.tracecompass.analysis.timing.ui.views.segmentstore.density;
-
-import org.eclipse.jdt.annotation.Nullable;
-import org.eclipse.tracecompass.segmentstore.core.ISegment;
-
-/**
- * A listener that gets notified when the viewer sees its data changed or its
- * data selection change.
- */
-@Deprecated
-public interface ISegmentStoreDensityViewerDataListener {
-
-    /**
-     * Notification that the data changed in the viewer.
-     *
-     * @param newData
-     *            the new data
-     * @since 2.0
-     */
-    default void viewDataChanged(Iterable<? extends ISegment> newData) {
-        // To be implemented by children
-    }
-
-    /**
-     * Notification that the selection of the data changed in the viewer.
-     *
-     * @param newSelectionData
-     *            the new selection of the data
-     * @since 2.0
-     */
-    default void selectedDataChanged(@Nullable Iterable<? extends ISegment> newSelectionData) {
-        // To be implemented in children
-    }
-
-    /**
-     * Notification that chart updated
-     * @since 2.2
-     */
-    default void chartUpdated() {
-        // To be implemented in children
-    }
-
-}
diff --git a/analysis/org.eclipse.tracecompass.analysis.timing.ui/src/org/eclipse/tracecompass/analysis/timing/ui/views/segmentstore/density/Messages.java b/analysis/org.eclipse.tracecompass.analysis.timing.ui/src/org/eclipse/tracecompass/analysis/timing/ui/views/segmentstore/density/Messages.java
deleted file mode 100644
index 495e409..0000000
--- a/analysis/org.eclipse.tracecompass.analysis.timing.ui/src/org/eclipse/tracecompass/analysis/timing/ui/views/segmentstore/density/Messages.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2015 Ericsson
- *
- * All rights reserved. This program and the accompanying materials are
- * made available under the terms of the Eclipse Public License 2.0 which
- * accompanies this distribution, and is available at
- * https://www.eclipse.org/legal/epl-2.0/
- *
- * SPDX-License-Identifier: EPL-2.0
- *******************************************************************************/
-
-package org.eclipse.tracecompass.analysis.timing.ui.views.segmentstore.density;
-
-import org.eclipse.jdt.annotation.NonNullByDefault;
-import org.eclipse.osgi.util.NLS;
-
-/**
- * @author Marc-Andre Laperle
- */
-@Deprecated
-@NonNullByDefault({})
-public class Messages extends NLS {
-    private static final String BUNDLE_NAME = "org.eclipse.tracecompass.analysis.timing.ui.views.segmentstore.density.messages"; //$NON-NLS-1$
-
-    /**
-     * Label for the count axis of the density chart.
-     */
-    public static String AbstractSegmentStoreDensityViewer_CountAxisLabel;
-
-    /**
-     * Label for the time axis of the density chart.
-     */
-    public static String AbstractSegmentStoreDensityViewer_TimeAxisLabel;
-
-    /**
-     * Tool-tip for the Zoom out action
-     */
-    public static String AbstractSegmentStoreDensityViewer_ZoomOutActionToolTipText;
-
-    /**
-     * Label for the series of the density chart.
-     */
-    public static String AbstractSegmentStoreDensityViewer_SeriesLabel;
-
-    static {
-        // initialize resource bundle
-        NLS.initializeMessages(BUNDLE_NAME, Messages.class);
-    }
-
-    private Messages() {
-    }
-}
diff --git a/analysis/org.eclipse.tracecompass.analysis.timing.ui/src/org/eclipse/tracecompass/analysis/timing/ui/views/segmentstore/density/ZoomOutAction.java b/analysis/org.eclipse.tracecompass.analysis.timing.ui/src/org/eclipse/tracecompass/analysis/timing/ui/views/segmentstore/density/ZoomOutAction.java
deleted file mode 100644
index 1e9aa15..0000000
--- a/analysis/org.eclipse.tracecompass.analysis.timing.ui/src/org/eclipse/tracecompass/analysis/timing/ui/views/segmentstore/density/ZoomOutAction.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/******************************************************************************
- * Copyright (c) 2015 Ericsson
- *
- * All rights reserved. This program and the accompanying materials are
- * made available under the terms of the Eclipse Public License 2.0 which
- * accompanies this distribution, and is available at
- * https://www.eclipse.org/legal/epl-2.0/
- *
- * SPDX-License-Identifier: EPL-2.0
- *******************************************************************************/
-
-package org.eclipse.tracecompass.analysis.timing.ui.views.segmentstore.density;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.tracecompass.analysis.timing.ui.views.segmentstore.AnalysisTimingImageConstants;
-import org.eclipse.tracecompass.common.core.NonNullUtils;
-import org.eclipse.tracecompass.internal.analysis.timing.ui.Activator;
-import org.swtchart.Range;
-
-/**
- * Zoom action for the density view
- */
-@Deprecated
-class ZoomOutAction extends Action {
-
-    private final AbstractSegmentStoreDensityView fView;
-
-    /**
-     * Constructors a ZoomOutAction.
-     *
-     * @param densityViewer
-     *            The parent density viewer
-     */
-    public ZoomOutAction(AbstractSegmentStoreDensityView densityViewer) {
-        fView = densityViewer;
-    }
-
-    @Override
-    public void run() {
-        final AbstractSegmentStoreDensityViewer chart = fView.getDensityViewer();
-        if (chart != null) {
-            chart.zoom(new Range(AbstractSegmentStoreDensityView.DEFAULT_RANGE.getFirst(), AbstractSegmentStoreDensityView.DEFAULT_RANGE.getSecond()));
-        }
-    }
-
-    @Override
-    public ImageDescriptor getImageDescriptor() {
-        return NonNullUtils.checkNotNull(Activator.getDefault().getImageDescripterFromPath(AnalysisTimingImageConstants.IMG_UI_ZOOM_OUT_MENU));
-    }
-
-    @Override
-    public String getToolTipText() {
-        return NonNullUtils.checkNotNull(Messages.AbstractSegmentStoreDensityViewer_ZoomOutActionToolTipText);
-    }
-}
\ No newline at end of file
diff --git a/analysis/org.eclipse.tracecompass.analysis.timing.ui/src/org/eclipse/tracecompass/analysis/timing/ui/views/segmentstore/density/messages.properties b/analysis/org.eclipse.tracecompass.analysis.timing.ui/src/org/eclipse/tracecompass/analysis/timing/ui/views/segmentstore/density/messages.properties
deleted file mode 100644
index a9512d6..0000000
--- a/analysis/org.eclipse.tracecompass.analysis.timing.ui/src/org/eclipse/tracecompass/analysis/timing/ui/views/segmentstore/density/messages.properties
+++ /dev/null
@@ -1,15 +0,0 @@
-###############################################################################
-# Copyright (c) 2015 Ericsson
-#
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License 2.0
-# which accompanies this distribution, and is available at
-# https://www.eclipse.org/legal/epl-2.0/
-#
-# SPDX-License-Identifier: EPL-2.0
-###############################################################################
-
-AbstractSegmentStoreDensityViewer_CountAxisLabel=Count
-AbstractSegmentStoreDensityViewer_TimeAxisLabel=Duration
-AbstractSegmentStoreDensityViewer_ZoomOutActionToolTipText=Zoom Out
-AbstractSegmentStoreDensityViewer_SeriesLabel=Latencies
diff --git a/analysis/org.eclipse.tracecompass.analysis.timing.ui/src/org/eclipse/tracecompass/analysis/timing/ui/views/segmentstore/density/package-info.java b/analysis/org.eclipse.tracecompass.analysis.timing.ui/src/org/eclipse/tracecompass/analysis/timing/ui/views/segmentstore/density/package-info.java
deleted file mode 100644
index b638a3f..0000000
--- a/analysis/org.eclipse.tracecompass.analysis.timing.ui/src/org/eclipse/tracecompass/analysis/timing/ui/views/segmentstore/density/package-info.java
+++ /dev/null
@@ -1,13 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2015 Ericsson
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License 2.0
- * which accompanies this distribution, and is available at
- * https://www.eclipse.org/legal/epl-2.0/
- *
- * SPDX-License-Identifier: EPL-2.0
- *******************************************************************************/
-
-@org.eclipse.jdt.annotation.NonNullByDefault
-package org.eclipse.tracecompass.analysis.timing.ui.views.segmentstore.density;
diff --git a/analysis/org.eclipse.tracecompass.analysis.timing.ui/src/org/eclipse/tracecompass/analysis/timing/ui/views/segmentstore/scatter/AbstractSegmentStoreScatterChartTreeViewer.java b/analysis/org.eclipse.tracecompass.analysis.timing.ui/src/org/eclipse/tracecompass/analysis/timing/ui/views/segmentstore/scatter/AbstractSegmentStoreScatterChartTreeViewer.java
deleted file mode 100644
index fec1144..0000000
--- a/analysis/org.eclipse.tracecompass.analysis.timing.ui/src/org/eclipse/tracecompass/analysis/timing/ui/views/segmentstore/scatter/AbstractSegmentStoreScatterChartTreeViewer.java
+++ /dev/null
@@ -1,139 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2017 École Polytechnique de Montréal
- *
- * All rights reserved. This program and the accompanying materials are
- * made available under the terms of the Eclipse Public License 2.0 which
- * accompanies this distribution, and is available at
- * https://www.eclipse.org/legal/epl-2.0/
- *
- * SPDX-License-Identifier: EPL-2.0
- *******************************************************************************/
-
-package org.eclipse.tracecompass.analysis.timing.ui.views.segmentstore.scatter;
-
-import java.util.Comparator;
-
-import org.eclipse.jdt.annotation.NonNull;
-import org.eclipse.jdt.annotation.Nullable;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.tracecompass.analysis.timing.core.segmentstore.IAnalysisProgressListener;
-import org.eclipse.tracecompass.analysis.timing.core.segmentstore.ISegmentStoreProvider;
-import org.eclipse.tracecompass.internal.analysis.timing.core.segmentstore.SegmentStoreScatterDataProvider;
-import org.eclipse.tracecompass.internal.tmf.ui.commands.Messages;
-import org.eclipse.tracecompass.segmentstore.core.ISegment;
-import org.eclipse.tracecompass.segmentstore.core.ISegmentStore;
-import org.eclipse.tracecompass.tmf.core.analysis.IAnalysisModule;
-import org.eclipse.tracecompass.tmf.core.dataprovider.DataProviderManager;
-import org.eclipse.tracecompass.tmf.core.model.tree.ITmfTreeDataModel;
-import org.eclipse.tracecompass.tmf.core.model.tree.ITmfTreeDataProvider;
-import org.eclipse.tracecompass.tmf.core.model.tree.TmfTreeDataModel;
-import org.eclipse.tracecompass.tmf.core.model.xy.ITmfTreeXYDataProvider;
-import org.eclipse.tracecompass.tmf.core.trace.ITmfTrace;
-import org.eclipse.tracecompass.tmf.core.trace.TmfTraceUtils;
-import org.eclipse.tracecompass.tmf.ui.viewers.tree.AbstractSelectTreeViewer;
-import org.eclipse.tracecompass.tmf.ui.viewers.tree.ITmfTreeColumnDataProvider;
-import org.eclipse.tracecompass.tmf.ui.viewers.tree.TmfGenericTreeEntry;
-import org.eclipse.tracecompass.tmf.ui.viewers.tree.TmfTreeColumnData;
-
-import com.google.common.collect.ImmutableList;
-
-/**
- * Abstract tree viewer to go along with the scatter chart viewer in segment
- * store scatter views
- *
- * @author Geneviève Bastien
- * @since 3.0
- * @deprecated use {@link AbstractSegmentStoreScatterChartTreeViewer2} instead
- */
-@Deprecated
-public class AbstractSegmentStoreScatterChartTreeViewer extends AbstractSelectTreeViewer {
-
-    private final String fAnalysisId;
-    private @Nullable ISegmentStoreProvider fSegmentProvider = null;
-    private SegmentStoreProviderProgressListener fListener = new SegmentStoreProviderProgressListener();
-
-    private final class SegStoreScatterLabelProvider extends TreeLabelProvider {
-
-        @Override
-        public @Nullable Image getColumnImage(@Nullable Object element, int columnIndex) {
-            if (columnIndex == 1 && element instanceof TmfGenericTreeEntry && isChecked(element)) {
-                TmfGenericTreeEntry<TmfTreeDataModel> entry = (TmfGenericTreeEntry<TmfTreeDataModel>) element;
-                if (!entry.hasChildren()) {
-                    // ensures that only leaf nodes return images
-                    return getLegendImage(entry.getModel().getId());
-                }
-            }
-            return null;
-        }
-    }
-
-    /**
-     * Listener to update the model with the segment store provider results once
-     * its store is fully completed
-     */
-    private final class SegmentStoreProviderProgressListener implements IAnalysisProgressListener {
-        @Override
-        public void onComplete(ISegmentStoreProvider activeProvider, ISegmentStore<ISegment> data) {
-            /*
-             * Check if the active trace was changed while the provider was building its
-             * segment store
-             */
-            if (activeProvider.equals(fSegmentProvider)) {
-                updateContent(getWindowStartTime(), getWindowEndTime(), false);
-            }
-        }
-    }
-
-    /**
-     * Constructor
-     *
-     * @param parent
-     *            The parent composite
-     * @param analysisId
-     *            The ID of the analysis to show in this viewer
-     */
-    public AbstractSegmentStoreScatterChartTreeViewer(Composite parent, String analysisId) {
-        super(parent, 1, SegmentStoreScatterDataProvider.ID);
-        fAnalysisId = analysisId;
-        setLabelProvider(new SegStoreScatterLabelProvider());
-    }
-
-    /**
-     * Get the analysis ID used to retrieve the scatter data provider. Extenders may
-     * override this method to return another analysis ID than the one in the
-     * constructor
-     *
-     * @return The analysis ID
-     */
-    protected String getAnalysisId() {
-        return fAnalysisId;
-    }
-
-    @Override
-    protected @Nullable ITmfTreeDataProvider<@NonNull ITmfTreeDataModel> getProvider(@NonNull ITmfTrace trace) {
-        String analysisId = getAnalysisId();
-        /* Support legacy code, get the analysis ID of the segment store */
-        if (analysisId.isEmpty()) {
-            return null;
-        }
-        /* End support of legacy */
-        // TODO: Find another mechanism to update the view rather than listeners, so
-        // that we don't need to expose the analysis to the view
-        IAnalysisModule module = TmfTraceUtils.getAnalysisModuleOfClass(trace, IAnalysisModule.class, analysisId);
-        if (!(module instanceof ISegmentStoreProvider)) {
-            return null;
-        }
-        fSegmentProvider = (ISegmentStoreProvider) module;
-        ((ISegmentStoreProvider) module).addListener(fListener);
-        return DataProviderManager.getInstance().getDataProvider(trace, SegmentStoreScatterDataProvider.ID + ':' + analysisId, ITmfTreeXYDataProvider.class);
-    }
-
-    @Override
-    protected ITmfTreeColumnDataProvider getColumnDataProvider() {
-        return () -> ImmutableList.of(
-                    createColumn(Messages.AbstractSegmentStoreScatterView_Type, Comparator.comparing(TmfGenericTreeEntry::getName)),
-                    new TmfTreeColumnData(Messages.AbstractSegmentStoreScatterView_Legend));
-    }
-
-}
diff --git a/analysis/org.eclipse.tracecompass.analysis.timing.ui/src/org/eclipse/tracecompass/analysis/timing/ui/views/segmentstore/scatter/AbstractSegmentStoreScatterChartViewer.java b/analysis/org.eclipse.tracecompass.analysis.timing.ui/src/org/eclipse/tracecompass/analysis/timing/ui/views/segmentstore/scatter/AbstractSegmentStoreScatterChartViewer.java
deleted file mode 100644
index ddb596b..0000000
--- a/analysis/org.eclipse.tracecompass.analysis.timing.ui/src/org/eclipse/tracecompass/analysis/timing/ui/views/segmentstore/scatter/AbstractSegmentStoreScatterChartViewer.java
+++ /dev/null
@@ -1,160 +0,0 @@
-/******************************************************************************
- * Copyright (c) 2017 Ericsson
- *
- * All rights reserved. This program and the accompanying materials are
- * made available under the terms of the Eclipse Public License 2.0 which
- * accompanies this distribution, and is available at
- * https://www.eclipse.org/legal/epl-2.0/
- *
- * SPDX-License-Identifier: EPL-2.0
- *******************************************************************************/
-
-package org.eclipse.tracecompass.analysis.timing.ui.views.segmentstore.scatter;
-
-import java.text.Format;
-
-import org.eclipse.jdt.annotation.NonNull;
-import org.eclipse.jdt.annotation.Nullable;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.tracecompass.common.core.format.SubSecondTimeWithUnitFormat;
-import org.eclipse.tracecompass.internal.analysis.timing.core.segmentstore.SegmentStoreScatterDataProvider;
-import org.eclipse.tracecompass.internal.analysis.timing.ui.views.segmentstore.scatter.SegmentStoreScatterGraphTooltipProvider;
-import org.eclipse.tracecompass.tmf.core.dataprovider.DataProviderManager;
-import org.eclipse.tracecompass.tmf.core.model.OutputElementStyle;
-import org.eclipse.tracecompass.tmf.core.model.xy.ITmfTreeXYDataProvider;
-import org.eclipse.tracecompass.tmf.core.model.xy.ITmfXYDataProvider;
-import org.eclipse.tracecompass.tmf.core.presentation.IYAppearance;
-import org.eclipse.tracecompass.tmf.core.signal.TmfSignalHandler;
-import org.eclipse.tracecompass.tmf.core.signal.TmfTraceClosedSignal;
-import org.eclipse.tracecompass.tmf.core.signal.TmfTraceOpenedSignal;
-import org.eclipse.tracecompass.tmf.core.signal.TmfTraceSelectedSignal;
-import org.eclipse.tracecompass.tmf.core.timestamp.TmfTimeRange;
-import org.eclipse.tracecompass.tmf.core.trace.ITmfTrace;
-import org.eclipse.tracecompass.tmf.core.trace.TmfTraceManager;
-import org.eclipse.tracecompass.tmf.ui.viewers.xycharts.linecharts.TmfFilteredXYChartViewer;
-import org.eclipse.tracecompass.tmf.ui.viewers.xycharts.linecharts.TmfXYChartSettings;
-
-/**
- * Displays the segment store provider data in a SWT scatter chart
- *
- * @author Yonni Chen
- * @since 2.1
- * @deprecated use {@link org.eclipse.tracecompass.analysis.timing.ui.views.segmentstore.scatter.AbstractSegmentStoreScatterChartViewer2}
- */
-@Deprecated
-public class AbstractSegmentStoreScatterChartViewer extends TmfFilteredXYChartViewer {
-
-    private static final Format FORMAT =SubSecondTimeWithUnitFormat.getInstance();
-    private static final int DEFAULT_SERIES_WIDTH = 1;
-    private String fAnalysisId;
-
-    /**
-     * Constructor
-     *
-     * @param parent
-     *            parent composite
-     * @param settings
-     *            See {@link TmfXYChartSettings} to know what it contains
-     */
-    public AbstractSegmentStoreScatterChartViewer(Composite parent, TmfXYChartSettings settings) {
-        this(parent, settings, ""); //$NON-NLS-1$
-    }
-
-    /**
-     * Constructor
-     *
-     * @param parent
-     *            parent composite
-     * @param settings
-     *            See {@link TmfXYChartSettings} to know what it contains
-     * @param analysisId
-     *            The ID of the analysis to show in this viewer
-     * @since 3.0
-     */
-    public AbstractSegmentStoreScatterChartViewer(Composite parent, TmfXYChartSettings settings, String analysisId) {
-        super(parent, settings, SegmentStoreScatterDataProvider.ID);
-        fAnalysisId = analysisId;
-        setTooltipProvider(new SegmentStoreScatterGraphTooltipProvider(this));
-        getSwtChart().getLegend().setVisible(false);
-        getSwtChart().getAxisSet().getYAxis(0).getTick().setFormat(FORMAT);
-    }
-
-    // ------------------------------------------------------------------------
-    // Operations
-    // ------------------------------------------------------------------------
-
-    /**
-     * Get the analysis ID to show in the viewer
-     *
-     * @return The analysis ID
-     * @since 3.0
-     */
-    protected String getAnalysisId() {
-        return fAnalysisId;
-    }
-
-    @Override
-    protected @Nullable ITmfXYDataProvider initializeDataProvider(ITmfTrace trace) {
-        String analysisId = getAnalysisId();
-
-        if (analysisId.isEmpty()) {
-            /* Should not happen anymore since legacy code,
-             * that get the analysis ID of the segment store, is removed */
-            return null;
-        }
-        return DataProviderManager.getInstance().getDataProvider(trace, SegmentStoreScatterDataProvider.ID + ':' + analysisId, ITmfTreeXYDataProvider.class);
-    }
-
-    // ------------------------------------------------------------------------
-    // Signal handlers
-    // ------------------------------------------------------------------------
-
-    /**
-     * @param signal
-     *            Signal received when a different trace is selected
-     */
-    @Override
-    @TmfSignalHandler
-    public void traceSelected(@Nullable TmfTraceSelectedSignal signal) {
-        super.traceSelected(signal);
-        if (getTrace() != null) {
-            final TmfTimeRange timeRange = TmfTraceManager.getInstance().getCurrentTraceContext().getWindowRange();
-            setWindowRange(timeRange.getStartTime().toNanos(), timeRange.getEndTime().toNanos());
-        }
-    }
-
-    /**
-     * @param signal
-     *            Signal received when trace is opened
-     */
-    @Override
-    @TmfSignalHandler
-    public void traceOpened(@Nullable TmfTraceOpenedSignal signal) {
-        super.traceOpened(signal);
-        if (getTrace() != null) {
-            final TmfTimeRange timeRange = TmfTraceManager.getInstance().getCurrentTraceContext().getWindowRange();
-            setWindowRange(timeRange.getStartTime().toNanos(), timeRange.getEndTime().toNanos());
-        }
-    }
-
-    @Override
-    public OutputElementStyle getSeriesStyle(@NonNull Long seriesId) {
-        return getPresentationProvider().getSeriesStyle(seriesId, IYAppearance.Type.SCATTER, DEFAULT_SERIES_WIDTH);
-    }
-
-    /**
-     * @param signal
-     *            Signal received when last opened trace is closed
-     */
-    @Override
-    @TmfSignalHandler
-    public void traceClosed(@Nullable TmfTraceClosedSignal signal) {
-        super.traceClosed(signal);
-
-        // Check if there is no more opened trace
-        if (signal != null && TmfTraceManager.getInstance().getActiveTrace() == null) {
-            clearContent();
-        }
-        refresh();
-    }
-}
diff --git a/analysis/org.eclipse.tracecompass.analysis.timing.ui/src/org/eclipse/tracecompass/analysis/timing/ui/views/segmentstore/scatter/SegmentStoreScatterView.java b/analysis/org.eclipse.tracecompass.analysis.timing.ui/src/org/eclipse/tracecompass/analysis/timing/ui/views/segmentstore/scatter/SegmentStoreScatterView.java
deleted file mode 100644
index 452a7fd..0000000
--- a/analysis/org.eclipse.tracecompass.analysis.timing.ui/src/org/eclipse/tracecompass/analysis/timing/ui/views/segmentstore/scatter/SegmentStoreScatterView.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2017 École Polytechnique de Montréal
- *
- * All rights reserved. This program and the accompanying materials are
- * made available under the terms of the Eclipse Public License 2.0 which
- * accompanies this distribution, and is available at
- * https://www.eclipse.org/legal/epl-2.0/
- *
- * SPDX-License-Identifier: EPL-2.0
- *******************************************************************************/
-
-package org.eclipse.tracecompass.analysis.timing.ui.views.segmentstore.scatter;
-
-import static org.eclipse.tracecompass.common.core.NonNullUtils.nullToEmptyString;
-
-import java.util.Objects;
-
-import org.eclipse.jdt.annotation.NonNull;
-import org.eclipse.jdt.annotation.Nullable;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.tracecompass.internal.analysis.timing.ui.views.segmentstore.scatter.Messages;
-import org.eclipse.tracecompass.tmf.ui.viewers.TmfViewer;
-import org.eclipse.tracecompass.tmf.ui.viewers.xycharts.TmfXYChartViewer;
-import org.eclipse.tracecompass.tmf.ui.viewers.xycharts.linecharts.TmfXYChartSettings;
-import org.eclipse.tracecompass.tmf.ui.views.TmfChartView;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.views.IViewDescriptor;
-
-/**
- * Scatter graph showing the segments' data in the form a scatter view.
- *
- * @author Geneviève Bastien
- * @since 3.0
- * {@link org.eclipse.tracecompass.analysis.timing.ui.views.segmentstore.scatter.SegmentStoreScatterView2}
- */
-@Deprecated
-public class SegmentStoreScatterView extends TmfChartView {
-    /**
-     * ID of this view
-     */
-    public static final String ID = "org.eclipse.tracecompass.analysis.timing.ui.segstore.scatter"; //$NON-NLS-1$
-
-    /**
-     * Constructor
-     */
-    public SegmentStoreScatterView() {
-        super(ID);
-    }
-
-    @Override
-    public void createPartControl(@Nullable Composite parent) {
-        super.createPartControl(parent);
-        // Set the title of the view from the actual view ID
-        IViewDescriptor desc = PlatformUI.getWorkbench().getViewRegistry().find(getViewId());
-        if (desc != null) {
-            setPartName(desc.getLabel());
-        }
-    }
-
-    @Override
-    protected TmfXYChartViewer createChartViewer(@Nullable Composite parent) {
-        String analysisId = String.valueOf(getViewSite().getSecondaryId());
-        return new AbstractSegmentStoreScatterChartViewer(Objects.requireNonNull(parent),
-                new TmfXYChartSettings(nullToEmptyString(Messages.SegmentStoreScatterGraphViewer_title), nullToEmptyString(Messages.SegmentStoreScatterGraphViewer_xAxis),
-                        nullToEmptyString(Messages.SegmentStoreScatterGraphViewer_yAxis), 1), analysisId);
-    }
-
-    @Override
-    protected @NonNull TmfViewer createLeftChildViewer(@Nullable Composite parent) {
-        String analysisId = String.valueOf(getViewSite().getSecondaryId());
-        return new AbstractSegmentStoreScatterChartTreeViewer(Objects.requireNonNull(parent), analysisId);
-    }
-
-}
diff --git a/analysis/org.eclipse.tracecompass.analysis.timing.ui/src/org/eclipse/tracecompass/internal/analysis/timing/ui/views/segmentstore/density/BaseMouseProvider.java b/analysis/org.eclipse.tracecompass.analysis.timing.ui/src/org/eclipse/tracecompass/internal/analysis/timing/ui/views/segmentstore/density/BaseMouseProvider.java
deleted file mode 100644
index a91cece..0000000
--- a/analysis/org.eclipse.tracecompass.analysis.timing.ui/src/org/eclipse/tracecompass/internal/analysis/timing/ui/views/segmentstore/density/BaseMouseProvider.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/**********************************************************************
- * Copyright (c) 2015 Ericsson
- *
- * All rights reserved. This program and the accompanying materials are
- * made available under the terms of the Eclipse Public License 2.0 which
- * accompanies this distribution, and is available at
- * https://www.eclipse.org/legal/epl-2.0/
- *
- * SPDX-License-Identifier: EPL-2.0
- **********************************************************************/
-
-package org.eclipse.tracecompass.internal.analysis.timing.ui.views.segmentstore.density;
-
-import org.eclipse.tracecompass.analysis.timing.ui.views.segmentstore.density.AbstractSegmentStoreDensityViewer;
-import org.swtchart.Chart;
-
-/**
- * Base class for any mouse provider such as tool tip, zoom and selection providers.
- *
- * @author Bernd Hufmann
- * @author Marc-Andre Laperle
- */
-@Deprecated
-public abstract class BaseMouseProvider {
-
-    private AbstractSegmentStoreDensityViewer fDensityViewer;
-
-    /**
-     * Standard constructor.
-     *
-     * @param densityViewer
-     *            The parent density viewer
-     */
-    public BaseMouseProvider(AbstractSegmentStoreDensityViewer densityViewer) {
-        fDensityViewer = densityViewer;
-    }
-
-    /**
-     * Method to register the provider to the viewer.
-     */
-    protected abstract void register();
-
-    /**
-     * Method to deregister the provider from the viewer.
-     */
-    protected abstract void deregister();
-
-    /**
-     * @return the density viewer
-     */
-    public AbstractSegmentStoreDensityViewer getDensityViewer() {
-        return fDensityViewer;
-    }
-
-    /**
-     * Returns the SWT chart reference
-     *
-     * @return SWT chart reference.
-     */
-    protected Chart getChart() {
-        return fDensityViewer.getControl();
-    }
-
-}
\ No newline at end of file
diff --git a/analysis/org.eclipse.tracecompass.analysis.timing.ui/src/org/eclipse/tracecompass/internal/analysis/timing/ui/views/segmentstore/density/Messages.java b/analysis/org.eclipse.tracecompass.analysis.timing.ui/src/org/eclipse/tracecompass/internal/analysis/timing/ui/views/segmentstore/density/Messages.java
deleted file mode 100644
index d702ccf..0000000
--- a/analysis/org.eclipse.tracecompass.analysis.timing.ui/src/org/eclipse/tracecompass/internal/analysis/timing/ui/views/segmentstore/density/Messages.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2015 Ericsson
- *
- * All rights reserved. This program and the accompanying materials are
- * made available under the terms of the Eclipse Public License 2.0 which
- * accompanies this distribution, and is available at
- * https://www.eclipse.org/legal/epl-2.0/
- *
- * SPDX-License-Identifier: EPL-2.0
- *******************************************************************************/
-
-package org.eclipse.tracecompass.internal.analysis.timing.ui.views.segmentstore.density;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- * @author Marc-Andre Laperle
- */
-@Deprecated
-public class Messages extends NLS {
-    private static final String BUNDLE_NAME = "org.eclipse.tracecompass.internal.analysis.timing.ui.views.segmentstore.density.messages"; //$NON-NLS-1$
-
-    /**
-     * Tooltip count message
-     */
-    public static String SimpleTooltipProvider_count;
-
-    /**
-     * Tooltip duration message
-     */
-    public static String SimpleTooltipProvider_duration;
-
-    static {
-        // initialize resource bundle
-        NLS.initializeMessages(BUNDLE_NAME, Messages.class);
-    }
-
-    private Messages() {
-    }
-}
diff --git a/analysis/org.eclipse.tracecompass.analysis.timing.ui/src/org/eclipse/tracecompass/internal/analysis/timing/ui/views/segmentstore/density/MouseDragZoomProvider.java b/analysis/org.eclipse.tracecompass.analysis.timing.ui/src/org/eclipse/tracecompass/internal/analysis/timing/ui/views/segmentstore/density/MouseDragZoomProvider.java
deleted file mode 100644
index aae7951..0000000
--- a/analysis/org.eclipse.tracecompass.analysis.timing.ui/src/org/eclipse/tracecompass/internal/analysis/timing/ui/views/segmentstore/density/MouseDragZoomProvider.java
+++ /dev/null
@@ -1,135 +0,0 @@
-/**********************************************************************
- * Copyright (c) 2015 Ericsson
- *
- * All rights reserved. This program and the accompanying materials are
- * made available under the terms of the Eclipse Public License 2.0 which
- * accompanies this distribution, and is available at
- * https://www.eclipse.org/legal/epl-2.0/
- *
- * SPDX-License-Identifier: EPL-2.0
- **********************************************************************/
-
-package org.eclipse.tracecompass.internal.analysis.timing.ui.views.segmentstore.density;
-
-import org.eclipse.jdt.annotation.Nullable;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.MouseEvent;
-import org.eclipse.swt.events.MouseListener;
-import org.eclipse.swt.events.MouseMoveListener;
-import org.eclipse.swt.events.PaintEvent;
-import org.eclipse.tracecompass.analysis.timing.ui.views.segmentstore.density.AbstractSegmentStoreDensityViewer;
-import org.swtchart.IAxis;
-import org.swtchart.ICustomPaintListener;
-import org.swtchart.IPlotArea;
-import org.swtchart.Range;
-
-/**
- * Class for providing zooming based on mouse drag with right mouse button.
- * It also notifies the viewer about a change of range.
- *
- * @author Bernd Hufmann
- * @author Marc-Andre Laperle
- */
-@Deprecated
-public class MouseDragZoomProvider extends BaseMouseProvider implements MouseListener, MouseMoveListener, ICustomPaintListener {
-
-    /** Cached start coordinate */
-    private double fStartCoordinate;
-    /** Cached end coordinate */
-    private double fEndCoordinate;
-    /** Flag indicating that an update is ongoing */
-    private boolean fIsUpdate;
-
-    /**
-     * Default constructor
-     *
-     * @param densityViewer
-     *            the density viewer reference.
-     */
-    public MouseDragZoomProvider(AbstractSegmentStoreDensityViewer densityViewer) {
-        super(densityViewer);
-        register();
-    }
-
-    @Override
-    public final void register() {
-        getChart().getPlotArea().addMouseListener(this);
-        getChart().getPlotArea().addMouseMoveListener(this);
-        ((IPlotArea) getChart().getPlotArea()).addCustomPaintListener(this);
-    }
-
-    @Override
-    public final void deregister() {
-        if (!getChart().isDisposed()) {
-            getChart().getPlotArea().removeMouseListener(this);
-            getChart().getPlotArea().removeMouseMoveListener(this);
-            ((IPlotArea) getChart().getPlotArea()).removeCustomPaintListener(this);
-        }
-    }
-
-    @Override
-    public void mouseDoubleClick(@Nullable MouseEvent e) {
-        // Do nothing
-    }
-
-    @Override
-    public void mouseDown(@Nullable MouseEvent e) {
-        if (e != null && e.button == 3) {
-            IAxis xAxis = getChart().getAxisSet().getXAxis(0);
-            fStartCoordinate = xAxis.getDataCoordinate(e.x);
-            fEndCoordinate = fStartCoordinate;
-            fIsUpdate = true;
-        }
-    }
-
-    @Override
-    public void mouseUp(@Nullable MouseEvent e) {
-        if ((fIsUpdate) && (fStartCoordinate != fEndCoordinate)) {
-            if (fStartCoordinate > fEndCoordinate) {
-                double tmp = fStartCoordinate;
-                fStartCoordinate = fEndCoordinate;
-                fEndCoordinate = tmp;
-            }
-            getDensityViewer().zoom(new Range(fStartCoordinate, fEndCoordinate));
-        }
-
-        if (fIsUpdate) {
-            getChart().redraw();
-        }
-        fIsUpdate = false;
-    }
-
-    @Override
-    public void mouseMove(@Nullable MouseEvent e) {
-        if (e != null && fIsUpdate) {
-            IAxis xAxis = getChart().getAxisSet().getXAxis(0);
-            fEndCoordinate = xAxis.getDataCoordinate(e.x);
-            getChart().redraw();
-        }
-    }
-
-    @Override
-    public void paintControl(@Nullable PaintEvent e) {
-        if (e != null && fIsUpdate && (fStartCoordinate != fEndCoordinate)) {
-            IAxis xAxis = getChart().getAxisSet().getXAxis(0);
-            int startX = xAxis.getPixelCoordinate(fStartCoordinate);
-            int endX = xAxis.getPixelCoordinate(fEndCoordinate);
-            int prevAlpha = e.gc.getAlpha();
-            e.gc.setAlpha(64);
-            e.gc.setBackground(e.gc.getDevice().getSystemColor(SWT.COLOR_WIDGET_BACKGROUND));
-            if (fStartCoordinate < fEndCoordinate) {
-                e.gc.fillRectangle(startX, 0, endX - startX, e.height);
-            } else {
-                e.gc.fillRectangle(endX, 0, startX - endX, e.height);
-            }
-            e.gc.setAlpha(prevAlpha);
-            e.gc.drawLine(startX, 0, startX, e.height);
-            e.gc.drawLine(endX, 0, endX, e.height);
-        }
-    }
-
-    @Override
-    public boolean drawBehindSeries() {
-        return false;
-    }
-}
\ No newline at end of file
diff --git a/analysis/org.eclipse.tracecompass.analysis.timing.ui/src/org/eclipse/tracecompass/internal/analysis/timing/ui/views/segmentstore/density/MouseSelectionProvider.java b/analysis/org.eclipse.tracecompass.analysis.timing.ui/src/org/eclipse/tracecompass/internal/analysis/timing/ui/views/segmentstore/density/MouseSelectionProvider.java
deleted file mode 100644
index 2f54cf5..0000000
--- a/analysis/org.eclipse.tracecompass.analysis.timing.ui/src/org/eclipse/tracecompass/internal/analysis/timing/ui/views/segmentstore/density/MouseSelectionProvider.java
+++ /dev/null
@@ -1,179 +0,0 @@
-/**********************************************************************
- * Copyright (c) 2015 Ericsson
- *
- * All rights reserved. This program and the accompanying materials are
- * made available under the terms of the Eclipse Public License 2.0 which
- * accompanies this distribution, and is available at
- * https://www.eclipse.org/legal/epl-2.0/
- *
- * SPDX-License-Identifier: EPL-2.0
- **********************************************************************/
-
-package org.eclipse.tracecompass.internal.analysis.timing.ui.views.segmentstore.density;
-
-import org.eclipse.jdt.annotation.Nullable;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.MouseEvent;
-import org.eclipse.swt.events.MouseListener;
-import org.eclipse.swt.events.MouseMoveListener;
-import org.eclipse.swt.events.PaintEvent;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.tracecompass.analysis.timing.ui.views.segmentstore.density.AbstractSegmentStoreDensityView;
-import org.eclipse.tracecompass.analysis.timing.ui.views.segmentstore.density.AbstractSegmentStoreDensityViewer;
-import org.swtchart.IAxis;
-import org.swtchart.ICustomPaintListener;
-import org.swtchart.IPlotArea;
-import org.swtchart.Range;
-
-/**
- * Class for providing selection with the left mouse button. It also notifies
- * the viewer about a change of selection.
- *
- * @author Bernd Hufmann
- * @author Marc-Andre Laperle
- */
-@Deprecated
-public class MouseSelectionProvider extends BaseMouseProvider implements MouseListener, MouseMoveListener, ICustomPaintListener {
-
-    /** Cached start coordinate */
-    private double fStartCoordinate;
-    /** Cached end coordinate */
-    private double fEndCoordinate;
-    /** Flag indicating that an update is ongoing */
-    private boolean fIsUpdate;
-    /** Flag indicating that the begin marker is dragged */
-    private boolean fDragBeginMarker;
-
-    /**
-     * Constructor for a mouse selection provider.
-     *
-     * @param densityViewer
-     *            The parent density viewer
-     */
-    public MouseSelectionProvider(AbstractSegmentStoreDensityViewer densityViewer) {
-        super(densityViewer);
-        register();
-    }
-
-    @Override
-    public final void register() {
-        getChart().getPlotArea().addMouseListener(this);
-        getChart().getPlotArea().addMouseMoveListener(this);
-        ((IPlotArea) getChart().getPlotArea()).addCustomPaintListener(this);
-    }
-
-    @Override
-    public final void deregister() {
-        if (!getChart().isDisposed()) {
-            getChart().getPlotArea().removeMouseListener(this);
-            getChart().getPlotArea().removeMouseMoveListener(this);
-            ((IPlotArea) getChart().getPlotArea()).removeCustomPaintListener(this);
-        }
-    }
-
-    @Override
-    public void mouseDoubleClick(@Nullable MouseEvent e) {
-        // Do nothing
-    }
-
-    @Override
-    public void mouseDown(@Nullable MouseEvent e) {
-        if (e != null && (e.button == 1)) {
-            fDragBeginMarker = false;
-            if (((e.stateMask & SWT.SHIFT) != SWT.SHIFT) || (fEndCoordinate == fStartCoordinate)) {
-                IAxis xAxis = getChart().getAxisSet().getXAxis(0);
-                fStartCoordinate = xAxis.getDataCoordinate(e.x);
-                fEndCoordinate = fStartCoordinate;
-            } else {
-                double selectionBegin = fStartCoordinate;
-                double selectionEnd = fEndCoordinate;
-                IAxis xAxis = getChart().getAxisSet().getXAxis(0);
-                double time = xAxis.getDataCoordinate(e.x);
-                if (Math.abs(time - selectionBegin) < Math.abs(time - selectionEnd)) {
-                    fDragBeginMarker = true;
-                    fStartCoordinate = time;
-                    fEndCoordinate = selectionEnd;
-                } else {
-                    fStartCoordinate = selectionBegin;
-                    fEndCoordinate = time;
-                }
-            }
-            fIsUpdate = true;
-        }
-    }
-
-    @Override
-    public void mouseUp(@Nullable MouseEvent e) {
-        if ((fIsUpdate)) {
-            if (fStartCoordinate > fEndCoordinate) {
-                double tmp = fStartCoordinate;
-                fStartCoordinate = fEndCoordinate;
-                fEndCoordinate = tmp;
-            }
-            if (!isEmptySelection()) {
-                getDensityViewer().select(new Range(AbstractSegmentStoreDensityView.DEFAULT_RANGE.getFirst(), AbstractSegmentStoreDensityView.DEFAULT_RANGE.getSecond()));
-            } else {
-                getDensityViewer().select(new Range(fStartCoordinate, fEndCoordinate));
-            }
-            fIsUpdate = false;
-            getChart().redraw();
-        }
-    }
-
-    @Override
-    public void mouseMove(@Nullable MouseEvent e) {
-        if (e != null && fIsUpdate) {
-            IAxis xAxis = getChart().getAxisSet().getXAxis(0);
-            if (fDragBeginMarker) {
-                fStartCoordinate = xAxis.getDataCoordinate(e.x);
-            } else {
-                fEndCoordinate = xAxis.getDataCoordinate(e.x);
-            }
-            getChart().redraw();
-        }
-    }
-
-    private boolean isEmptySelection() {
-        IAxis xAxis = getChart().getAxisSet().getXAxis(0);
-        int begin = xAxis.getPixelCoordinate(fStartCoordinate);
-        int end = xAxis.getPixelCoordinate(fEndCoordinate);
-
-        return Math.abs(end - begin) > 2;
-    }
-
-    @Override
-    public void paintControl(@Nullable PaintEvent e) {
-        if (e == null || !isEmptySelection()) {
-            return;
-        }
-
-        Display display = getChart().getDisplay();
-
-        IAxis xAxis = getChart().getAxisSet().getXAxis(0);
-        e.gc.setBackground(display.getSystemColor(SWT.COLOR_BLUE));
-        e.gc.setForeground(display.getSystemColor(SWT.COLOR_BLUE));
-        e.gc.setLineStyle(SWT.LINE_SOLID);
-        int begin = xAxis.getPixelCoordinate(fStartCoordinate);
-        e.gc.drawLine(begin, 0, begin, e.height);
-
-        int end = xAxis.getPixelCoordinate(fEndCoordinate);
-        e.gc.drawLine(end, 0, end, e.height);
-
-        e.gc.setAlpha(64);
-        if (Math.abs(fEndCoordinate - fStartCoordinate) > 1) {
-            e.gc.setBackground(display.getSystemColor(SWT.COLOR_WIDGET_BACKGROUND));
-            int beginX = xAxis.getPixelCoordinate(fStartCoordinate);
-            int endX = xAxis.getPixelCoordinate(fEndCoordinate);
-            if (fEndCoordinate > fStartCoordinate) {
-                e.gc.fillRectangle(beginX + 1, 0, endX - beginX - 1, e.height);
-            } else {
-                e.gc.fillRectangle(endX + 1, 0, beginX - endX - 1, e.height);
-            }
-        }
-    }
-
-    @Override
-    public boolean drawBehindSeries() {
-        return false;
-    }
-}
diff --git a/analysis/org.eclipse.tracecompass.analysis.timing.ui/src/org/eclipse/tracecompass/internal/analysis/timing/ui/views/segmentstore/density/SimpleTooltipProvider.java b/analysis/org.eclipse.tracecompass.analysis.timing.ui/src/org/eclipse/tracecompass/internal/analysis/timing/ui/views/segmentstore/density/SimpleTooltipProvider.java
deleted file mode 100644
index 510061b..0000000
--- a/analysis/org.eclipse.tracecompass.analysis.timing.ui/src/org/eclipse/tracecompass/internal/analysis/timing/ui/views/segmentstore/density/SimpleTooltipProvider.java
+++ /dev/null
@@ -1,125 +0,0 @@
-/**********************************************************************
- * Copyright (c) 2015, 2016 Ericsson
- *
- * All rights reserved. This program and the accompanying materials are
- * made available under the terms of the Eclipse Public License 2.0 which
- * accompanies this distribution, and is available at
- * https://www.eclipse.org/legal/epl-2.0/
- *
- * SPDX-License-Identifier: EPL-2.0
- **********************************************************************/
-package org.eclipse.tracecompass.internal.analysis.timing.ui.views.segmentstore.density;
-
-import java.text.Format;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-import org.eclipse.swt.events.MouseEvent;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.graphics.RGB;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.tracecompass.analysis.timing.ui.views.segmentstore.density.AbstractSegmentStoreDensityViewer;
-import org.eclipse.tracecompass.common.core.format.SubSecondTimeWithUnitFormat;
-import org.eclipse.tracecompass.tmf.core.presentation.RGBAColor;
-import org.eclipse.tracecompass.tmf.ui.viewers.TmfAbstractToolTipHandler;
-import org.swtchart.Chart;
-import org.swtchart.IAxis;
-import org.swtchart.ISeries;
-
-/**
- * Tool tip provider for density viewer. It displays the x and y value of the
- * current mouse position.
- *
- * @author Bernd Hufmann
- * @author Marc-Andre Laperle
- */
-@Deprecated
-public class SimpleTooltipProvider extends BaseMouseProvider {
-
-    private static final Format FORMAT = SubSecondTimeWithUnitFormat.getInstance();
-    private static final String HTML_COLOR_TOOLTIP = "<span style=\"color:%s;\">%s</span>"; //$NON-NLS-1$
-
-    private final class DensityToolTipHandler extends TmfAbstractToolTipHandler {
-
-        @Override
-        public void fill(Control control, MouseEvent event, Point pt) {
-            Chart chart = getChart();
-            ISeries[] seriesSet = chart.getSeriesSet().getSeries();
-            if (seriesSet.length != 0) {
-
-                if (event == null || chart.getAxisSet().getXAxes().length == 0 || chart.getAxisSet().getYAxes().length == 0 || seriesSet.length == 0) {
-                    return;
-                }
-                chart.getPlotArea().setToolTipText(null);
-                long x1 = -1;
-                long x2 = -1;
-                List<String> names = new ArrayList<>();
-                List<Long> yValues = new ArrayList<>();
-                List<RGB> colors = new ArrayList<>();
-                for (ISeries ySeriesProvider : seriesSet) {
-                    double[] xValues = ySeriesProvider.getXSeries();
-                    if (xValues.length < 2) {
-                        continue;
-                    }
-                    double delta = xValues[1] - xValues[0];
-                    IAxis xAxis = chart.getAxisSet().getXAxis(0);
-                    double coords = xAxis.getDataCoordinate(event.x);
-                    int index = Arrays.binarySearch(xValues, coords);
-                    if (index < 0) {
-                        index = -index - 2;
-                    }
-                    double[] ySeries = ySeriesProvider.getYSeries();
-                    long y = Math.round(ySeries[index]);
-                    if (y > 0) {
-                        x1 = (long) xValues[index];
-                        x2 = (long) (x1 + delta);
-                        String id = ySeriesProvider.getId();
-                        colors.add(getDensityViewer().getColorForItem(id));
-                        names.add(id);
-                        yValues.add(y);
-                    }
-                }
-                if (!names.isEmpty()) {
-                    addItem(Messages.SimpleTooltipProvider_duration, FORMAT.format(x1) + '-' + FORMAT.format(x2));
-                    if (seriesSet.length == 1) {
-                        // No Color if there's only one
-                        addItem(null, ToolTipString.fromString(String.valueOf(Messages.SimpleTooltipProvider_count)), ToolTipString.fromDecimal(yValues.get(0)));
-                    } else {
-                        for (int i = 0; i < names.size(); i++) {
-                            String id = names.get(i);
-                            RGB color = getDensityViewer().getColorForItem(id);
-                            addItem(null, ToolTipString.fromHtml(String.format(HTML_COLOR_TOOLTIP, new RGBAColor(color.red, color.green, color.blue).toString(), id)), ToolTipString.fromDecimal(yValues.get(i)));
-                        }
-                    }
-
-                }
-            }
-        }
-    }
-
-    private DensityToolTipHandler fToolTipHandler = new DensityToolTipHandler();
-
-    /**
-     * Constructor for a tool tip provider.
-     *
-     * @param densityViewer
-     *            The parent density viewer
-     */
-    public SimpleTooltipProvider(AbstractSegmentStoreDensityViewer densityViewer) {
-        super(densityViewer);
-        register();
-    }
-
-    @Override
-    public void register() {
-        fToolTipHandler.activateHoverHelp(getChart().getPlotArea());
-    }
-
-    @Override
-    public void deregister() {
-        if (!getDensityViewer().getControl().isDisposed()) {
-            fToolTipHandler.deactivateHoverHelp(getChart().getPlotArea());
-        }
-    }
-}
\ No newline at end of file
diff --git a/analysis/org.eclipse.tracecompass.analysis.timing.ui/src/org/eclipse/tracecompass/internal/analysis/timing/ui/views/segmentstore/density/messages.properties b/analysis/org.eclipse.tracecompass.analysis.timing.ui/src/org/eclipse/tracecompass/internal/analysis/timing/ui/views/segmentstore/density/messages.properties
deleted file mode 100644
index 8152bb4..0000000
--- a/analysis/org.eclipse.tracecompass.analysis.timing.ui/src/org/eclipse/tracecompass/internal/analysis/timing/ui/views/segmentstore/density/messages.properties
+++ /dev/null
@@ -1,12 +0,0 @@
-###############################################################################
-# Copyright (c) 2015 Ericsson
-#
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License 2.0
-# which accompanies this distribution, and is available at
-# https://www.eclipse.org/legal/epl-2.0/
-#
-# SPDX-License-Identifier: EPL-2.0
-###############################################################################
-SimpleTooltipProvider_count=Count
-SimpleTooltipProvider_duration=Duration
diff --git a/analysis/org.eclipse.tracecompass.analysis.timing.ui/src/org/eclipse/tracecompass/internal/analysis/timing/ui/views/segmentstore/scatter/Messages.java b/analysis/org.eclipse.tracecompass.analysis.timing.ui/src/org/eclipse/tracecompass/internal/analysis/timing/ui/views/segmentstore/scatter/Messages.java
deleted file mode 100644
index 82e0e77..0000000
--- a/analysis/org.eclipse.tracecompass.analysis.timing.ui/src/org/eclipse/tracecompass/internal/analysis/timing/ui/views/segmentstore/scatter/Messages.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2016 Ericsson
- *
- * All rights reserved. This program and the accompanying materials are
- * made available under the terms of the Eclipse Public License 2.0 which
- * accompanies this distribution, and is available at
- * https://www.eclipse.org/legal/epl-2.0/
- *
- * SPDX-License-Identifier: EPL-2.0
- *******************************************************************************/
-
-package org.eclipse.tracecompass.internal.analysis.timing.ui.views.segmentstore.scatter;
-
-import org.eclipse.jdt.annotation.NonNullByDefault;
-import org.eclipse.osgi.util.NLS;
-
-/**
- * @author France Bernd Hufmann
- */
-@Deprecated
-@NonNullByDefault({})
-public class Messages extends NLS {
-    private static final String BUNDLE_NAME = "org.eclipse.tracecompass.internal.analysis.timing.ui.views.segmentstore.scatter.messages"; //$NON-NLS-1$
-
-    /**
-     * Category
-     */
-    public static String SegmentStoreScatterGraphTooltipProvider_category;
-
-    /**
-     * Title of the scatter graph
-     */
-    public static String SegmentStoreScatterGraphViewer_title;
-
-    /**
-     * Title of the x axis of the scatter graph
-     */
-    public static String SegmentStoreScatterGraphViewer_xAxis;
-
-    /**
-     * Title of the y axis of the scatter graph
-     */
-    public static String SegmentStoreScatterGraphViewer_yAxis;
-
-    /**
-     * Legend
-     */
-    public static String SegmentStoreScatterGraphViewer_legend;
-
-    /**
-     * Name of the compacting job
-     */
-    public static String SegmentStoreScatterGraphViewer_compactTitle;
-
-    static {
-        // initialize resource bundle
-        NLS.initializeMessages(BUNDLE_NAME, Messages.class);
-    }
-
-    private Messages() {
-    }
-}
diff --git a/analysis/org.eclipse.tracecompass.analysis.timing.ui/src/org/eclipse/tracecompass/internal/analysis/timing/ui/views/segmentstore/scatter/SegmentStoreScatterGraphTooltipProvider.java b/analysis/org.eclipse.tracecompass.analysis.timing.ui/src/org/eclipse/tracecompass/internal/analysis/timing/ui/views/segmentstore/scatter/SegmentStoreScatterGraphTooltipProvider.java
deleted file mode 100644
index 98da82c..0000000
--- a/analysis/org.eclipse.tracecompass.analysis.timing.ui/src/org/eclipse/tracecompass/internal/analysis/timing/ui/views/segmentstore/scatter/SegmentStoreScatterGraphTooltipProvider.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/**********************************************************************
- * Copyright (c) 2015, 2016 Ericsson
- *
- * All rights reserved. This program and the accompanying materials are
- * made available under the terms of the Eclipse Public License 2.0 which
- * accompanies this distribution, and is available at
- * https://www.eclipse.org/legal/epl-2.0/
- *
- * SPDX-License-Identifier: EPL-2.0
- *
- * Contributors:
- *   Bernd Hufmann - Initial API and implementation
- **********************************************************************/
-package org.eclipse.tracecompass.internal.analysis.timing.ui.views.segmentstore.scatter;
-
-import static org.eclipse.tracecompass.common.core.NonNullUtils.checkNotNull;
-
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.jdt.annotation.Nullable;
-import org.eclipse.tracecompass.tmf.core.timestamp.ITmfTimestamp;
-import org.eclipse.tracecompass.tmf.core.timestamp.TmfTimestamp;
-import org.eclipse.tracecompass.tmf.ui.viewers.xycharts.ITmfChartTimeProvider;
-import org.eclipse.tracecompass.tmf.ui.viewers.xycharts.TmfClosestDataPointTooltipProvider;
-import org.eclipse.tracecompass.tmf.ui.views.FormatTimeUtils;
-import org.eclipse.tracecompass.tmf.ui.views.FormatTimeUtils.Resolution;
-import org.eclipse.tracecompass.tmf.ui.views.FormatTimeUtils.TimeFormat;
-import org.swtchart.ISeries;
-
-/**
- * Tooltip provider for durations scatter charts. It displays the y value of
- * position x as well as it highlights the closest data point.
- *
- * @author Bernd Hufmann
- */
-@Deprecated
-public class SegmentStoreScatterGraphTooltipProvider extends TmfClosestDataPointTooltipProvider{
-
-    // ------------------------------------------------------------------------
-    // Constructors
-    // ------------------------------------------------------------------------
-    /**
-     * Constructor for the segment store scatter chart tooltip provider.
-     *
-     * @param tmfChartViewer
-     *                  - the parent chart viewer
-     */
-    public SegmentStoreScatterGraphTooltipProvider(ITmfChartTimeProvider tmfChartViewer) {
-        super(tmfChartViewer);
-    }
-
-    // ------------------------------------------------------------------------
-    // TmfClosestDataPointTooltipProvider
-    // ------------------------------------------------------------------------
-    @Override
-    protected @Nullable Map<String, Map<String, Object>> createToolTipMap(Parameter param) {
-        ISeries[] series = getChart().getSeriesSet().getSeries();
-        int seriesIndex = param.getSeriesIndex();
-        int dataIndex = param.getDataIndex();
-        if ((series != null) && (seriesIndex < series.length)) {
-            Map<String, Object> segMap = new HashMap<>();
-            ISeries serie = series[seriesIndex];
-            double[] xS = serie.getXSeries();
-            double[] yS = serie.getYSeries();
-            if ((xS != null) && (yS != null) && (dataIndex < xS.length) && (dataIndex < yS.length)) {
-                ITmfTimestamp segTs = TmfTimestamp.fromNanos((long) xS[dataIndex] + getChartViewer().getTimeOffset());
-                long segDuration = (long) yS[dataIndex];
-                segMap.put(checkNotNull(Messages.SegmentStoreScatterGraphViewer_xAxis), segTs);
-                segMap.put(checkNotNull(Messages.SegmentStoreScatterGraphViewer_yAxis), String.valueOf(FormatTimeUtils.formatDelta(segDuration, TimeFormat.RELATIVE, Resolution.NANOSEC)));
-                return Collections.singletonMap(checkNotNull(Messages.SegmentStoreScatterGraphTooltipProvider_category), segMap);
-            }
-        }
-        return null;
-    }
-
-}
\ No newline at end of file
diff --git a/analysis/org.eclipse.tracecompass.analysis.timing.ui/src/org/eclipse/tracecompass/internal/analysis/timing/ui/views/segmentstore/scatter/messages.properties b/analysis/org.eclipse.tracecompass.analysis.timing.ui/src/org/eclipse/tracecompass/internal/analysis/timing/ui/views/segmentstore/scatter/messages.properties
deleted file mode 100644
index 8e496aa..0000000
--- a/analysis/org.eclipse.tracecompass.analysis.timing.ui/src/org/eclipse/tracecompass/internal/analysis/timing/ui/views/segmentstore/scatter/messages.properties
+++ /dev/null
@@ -1,16 +0,0 @@
-###############################################################################
-# Copyright (c) 2016 Ericsson
-#
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License 2.0
-# which accompanies this distribution, and is available at
-# https://www.eclipse.org/legal/epl-2.0/
-#
-# SPDX-License-Identifier: EPL-2.0
-###############################################################################
-SegmentStoreScatterGraphTooltipProvider_category=Segment
-SegmentStoreScatterGraphViewer_title=Latency vs Time
-SegmentStoreScatterGraphViewer_xAxis=Time
-SegmentStoreScatterGraphViewer_yAxis=Latency
-SegmentStoreScatterGraphViewer_legend=Duration
-SegmentStoreScatterGraphViewer_compactTitle=Compacting Duration Query
diff --git a/analysis/org.eclipse.tracecompass.analysis.timing.ui/src/org/eclipse/tracecompass/internal/analysis/timing/ui/views/segmentstore/scatter/package-info.java b/analysis/org.eclipse.tracecompass.analysis.timing.ui/src/org/eclipse/tracecompass/internal/analysis/timing/ui/views/segmentstore/scatter/package-info.java
deleted file mode 100644
index d6d93d4..0000000
--- a/analysis/org.eclipse.tracecompass.analysis.timing.ui/src/org/eclipse/tracecompass/internal/analysis/timing/ui/views/segmentstore/scatter/package-info.java
+++ /dev/null
@@ -1,13 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2016 Ericsson
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License 2.0
- * which accompanies this distribution, and is available at
- * https://www.eclipse.org/legal/epl-2.0/
- *
- * SPDX-License-Identifier: EPL-2.0
- *******************************************************************************/
-
-@org.eclipse.jdt.annotation.NonNullByDefault
-package org.eclipse.tracecompass.internal.analysis.timing.ui.views.segmentstore.scatter;
diff --git a/doc/org.eclipse.tracecompass.doc.dev/doc/Developer-Guide.mediawiki b/doc/org.eclipse.tracecompass.doc.dev/doc/Developer-Guide.mediawiki
index fc39a0f..18eb8b7 100644
--- a/doc/org.eclipse.tracecompass.doc.dev/doc/Developer-Guide.mediawiki
+++ b/doc/org.eclipse.tracecompass.doc.dev/doc/Developer-Guide.mediawiki
@@ -364,7 +364,7 @@
 [[Image:images/SelectManifest.png]]<br>
 
 Change to the Dependencies tab and select '''Add...''' of the ''Required Plug-ins'' section. A new dialog box will open. Next find plug-in ''org.eclipse.tracecompass.tmf.core'' and press '''OK'''<br>
-Following the same steps, add ''org.eclipse.tracecompass.tmf.ui'' and ''org.swtchart''.<br>
+Following the same steps, add ''org.eclipse.tracecompass.tmf.ui'' and ''org.exlipse.swtchart''.<br>
 [[Image:images/AddDependencyTmfUi.png]]<br>
 
 Change to the Extensions tab and select '''Add...''' of the ''All Extension'' section. A new dialog box will open. Find the view extension ''org.eclipse.ui.views'' and press '''Finish'''.<br>
diff --git a/lttng/org.eclipse.tracecompass.lttng2.kernel.ui.swtbot.tests/META-INF/MANIFEST.MF b/lttng/org.eclipse.tracecompass.lttng2.kernel.ui.swtbot.tests/META-INF/MANIFEST.MF
index 5656fef..8ea5e63 100644
--- a/lttng/org.eclipse.tracecompass.lttng2.kernel.ui.swtbot.tests/META-INF/MANIFEST.MF
+++ b/lttng/org.eclipse.tracecompass.lttng2.kernel.ui.swtbot.tests/META-INF/MANIFEST.MF
@@ -40,6 +40,5 @@
  com.google.gson,
  org.apache.commons.io,
  org.eclipse.swtchart,
- org.eclipse.tracecompass.testtraces.ctf,
- org.swtchart
+ org.eclipse.tracecompass.testtraces.ctf
 Automatic-Module-Name: org.eclipse.tracecompass.lttng2.kernel.ui.swtbot.tests
diff --git a/lttng/org.eclipse.tracecompass.lttng2.ust.ui.swtbot.tests/META-INF/MANIFEST.MF b/lttng/org.eclipse.tracecompass.lttng2.ust.ui.swtbot.tests/META-INF/MANIFEST.MF
index 1a37374..56a631d 100644
--- a/lttng/org.eclipse.tracecompass.lttng2.ust.ui.swtbot.tests/META-INF/MANIFEST.MF
+++ b/lttng/org.eclipse.tracecompass.lttng2.ust.ui.swtbot.tests/META-INF/MANIFEST.MF
@@ -25,7 +25,6 @@
  org.junit,
  org.eclipse.tracecompass.lttng2.ust.core,
  org.eclipse.tracecompass.lttng2.ust.ui,
- org.swtchart,
  org.eclipse.tracecompass.tmf.ui.tests,
  org.eclipse.tracecompass.ctf.core.tests,
  org.eclipse.tracecompass.analysis.profiling.ui,
diff --git a/lttng/org.eclipse.tracecompass.lttng2.ust.ui/META-INF/MANIFEST.MF b/lttng/org.eclipse.tracecompass.lttng2.ust.ui/META-INF/MANIFEST.MF
index 5a82df3..1ba76e1 100644
--- a/lttng/org.eclipse.tracecompass.lttng2.ust.ui/META-INF/MANIFEST.MF
+++ b/lttng/org.eclipse.tracecompass.lttng2.ust.ui/META-INF/MANIFEST.MF
@@ -28,6 +28,5 @@
  com.google.common.collect,
  org.eclipse.tracecompass.analysis.os.linux.core.kernelmemoryusage,
  org.eclipse.tracecompass.analysis.os.linux.core.memory,
- org.eclipse.tracecompass.internal.analysis.os.linux.ui.views.memory,
- org.swtchart
+ org.eclipse.tracecompass.internal.analysis.os.linux.ui.views.memory
 Automatic-Module-Name: org.eclipse.tracecompass.lttng2.ust.ui
diff --git a/rcp/org.eclipse.tracecompass.rcp/feature.xml b/rcp/org.eclipse.tracecompass.rcp/feature.xml
index aba948f..0414530 100644
--- a/rcp/org.eclipse.tracecompass.rcp/feature.xml
+++ b/rcp/org.eclipse.tracecompass.rcp/feature.xml
@@ -79,13 +79,6 @@
          unpack="false"/>
 
    <plugin
-         id="org.swtchart"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
          id="org.eclipse.swtchart"
          download-size="0"
          install-size="0"
diff --git a/rcp/org.eclipse.tracecompass.rcp/pom.xml b/rcp/org.eclipse.tracecompass.rcp/pom.xml
index 3aad573..88787d5 100644
--- a/rcp/org.eclipse.tracecompass.rcp/pom.xml
+++ b/rcp/org.eclipse.tracecompass.rcp/pom.xml
@@ -85,7 +85,6 @@
                 <plugin id="org.json"/>
                 <plugin id="org.sat4j.core"/>
                 <plugin id="org.sat4j.pb"/>
-                <plugin id="org.swtchart"/>
                 <plugin id="com.google.gson"/>
                 <plugin id="com.google.guava"/>
                 <plugin id="org.apache.commons.io"/>
diff --git a/releng/org.eclipse.tracecompass.releng-site/category.xml b/releng/org.eclipse.tracecompass.releng-site/category.xml
index 7d008f5..8c2c820 100644
--- a/releng/org.eclipse.tracecompass.releng-site/category.xml
+++ b/releng/org.eclipse.tracecompass.releng-site/category.xml
@@ -41,7 +41,7 @@
    <bundle id="org.apache.commons.compress"/>
    <bundle id="org.apache.commons.lang3"/>
    <bundle id="org.apache.commons.io"/>
-   <bundle id="org.swtchart"/>
+   <bundle id="org.eclipse.swtchart"/>
    <bundle id="com.google.guava"/>
    <bundle id="org.json"/>
    <category-def name="Trace Compass" label="Trace Compass Main Features"/>
diff --git a/releng/org.eclipse.tracecompass.target/tracecompass-e4.10.target b/releng/org.eclipse.tracecompass.target/tracecompass-e4.10.target
index 3e57f82..08180e3 100644
--- a/releng/org.eclipse.tracecompass.target/tracecompass-e4.10.target
+++ b/releng/org.eclipse.tracecompass.target/tracecompass-e4.10.target
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<?pde version="3.8"?><target name="tracecompass-e4.10" sequenceNumber="14">
+<?pde version="3.8"?><target name="tracecompass-e4.10" sequenceNumber="15">
 <locations>
 <location includeAllPlatforms="false" includeConfigurePhase="false" includeMode="planner" includeSource="true" type="InstallableUnit">
 <unit id="org.eclipse.cdt.gnu.dsf.feature.group" version="0.0.0"/>
@@ -33,8 +33,6 @@
 <unit id="org.apache.commons.io" version="0.0.0"/>
 <unit id="org.apache.commons.lang" version="0.0.0"/>
 <unit id="org.apache.commons.lang3" version="0.0.0"/>
-<unit id="org.swtchart" version="0.10.0.v201605200358"/>
-<unit id="org.swtchart.source" version="0.10.0.v201605200358"/>
 <unit id="com.google.guava" version="21.0.0.v20170206-1425"/>
 <unit id="org.json" version="0.0.0"/>
 <unit id="org.apache.derby" version="0.0.0"/>
diff --git a/releng/org.eclipse.tracecompass.target/tracecompass-e4.11.target b/releng/org.eclipse.tracecompass.target/tracecompass-e4.11.target
index 8192754..cfc1aa5 100644
--- a/releng/org.eclipse.tracecompass.target/tracecompass-e4.11.target
+++ b/releng/org.eclipse.tracecompass.target/tracecompass-e4.11.target
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?><?pde version="3.8"?><target name="tracecompass-e4.11" sequenceNumber="14">
+<?xml version="1.0" encoding="UTF-8" standalone="no"?><?pde version="3.8"?><target name="tracecompass-e4.11" sequenceNumber="15">
 <locations>
 <location includeAllPlatforms="false" includeConfigurePhase="false" includeMode="planner" includeSource="true" type="InstallableUnit">
 <unit id="org.eclipse.cdt.gnu.dsf.feature.group" version="0.0.0"/>
@@ -32,8 +32,6 @@
 <unit id="org.apache.commons.io" version="0.0.0"/>
 <unit id="org.apache.commons.lang" version="0.0.0"/>
 <unit id="org.apache.commons.lang3" version="0.0.0"/>
-<unit id="org.swtchart" version="0.10.0.v201605200358"/>
-<unit id="org.swtchart.source" version="0.10.0.v201605200358"/>
 <unit id="com.google.guava" version="21.0.0.v20170206-1425"/>
 <unit id="org.json" version="0.0.0"/>
 <unit id="org.apache.derby" version="0.0.0"/>
diff --git a/releng/org.eclipse.tracecompass.target/tracecompass-e4.12.target b/releng/org.eclipse.tracecompass.target/tracecompass-e4.12.target
index 1b048a7..79ae583 100644
--- a/releng/org.eclipse.tracecompass.target/tracecompass-e4.12.target
+++ b/releng/org.eclipse.tracecompass.target/tracecompass-e4.12.target
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?><?pde version="3.8"?><target name="tracecompass-e4.12" sequenceNumber="9">
+<?xml version="1.0" encoding="UTF-8" standalone="no"?><?pde version="3.8"?><target name="tracecompass-e4.12" sequenceNumber="10">
 <locations>
 <location includeAllPlatforms="false" includeConfigurePhase="false" includeMode="planner" includeSource="true" type="InstallableUnit">
 <unit id="org.eclipse.cdt.gnu.dsf.feature.group" version="0.0.0"/>
@@ -32,8 +32,6 @@
 <unit id="org.apache.commons.io" version="0.0.0"/>
 <unit id="org.apache.commons.lang" version="0.0.0"/>
 <unit id="org.apache.commons.lang3" version="0.0.0"/>
-<unit id="org.swtchart" version="0.10.0.v201605200358"/>
-<unit id="org.swtchart.source" version="0.10.0.v201605200358"/>
 <unit id="com.google.guava" version="21.0.0.v20170206-1425"/>
 <unit id="org.json" version="0.0.0"/>
 <unit id="org.apache.derby" version="0.0.0"/>
diff --git a/releng/org.eclipse.tracecompass.target/tracecompass-e4.13.target b/releng/org.eclipse.tracecompass.target/tracecompass-e4.13.target
index c1dc455..091739b 100644
--- a/releng/org.eclipse.tracecompass.target/tracecompass-e4.13.target
+++ b/releng/org.eclipse.tracecompass.target/tracecompass-e4.13.target
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?><?pde version="3.8"?><target name="tracecompass-e4.13" sequenceNumber="9">
+<?xml version="1.0" encoding="UTF-8" standalone="no"?><?pde version="3.8"?><target name="tracecompass-e4.14" sequenceNumber="9">
 <locations>
 <location includeAllPlatforms="false" includeConfigurePhase="false" includeMode="planner" includeSource="true" type="InstallableUnit">
 <unit id="org.eclipse.cdt.gnu.dsf.feature.group" version="0.0.0"/>
@@ -32,8 +32,6 @@
 <unit id="org.apache.commons.io" version="0.0.0"/>
 <unit id="org.apache.commons.lang" version="0.0.0"/>
 <unit id="org.apache.commons.lang3" version="0.0.0"/>
-<unit id="org.swtchart" version="0.10.0.v201605200358"/>
-<unit id="org.swtchart.source" version="0.10.0.v201605200358"/>
 <unit id="com.google.guava" version="27.1.0.v20190517-1946"/>
 <unit id="org.json" version="0.0.0"/>
 <unit id="org.apache.derby" version="0.0.0"/>
diff --git a/releng/org.eclipse.tracecompass.target/tracecompass-e4.14.target b/releng/org.eclipse.tracecompass.target/tracecompass-e4.14.target
index bb1e13c..dd88ea8 100644
--- a/releng/org.eclipse.tracecompass.target/tracecompass-e4.14.target
+++ b/releng/org.eclipse.tracecompass.target/tracecompass-e4.14.target
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?><?pde version="3.8"?><target name="tracecompass-e4.14" sequenceNumber="12">
+<?xml version="1.0" encoding="UTF-8" standalone="no"?><?pde version="3.8"?><target name="tracecompass-e4.14" sequenceNumber="13">
 <locations>
 <location includeAllPlatforms="false" includeConfigurePhase="false" includeMode="planner" includeSource="true" type="InstallableUnit">
 <unit id="org.eclipse.cdt.gnu.dsf.feature.group" version="0.0.0"/>
@@ -32,8 +32,6 @@
 <unit id="org.apache.commons.io" version="0.0.0"/>
 <unit id="org.apache.commons.lang" version="0.0.0"/>
 <unit id="org.apache.commons.lang3" version="0.0.0"/>
-<unit id="org.swtchart" version="0.10.0.v201605200358"/>
-<unit id="org.swtchart.source" version="0.10.0.v201605200358"/>
 <unit id="com.google.guava" version="27.1.0.v20190517-1946"/>
 <unit id="org.json" version="0.0.0"/>
 <unit id="org.apache.derby" version="0.0.0"/>
diff --git a/releng/org.eclipse.tracecompass.target/tracecompass-e4.15.target b/releng/org.eclipse.tracecompass.target/tracecompass-e4.15.target
index fcfe4aa..3efad4b 100644
--- a/releng/org.eclipse.tracecompass.target/tracecompass-e4.15.target
+++ b/releng/org.eclipse.tracecompass.target/tracecompass-e4.15.target
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?><?pde version="3.8"?><target name="tracecompass-e4.15" sequenceNumber="10">
+<?xml version="1.0" encoding="UTF-8" standalone="no"?><?pde version="3.8"?><target name="tracecompass-e4.15" sequenceNumber="11">
 <locations>
 <location includeAllPlatforms="false" includeConfigurePhase="false" includeMode="planner" includeSource="true" type="InstallableUnit">
 <unit id="org.eclipse.cdt.gnu.dsf.feature.group" version="0.0.0"/>
@@ -26,8 +26,6 @@
 <unit id="org.apache.commons.io" version="0.0.0"/>
 <unit id="org.apache.commons.lang" version="0.0.0"/>
 <unit id="org.apache.commons.lang3" version="0.0.0"/>
-<unit id="org.swtchart" version="0.10.0.v201605200358"/>
-<unit id="org.swtchart.source" version="0.10.0.v201605200358"/>
 <unit id="com.google.guava" version="27.1.0.v20190517-1946"/>
 <unit id="org.json" version="0.0.0"/>
 <unit id="org.apache.derby" version="0.0.0"/>
diff --git a/releng/org.eclipse.tracecompass.target/tracecompass-e4.16.target b/releng/org.eclipse.tracecompass.target/tracecompass-e4.16.target
index d7daa0a..e352631 100644
--- a/releng/org.eclipse.tracecompass.target/tracecompass-e4.16.target
+++ b/releng/org.eclipse.tracecompass.target/tracecompass-e4.16.target
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?><?pde version="3.8"?><target name="tracecompass-e4.16" sequenceNumber="7">
+<?xml version="1.0" encoding="UTF-8" standalone="no"?><?pde version="3.8"?><target name="tracecompass-e4.16" sequenceNumber="8">
 <locations>
 <location includeAllPlatforms="false" includeConfigurePhase="false" includeMode="planner" includeSource="true" type="InstallableUnit">
 <unit id="org.eclipse.cdt.gnu.dsf.feature.group" version="0.0.0"/>
@@ -26,8 +26,6 @@
 <unit id="org.apache.commons.io" version="0.0.0"/>
 <unit id="org.apache.commons.lang" version="0.0.0"/>
 <unit id="org.apache.commons.lang3" version="0.0.0"/>
-<unit id="org.swtchart" version="0.10.0.v201605200358"/>
-<unit id="org.swtchart.source" version="0.10.0.v201605200358"/>
 <unit id="com.google.guava" version="27.1.0.v20190517-1946"/>
 <unit id="org.json" version="0.0.0"/>
 <unit id="org.apache.derby" version="0.0.0"/>
diff --git a/releng/org.eclipse.tracecompass.target/tracecompass-e4.17.target b/releng/org.eclipse.tracecompass.target/tracecompass-e4.17.target
index 97bdb22..ec9b964 100644
--- a/releng/org.eclipse.tracecompass.target/tracecompass-e4.17.target
+++ b/releng/org.eclipse.tracecompass.target/tracecompass-e4.17.target
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?><?pde version="3.8"?><target name="tracecompass-e4.17" sequenceNumber="9">
+<?xml version="1.0" encoding="UTF-8" standalone="no"?><?pde version="3.8"?><target name="tracecompass-e4.17" sequenceNumber="10">
 <locations>
 <location includeAllPlatforms="false" includeConfigurePhase="false" includeMode="planner" includeSource="true" type="InstallableUnit">
 <unit id="org.eclipse.cdt.gnu.dsf.feature.group" version="0.0.0"/>
@@ -26,8 +26,6 @@
 <unit id="org.apache.commons.io" version="0.0.0"/>
 <unit id="org.apache.commons.lang" version="0.0.0"/>
 <unit id="org.apache.commons.lang3" version="0.0.0"/>
-<unit id="org.swtchart" version="0.10.0.v201605200358"/>
-<unit id="org.swtchart.source" version="0.10.0.v201605200358"/>
 <unit id="com.google.guava" version="27.1.0.v20190517-1946"/>
 <unit id="org.json" version="0.0.0"/>
 <unit id="org.apache.derby" version="0.0.0"/>
diff --git a/releng/org.eclipse.tracecompass.target/tracecompass-e4.18.target b/releng/org.eclipse.tracecompass.target/tracecompass-e4.18.target
index fa027cd..2f6405d 100644
--- a/releng/org.eclipse.tracecompass.target/tracecompass-e4.18.target
+++ b/releng/org.eclipse.tracecompass.target/tracecompass-e4.18.target
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?><?pde version="3.8"?><target name="tracecompass-e4.18" sequenceNumber="4">
+<?xml version="1.0" encoding="UTF-8" standalone="no"?><?pde version="3.8"?><target name="tracecompass-e4.18" sequenceNumber="5">
 <locations>
 <location includeAllPlatforms="false" includeConfigurePhase="false" includeMode="planner" includeSource="true" type="InstallableUnit">
 <unit id="org.eclipse.cdt.gnu.dsf.feature.group" version="0.0.0"/>
@@ -26,8 +26,6 @@
 <unit id="org.apache.commons.io" version="0.0.0"/>
 <unit id="org.apache.commons.lang" version="0.0.0"/>
 <unit id="org.apache.commons.lang3" version="0.0.0"/>
-<unit id="org.swtchart" version="0.10.0.v201605200358"/>
-<unit id="org.swtchart.source" version="0.10.0.v201605200358"/>
 <unit id="com.google.guava" version="27.1.0.v20190517-1946"/>
 <unit id="org.json" version="0.0.0"/>
 <unit id="org.apache.derby" version="0.0.0"/>
diff --git a/releng/org.eclipse.tracecompass.target/tracecompass-e4.19.target b/releng/org.eclipse.tracecompass.target/tracecompass-e4.19.target
index 5e986e1..bb561db 100644
--- a/releng/org.eclipse.tracecompass.target/tracecompass-e4.19.target
+++ b/releng/org.eclipse.tracecompass.target/tracecompass-e4.19.target
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?><?pde version="3.8"?><target name="tracecompass-e4.19" sequenceNumber="6">
+<?xml version="1.0" encoding="UTF-8" standalone="no"?><?pde version="3.8"?><target name="tracecompass-e4.19" sequenceNumber="7">
 <locations>
 <location includeAllPlatforms="false" includeConfigurePhase="false" includeMode="planner" includeSource="true" type="InstallableUnit">
 <unit id="org.eclipse.cdt.gnu.dsf.feature.group" version="0.0.0"/>
@@ -27,8 +27,6 @@
 <unit id="org.apache.commons.lang" version="0.0.0"/>
 <unit id="org.apache.commons.lang3" version="0.0.0"/>
 <unit id="org.apache.xml.serializer" version="0.0.0"/>
-<unit id="org.swtchart" version="0.10.0.v201605200358"/>
-<unit id="org.swtchart.source" version="0.10.0.v201605200358"/>
 <unit id="com.google.guava" version="27.1.0.v20190517-1946"/>
 <unit id="org.json" version="0.0.0"/>
 <unit id="org.apache.derby" version="0.0.0"/>
diff --git a/releng/org.eclipse.tracecompass.target/tracecompass-e4.8.target b/releng/org.eclipse.tracecompass.target/tracecompass-e4.8.target
index d899e1c..96b161a 100644
--- a/releng/org.eclipse.tracecompass.target/tracecompass-e4.8.target
+++ b/releng/org.eclipse.tracecompass.target/tracecompass-e4.8.target
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<?pde version="3.8"?><target name="tracecompass-e4.8" sequenceNumber="16">
+<?pde version="3.8"?><target name="tracecompass-e4.8" sequenceNumber="17">
 <locations>
 <location includeAllPlatforms="false" includeConfigurePhase="false" includeMode="planner" includeSource="true" type="InstallableUnit">
 <unit id="org.eclipse.cdt.gnu.dsf.feature.group" version="0.0.0"/>
@@ -33,8 +33,6 @@
 <unit id="org.apache.commons.io" version="0.0.0"/>
 <unit id="org.apache.commons.lang" version="0.0.0"/>
 <unit id="org.apache.commons.lang3" version="0.0.0"/>
-<unit id="org.swtchart" version="0.10.0.v201605200358"/>
-<unit id="org.swtchart.source" version="0.10.0.v201605200358"/>
 <unit id="com.google.guava" version="21.0.0.v20170206-1425"/>
 <unit id="org.json" version="0.0.0"/>
 <unit id="org.apache.derby" version="0.0.0"/>
diff --git a/releng/org.eclipse.tracecompass.target/tracecompass-e4.9.target b/releng/org.eclipse.tracecompass.target/tracecompass-e4.9.target
index 5f6034e..3285426 100644
--- a/releng/org.eclipse.tracecompass.target/tracecompass-e4.9.target
+++ b/releng/org.eclipse.tracecompass.target/tracecompass-e4.9.target
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<?pde version="3.8"?><target name="tracecompass-e4.9" sequenceNumber="15">
+<?pde version="3.8"?><target name="tracecompass-e4.9" sequenceNumber="16">
 <locations>
 <location includeAllPlatforms="false" includeConfigurePhase="false" includeMode="planner" includeSource="true" type="InstallableUnit">
 <unit id="org.eclipse.cdt.gnu.dsf.feature.group" version="0.0.0"/>
@@ -33,8 +33,6 @@
 <unit id="org.apache.commons.io" version="0.0.0"/>
 <unit id="org.apache.commons.lang" version="0.0.0"/>
 <unit id="org.apache.commons.lang3" version="0.0.0"/>
-<unit id="org.swtchart" version="0.10.0.v201605200358"/>
-<unit id="org.swtchart.source" version="0.10.0.v201605200358"/>
 <unit id="com.google.guava" version="21.0.0.v20170206-1425"/>
 <unit id="org.json" version="0.0.0"/>
 <unit id="org.apache.derby" version="0.0.0"/>
diff --git a/releng/org.eclipse.tracecompass.target/tracecompass-eStaging.target b/releng/org.eclipse.tracecompass.target/tracecompass-eStaging.target
index 635f075..c8ffe60 100644
--- a/releng/org.eclipse.tracecompass.target/tracecompass-eStaging.target
+++ b/releng/org.eclipse.tracecompass.target/tracecompass-eStaging.target
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?><?pde version="3.8"?><target name="tracecompass-eStaging" sequenceNumber="161">
+<?xml version="1.0" encoding="UTF-8" standalone="no"?><?pde version="3.8"?><target name="tracecompass-eStaging" sequenceNumber="162">
 <locations>
 <location includeAllPlatforms="false" includeConfigurePhase="false" includeMode="planner" includeSource="true" type="InstallableUnit">
 <unit id="org.eclipse.cdt.gnu.dsf.feature.group" version="0.0.0"/>
@@ -27,8 +27,6 @@
 <unit id="org.apache.commons.lang" version="0.0.0"/>
 <unit id="org.apache.commons.lang3" version="0.0.0"/>
 <unit id="org.apache.xml.serializer" version="0.0.0"/>
-<unit id="org.swtchart" version="0.10.0.v201605200358"/>
-<unit id="org.swtchart.source" version="0.10.0.v201605200358"/>
 <unit id="com.google.guava" version="27.1.0.v20190517-1946"/>
 <unit id="org.json" version="0.0.0"/>
 <unit id="org.apache.derby" version="0.0.0"/>
diff --git a/tmf/org.eclipse.tracecompass.tmf.analysis.xml.ui.swtbot.tests/META-INF/MANIFEST.MF b/tmf/org.eclipse.tracecompass.tmf.analysis.xml.ui.swtbot.tests/META-INF/MANIFEST.MF
index d791286..167cf09 100644
--- a/tmf/org.eclipse.tracecompass.tmf.analysis.xml.ui.swtbot.tests/META-INF/MANIFEST.MF
+++ b/tmf/org.eclipse.tracecompass.tmf.analysis.xml.ui.swtbot.tests/META-INF/MANIFEST.MF
@@ -39,6 +39,5 @@
  org.eclipse.tracecompass.tmf.ui.tests,
  org.eclipse.jdt.annotation;bundle-version="[2.0.0,3.0.0)";resolution:=optional
 Import-Package: org.apache.commons.io,
- org.eclipse.tracecompass.testtraces.ctf,
- org.swtchart
+ org.eclipse.tracecompass.testtraces.ctf
 Automatic-Module-Name: org.eclipse.tracecompass.tmf.analysis.xml.ui.swtbot.tests
diff --git a/tmf/org.eclipse.tracecompass.tmf.analysis.xml.ui/META-INF/MANIFEST.MF b/tmf/org.eclipse.tracecompass.tmf.analysis.xml.ui/META-INF/MANIFEST.MF
index 434f74f..19befc0 100644
--- a/tmf/org.eclipse.tracecompass.tmf.analysis.xml.ui/META-INF/MANIFEST.MF
+++ b/tmf/org.eclipse.tracecompass.tmf.analysis.xml.ui/META-INF/MANIFEST.MF
@@ -18,7 +18,6 @@
  org.eclipse.tracecompass.analysis.timing.core,
  org.eclipse.tracecompass.analysis.timing.ui,
  org.eclipse.tracecompass.segmentstore.core,
- org.swtchart,
  org.eclipse.wst.xml.ui,
  org.eclipse.ui.ide,
  org.eclipse.core.filesystem,
diff --git a/tmf/org.eclipse.tracecompass.tmf.ui.swtbot.tests/META-INF/MANIFEST.MF b/tmf/org.eclipse.tracecompass.tmf.ui.swtbot.tests/META-INF/MANIFEST.MF
index 5e8af51..228667f 100644
--- a/tmf/org.eclipse.tracecompass.tmf.ui.swtbot.tests/META-INF/MANIFEST.MF
+++ b/tmf/org.eclipse.tracecompass.tmf.ui.swtbot.tests/META-INF/MANIFEST.MF
@@ -43,10 +43,8 @@
  org.eclipse.test.performance,
  org.eclipse.tracecompass.testtraces.ctf,
  org.eclipse.tracecompass.tmf.ctf.core.tests.shared,
- org.eclipse.tracecompass.tmf.ctf.core.trace,
- org.swtchart
-Export-Package: org.eclipse.tracecompass.tmf.ui.swtbot.tests,
- org.eclipse.tracecompass.tmf.ui.swtbot.tests.parsers.custom;x-internal:=true,
+ org.eclipse.tracecompass.tmf.ctf.core.trace
+Export-Package: org.eclipse.tracecompass.tmf.ui.swtbot.tests.parsers.custom;x-internal:=true,
  org.eclipse.tracecompass.tmf.ui.swtbot.tests.perf.views,
  org.eclipse.tracecompass.tmf.ui.swtbot.tests.perspectives;x-internal:=true,
  org.eclipse.tracecompass.tmf.ui.swtbot.tests.project,
diff --git a/tmf/org.eclipse.tracecompass.tmf.ui.swtbot.tests/shared/org/eclipse/tracecompass/tmf/ui/swtbot/tests/shared/ConditionHelpers.java b/tmf/org.eclipse.tracecompass.tmf.ui.swtbot.tests/shared/org/eclipse/tracecompass/tmf/ui/swtbot/tests/shared/ConditionHelpers.java
index 0c5561f..f39e92b 100644
--- a/tmf/org.eclipse.tracecompass.tmf.ui.swtbot.tests/shared/org/eclipse/tracecompass/tmf/ui/swtbot/tests/shared/ConditionHelpers.java
+++ b/tmf/org.eclipse.tracecompass.tmf.ui.swtbot.tests/shared/org/eclipse/tracecompass/tmf/ui/swtbot/tests/shared/ConditionHelpers.java
@@ -733,32 +733,6 @@
         return new TimeGraphIsReadyCondition(view, selectionRange, visibleTime);
     }
 
-    @Deprecated
-    private static class XYViewerIsReadyConditionLegacy extends DefaultCondition  {
-
-        private org.eclipse.tracecompass.tmf.ui.viewers.xycharts.TmfXYChartViewer fViewer;
-        private String fFailureMessage;
-
-        private XYViewerIsReadyConditionLegacy(org.eclipse.tracecompass.tmf.ui.viewers.xycharts.TmfXYChartViewer view) {
-            fViewer = view;
-        }
-
-        @Override
-        public boolean test() throws Exception {
-
-            if (fViewer.isDirty()) {
-                fFailureMessage = "Time graph is dirty";
-                return false;
-            }
-            return true;
-        }
-
-        @Override
-        public String getFailureMessage() {
-            return fFailureMessage;
-        }
-    }
-
     private static class XYViewerIsReadyCondition extends DefaultCondition  {
 
         private org.eclipse.tracecompass.tmf.ui.viewers.xychart.TmfXYChartViewer fViewer;
@@ -841,21 +815,6 @@
     }
 
     /**
-     *
-     * Wait until the XY chart viewer is ready. The XY chart viewer is
-     * considered ready when it is not updating.
-     *
-     * @param viewer
-     *            the XY chart viewer
-     * @return ICondition for verification
-     * @deprecated @{link {@link ConditionHelpers#xyViewerIsReadyCondition(org.eclipse.tracecompass.tmf.ui.viewers.xychart.TmfXYChartViewer)}}
-     */
-    @Deprecated
-    public static ICondition xyViewerIsReadyCondition(org.eclipse.tracecompass.tmf.ui.viewers.xycharts.TmfXYChartViewer viewer) {
-        return new XYViewerIsReadyConditionLegacy(viewer);
-    }
-
-    /**
     *
     * Wait until the XY chart viewer is ready. The XY chart viewer is
     * considered ready when it is not updating.
@@ -956,33 +915,6 @@
         }
     }
 
-    private static class NumberOfSeriesLegacy extends DefaultCondition {
-        private String fFailureMessage;
-        private org.swtchart.Chart fChart;
-        private final int fNumberOfSeries;
-
-        public NumberOfSeriesLegacy(org.swtchart.Chart chart, int numberOfSeries) {
-            fChart = chart;
-            fNumberOfSeries = numberOfSeries;
-        }
-
-        @Override
-        public boolean test() throws Exception {
-            int length = fChart.getSeriesSet().getSeries().length;
-            if (length != fNumberOfSeries){
-                fFailureMessage = "Chart did not contain the expected number series. Actual " + length + ", expected " + fNumberOfSeries;
-                return false;
-            }
-
-            return true;
-        }
-
-        @Override
-        public String getFailureMessage() {
-            return fFailureMessage;
-        }
-    }
-
     private static class NumberOfSeries extends DefaultCondition {
         private String fFailureMessage;
         private Chart fChart;
@@ -1019,22 +951,6 @@
      *            the number of expected series
      *
      * @return ICondition for verification
-     * @deprecated use {@link ConditionHelpers#numberOfSeries(Chart, int)}
-     */
-    @Deprecated
-    public static ICondition numberOfSeries(org.swtchart.Chart chart, int numberOfSeries) {
-        return new NumberOfSeriesLegacy(chart, numberOfSeries);
-    }
-
-    /**
-     * Wait until the chart has the specified number of series.
-     *
-     * @param chart
-     *            the chart
-     * @param numberOfSeries
-     *            the number of expected series
-     *
-     * @return ICondition for verification
      */
     public static ICondition numberOfSeries(Chart chart, int numberOfSeries) {
         return new NumberOfSeries(chart, numberOfSeries);
diff --git a/tmf/org.eclipse.tracecompass.tmf.ui.swtbot.tests/shared/org/eclipse/tracecompass/tmf/ui/swtbot/tests/shared/SWTBotSwtChart.java b/tmf/org.eclipse.tracecompass.tmf.ui.swtbot.tests/shared/org/eclipse/tracecompass/tmf/ui/swtbot/tests/shared/SWTBotSwtChart.java
deleted file mode 100644
index 20164cb..0000000
--- a/tmf/org.eclipse.tracecompass.tmf.ui.swtbot.tests/shared/org/eclipse/tracecompass/tmf/ui/swtbot/tests/shared/SWTBotSwtChart.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2019 Ericsson
- *
- * All rights reserved. This program and the accompanying materials are
- * made available under the terms of the Eclipse Public License 2.0 which
- * accompanies this distribution, and is available at
- * https://www.eclipse.org/legal/epl-2.0/
- *
- * SPDX-License-Identifier: EPL-2.0
- *******************************************************************************/
-
-package org.eclipse.tracecompass.tmf.ui.swtbot.tests.shared;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.atomic.AtomicReference;
-
-import org.eclipse.swtbot.swt.finder.SWTBot;
-import org.eclipse.swtbot.swt.finder.exceptions.WidgetNotFoundException;
-import org.eclipse.swtbot.swt.finder.matchers.WidgetOfType;
-import org.eclipse.swtbot.swt.finder.widgets.AbstractSWTBotControl;
-import org.swtchart.Chart;
-import org.swtchart.ISeries;
-
-/**
- * SWTBot class representing a SwtChart
- *
- * @author Bernd Hufmann
- * @deprecated use {link {@link SWTBotEclipseSwtChart}
- */
-@Deprecated
-public class SWTBotSwtChart extends AbstractSWTBotControl<Chart> {
-
-    /**
-     * Constructor
-     *
-     * @param w the widget
-     * @throws WidgetNotFoundException if the widget is <code>null</code> or widget has been disposed.
-     */
-    public SWTBotSwtChart(Chart w) throws WidgetNotFoundException {
-        super(w);
-    }
-
-    /**
-     * Constructor
-     *
-     * @param bot
-     *            a SWTBot instance with which to find a SwtChart
-     * @throws WidgetNotFoundException
-     *             if the widget is <code>null</code> or widget has been
-     *             disposed.
-     */
-    public SWTBotSwtChart(SWTBot bot) throws WidgetNotFoundException {
-        super(bot.widget(WidgetOfType.widgetOfType(Chart.class)));
-    }
-
-    @Override
-    public AbstractSWTBotControl<Chart> moveMouseToWidget() {
-        return super.moveMouseToWidget();
-    }
-
-    /**
-     * Returns the list of series
-     *
-     * @return the list of series
-     */
-    public List<SWTBotSwtChartSeries> getSeries() {
-        List<SWTBotSwtChartSeries> list = new ArrayList<>();
-        for (ISeries series : widget.getSeriesSet().getSeries()) {
-            list.add(new SWTBotSwtChartSeries(widget, series));
-        }
-        return list;
-    }
-
-    /**
-     * Returns the series with the specified id
-     *
-     * @param id
-     *            the id
-     * @return the series
-     */
-    public SWTBotSwtChartSeries getSeries(String id) {
-        AtomicReference<ISeries> series = new AtomicReference<>();
-        SWTBotUtils.waitUntil(chart -> {
-            series.set(widget.getSeriesSet().getSeries(id));
-            return series.get() != null;
-        }, widget, () -> "Timed out waiting for series " + id);
-        return new SWTBotSwtChartSeries(widget, series.get());
-    }
-}
diff --git a/tmf/org.eclipse.tracecompass.tmf.ui.swtbot.tests/shared/org/eclipse/tracecompass/tmf/ui/swtbot/tests/shared/SWTBotSwtChartSeries.java b/tmf/org.eclipse.tracecompass.tmf.ui.swtbot.tests/shared/org/eclipse/tracecompass/tmf/ui/swtbot/tests/shared/SWTBotSwtChartSeries.java
deleted file mode 100644
index bfae59c..0000000
--- a/tmf/org.eclipse.tracecompass.tmf.ui.swtbot.tests/shared/org/eclipse/tracecompass/tmf/ui/swtbot/tests/shared/SWTBotSwtChartSeries.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2019 Ericsson
- *
- * All rights reserved. This program and the accompanying materials are
- * made available under the terms of the Eclipse Public License 2.0 which
- * accompanies this distribution, and is available at
- * https://www.eclipse.org/legal/epl-2.0/
- *
- * SPDX-License-Identifier: EPL-2.0
- *******************************************************************************/
-
-package org.eclipse.tracecompass.tmf.ui.swtbot.tests.shared;
-
-import org.eclipse.swtbot.swt.finder.exceptions.WidgetNotFoundException;
-import org.eclipse.swtbot.swt.finder.widgets.AbstractSWTBotControl;
-import org.swtchart.Chart;
-import org.swtchart.ISeries;
-import org.swtchart.ISeries.SeriesType;
-
-/**
- * SWTBot class representing a SwtChart series
- *
- * @author Patrick Tasse
- * @deprecated use {link {@link SWTBotEclipseSwtChartSeries}
- */
-@Deprecated
-public class SWTBotSwtChartSeries extends AbstractSWTBotControl<Chart> {
-
-    private final ISeries fSeries;
-
-    /**
-     * Constructor
-     *
-     * @param chart
-     *            the chart widget
-     * @param series
-     *            the series
-     * @throws WidgetNotFoundException
-     *             if the widget is <code>null</code> or widget has been
-     *             disposed.
-     */
-    public SWTBotSwtChartSeries(Chart chart, ISeries series) throws WidgetNotFoundException {
-        super(chart);
-        fSeries = series;
-    }
-
-    /**
-     * Returns the series type
-     *
-     * @return the series type
-     */
-    public SeriesType getType() {
-        return fSeries.getType();
-    }
-
-    /**
-     * Returns the series id
-     *
-     * @return the series id
-     */
-    public String getSeriesId() {
-        return fSeries.getId();
-    }
-}
diff --git a/tmf/org.eclipse.tracecompass.tmf.ui.swtbot.tests/src/org/eclipse/tracecompass/tmf/ui/swtbot/tests/XYDataProviderBaseTest.java b/tmf/org.eclipse.tracecompass.tmf.ui.swtbot.tests/src/org/eclipse/tracecompass/tmf/ui/swtbot/tests/XYDataProviderBaseTest.java
deleted file mode 100644
index 6520482..0000000
--- a/tmf/org.eclipse.tracecompass.tmf.ui.swtbot.tests/src/org/eclipse/tracecompass/tmf/ui/swtbot/tests/XYDataProviderBaseTest.java
+++ /dev/null
@@ -1,356 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2017, 2019 Ericsson
- *
- * All rights reserved. This program and the accompanying materials are
- * made available under the terms of the Eclipse Public License 2.0 which
- * accompanies this distribution, and is available at
- * https://www.eclipse.org/legal/epl-2.0/
- *
- * SPDX-License-Identifier: EPL-2.0
- *******************************************************************************/
-
-package org.eclipse.tracecompass.tmf.ui.swtbot.tests;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
-import java.io.File;
-import java.net.URI;
-import java.net.URL;
-import java.util.Arrays;
-import java.util.LinkedHashMap;
-import java.util.Map;
-import java.util.Objects;
-
-import org.apache.log4j.ConsoleAppender;
-import org.apache.log4j.Logger;
-import org.apache.log4j.SimpleLayout;
-import org.eclipse.core.runtime.FileLocator;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.jdt.annotation.NonNull;
-import org.eclipse.jdt.annotation.Nullable;
-import org.eclipse.swt.graphics.RGB;
-import org.eclipse.swtbot.eclipse.finder.SWTWorkbenchBot;
-import org.eclipse.swtbot.eclipse.finder.widgets.SWTBotView;
-import org.eclipse.swtbot.swt.finder.finders.UIThreadRunnable;
-import org.eclipse.swtbot.swt.finder.junit.SWTBotJunit4ClassRunner;
-import org.eclipse.swtbot.swt.finder.matchers.WidgetOfType;
-import org.eclipse.swtbot.swt.finder.utils.FileUtils;
-import org.eclipse.swtbot.swt.finder.utils.SWTBotPreferences;
-import org.eclipse.tracecompass.tmf.core.model.TmfCommonXAxisModel;
-import org.eclipse.tracecompass.tmf.core.model.YModel;
-import org.eclipse.tracecompass.tmf.core.model.xy.IYModel;
-import org.eclipse.tracecompass.tmf.core.trace.ITmfTrace;
-import org.eclipse.tracecompass.tmf.ui.swtbot.tests.shared.SWTBotUtils;
-import org.eclipse.tracecompass.tmf.ui.tests.shared.WaitUtils;
-import org.eclipse.tracecompass.tmf.ui.viewers.xycharts.TmfXYChartViewer;
-import org.eclipse.tracecompass.tmf.ui.views.TmfChartView;
-import org.eclipse.ui.IViewPart;
-import org.hamcrest.Matcher;
-import org.junit.After;
-import org.junit.AfterClass;
-import org.junit.Before;
-import org.junit.BeforeClass;
-import org.junit.runner.RunWith;
-import org.osgi.framework.Bundle;
-import org.osgi.framework.FrameworkUtil;
-import org.swtchart.Chart;
-import org.swtchart.IBarSeries;
-import org.swtchart.ILineSeries;
-import org.swtchart.ISeries;
-import org.swtchart.LineStyle;
-
-import com.google.common.primitives.Doubles;
-import com.google.common.primitives.Longs;
-import com.google.gson.Gson;
-import com.google.gson.GsonBuilder;
-
-/**
- * SWTBot tests for viewers using XY data provider
- *
- * @author Yonni Chen
- * @deprecated use {@link org.eclipse.tracecompass.tmf.ui.swtbot.tests.views.xychart.XYDataProviderBaseTest}
- */
-@Deprecated
-@RunWith(SWTBotJunit4ClassRunner.class)
-public abstract class XYDataProviderBaseTest {
-
-    /** The workbench bot */
-    protected static SWTWorkbenchBot fBot;
-
-    /** The Log4j logger instance. */
-    private static final Logger fLogger = Logger.getRootLogger();
-
-    /** Default project name */
-    protected static final String TRACE_PROJECT_NAME = "test";
-
-    private static Gson fGson = new GsonBuilder().setPrettyPrinting().create();
-
-    private SWTBotView fViewBot;
-    private Chart fChart;
-
-    /**
-     * Before Class
-     */
-    @BeforeClass
-    public static void beforeClass() {
-        SWTBotUtils.initialize();
-
-        /* set up for swtbot */
-        SWTBotPreferences.TIMEOUT = 20000; /* 20 second timeout */
-        SWTBotPreferences.KEYBOARD_LAYOUT = "EN_US";
-        fLogger.removeAllAppenders();
-        fLogger.addAppender(new ConsoleAppender(new SimpleLayout(), ConsoleAppender.SYSTEM_OUT));
-        fBot = new SWTWorkbenchBot();
-        SWTBotUtils.closeView("welcome", fBot);
-        /* Create the trace project */
-        SWTBotUtils.createProject(TRACE_PROJECT_NAME);
-        /* Finish waiting for eclipse to load */
-        WaitUtils.waitForJobs();
-    }
-
-    /**
-     * Close the editor
-     */
-    @AfterClass
-    public static void tearDown() {
-        SWTBotUtils.deleteProject(TRACE_PROJECT_NAME, fBot);
-        fLogger.removeAllAppenders();
-    }
-
-    /**
-     * Set up
-     */
-    @Before
-    public void setup() {
-        SWTBotUtils.openView(getViewID());
-        fViewBot = fBot.viewById(getViewID());
-        fViewBot.show();
-
-        Matcher<Chart> widgetOfType = WidgetOfType.widgetOfType(Chart.class);
-        fChart = fViewBot.bot().widget(widgetOfType);
-        ITmfTrace trace = getTestTrace();
-
-        File file = new File(trace.getPath());
-        SWTBotUtils.openTrace(TRACE_PROJECT_NAME, file.getAbsolutePath(), trace.getTraceTypeId());
-        SWTBotUtils.activateEditor(fBot, trace.getName());
-    }
-
-    /**
-     * After Test
-     */
-    @After
-    public void after() {
-        fBot.closeAllEditors();
-        SWTBotUtils.closeSecondaryShells(fBot);
-        disposeTestTrace();
-    }
-
-    /**
-     * Get the full path to a test file from this class's bundle.
-     *
-     * @param bundlePath
-     *            path from the bundle
-     * @return the absolute path
-     */
-    private String getFullPath(String bundlePath) {
-        try {
-            Bundle bundle = FrameworkUtil.getBundle(this.getClass());
-            URL location = FileLocator.find(bundle, new Path(bundlePath), null);
-            URI uri = FileLocator.toFileURL(location).toURI();
-            return new File(uri).getAbsolutePath();
-        } catch (Exception e) {
-            fail(e.toString());
-            return null;
-        }
-    }
-
-    /**
-     * Based on a SWT Chart, we check if data shown is valid with a JSON file.
-     * Comparison with the main series and other series if exists
-     *
-     * @param chart
-     *            A SWT Chart
-     * @param otherSeries
-     *            An array of other series name to check other than the main series
-     * @param expectedJson
-     *            The path of the JSON file relative to this class's bundle
-     * @return True if the serialized chart data matches the JSON file content
-     */
-    protected boolean isChartDataValid(final Chart chart, String expectedJson, String... otherSeries) {
-        /**
-         * FIXME : Once CQ for Jackson is approved, use deserialization instead of
-         * comparing strings
-         */
-        String expected = FileUtils.read(getFullPath(expectedJson));
-        TmfCommonXAxisModel model = extractModelFromChart(chart, otherSeries);
-        String current = fGson.toJson(model);
-        current = current.replaceAll("\\(Legacy\\)", "View");
-        return expected.equals(current);
-    }
-
-    /**
-     * From a SWT Chart, this method extract a {@link TmfCommonXAxisModel} that
-     * represents the chart. Since, we unfortunately have no mecanism to deserialize
-     * with GSON, we have to compare strings. So, once the model is extract from the
-     * Chart, we serialize it and compare with a string
-     *
-     * @param chart
-     *            A SWT Chart
-     * @param otherSeries
-     *            Name of other series to extract from Chart
-     * @return A {@link TmfCommonXAxisModel}
-     */
-    protected TmfCommonXAxisModel extractModelFromChart(final Chart chart, String... otherSeries) {
-        String mainSeriesName = getMainSeriesName();
-        ISeries mainSeries = chart.getSeriesSet().getSeries(mainSeriesName);
-        if (mainSeries == null) {
-            System.out.println("Main Series " + mainSeriesName + " not found in chart");
-            return null;
-        }
-
-        /* X and Y Values shown in chart */
-        double[] xMain = mainSeries.getXSeries();
-        double[] yMain = mainSeries.getYSeries();
-
-        Map<@NonNull String, @NonNull IYModel> yModels = new LinkedHashMap<>();
-        yModels.put(mainSeriesName, new YModel(-1, mainSeriesName, Objects.requireNonNull(yMain)));
-
-        for (String other : otherSeries) {
-            if (other != null) {
-                ISeries series = chart.getSeriesSet().getSeries(other);
-                if (series == null) {
-                    System.out.println("Series " + other + " not found in chart");
-                    return null;
-                }
-
-                /* X and Y Values shown in chart */
-                double[] xSeries = series.getXSeries();
-                double[] ySeries = series.getYSeries();
-
-                /* Series should have the same x axis values, not finished updating all series*/
-                if (!Arrays.equals(xMain, xSeries)) {
-                    System.out.println("Series don't currently have the same x axis values");
-                    return null;
-                }
-                yModels.put(other, new YModel(-1, other, Objects.requireNonNull(ySeries)));
-            }
-        }
-
-        long[] x = Longs.toArray(Doubles.asList(xMain));
-        assertNotNull(x);
-        return new TmfCommonXAxisModel(getTitle(), x, yModels.values());
-    }
-
-    /**
-     * Gets the ChartViewer from a TmfChartView
-     *
-     * @param viewPart
-     *            The IViewPart
-     * @return The ChartViewer from the IViewPart
-     */
-    protected static TmfXYChartViewer getChartViewer(IViewPart viewPart) {
-        if (viewPart instanceof TmfChartView) {
-            return ((TmfChartView) viewPart).getChartViewer();
-        }
-        return null;
-    }
-
-    /**
-     * Verify the style of a series in the XY chart
-     *
-     * @param seriesName
-     *            The name of the series
-     * @param expectedType
-     *            Expected type of the series
-     * @param expectedColor
-     *            Expected color of the series. If the color is arbitrary, a value
-     *            of <code>null</code> will skip color check
-     * @param expectedLineStyle
-     *            Expected line style of the series
-     * @param isArea
-     *            Parameter should be true if expected series show area, false
-     *            either
-     */
-    protected void verifySeriesStyle(String seriesName, ISeries.SeriesType expectedType, @Nullable RGB expectedColor, LineStyle expectedLineStyle, boolean isArea) {
-        /* Make sure the UI update is complete */
-        UIThreadRunnable.syncExec(() -> {});
-
-        ISeries series = fChart.getSeriesSet().getSeries(seriesName);
-        assertNotNull(series);
-        assertTrue(series.isVisible());
-
-        /* Color, type and style */
-        assertEquals(expectedType, series.getType());
-
-        if (expectedType == ISeries.SeriesType.LINE) {
-            ILineSeries line = (ILineSeries) series;
-            if (expectedColor != null) {
-                assertEquals(expectedColor, line.getLineColor().getRGB());
-            }
-            assertEquals(expectedLineStyle, line.getLineStyle());
-            assertEquals(isArea, line.isAreaEnabled());
-        } else if (expectedType == ISeries.SeriesType.BAR) {
-            IBarSeries bar = (IBarSeries) series;
-            if (expectedColor != null) {
-                assertEquals(expectedColor, bar.getBarColor().getRGB());
-            }
-            assertTrue(bar.isStackEnabled());
-        }
-    }
-
-    /**
-     * Gets the SWT Chart
-     *
-     * @return The chart
-     *
-     */
-    protected Chart getChart() {
-        return fChart;
-    }
-
-    /**
-     * Gets the SWT Bot View
-     *
-     * @return The SWT Bot View
-     *
-     */
-    protected SWTBotView getSWTBotView() {
-        return fViewBot;
-    }
-
-    /**
-     * Gets the main series name of the XY
-     *
-     * @return The main series name
-     */
-    protected abstract @NonNull String getMainSeriesName();
-
-    /**
-     * Gets the title of the XY
-     *
-     * @return The title
-     */
-    protected abstract @NonNull String getTitle();
-
-    /**
-     * Gets the view ID
-     *
-     * @return The view ID
-     */
-    protected abstract String getViewID();
-
-    /**
-     * Gets the trace on which the test will be run
-     *
-     * @return The trace
-     */
-    protected abstract ITmfTrace getTestTrace();
-
-    /**
-     * Disposes the trace on which the test was run
-     */
-    protected abstract void disposeTestTrace();
-}
diff --git a/tmf/org.eclipse.tracecompass.tmf.ui.swtbot.tests/src/org/eclipse/tracecompass/tmf/ui/swtbot/tests/views/XYChartViewStub.java b/tmf/org.eclipse.tracecompass.tmf.ui.swtbot.tests/src/org/eclipse/tracecompass/tmf/ui/swtbot/tests/views/XYChartViewStub.java
deleted file mode 100644
index 8714bd4..0000000
--- a/tmf/org.eclipse.tracecompass.tmf.ui.swtbot.tests/src/org/eclipse/tracecompass/tmf/ui/swtbot/tests/views/XYChartViewStub.java
+++ /dev/null
@@ -1,149 +0,0 @@
-/**********************************************************************
- * Copyright (c) 2019 Ericsson
- *
- * All rights reserved. This program and the accompanying materials are
- * made available under the terms of the Eclipse Public License 2.0 which
- * accompanies this distribution, and is available at
- * https://www.eclipse.org/legal/epl-2.0/
- *
- * SPDX-License-Identifier: EPL-2.0
- **********************************************************************/
-package org.eclipse.tracecompass.tmf.ui.swtbot.tests.views;
-
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.jdt.annotation.NonNull;
-import org.eclipse.jdt.annotation.Nullable;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.tracecompass.internal.tmf.core.model.TmfXyResponseFactory;
-import org.eclipse.tracecompass.tmf.core.dataprovider.DataProviderParameterUtils;
-import org.eclipse.tracecompass.tmf.core.model.CommonStatusMessage;
-import org.eclipse.tracecompass.tmf.core.model.YModel;
-import org.eclipse.tracecompass.tmf.core.model.tree.ITmfTreeDataModel;
-import org.eclipse.tracecompass.tmf.core.model.tree.ITmfTreeDataProvider;
-import org.eclipse.tracecompass.tmf.core.model.tree.TmfTreeDataModel;
-import org.eclipse.tracecompass.tmf.core.model.tree.TmfTreeModel;
-import org.eclipse.tracecompass.tmf.core.model.xy.ITmfTreeXYDataProvider;
-import org.eclipse.tracecompass.tmf.core.model.xy.ITmfXYDataProvider;
-import org.eclipse.tracecompass.tmf.core.model.xy.ITmfXyModel;
-import org.eclipse.tracecompass.tmf.core.model.xy.IYModel;
-import org.eclipse.tracecompass.tmf.core.response.ITmfResponse;
-import org.eclipse.tracecompass.tmf.core.response.TmfModelResponse;
-import org.eclipse.tracecompass.tmf.core.trace.ITmfTrace;
-import org.eclipse.tracecompass.tmf.ui.viewers.TmfViewer;
-import org.eclipse.tracecompass.tmf.ui.viewers.tree.AbstractSelectTreeViewer;
-import org.eclipse.tracecompass.tmf.ui.viewers.tree.ITmfTreeColumnDataProvider;
-import org.eclipse.tracecompass.tmf.ui.viewers.tree.TmfGenericTreeEntry;
-import org.eclipse.tracecompass.tmf.ui.viewers.tree.TmfTreeColumnData;
-import org.eclipse.tracecompass.tmf.ui.viewers.xycharts.TmfXYChartViewer;
-import org.eclipse.tracecompass.tmf.ui.viewers.xycharts.linecharts.TmfFilteredXYChartViewer;
-import org.eclipse.tracecompass.tmf.ui.viewers.xycharts.linecharts.TmfXYChartSettings;
-import org.eclipse.tracecompass.tmf.ui.views.TmfChartView;
-
-import com.google.common.collect.ImmutableList;
-import com.google.common.primitives.Longs;
-
-/**
- * XYChart View Stub
- *
- * @author Bernd Hufmann
- * @deprecated use {@link org.eclipse.tracecompass.tmf.ui.swtbot.tests.views.xychart.XYChartViewStub}
- */
-@Deprecated
-@SuppressWarnings("restriction")
-public class XYChartViewStub extends TmfChartView {
-
-    /** View ID. */
-    public static final String ID = "org.eclipse.tracecompass.tmf.ui.swtbot.tests.views.xychart.stub"; //$NON-NLS-1$
-
-    /** View ID. */
-    @NonNull
-    public static final String PROVIDER_ID = "org.eclipse.tracecompass.tmf.ui.swtbot.tests.views.xychart.stub.provider"; //$NON-NLS-1$
-
-    /** Title of the chart viewer */
-    public static final String VIEW_TITLE = "XY Chart View Stub"; //$NON-NLS-1$
-
-    /**
-     * Constructor
-     */
-    public XYChartViewStub() {
-        super(VIEW_TITLE);
-    }
-
-    @Override
-    protected TmfXYChartViewer createChartViewer(Composite parent) {
-        TmfXYChartSettings settings = new TmfXYChartSettings(null, null, null, 1);
-        return new TmfFilteredXYChartViewer(parent, settings, PROVIDER_ID) {
-            @Override
-            protected ITmfXYDataProvider initializeDataProvider(@NonNull ITmfTrace trace) {
-                return new MyTmfXyDataProvider();
-            }
-        };
-    }
-
-    @Override
-    protected @NonNull TmfViewer createLeftChildViewer(Composite parent) {
-        return new MyAbsractSelectTreeViewer(parent, PROVIDER_ID);
-    }
-
-    private class MyTmfXyDataProvider implements ITmfTreeXYDataProvider<@NonNull ITmfTreeDataModel> {
-        @SuppressWarnings("null")
-        @Override
-        public final TmfModelResponse<ITmfXyModel> fetchXY(Map<String, Object> fetchParameters, @Nullable IProgressMonitor monitor) {
-            List<Long> xValues = DataProviderParameterUtils.extractTimeRequested(fetchParameters);
-            if (xValues == null) {
-                return TmfXyResponseFactory.createFailedResponse("No requested time values provided");
-            }
-            double[] yValues = new double[xValues.size()];
-            for (int i = 0; i < yValues.length; i++) {
-                yValues[i] = xValues.get(i) * 0.000001;
-            }
-            @NonNull
-            IYModel series = new YModel(1, "Top", yValues);
-            List<@NonNull IYModel> yModels = Collections.singletonList(series);
-            return TmfXyResponseFactory.create("Top", Objects.requireNonNull(Longs.toArray(xValues)), yModels, true);
-        }
-
-        @Override
-        public final TmfModelResponse<TmfTreeModel<@NonNull ITmfTreeDataModel>> fetchTree(Map<String, Object> fetchParameters, @Nullable IProgressMonitor monitor) {
-            @NonNull
-            List<@NonNull ITmfTreeDataModel> list = Collections.singletonList(new TmfTreeDataModel(1, -1L, "Top"));
-            TmfTreeModel<@NonNull ITmfTreeDataModel> tree = new TmfTreeModel<>(Collections.emptyList(), list);
-            return new TmfModelResponse<>(tree, ITmfResponse.Status.COMPLETED, CommonStatusMessage.COMPLETED);
-        }
-
-        @Override
-        public @NonNull String getId() {
-            return PROVIDER_ID;
-        }
-
-    }
-
-    private class MyAbsractSelectTreeViewer extends AbstractSelectTreeViewer {
-
-        class MyTreeLabelProvider extends TreeLabelProvider { }
-
-        public MyAbsractSelectTreeViewer(Composite parent, String id) {
-            super(parent, 1, id);
-            setLabelProvider(new MyTreeLabelProvider());
-        }
-
-        @Override
-        protected ITmfTreeColumnDataProvider getColumnDataProvider() {
-            return () -> ImmutableList.of(
-                        createColumn("Name", Comparator.comparing(TmfGenericTreeEntry::getName)),
-                        new TmfTreeColumnData("Legend"));
-        }
-
-        @Override
-        protected ITmfTreeDataProvider<@NonNull ITmfTreeDataModel> getProvider(@NonNull ITmfTrace trace) {
-            return new MyTmfXyDataProvider();
-        }
-    }
-
-}
diff --git a/tmf/org.eclipse.tracecompass.tmf.ui.swtbot.tests/src/org/eclipse/tracecompass/tmf/ui/swtbot/tests/views/XYChartViewTest.java b/tmf/org.eclipse.tracecompass.tmf.ui.swtbot.tests/src/org/eclipse/tracecompass/tmf/ui/swtbot/tests/views/XYChartViewTest.java
deleted file mode 100644
index 5e5678e..0000000
--- a/tmf/org.eclipse.tracecompass.tmf.ui.swtbot.tests/src/org/eclipse/tracecompass/tmf/ui/swtbot/tests/views/XYChartViewTest.java
+++ /dev/null
@@ -1,366 +0,0 @@
-/**********************************************************************
- * Copyright (c) 2019 Ericsson
- *
- * All rights reserved. This program and the accompanying materials are
- * made available under the terms of the Eclipse Public License 2.0 which
- * accompanies this distribution, and is available at
- * https://www.eclipse.org/legal/epl-2.0/
- *
- * SPDX-License-Identifier: EPL-2.0
- **********************************************************************/
-
-package org.eclipse.tracecompass.tmf.ui.swtbot.tests.views;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-
-import org.apache.log4j.ConsoleAppender;
-import org.apache.log4j.Logger;
-import org.apache.log4j.SimpleLayout;
-import org.eclipse.jdt.annotation.NonNull;
-import org.eclipse.swtbot.eclipse.finder.SWTWorkbenchBot;
-import org.eclipse.swtbot.eclipse.finder.widgets.SWTBotView;
-import org.eclipse.swtbot.swt.finder.finders.UIThreadRunnable;
-import org.eclipse.swtbot.swt.finder.junit.SWTBotJunit4ClassRunner;
-import org.eclipse.swtbot.swt.finder.utils.SWTBotPreferences;
-import org.eclipse.swtbot.swt.finder.waits.DefaultCondition;
-import org.eclipse.swtbot.swt.finder.widgets.SWTBotToolbarButton;
-import org.eclipse.tracecompass.tmf.core.event.ITmfEvent;
-import org.eclipse.tracecompass.tmf.core.exceptions.TmfTraceException;
-import org.eclipse.tracecompass.tmf.core.signal.TmfSelectionRangeUpdatedSignal;
-import org.eclipse.tracecompass.tmf.core.signal.TmfSignalManager;
-import org.eclipse.tracecompass.tmf.core.signal.TmfTraceClosedSignal;
-import org.eclipse.tracecompass.tmf.core.signal.TmfTraceOpenedSignal;
-import org.eclipse.tracecompass.tmf.core.signal.TmfWindowRangeUpdatedSignal;
-import org.eclipse.tracecompass.tmf.core.timestamp.ITmfTimestamp;
-import org.eclipse.tracecompass.tmf.core.timestamp.TmfTimeRange;
-import org.eclipse.tracecompass.tmf.core.timestamp.TmfTimestamp;
-import org.eclipse.tracecompass.tmf.core.trace.TmfContext;
-import org.eclipse.tracecompass.tmf.core.trace.location.ITmfLocation;
-import org.eclipse.tracecompass.tmf.tests.stubs.trace.TmfTraceStub;
-import org.eclipse.tracecompass.tmf.ui.swtbot.tests.shared.ConditionHelpers;
-import org.eclipse.tracecompass.tmf.ui.swtbot.tests.shared.SWTBotSwtChart;
-import org.eclipse.tracecompass.tmf.ui.swtbot.tests.shared.SWTBotUtils;
-import org.eclipse.tracecompass.tmf.ui.viewers.xycharts.TmfXYChartViewer;
-import org.eclipse.tracecompass.tmf.ui.views.TmfChartView;
-import org.junit.After;
-import org.junit.AfterClass;
-import org.junit.Before;
-import org.junit.BeforeClass;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.swtchart.Chart;
-import org.swtchart.ISeries;
-import org.swtchart.ISeriesSet;
-
-/**
- * Test for XY Chart views in Trace Compass.
- * @deprecated use {@link org.eclipse.tracecompass.tmf.ui.swtbot.tests.views.xychart.XYChartViewTest}
- */
-@Deprecated
-@RunWith(SWTBotJunit4ClassRunner.class)
-public class XYChartViewTest {
-
-    private static final Logger fLogger = Logger.getRootLogger();
-
-    private SWTBotView fViewBot;
-
-    private TmfTraceStub fTrace;
-
-    private SWTWorkbenchBot fBot;
-
-    private TmfXYChartViewer fXyViewer;
-
-    private static final TmfTimeRange INITIAL_WINDOW_RANGE = new TmfTimeRange(TmfTimestamp.fromNanos(20), TmfTimestamp.fromNanos(100));
-
-    /**
-     * Set up for test
-     */
-    @BeforeClass
-    public static void beforeClass() {
-        SWTBotUtils.initialize();
-        SWTBotPreferences.TIMEOUT = 20000; /* 20 second timeout */
-        SWTBotPreferences.KEYBOARD_LAYOUT = "EN_US";
-        fLogger.removeAllAppenders();
-        fLogger.addAppender(new ConsoleAppender(new SimpleLayout(), ConsoleAppender.SYSTEM_OUT));
-    }
-
-    /**
-     * Before the test is run, make the view see the items.
-     *
-     * Reset the perspective and close all the views.
-     *
-     * @throws TmfTraceException
-     *             could not load a trace
-     */
-    @Before
-    public void before() throws TmfTraceException {
-        fBot = new SWTWorkbenchBot();
-        fBot.closeAllEditors();
-        for (SWTBotView viewBot : fBot.views()) {
-            viewBot.close();
-        }
-        fTrace = new TmfTraceStub() {
-
-            @Override
-            public @NonNull String getName() {
-                return "Stub";
-            }
-
-            @Override
-            public TmfContext seekEvent(ITmfLocation location) {
-                return new TmfContext();
-            }
-        };
-        fTrace.setStartTime(TmfTimestamp.fromNanos(0));
-
-        fTrace.setEndTime(TmfTimestamp.fromNanos(180));
-
-        TmfTraceStub trace = fTrace;
-        trace.initialize(null, "", ITmfEvent.class);
-        assertNotNull(trace);
-
-        // Register trace to trace manager
-        UIThreadRunnable.syncExec(() -> TmfSignalManager.dispatchSignal(new TmfTraceOpenedSignal(this, trace, null)));
-
-        // Open view
-        SWTBotUtils.openView(XYChartViewStub.ID);
-        fViewBot = fBot.viewById(XYChartViewStub.ID);
-        fViewBot.show();
-
-        TmfChartView viewPart = (TmfChartView) fViewBot.getViewReference().getView(true);
-        fXyViewer = viewPart.getChartViewer();
-
-        // Wait till SWT chart is constructed
-        fViewBot.bot().waitUntil(new DefaultCondition() {
-            @Override
-            public boolean test() throws Exception {
-                return fXyViewer.getSwtChart() != null;
-            }
-            @Override
-            public String getFailureMessage() {
-                return "SWT Chart is null";
-            }
-        });
-
-        // Wait for trace to be loaded
-        resetTimeRange();
-    }
-
-
-    /**
-     * Clean up after a test, reset the views.
-     */
-    @After
-    public void after() {
-        TmfTraceStub trace = fTrace;
-        assertNotNull(trace);
-        UIThreadRunnable.syncExec(() -> TmfSignalManager.dispatchSignal(new TmfTraceClosedSignal(this, trace)));
-        fViewBot.close();
-        fBot.waitUntil(ConditionHelpers.viewIsClosed(fViewBot));
-        fTrace.dispose();
-    }
-
-    /**
-     * Put things back the way they were
-     */
-    @AfterClass
-    public static void afterClass() {
-        SWTWorkbenchBot bot = new SWTWorkbenchBot();
-        bot.closeAllEditors();
-        fLogger.removeAllAppenders();
-    }
-
-    /**
-     * Test horizontal zoom, we can see a rounding error
-     */
-    @Test
-    public void testHorizontalZoom() {
-        fViewBot.setFocus();
-
-        assertEquals(80, fXyViewer.getWindowDuration());
-
-        SWTBotSwtChart xyChart = new SWTBotSwtChart(fViewBot.bot());
-
-        fireKeyInGraph(xyChart, '=');
-        fViewBot.bot().waitUntil(new SeriesCondition(fXyViewer, 52));
-        fireKeyInGraph(xyChart, '+');
-        fViewBot.bot().waitUntil(new SeriesCondition(fXyViewer, 34));
-        fireKeyInGraph(xyChart, '-');
-        fViewBot.bot().waitUntil(new SeriesCondition(fXyViewer, 51));
-        fireKeyInGraph(xyChart, '-');
-        fViewBot.bot().waitUntil(new SeriesCondition(fXyViewer, 77));
-
-        resetTimeRange();
-
-        /* Zoom using zoom-in and zoom-out buttons */
-        SWTBotToolbarButton button = fViewBot.toolbarButton("Zoom In");
-        button.click();
-        fViewBot.bot().waitUntil(new SeriesCondition(fXyViewer, 52));
-        button = fViewBot.toolbarButton("Zoom Out");
-        button.click();
-        fViewBot.bot().waitUntil(new SeriesCondition(fXyViewer, 78));
-
-        /*
-         *  Note that 'w' and 's' zooming is based on mouse position. Just check if
-         *  window range was increased or decreased to avoid inaccuracy due to
-         *  the mouse position in test environment.
-         */
-        long previousRange = fXyViewer.getWindowDuration();
-        fireKeyInGraph(xyChart, 'w');
-        fViewBot.bot().waitUntil(new SeriesUpdatedCondition(fXyViewer, previousRange, false));
-        previousRange = fXyViewer.getWindowDuration();
-        fireKeyInGraph(xyChart, 's');
-        fViewBot.bot().waitUntil(new SeriesUpdatedCondition(fXyViewer, previousRange, true));
-    }
-
-    /**
-     * Test zoom to selection
-     */
-    @Test
-    public void testZoomToSelection() {
-        SWTBotSwtChart xyChart = new SWTBotSwtChart(fViewBot.bot());
-
-        xyChart.setFocus();
-
-        assertEquals(80, fXyViewer.getWindowDuration());
-
-        /* set selection to trace start time */
-        ITmfTimestamp selStartTime = TmfTimestamp.fromNanos(30L);
-        ITmfTimestamp selEndTime = TmfTimestamp.fromNanos(80L);
-        TmfTimeRange range = new TmfTimeRange(selStartTime, selEndTime);
-        TmfSignalManager.dispatchSignal(new TmfSelectionRangeUpdatedSignal(this, selStartTime, selEndTime));
-        // Wait till selection is finished
-        fViewBot.bot().waitUntil(new DefaultCondition() {
-            @Override
-            public boolean test() throws Exception {
-                return (fXyViewer.getSelectionEndTime() - fXyViewer.getSelectionBeginTime()) == getDuration(range);
-            }
-            @Override
-            public String getFailureMessage() {
-                return "SWT Chart is null";
-            }
-        });
-        fireKeyInGraph(xyChart, 'z');
-        fViewBot.bot().waitUntil(new SeriesCondition(fXyViewer, getDuration(range)));
-    }
-
-    /**
-     * Test 'a' and 'd' navigation
-     */
-    @Test
-    public void testKeyboardNavigation() {
-        SWTBotSwtChart xyChart = new SWTBotSwtChart(fViewBot.bot());
-        xyChart.setFocus();
-        assertEquals(80, fXyViewer.getWindowDuration());
-
-        TmfTimeRange updatedWindowRange = new TmfTimeRange(TmfTimestamp.fromNanos(40), TmfTimestamp.fromNanos(120));
-
-        // move to the right
-        fireKeyInGraph(xyChart, 'd');
-        fViewBot.bot().waitUntil(new SeriesCondition(fXyViewer, getDuration(updatedWindowRange)));
-
-        // move to the left
-        fireKeyInGraph(xyChart, 'a');
-        fViewBot.bot().waitUntil(new SeriesCondition(fXyViewer, getDuration(INITIAL_WINDOW_RANGE)));
-    }
-
-    // ------------------------------------------------------------------------
-    // Helper methods
-    // ------------------------------------------------------------------------
-
-    private static void fireKeyInGraph(SWTBotSwtChart chart, char c, int... modifiers) {
-        chart.setFocus();
-        // Move mouse to middle of the chart
-        chart.moveMouseToWidget();
-        int mask = 0;
-        for (int modifier : modifiers) {
-            mask |= modifier;
-        }
-        chart.pressShortcut(mask, c);
-    }
-
-    private static long getDuration(TmfTimeRange range) {
-        return range.getEndTime().getValue() - range.getStartTime().getValue();
-    }
-
-    private void resetTimeRange() {
-        TmfWindowRangeUpdatedSignal signal = new TmfWindowRangeUpdatedSignal(this, INITIAL_WINDOW_RANGE);
-        TmfSignalManager.dispatchSignal(signal);
-        fViewBot.bot().waitUntil(new SeriesCondition(fXyViewer, getDuration(INITIAL_WINDOW_RANGE)));
-    }
-
-    private static class SeriesCondition extends DefaultCondition {
-        private TmfXYChartViewer fViewer;
-        private long fExpectedRange;
-        private Exception fExecption = null;
-
-        public SeriesCondition(TmfXYChartViewer view, long expectedRange) {
-            fViewer = view;
-            fExpectedRange = expectedRange;
-        }
-
-        @Override
-        public boolean test() throws Exception {
-            try {
-                Chart chart = fViewer.getSwtChart();
-                ISeriesSet set = chart.getSeriesSet();
-                if (set == null) {
-                    return false;
-                }
-                ISeries[] series = set.getSeries();
-                return series != null && series.length > 0 && fExpectedRange == fViewer.getWindowDuration();
-            } catch (Exception e) {
-                fExecption = e;
-                throw e;
-            }
-        }
-
-        @Override
-        public String getFailureMessage() {
-            return "Expected window range (" + fExpectedRange + ") not achieved. Actual=" + fViewer.getWindowDuration() + (fExecption == null ? "" : (". Exception: " + fExecption));
-        }
-    }
-
-    private class SeriesUpdatedCondition extends DefaultCondition {
-        TmfXYChartViewer fView;
-        long fPreviousRange;
-        boolean fIsIncreased;
-        private Exception fExecption = null;
-
-        public SeriesUpdatedCondition(TmfXYChartViewer view, long previousRange, boolean increased) {
-            fView = view;
-            fPreviousRange = previousRange;
-            fIsIncreased = increased;
-        }
-
-        @Override
-        public boolean test() throws Exception {
-            try {
-                Chart chart = fView.getSwtChart();
-                ISeriesSet set = chart.getSeriesSet();
-                if (set == null) {
-                    return false;
-                }
-                ISeries[] series = set.getSeries();
-                if (series == null) {
-                    return false;
-                }
-                long newRange = fView.getWindowDuration();
-                if (fIsIncreased) {
-                    return newRange > fPreviousRange;
-                }
-                return newRange < fPreviousRange;
-            } catch (Exception e) {
-                fExecption = e;
-                throw e;
-            }
-        }
-
-        @Override
-        public String getFailureMessage() {
-            return "Window range didn't " + (fIsIncreased ? "increase" : "decrease") +
-                    " (previous: " + fPreviousRange + ", actual: " + fView.getWindowDuration() + ")" + (fExecption == null ? "" : (". Exception: " + fExecption));
-        }
-    }
-}
diff --git a/tmf/org.eclipse.tracecompass.tmf.ui/META-INF/MANIFEST.MF b/tmf/org.eclipse.tracecompass.tmf.ui/META-INF/MANIFEST.MF
index 263c4ec..28160c7 100644
--- a/tmf/org.eclipse.tracecompass.tmf.ui/META-INF/MANIFEST.MF
+++ b/tmf/org.eclipse.tracecompass.tmf.ui/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: %Bundle-Name
 Bundle-Vendor: %Bundle-Vendor
-Bundle-Version: 6.2.2.qualifier
+Bundle-Version: 7.0.0.qualifier
 Bundle-Localization: plugin
 Bundle-SymbolicName: org.eclipse.tracecompass.tmf.ui;singleton:=true
 Bundle-Activator: org.eclipse.tracecompass.internal.tmf.ui.Activator
@@ -22,7 +22,6 @@
  org.eclipse.jface.text,
  org.eclipse.cdt.core,
  org.eclipse.swtchart,
- org.swtchart,
  com.ibm.icu,
  org.eclipse.tracecompass.segmentstore.core,
  org.apache.commons.compress,
@@ -72,7 +71,6 @@
  org.eclipse.tracecompass.internal.tmf.ui.viewers.timegraph.handlers;x-internal:=true,
  org.eclipse.tracecompass.internal.tmf.ui.viewers.tree;x-internal:=true,
  org.eclipse.tracecompass.internal.tmf.ui.viewers.xychart;x-internal:=true,
- org.eclipse.tracecompass.internal.tmf.ui.viewers.xycharts;x-internal:=true,
  org.eclipse.tracecompass.internal.tmf.ui.views;x-friends:="org.eclipse.tracecompass.tmf.ui.swtbot.tests",
  org.eclipse.tracecompass.internal.tmf.ui.views.handler;x-internal:=true,
  org.eclipse.tracecompass.internal.tmf.ui.views.histogram;x-internal:=true,
@@ -110,9 +108,6 @@
  org.eclipse.tracecompass.tmf.ui.viewers.xychart,
  org.eclipse.tracecompass.tmf.ui.viewers.xychart.barchart,
  org.eclipse.tracecompass.tmf.ui.viewers.xychart.linechart,
- org.eclipse.tracecompass.tmf.ui.viewers.xycharts,
- org.eclipse.tracecompass.tmf.ui.viewers.xycharts.barcharts,
- org.eclipse.tracecompass.tmf.ui.viewers.xycharts.linecharts,
  org.eclipse.tracecompass.tmf.ui.views,
  org.eclipse.tracecompass.tmf.ui.views.colors,
  org.eclipse.tracecompass.tmf.ui.views.distribution.model,
diff --git a/tmf/org.eclipse.tracecompass.tmf.ui/pom.xml b/tmf/org.eclipse.tracecompass.tmf.ui/pom.xml
index 454da0d..d8ff1fd 100644
--- a/tmf/org.eclipse.tracecompass.tmf.ui/pom.xml
+++ b/tmf/org.eclipse.tracecompass.tmf.ui/pom.xml
@@ -20,7 +20,7 @@
   </parent>
 
   <artifactId>org.eclipse.tracecompass.tmf.ui</artifactId>
-  <version>6.2.2-SNAPSHOT</version>
+  <version>7.0.0-SNAPSHOT</version>
 
   <packaging>eclipse-plugin</packaging>
 
diff --git a/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/internal/tmf/ui/viewers/xycharts/TmfXYChartTimeAdapter.java b/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/internal/tmf/ui/viewers/xycharts/TmfXYChartTimeAdapter.java
deleted file mode 100644
index 17aa657..0000000
--- a/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/internal/tmf/ui/viewers/xycharts/TmfXYChartTimeAdapter.java
+++ /dev/null
@@ -1,165 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2017, 2019 Ericsson
- *
- * All rights reserved. This program and the accompanying materials are
- * made available under the terms of the Eclipse Public License 2.0 which
- * accompanies this distribution, and is available at
- * https://www.eclipse.org/legal/epl-2.0/
- *
- * SPDX-License-Identifier: EPL-2.0
- *******************************************************************************/
-
-package org.eclipse.tracecompass.internal.tmf.ui.viewers.xycharts;
-
-import org.eclipse.jdt.annotation.NonNull;
-import org.eclipse.tracecompass.tmf.ui.viewers.xycharts.ITmfChartTimeProvider;
-import org.eclipse.tracecompass.tmf.ui.viewers.xycharts.TmfXYChartViewer;
-import org.eclipse.tracecompass.tmf.ui.widgets.timegraph.widgets.ITimeDataProvider;
-import org.eclipse.tracecompass.tmf.ui.widgets.timegraph.widgets.Utils.TimeFormat;
-
-/**
- * Tmf Chart data provider wrapper to comply with Time data provider API
- *
- * @author Matthew Khouzam
- * @deprecated use {@link org.eclipse.tracecompass.internal.tmf.ui.viewers.xychart.TmfXYChartTimeAdapter}
- */
-@Deprecated
-public final class TmfXYChartTimeAdapter implements ITimeDataProvider {
-
-    private final TmfXYChartViewer fTimeProvider;
-    private TimeFormat fTimeFormat;
-
-    /**
-     * Constructor, requires a {@link ITmfChartTimeProvider}
-     *
-     * @param provider
-     *            the provider to wrap
-     */
-    public TmfXYChartTimeAdapter(@NonNull TmfXYChartViewer provider) {
-        fTimeProvider = provider;
-    }
-
-    @Override
-    public long getBeginTime() {
-        return fTimeProvider.getStartTime();
-    }
-
-    @Override
-    public long getEndTime() {
-        return fTimeProvider.getEndTime();
-    }
-
-    @Override
-    public long getMinTimeInterval() {
-        return 1L;
-    }
-
-    @Override
-    public int getNameSpace() {
-        // charts have no namespace
-        return 0;
-    }
-
-    @Override
-    public long getSelectionBegin() {
-        return fTimeProvider.getSelectionBeginTime();
-    }
-
-    @Override
-    public long getSelectionEnd() {
-        return fTimeProvider.getSelectionEndTime();
-    }
-
-    @Override
-    public long getTime0() {
-        return fTimeProvider.getWindowStartTime();
-    }
-
-    @Override
-    public long getTime1() {
-        return fTimeProvider.getWindowEndTime();
-    }
-
-    @Override
-    public void setSelectionRangeNotify(long beginTime, long endTime, boolean ensureVisible) {
-        // Do nothing
-    }
-
-    @Override
-    public void setSelectionRange(long beginTime, long endTime, boolean ensureVisible) {
-        // Do nothing
-    }
-
-    @Override
-    public long getMinTime() {
-        return fTimeProvider.getStartTime();
-    }
-
-    @Override
-    public long getMaxTime() {
-        return fTimeProvider.getEndTime();
-    }
-
-    @Override
-    public TimeFormat getTimeFormat() {
-        return fTimeFormat;
-    }
-
-    @Override
-    public int getTimeSpace() {
-        return getAxisWidth();
-    }
-
-    /**
-     * Get the width of the axis
-     *
-     * @return the width of the axis
-     */
-    public int getAxisWidth() {
-        return fTimeProvider.getSwtChart().getPlotArea().getBounds().width;
-    }
-
-    // -------------------------------------------------------------------------
-    // Override rest if need be
-    // -------------------------------------------------------------------------
-
-    @Override
-    public void setStartFinishTimeNotify(long time0, long time1) {
-        fTimeProvider.updateWindow(time0, time1);
-    }
-
-    @Override
-    public void setStartFinishTime(long time0, long time1) {
-        // Do nothing
-    }
-
-    @Override
-    public void notifyStartFinishTime() {
-        // Do nothing
-    }
-
-    @Override
-    public void setSelectedTimeNotify(long time, boolean ensureVisible) {
-        // Do nothing
-    }
-
-    @Override
-    public void setSelectedTime(long time, boolean ensureVisible) {
-        // Do nothing
-    }
-
-    @Override
-    public void setNameSpace(int width) {
-        // Do nothing
-    }
-
-    /**
-     * Set the time format.
-     *
-     * @param timeFormat
-     *            the time format
-     */
-    public void setTimeFormat(org.eclipse.tracecompass.tmf.ui.views.FormatTimeUtils.TimeFormat timeFormat) {
-        fTimeFormat = TimeFormat.convert(timeFormat);
-    }
-}
diff --git a/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/internal/tmf/ui/viewers/xycharts/TmfXyUiUtils.java b/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/internal/tmf/ui/viewers/xycharts/TmfXyUiUtils.java
deleted file mode 100644
index caa7b91..0000000
--- a/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/internal/tmf/ui/viewers/xycharts/TmfXyUiUtils.java
+++ /dev/null
@@ -1,264 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2019 Ericsson
- *
- * All rights reserved. This program and the accompanying materials are
- * made available under the terms of the Eclipse Public License 2.0 which
- * accompanies this distribution, and is available at
- * https://www.eclipse.org/legal/epl-2.0/
- *
- * SPDX-License-Identifier: EPL-2.0
- *******************************************************************************/
-
-package org.eclipse.tracecompass.internal.tmf.ui.viewers.xycharts;
-
-import org.eclipse.jdt.annotation.Nullable;
-import org.eclipse.tracecompass.tmf.ui.viewers.xycharts.ITmfChartTimeProvider;
-import org.swtchart.Chart;
-import org.swtchart.IAxis;
-import org.swtchart.Range;
-
-/**
- * Utility class providing XY charts utility methods, for example for zooming
- * and scrolling. For scrolling, it will move the zoom window to another
- * position while maintaining the window size. It also notifies the viewer about
- * a change of range.
- *
- * @author Bernd Hufmann
- * @deprecated use {@link org.eclipse.tracecompass.internal.tmf.ui.viewers.xychart.TmfXyUiUtils}
- */
-@Deprecated
-public class TmfXyUiUtils {
-
-    // ------------------------------------------------------------------------
-    // Constants
-    // ------------------------------------------------------------------------
-    private static final long MIN_WINDOW_SIZE = 1;
-    private static final double ZOOM_FACTOR_AT_X_POSITION = 0.8;
-    private static final double ZOOM_FACTOR_SELECTION_CENTERED = 1.5;
-
-    // ------------------------------------------------------------------------
-    // Constructor
-    // ------------------------------------------------------------------------
-    private TmfXyUiUtils() {
-    }
-
-    /**
-     * Perform horizontal scrolling for a given viewer.
-     *
-     * @param viewer
-     *            the chart time provider to use for scrolling
-     * @param chart
-     *            the SwtChart reference to use the scrolling
-     * @param left
-     *            true to scroll left else scroll right
-     *
-     */
-    public static void horizontalScroll(ITmfChartTimeProvider viewer, Chart chart, boolean left) {
-        IAxis xAxis = chart.getAxisSet().getXAxis(0);
-        if (xAxis == null) {
-            return;
-        }
-        long windowStartTime = viewer.getWindowStartTime();
-        long windowsEndTime = viewer.getWindowEndTime();
-
-        long startTime = viewer.getStartTime();
-        long endTime = viewer.getEndTime();
-
-        long range = windowsEndTime - windowStartTime;
-        if (range <= 0) {
-            return;
-        }
-        long increment = Math.max(1, range / 2);
-        if (left) {
-            windowStartTime = Math.max(windowStartTime - increment, startTime);
-            windowsEndTime = windowStartTime + range;
-        } else {
-            windowsEndTime = Math.min(windowsEndTime + increment, endTime);
-            windowStartTime = windowsEndTime - range;
-        }
-        viewer.updateWindow(windowStartTime, windowsEndTime);
-        xAxis.setRange(new Range(windowStartTime - viewer.getTimeOffset(), windowsEndTime - viewer.getTimeOffset()));
-    }
-
-    /**
-     * Provides horizontal zooming for a given viewer at given position.
-     *
-     * @param viewer
-     *            the chart time provider to use for zooming
-     * @param chart
-     *            the SwtChart reference to use the zooming
-     * @param zoomIn
-     *            true to zoomIn else zoomOut
-     * @param x
-     *            x location to center the zoom
-     */
-    public static void zoom(ITmfChartTimeProvider viewer, Chart chart, boolean zoomIn, final int x) {
-        IAxis xAxis = chart.getAxisSet().getXAxis(0);
-        if (xAxis == null) {
-            return;
-        }
-        // Compute the new time range
-        long newDuration = viewer.getWindowDuration();
-        if (newDuration == 0) {
-            return;
-        }
-        double ratio = 1.0;
-        if (zoomIn) {
-            ratio = ZOOM_FACTOR_AT_X_POSITION;
-            newDuration = Math.round(ZOOM_FACTOR_AT_X_POSITION * newDuration);
-        } else {
-            ratio = 1.0 / ZOOM_FACTOR_AT_X_POSITION;
-            newDuration = (long) Math.ceil(newDuration * ratio);
-        }
-        newDuration = Math.max(MIN_WINDOW_SIZE, newDuration);
-
-        // Center the zoom on mouse position, distribute new duration and adjust
-        // for boundaries.
-        long timeAtXPos = limitXDataCoordinate(viewer, xAxis.getDataCoordinate(x)) + viewer.getTimeOffset();
-        // Note: ratio = newDuration/oldDuration
-        long newWindowStartTime = timeAtXPos - Math.round(ratio * (timeAtXPos - viewer.getWindowStartTime()));
-        long newWindowEndTime = validateWindowEndTime(viewer, newWindowStartTime, newWindowStartTime + newDuration);
-        newWindowStartTime = validateWindowStartTime(viewer, newWindowStartTime);
-        viewer.updateWindow(newWindowStartTime, newWindowEndTime);
-        xAxis.setRange(new Range(newWindowStartTime - viewer.getTimeOffset(),
-                newWindowEndTime - viewer.getTimeOffset()));
-    }
-
-    /**
-     * Provides horizontal zooming for a given viewer based on current selection
-     * range. If selection range is visible, the zooming is centered on the
-     * middle of the selection range. If the selection range is not visible,
-     * then the zooming is centered on the window range.
-     *
-     * @param viewer
-     *            the chart time provider to use for zooming
-     * @param chart
-     *            the SwtChart reference to use the zooming
-     * @param zoomIn
-     *            true to zoom-in else to zoom-out
-     */
-    public static void zoom(ITmfChartTimeProvider viewer, Chart chart, boolean zoomIn) {
-        if (zoomIn) {
-            zoomIn(viewer, chart);
-        } else {
-            zoomOut(viewer, chart);
-        }
-    }
-
-    /**
-     * Limits x data coordinate to window start and window end range for a given
-     * viewer
-     *
-     * @param viewer
-     *            the chart time provider to use
-     * @param x
-     *            x to limit
-     * @return x if x >= begin && x <= end begin if x < begin end if x > end
-     */
-    public static long limitXDataCoordinate(@Nullable ITmfChartTimeProvider viewer, double x) {
-        if (viewer != null) {
-            long windowStartTime = viewer.getWindowStartTime() - viewer.getTimeOffset();
-            long windowEndTime = viewer.getWindowEndTime() - viewer.getTimeOffset();
-
-            if (x < windowStartTime) {
-                return windowStartTime;
-            }
-
-            if (x > windowEndTime) {
-                return windowEndTime;
-            }
-        }
-
-        return (long) x;
-    }
-
-    // ------------------------------------------------------------------------
-    // Helper methods
-    // ------------------------------------------------------------------------
-    private static void zoomIn(ITmfChartTimeProvider viewer, Chart chart) {
-        IAxis xAxis = chart.getAxisSet().getXAxis(0);
-        if (xAxis == null) {
-            return;
-        }
-        long prevTime0 = viewer.getWindowStartTime();
-        long prevTime1 = viewer.getWindowEndTime();
-        long prevRange = prevTime1 - prevTime0;
-        if (prevRange == 0) {
-            return;
-        }
-        long selTime = (viewer.getSelectionEndTime() + viewer.getSelectionBeginTime()) / 2;
-        if (selTime < prevTime0 || selTime > prevTime1) {
-            selTime = (prevTime0 + prevTime1) / 2;
-        }
-        long time0 = selTime - (long) ((selTime - prevTime0) / ZOOM_FACTOR_SELECTION_CENTERED);
-        long time1 = selTime + (long) ((prevTime1 - selTime) / ZOOM_FACTOR_SELECTION_CENTERED);
-
-        if ((time1 - time0) < MIN_WINDOW_SIZE) {
-            time0 = selTime - (selTime - prevTime0) * MIN_WINDOW_SIZE / prevRange;
-            time1 = time0 + MIN_WINDOW_SIZE;
-        }
-
-        time0 = validateWindowStartTime(viewer, time0);
-        time1 = validateWindowEndTime(viewer, time0, time1);
-        viewer.updateWindow(time0, time1);
-        xAxis.setRange(new Range(time0 - viewer.getTimeOffset(),
-                time1 - viewer.getTimeOffset()));
-    }
-
-    private static void zoomOut(ITmfChartTimeProvider viewer, Chart chart) {
-        IAxis xAxis = chart.getAxisSet().getXAxis(0);
-        if (xAxis == null) {
-            return;
-        }
-
-        long prevTime0 = viewer.getWindowStartTime();
-        long prevTime1 = viewer.getWindowEndTime();
-        long selTime = (viewer.getSelectionEndTime() + viewer.getSelectionBeginTime()) / 2;
-        if (selTime < prevTime0 || selTime > prevTime1) {
-            selTime = (prevTime0 + prevTime1) / 2;
-        }
-        long newInterval;
-        long time0;
-        if (prevTime1 - prevTime0 <= 1) {
-            newInterval = 2;
-            time0 = selTime - 1;
-        } else {
-            newInterval = (long) Math.ceil((prevTime1 - prevTime0) * ZOOM_FACTOR_SELECTION_CENTERED);
-            time0 = selTime - (long) Math.ceil((selTime - prevTime0) * ZOOM_FACTOR_SELECTION_CENTERED);
-        }
-        /* snap to bounds if zooming out of range */
-        time0 = validateWindowStartTime(viewer, Math.max(MIN_WINDOW_SIZE, Math.min(time0, viewer.getEndTime() - newInterval)));
-        long time1 = validateWindowEndTime(viewer, time0, time0 + newInterval);
-        viewer.updateWindow(time0, time1);
-        xAxis.setRange(new Range(time0 - viewer.getTimeOffset(),
-                time1 - viewer.getTimeOffset()));
-    }
-
-    private static long validateWindowStartTime(ITmfChartTimeProvider viewer, long start) {
-        long realStart = start;
-
-        long startTime = viewer.getStartTime();
-        long endTime = viewer.getEndTime();
-
-        if (realStart < startTime) {
-            realStart = startTime;
-        }
-        if (realStart > endTime) {
-            realStart = endTime;
-        }
-        return realStart;
-    }
-
-    private static long validateWindowEndTime(ITmfChartTimeProvider viewer, long start, long end) {
-        long realEnd = end;
-        long endTime = viewer.getEndTime();
-
-        if (realEnd > endTime) {
-            realEnd = endTime;
-        }
-        if (realEnd < start + MIN_WINDOW_SIZE) {
-            realEnd = start + MIN_WINDOW_SIZE;
-        }
-        return realEnd;
-    }
-}
diff --git a/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/internal/tmf/ui/views/LockRangeDialog.java b/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/internal/tmf/ui/views/LockRangeDialog.java
deleted file mode 100644
index c579035..0000000
--- a/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/internal/tmf/ui/views/LockRangeDialog.java
+++ /dev/null
@@ -1,165 +0,0 @@
-/**********************************************************************
- * Copyright (c) 2019 Draeger, Auriga
- *
- * All rights reserved. This program and the accompanying materials are
- * made available under the terms of the Eclipse Public License 2.0 which
- * accompanies this distribution, and is available at
- * https://www.eclipse.org/legal/epl-2.0/
- *
- * SPDX-License-Identifier: EPL-2.0
- **********************************************************************/
-package org.eclipse.tracecompass.internal.tmf.ui.views;
-
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.tracecompass.tmf.ui.viewers.xycharts.AxisRange;
-import org.eclipse.tracecompass.tmf.ui.viewers.xycharts.TmfXYChartViewer;
-import org.eclipse.tracecompass.tmf.ui.views.TmfChartView;
-import org.swtchart.Range;
-
-/**
- * Dialog box for entering minimum and maximum range for Y axis of
- * {@link TmfChartView}.
- *
- * @author Ivan Grinenko
- * @deprecated use {@link org.eclipse.tracecompass.internal.tmf.ui.views.xychart.LockRangeDialog}
- *
- */
-@Deprecated
-public class LockRangeDialog extends Dialog {
-    /**
-     * Checkbox to lock or unlock the axis.
-     */
-    private Button fCheck;
-    /**
-     * Text field for minimum.
-     */
-    private Text fMinText;
-    /**
-     * Text field for maximum.
-     */
-    private Text fMaxText;
-    /**
-     * Viewer with Y axis to lock.
-     */
-    private final TmfXYChartViewer fChartViewer;
-    /**
-     * ModifyListener for the text inputs.
-     */
-    private ModifyListener fModifyListener = e -> validateInputs();
-
-    private static boolean isValidDouble(String input) {
-        try {
-            Double.parseDouble(input);
-        } catch (NumberFormatException e) {
-            return false;
-        }
-        return true;
-    }
-
-    /**
-     * Constructor.
-     *
-     * @param parentShell
-     *            parent shell
-     * @param chartViewer
-     *            viewer with Y axis to lock
-     */
-    public LockRangeDialog(Shell parentShell, TmfXYChartViewer chartViewer) {
-        super(parentShell);
-        fChartViewer = chartViewer;
-    }
-
-    @Override
-    protected Control createDialogArea(Composite p) {
-        p.getShell().setText(Messages.TmfChartView_LockYAxis);
-        Composite parent = (Composite) super.createDialogArea(p);
-
-        GridLayout parentLayout = new GridLayout(2, false);
-        parent.setLayout(parentLayout);
-
-        Range range = fChartViewer.getSwtChart().getAxisSet().getYAxis(0).getRange();
-
-        fCheck = new Button(parent, SWT.CHECK);
-        fCheck.setText(Messages.TmfChartView_LockButton);
-        fCheck.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, true, false, 2, 1));
-        fCheck.setSelection(true);
-        fCheck.addSelectionListener(new SelectionListener() {
-            @Override
-            public void widgetSelected(SelectionEvent e) {
-                fMinText.setEnabled(fCheck.getSelection());
-                fMaxText.setEnabled(fCheck.getSelection());
-                validateInputs();
-            }
-
-            @Override
-            public void widgetDefaultSelected(SelectionEvent e) {
-                // nothing to do
-            }
-        });
-
-        Label minLabel = new Label(parent, SWT.RADIO);
-        minLabel.setText(Messages.TmfChartView_LowerYAxisRange);
-        minLabel.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false));
-
-        fMinText = new Text(parent, SWT.SINGLE | SWT.BORDER);
-        fMinText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
-        fMinText.setText(String.valueOf(range.lower));
-        fMinText.addModifyListener(fModifyListener);
-
-        Label maxLabel = new Label(parent, SWT.RADIO);
-        maxLabel.setText(Messages.TmfChartView_UpperYAxisRange);
-        maxLabel.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false));
-
-        fMaxText = new Text(parent, SWT.SINGLE | SWT.BORDER);
-        fMaxText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
-        fMaxText.setText(String.valueOf(range.upper));
-        fMaxText.addModifyListener(fModifyListener);
-
-        return parent;
-    }
-
-    @Override
-    protected void okPressed() {
-        if (fCheck.getSelection()) {
-            lockAxis();
-        } else {
-            fChartViewer.setFixedYRange(null);
-        }
-        super.okPressed();
-    }
-
-    private void lockAxis() {
-        double min = 0;
-        double max = 0;
-        try {
-            min = Double.parseDouble(fMinText.getText());
-            max = Double.parseDouble(fMaxText.getText());
-            fChartViewer.setFixedYRange(new AxisRange(min, max));
-        } catch (NumberFormatException e) {
-            // Suppose values are already validated
-        }
-    }
-
-    /**
-     * OK is enabled only if both of text inputs contain valid doubles or the
-     * checkbox is unchecked.
-     */
-    private void validateInputs() {
-        boolean isValidInput = isValidDouble(fMaxText.getText()) && isValidDouble(fMinText.getText());
-        getButton(IDialogConstants.OK_ID).setEnabled(isValidInput || !fCheck.getSelection());
-    }
-
-}
diff --git a/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/colors/X11Color.java b/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/colors/X11Color.java
deleted file mode 100644
index dd8d359..0000000
--- a/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/colors/X11Color.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2017, 2019 Ericsson
- *
- * All rights reserved. This program and the accompanying materials are
- * made available under the terms of the Eclipse Public License 2.0 which
- * accompanies this distribution, and is available at
- * https://www.eclipse.org/legal/epl-2.0/
- *
- * SPDX-License-Identifier: EPL-2.0
- *
- * Contributors:
- *   Patrick Tasse - Initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.tracecompass.tmf.ui.colors;
-
-import org.eclipse.swt.graphics.RGB;
-import org.eclipse.tracecompass.tmf.core.dataprovider.X11ColorUtils;
-
-/**
- * A registry of named X11 colors. It maps certain strings to RGB color values.
- *
- * @see <a href=
- *      "http://cgit.freedesktop.org/xorg/app/rgb/tree/rgb.txt">http://cgit.freedesktop.org/xorg/app/rgb/tree/rgb.txt</a>
- *
- * @since 3.0
- * @deprecated Use {@link X11ColorUtils} instead
- */
-@Deprecated
-public class X11Color {
-
-    /**
-     * Get the RGB corresponding to a X11 color name.
-     *
-     * @param name
-     *            the X11 color name (case insensitive)
-     * @return the corresponding RGB, or null
-     */
-    public static RGB toRGB(String name) {
-        return ColorUtils.fromX11Color(name);
-    }
-}
diff --git a/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/viewers/ILegendImageProvider.java b/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/viewers/ILegendImageProvider.java
index b7dc846..00bf048 100644
--- a/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/viewers/ILegendImageProvider.java
+++ b/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/viewers/ILegendImageProvider.java
@@ -20,7 +20,9 @@
  *
  * @author Yonni Chen
  * @since 3.2
+ * @deprecated use {@link ILegendImageProvider2} instead
  */
+@Deprecated
 public interface ILegendImageProvider {
 
     /**
@@ -30,27 +32,10 @@
      *            Desired image height
      * @param imageWidth
      *            Desired image width
-     * @param name
-     *            Name associated with a legend image
-     * @return A legend image
-     * @deprecated As of 6.0, use {@link #getLegendImage(int, int, Long)} instead
-     */
-    @Deprecated
-    Image getLegendImage(int imageHeight, int imageWidth, @NonNull String name);
-
-    /**
-     * Returns an image that represents the legend.
-     *
-     * @param imageHeight
-     *            Desired image height
-     * @param imageWidth
-     *            Desired image width
      * @param id
      *            Id associate with a legend image
      * @return A legend image
      * @since 6.0
      */
-    default Image getLegendImage(int imageHeight, int imageWidth, @NonNull Long id) {
-        return getLegendImage(imageHeight, imageWidth, String.valueOf(id));
-    }
+    Image getLegendImage(int imageHeight, int imageWidth, @NonNull Long id);
 }
diff --git a/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/viewers/tree/AbstractSelectTreeViewer.java b/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/viewers/tree/AbstractSelectTreeViewer.java
deleted file mode 100644
index 08a9db3..0000000
--- a/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/viewers/tree/AbstractSelectTreeViewer.java
+++ /dev/null
@@ -1,726 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2017, 2020 Ericsson, Draeger Auriga
- *
- * All rights reserved. This program and the accompanying materials are
- * made available under the terms of the Eclipse Public License 2.0 which
- * accompanies this distribution, and is available at
- * https://www.eclipse.org/legal/epl-2.0/
- *
- * SPDX-License-Identifier: EPL-2.0
- *******************************************************************************/
-
-package org.eclipse.tracecompass.tmf.ui.viewers.tree;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.atomic.AtomicInteger;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-import org.apache.commons.lang3.StringUtils;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.jdt.annotation.NonNull;
-import org.eclipse.jface.viewers.AbstractTreeViewer;
-import org.eclipse.jface.viewers.CheckStateChangedEvent;
-import org.eclipse.jface.viewers.CheckboxTreeViewer;
-import org.eclipse.jface.viewers.ICheckStateListener;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerComparator;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.swt.widgets.Tree;
-import org.eclipse.swt.widgets.TreeColumn;
-import org.eclipse.tracecompass.common.core.log.TraceCompassLog;
-import org.eclipse.tracecompass.common.core.log.TraceCompassLogUtils.FlowScopeLog;
-import org.eclipse.tracecompass.common.core.log.TraceCompassLogUtils.FlowScopeLogBuilder;
-import org.eclipse.tracecompass.internal.tmf.core.model.filters.FetchParametersUtils;
-import org.eclipse.tracecompass.internal.tmf.ui.Activator;
-import org.eclipse.tracecompass.tmf.core.dataprovider.DataProviderManager;
-import org.eclipse.tracecompass.tmf.core.model.filters.TimeQueryFilter;
-import org.eclipse.tracecompass.tmf.core.model.timegraph.IElementResolver;
-import org.eclipse.tracecompass.tmf.core.model.tree.ITmfTreeDataModel;
-import org.eclipse.tracecompass.tmf.core.model.tree.ITmfTreeDataProvider;
-import org.eclipse.tracecompass.tmf.core.model.tree.TmfTreeDataModel;
-import org.eclipse.tracecompass.tmf.core.model.tree.TmfTreeModel;
-import org.eclipse.tracecompass.tmf.core.response.ITmfResponse;
-import org.eclipse.tracecompass.tmf.core.response.TmfModelResponse;
-import org.eclipse.tracecompass.tmf.core.signal.TmfDataModelSelectedSignal;
-import org.eclipse.tracecompass.tmf.core.signal.TmfSignalHandler;
-import org.eclipse.tracecompass.tmf.core.signal.TmfSignalManager;
-import org.eclipse.tracecompass.tmf.core.signal.TmfTraceOpenedSignal;
-import org.eclipse.tracecompass.tmf.core.signal.TmfTraceSelectedSignal;
-import org.eclipse.tracecompass.tmf.core.trace.ITmfTrace;
-import org.eclipse.tracecompass.tmf.core.trace.TmfTraceContext;
-import org.eclipse.tracecompass.tmf.core.trace.TmfTraceManager;
-import org.eclipse.tracecompass.tmf.ui.viewers.ILegendImageProvider;
-import org.eclipse.tracecompass.tmf.ui.widgets.timegraph.dialogs.MultiTreePatternFilter;
-import org.eclipse.tracecompass.tmf.ui.widgets.timegraph.dialogs.TriStateFilteredCheckboxTree;
-
-import com.google.common.collect.Iterables;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Multimap;
-import com.google.common.primitives.Longs;
-
-/**
- * Abstract viewer for trees with checkboxes. This viewer gets his data from a
- * data provider.
- *
- * @since 3.2
- * @author Loic Prieur-Drevon
- */
-@Deprecated
-public abstract class AbstractSelectTreeViewer extends AbstractTmfTreeViewer {
-
-    private static final @NonNull Logger LOGGER = TraceCompassLog.getLogger(AbstractSelectTreeViewer.class);
-
-    private static final AtomicInteger INSTANCE_ID_SEQUENCE = new AtomicInteger(0);
-
-    /** Timeout between updates in the updateData thread **/
-    private static final long BUILD_UPDATE_TIMEOUT = 500;
-
-    /** ID of the checked tree items in the map of data in {@link TmfTraceContext} */
-    private static final char SEP = ':';
-    private static final @NonNull String CHECKED_ELEMENTS = ".CHECKED_ELEMENTS"; //$NON-NLS-1$
-    private static final @NonNull String FILTER_STRING = ".FILTER_STRING"; //$NON-NLS-1$
-    private static final @NonNull String UPDATE_CONTENT_JOB_NAME = "AbstractSelectTreeViewer#updateContent Job"; //$NON-NLS-1$
-    private static final String FAILED_TO_SLEEP_PREFIX = "Failed to sleep the "; //$NON-NLS-1$
-    private static final String LOG_CATEGORY_SUFFIX = " Tree viewer"; //$NON-NLS-1$
-
-    private final String fId;
-    private final @NonNull String fLogCategory;
-    private final int fInstanceId;
-
-    private static final ViewerComparator COMPARATOR = new ViewerComparator() {
-        @Override
-        public int compare(Viewer viewer, Object e1, Object e2) {
-            TmfTreeViewerEntry entry1 = (TmfTreeViewerEntry) e1;
-            TmfTreeViewerEntry entry2 = (TmfTreeViewerEntry) e2;
-            String name1 = entry1.getName();
-            String name2 = entry2.getName();
-            Long longValue1 = Longs.tryParse(name1);
-            Long longValue2 = Longs.tryParse(name2);
-
-            return (longValue1 == null || longValue2 == null) ? name1.compareTo(name2) : longValue1.compareTo(longValue2);
-        }
-    };
-
-    private final class CheckStateChangedListener implements ICheckStateListener {
-        @Override
-        public void checkStateChanged(CheckStateChangedEvent event) {
-            saveViewContext();
-            if (!fTreeListeners.isEmpty()) {
-                Collection<ITmfTreeViewerEntry> entries = getCheckedViewerEntries();
-                for (ICheckboxTreeViewerListener listener : fTreeListeners) {
-                    listener.handleCheckStateChangedEvent(entries);
-                }
-                refresh();
-            }
-
-        }
-    }
-
-    /**
-     * Listener to select a range in other viewers when a cell of the segment
-     * store table view is selected
-     */
-    private class TreeViewerSelectionListener implements ISelectionChangedListener {
-
-        @Override
-        public void selectionChanged(SelectionChangedEvent event) {
-            IStructuredSelection selection = event.getStructuredSelection();
-            Object entry = selection.getFirstElement();
-            if (entry instanceof TmfGenericTreeEntry) {
-                ITmfTreeDataModel model = ((TmfGenericTreeEntry<?>) entry).getModel();
-                if (model instanceof IElementResolver) {
-                    Multimap<@NonNull String, @NonNull Object> metadata = ((IElementResolver) model).getMetadata();
-                    if (!metadata.isEmpty()) {
-                        TmfSignalManager.dispatchSignal(new TmfDataModelSelectedSignal(AbstractSelectTreeViewer.this, metadata));
-                    }
-                }
-            }
-        }
-    }
-
-    /**
-     * Base class to provide the labels for the tree viewer. Views extending
-     * this class typically need to override the getColumnText method if they
-     * have more than one column to display. It also allows to change the font
-     * and colors of the cells.
-     * @since 6.0
-     */
-    protected class DataProviderTreeLabelProvider extends TreeLabelProvider {
-
-        @Override
-        public Image getColumnImage(Object element, int columnIndex) {
-            if (columnIndex == fLegendIndex && element instanceof TmfGenericTreeEntry && isChecked(element)) {
-                TmfGenericTreeEntry<TmfTreeDataModel> genericEntry = (TmfGenericTreeEntry<TmfTreeDataModel>) element;
-                TmfTreeDataModel model = genericEntry.getModel();
-                if (model.hasRowModel()) {
-                    return getLegendImage(genericEntry.getModel().getId());
-                }
-            }
-            return null;
-        }
-
-
-        @Override
-        public String getColumnText(Object element, int columnIndex) {
-            if (element instanceof TmfGenericTreeEntry) {
-                if (columnIndex == fLegendIndex) {
-                    return ""; //$NON-NLS-1$
-                }
-                /* Model should not contain any label for the legend column */
-                int index = fLegendIndex < 0 || columnIndex < fLegendIndex ? columnIndex : columnIndex - 1;
-                TmfGenericTreeEntry<@NonNull ? extends ITmfTreeDataModel> genericEntry = (TmfGenericTreeEntry<@NonNull ? extends ITmfTreeDataModel>) element;
-                ITmfTreeDataModel model = genericEntry.getModel();
-                if (index < model.getLabels().size()) {
-                    return model.getLabels().get(index);
-                }
-                return ""; //$NON-NLS-1$
-            }
-            return super.getColumnText(element, columnIndex);
-        }
-    }
-
-    private ILegendImageProvider fLegendImageProvider;
-    private Set<ICheckboxTreeViewerListener> fTreeListeners = new HashSet<>();
-    private TriStateFilteredCheckboxTree fCheckboxTree;
-    private final int fLegendIndex;
-
-    /**
-     * Constructor
-     *
-     * @param parent
-     *            Parent composite
-     * @param checkboxTree
-     *            <code>TriStateFilteredTree</code> wrapping a
-     *            <code>CheckboxTreeViewer</code>
-     * @param legendColumnIndex
-     *            index of the legend column (-1 if none)
-     */
-    private AbstractSelectTreeViewer(Composite parent, TriStateFilteredCheckboxTree checkboxTree,
-            int legendIndex, String id) {
-        super(parent, checkboxTree.getViewer());
-
-        TreeViewer treeViewer = checkboxTree.getViewer();
-        treeViewer.setAutoExpandLevel(AbstractTreeViewer.ALL_LEVELS);
-        treeViewer.setComparator(COMPARATOR);
-        if (treeViewer instanceof CheckboxTreeViewer) {
-            ((CheckboxTreeViewer) treeViewer).addCheckStateListener(new CheckStateChangedListener());
-        }
-        treeViewer.addSelectionChangedListener(new TreeViewerSelectionListener());
-        checkboxTree.getFilterControl().addModifyListener(e -> saveViewContext());
-        fCheckboxTree = checkboxTree;
-        fLegendIndex = legendIndex;
-        fId = id;
-        fLogCategory = fId + LOG_CATEGORY_SUFFIX;
-        setLabelProvider(new DataProviderTreeLabelProvider());
-        fInstanceId = INSTANCE_ID_SEQUENCE.incrementAndGet();
-    }
-
-    /**
-     * Constructor
-     *
-     * @param parent
-     *            Parent composite
-     * @param legendIndex
-     *            index of the legend column (-1 if none)
-     * @param id
-     *            {@link ITmfTreeDataProvider} ID
-     */
-    public AbstractSelectTreeViewer(Composite parent, int legendIndex, String id) {
-        // Create the tree viewer with a filtered checkbox
-        this(parent, new TriStateFilteredCheckboxTree(parent,
-                SWT.MULTI | SWT.H_SCROLL | SWT.FULL_SELECTION,
-                new MultiTreePatternFilter(), true, false), legendIndex, id);
-    }
-
-    /**
-     * Tell the chart viewer to listen to changes in the tree viewer
-     *
-     * @param listener
-     *            Chart listening to changes in the tree's selected entries
-     * @deprecated As of 6.0, there can be more than one listener for the tree,
-     *             use {@link #addTreeListener(ICheckboxTreeViewerListener)}
-     */
-    @Deprecated
-    public void setTreeListener(ICheckboxTreeViewerListener listener) {
-        addTreeListener(listener);
-    }
-
-    /**
-     * Add a listener to changes in the tree viewer
-     *
-     * @param listener
-     *            Listener for changes in the tree's selected entries
-     * @since 6.0
-     */
-    public void addTreeListener(ICheckboxTreeViewerListener listener) {
-        fTreeListeners.add(listener);
-    }
-
-    /**
-     * Remove a listener from this tree viewer
-     *
-     * @param listener
-     *            The listener to remove
-     * @since 6.0
-     */
-    public void removeTreeListener(ICheckboxTreeViewerListener listener) {
-        fTreeListeners.remove(listener);
-    }
-
-    /**
-     * Set the legend image provider (provider tree cells with an image).
-     *
-     * @param legendImageProvider
-     *            Provides an image legend associated with a name
-     */
-    public void setLegendImageProvider(ILegendImageProvider legendImageProvider) {
-        fLegendImageProvider = legendImageProvider;
-    }
-
-    /**
-     * Return the checked state of an element
-     *
-     * @param element
-     *            the element
-     * @return if the element is checked
-     */
-    public boolean isChecked(Object element) {
-        return fCheckboxTree.getChecked(element);
-    }
-
-    /**
-     * Select previously checked entries when going back to trace.
-     */
-    @Override
-    protected void contentChanged(ITmfTreeViewerEntry rootEntry) {
-        ITmfTrace trace = getTrace();
-        if (trace == null) {
-            return;
-        }
-        TmfTraceContext ctx = TmfTraceManager.getInstance().getTraceContext(trace);
-        Set<Long> ids = (Set<Long>) ctx.getData(getDataContextId(CHECKED_ELEMENTS));
-        if (ids != null && rootEntry != null) {
-            List<ITmfTreeViewerEntry> checkedElements = new ArrayList<>();
-            checkEntries(ids, rootEntry, checkedElements);
-            internalSetCheckedElements(checkedElements.toArray());
-        }
-        Object filterString = ctx.getData(getDataContextId(FILTER_STRING));
-        if (filterString instanceof String) {
-            fCheckboxTree.setFilterText((String) filterString);
-        } else {
-            fCheckboxTree.setFilterText(""); //$NON-NLS-1$
-        }
-
-        getTreeViewer().refresh();
-    }
-
-    /**
-     * Checks all the passed elements and unchecks all the other.
-     *
-     * @param checkedElements
-     *            the elements to check
-     * @since 6.0
-     */
-    protected void setCheckedElements(Object[] checkedElements) {
-        internalSetCheckedElements(checkedElements);
-        getTreeViewer().refresh();
-    }
-
-    private void internalSetCheckedElements(Object[] checkedElements) {
-        fCheckboxTree.setCheckedElements(checkedElements);
-        saveViewContext();
-        for (ICheckboxTreeViewerListener listener : fTreeListeners) {
-            listener.handleCheckStateChangedEvent(getCheckedViewerEntries());
-        }
-    }
-
-    private Collection<ITmfTreeViewerEntry> getCheckedViewerEntries() {
-        Object[] checkedElements = fCheckboxTree.getCheckedElements();
-        return Lists.newArrayList(Iterables.filter(Arrays.asList(checkedElements), ITmfTreeViewerEntry.class));
-    }
-
-    /**
-     * Recursively find entries which were previously checked and check them again
-     * by id.
-     *
-     * @param ids
-     *            Set of previously checked IDs
-     * @param root
-     *            {@link ITmfTreeViewerEntry} to compare to the set of checked
-     *            entries
-     * @param checkedElements
-     *            list of checked entries to which we add the root entry if it was
-     *            previously checked
-     */
-    private void checkEntries(Set<Long> ids, ITmfTreeViewerEntry root, List<ITmfTreeViewerEntry> checkedElements) {
-        if (root instanceof TmfGenericTreeEntry
-                && ids.contains(((TmfGenericTreeEntry) root).getModel().getId())) {
-            checkedElements.add(root);
-        }
-        for (ITmfTreeViewerEntry child : root.getChildren()) {
-            checkEntries(ids, child, checkedElements);
-        }
-    }
-
-    @Override
-    @TmfSignalHandler
-    public void traceOpened(TmfTraceOpenedSignal signal) {
-        saveViewContext();
-        restorePatternFilter(signal.getTrace());
-        fCheckboxTree.setCheckedElements(new Object[0]);
-        super.traceOpened(signal);
-    }
-
-    @Override
-    @TmfSignalHandler
-    public void traceSelected(TmfTraceSelectedSignal signal) {
-        if (getTrace() != signal.getTrace()) {
-            saveViewContext();
-            restorePatternFilter(signal.getTrace());
-            fCheckboxTree.setCheckedElements(new Object[0]);
-        }
-        super.traceSelected(signal);
-    }
-
-    @Override
-    public void reset() {
-        fCheckboxTree.setCheckedElements(new Object[0]);
-        fCheckboxTree.setFilterText(""); //$NON-NLS-1$
-        super.reset();
-    }
-
-    @Override
-    protected void updateContent(long start, long end, boolean isSelection) {
-        try (FlowScopeLog scope = new FlowScopeLogBuilder(LOGGER, Level.FINE, UPDATE_CONTENT_JOB_NAME)
-                .setCategory(fLogCategory).build()) {
-            ITmfTrace trace = getTrace();
-            if (trace == null) {
-                return;
-            }
-            Job thread = new Job(UPDATE_CONTENT_JOB_NAME) {
-                @Override
-                public IStatus run(IProgressMonitor monitor) {
-                    try (FlowScopeLog runScope = new FlowScopeLogBuilder(LOGGER, Level.FINE, UPDATE_CONTENT_JOB_NAME + " run") //$NON-NLS-1$
-                            .setParentScope(scope).build()) {
-
-                        ITmfTreeDataProvider<@NonNull ITmfTreeDataModel> provider = getProvider(trace);
-                        if (provider == null) {
-                            return Status.OK_STATUS;
-                        }
-
-                        Map<String, Object> parameters = getParameters(start, end, isSelection);
-                        if (parameters.isEmpty()) {
-                            return Status.OK_STATUS;
-                        }
-
-                        boolean isComplete = false;
-                        do {
-                            TmfModelResponse<@NonNull TmfTreeModel<@NonNull ITmfTreeDataModel>> response;
-                            try (FlowScopeLog iterScope = new FlowScopeLogBuilder(LOGGER, Level.FINE, UPDATE_CONTENT_JOB_NAME + " query") //$NON-NLS-1$
-                                    .setParentScope(scope).build()) {
-
-                                response = provider.fetchTree(parameters, monitor);
-                                TmfTreeModel<@NonNull ITmfTreeDataModel> model = response.getModel();
-                                if (model != null) {
-                                    updateTree(trace, start, end, model.getEntries());
-                                }
-                            }
-
-                            ITmfResponse.Status status = response.getStatus();
-                            if (status == ITmfResponse.Status.COMPLETED) {
-                                /* Model is complete, no need to request again the data provider */
-                                isComplete = true;
-                            } else if (status == ITmfResponse.Status.FAILED || status == ITmfResponse.Status.CANCELLED) {
-                                /* Error occurred, return */
-                                isComplete = true;
-                            } else {
-                                /**
-                                 * Status is RUNNING. Sleeping current thread to wait before request data
-                                 * provider again
-                                 **/
-                                try {
-                                    Thread.sleep(BUILD_UPDATE_TIMEOUT);
-                                } catch (InterruptedException e) {
-                                    /**
-                                     * InterruptedException is throw by Thread.Sleep and we should retry querying
-                                     * the data provider
-                                     **/
-                                    runScope.addData(FAILED_TO_SLEEP_PREFIX + getName(), e);
-                                    Thread.currentThread().interrupt();
-                                    return new Status(IStatus.ERROR, Activator.PLUGIN_ID, FAILED_TO_SLEEP_PREFIX + getName());
-                                }
-                            }
-                        } while (!isComplete);
-
-                        return Status.OK_STATUS;
-                    }
-                }
-            };
-            thread.setSystem(true);
-            thread.schedule();
-        }
-    }
-
-    private void updateTree(ITmfTrace trace, long start, long end, List<@NonNull ITmfTreeDataModel> model) {
-        try (FlowScopeLog parentScope = new FlowScopeLogBuilder(LOGGER, Level.FINE, "AbstractSelectTreeViewer:TreeUpdateRequested" ) //$NON-NLS-1$
-                .setCategory(fLogCategory).build()) {
-            final TmfTreeViewerEntry rootEntry = getRoot(trace);
-            /*
-             * To avoid breaking API, get the new tree model root and reassign
-             * its children to the trace's fixed root after clearing it.
-             */
-            final ITmfTreeViewerEntry newTreeModel = modelToTree(start, end, model);
-            if (rootEntry != null && newTreeModel != null) {
-                synchronized (rootEntry) {
-                    rootEntry.getChildren().clear();
-                    newTreeModel.getChildren().forEach(child -> rootEntry.addChild((TmfTreeViewerEntry) child));
-                }
-                Display.getDefault().asyncExec(() -> {
-                    try (FlowScopeLog scope = new FlowScopeLogBuilder(LOGGER, Level.FINE, "AbstractSelectTreeViewer:TreeUpdate").setParentScope(parentScope).build()) { //$NON-NLS-1$
-
-                        if (!trace.equals(getTrace())) {
-                            return;
-                        }
-                        TreeViewer treeViewer = getTreeViewer();
-                        if (treeViewer.getControl().isDisposed()) {
-                            return;
-                        }
-
-                        Object currentRootEntry = treeViewer.getInput();
-                        updateTreeUI(treeViewer, rootEntry);
-                        if (rootEntry != currentRootEntry) {
-                            // FIXME should add a bit of padding
-                            for (TreeColumn column : treeViewer.getTree().getColumns()) {
-                                column.pack();
-                            }
-                        }
-                    }
-                });
-            }
-        }
-    }
-
-    /**
-     * Save the checked entries' ID in the view context before changing trace and
-     * check them again in the new tree.
-     */
-    private void saveViewContext() {
-        ITmfTrace previousTrace = getTrace();
-        if (previousTrace != null) {
-            Object[] checkedElements = fCheckboxTree.getCheckedElements();
-            Set<Long> ids = new HashSet<>();
-            for (Object checkedElement : checkedElements) {
-                if (checkedElement instanceof TmfGenericTreeEntry) {
-                    ids.add(((TmfGenericTreeEntry) checkedElement).getModel().getId());
-                }
-            }
-            Text filterControl = fCheckboxTree.getFilterControl();
-            String filterString = filterControl != null ? filterControl.getText() : null;
-            TmfTraceManager.getInstance().updateTraceContext(previousTrace,
-                    builder -> builder.setData(getDataContextId(CHECKED_ELEMENTS), ids)
-                    .setData(getDataContextId(FILTER_STRING), filterString));
-        }
-    }
-
-    private @NonNull String getDataContextId(String baseKey) {
-        return getClass().getName() + SEP + fInstanceId + baseKey;
-    }
-
-    private void restorePatternFilter(ITmfTrace trace) {
-        if (trace == null) {
-            fCheckboxTree.getPatternFilter().setPattern(null);
-            return;
-        }
-        TmfTraceContext ctx = TmfTraceManager.getInstance().getTraceContext(trace);
-        Object filterString = ctx.getData(getClass() + FILTER_STRING);
-        if (filterString instanceof String) {
-            fCheckboxTree.getPatternFilter().setPattern((String) filterString);
-        } else {
-            fCheckboxTree.getPatternFilter().setPattern(null);
-        }
-    }
-
-    /**
-     * Get the legend image for a entry's name
-     *
-     * @param name
-     *            the entry's name (used in both Tree and Chart viewer
-     * @return the correctly dimensioned image if there is a legend image provider
-     */
-    protected Image getLegendImage(@NonNull String name) {
-        /* If the image height match the row height, row height will increment */
-        ILegendImageProvider legendImageProvider = fLegendImageProvider;
-        int legendColumnIndex = fLegendIndex;
-        if (legendImageProvider != null && legendColumnIndex >= 0) {
-            Tree tree = getTreeViewer().getTree();
-            int imageWidth = tree.getColumn(legendColumnIndex).getWidth();
-            int imageHeight = tree.getItemHeight() - 1;
-            if (imageHeight > 0 && imageWidth > 0) {
-                return legendImageProvider.getLegendImage(imageHeight, imageWidth, name);
-            }
-        }
-        return null;
-    }
-
-    /**
-     * Get the legend image for a entry's ID
-     *
-     * @param id
-     *            the entry's unique ID
-     * @return the correctly dimensioned image if there is a legend image provider
-     * @since 6.0
-     */
-    protected Image getLegendImage(@NonNull Long id) {
-        /* If the image height match the row height, row height will increment */
-        ILegendImageProvider legendImageProvider = fLegendImageProvider;
-        int legendColumnIndex = fLegendIndex;
-        if (legendImageProvider != null && legendColumnIndex >= 0) {
-            Tree tree = getTreeViewer().getTree();
-            int imageWidth = tree.getColumn(legendColumnIndex).getWidth();
-            int imageHeight = tree.getItemHeight() - 1;
-            if (imageHeight > 0 && imageWidth > 0) {
-                return legendImageProvider.getLegendImage(imageHeight, imageWidth, id);
-            }
-        }
-        return null;
-    }
-
-    @Override
-    protected ITmfTreeViewerEntry updateElements(ITmfTrace trace, long start, long end, boolean isSelection) {
-        throw new UnsupportedOperationException("This method should not be called for AbstractSelectTreeViewers"); //$NON-NLS-1$
-    }
-
-    /**
-     * Getter for the {@link ITmfTreeDataProvider} to query for this TreeViewer
-     *
-     * @param trace the trace
-     * @return the relevant provider, if any
-     * @since 4.0
-     */
-    protected ITmfTreeDataProvider<@NonNull ITmfTreeDataModel> getProvider(@NonNull ITmfTrace trace) {
-        return DataProviderManager.getInstance().getDataProvider(trace, fId, ITmfTreeDataProvider.class);
-    }
-
-    @Override
-    protected void initializeDataSource(@NonNull ITmfTrace trace) {
-        getProvider(trace);
-    }
-
-    /**
-     * Get the map to query the {@link ITmfTreeDataProvider} for the queried
-     * parameters
-     *
-     * @param start
-     *            query start time
-     * @param end
-     *            query end time
-     * @param isSelection
-     *            if the query is a selection
-     * @return the resulting query parameters
-     * @since 5.0
-     */
-    protected @NonNull Map<String, Object> getParameters(long start, long end, boolean isSelection) {
-        return FetchParametersUtils.timeQueryToMap(new TimeQueryFilter(Long.min(start, end), Long.max(start, end), 2));
-    }
-
-    /**
-     * Algorithm to convert a model (List of {@link TmfTreeDataModel}) to the tree.
-     *
-     * @param start
-     *            queried start time
-     * @param end
-     *            queried end time
-     * @param model
-     *            model to convert
-     * @return the resulting {@link TmfTreeViewerEntry}.
-     */
-    protected ITmfTreeViewerEntry modelToTree(long start, long end, List<ITmfTreeDataModel> model) {
-        TmfTreeViewerEntry root = new TmfTreeViewerEntry(StringUtils.EMPTY);
-
-        Map<Long, TmfTreeViewerEntry> map = new HashMap<>();
-        map.put(-1L, root);
-        for (ITmfTreeDataModel entry : model) {
-            TmfGenericTreeEntry<ITmfTreeDataModel> viewerEntry = new TmfGenericTreeEntry<>(entry);
-            map.put(entry.getId(), viewerEntry);
-
-            TmfTreeViewerEntry parent = map.get(entry.getParentId());
-            if (parent != null && !parent.getChildren().contains(viewerEntry)) {
-                parent.addChild(viewerEntry);
-            }
-        }
-        return root;
-    }
-
-    /**
-     * Create a sortable column
-     *
-     * @param text
-     *            column label
-     * @param comparator
-     *            comparator to sort {@link TmfGenericTreeEntry}s
-     * @return the comparator
-     */
-    protected static <T extends TmfGenericTreeEntry<? extends TmfTreeDataModel>>
-    @NonNull TmfTreeColumnData createColumn(String text, Comparator<T> comparator) {
-        TmfTreeColumnData column = new TmfTreeColumnData(text);
-        column.setComparator(new ViewerComparator() {
-            @Override
-            public int compare(Viewer viewer, Object e1, Object e2) {
-                return comparator.compare((T) e1, (T) e2);
-            }
-        });
-        return column;
-    }
-
-    /**
-     * Get the full path of the entry, from the trace to itself, to query the
-     * presentation provider.
-     *
-     * @param entry
-     *            entry whose legend needs to be resolved.
-     * @return the relevant series name.
-     * @deprecated The ID should be used to query the presentation provider
-     *             instead of the full path
-     */
-    @Deprecated
-    protected static @NonNull String getFullPath(TmfGenericTreeEntry<TmfTreeDataModel> entry) {
-        StringBuilder path = new StringBuilder(entry.getName());
-        ITmfTreeViewerEntry parent = entry.getParent();
-        while (parent instanceof TmfGenericTreeEntry) {
-            path.insert(0, parent.getName() + '/');
-            parent = parent.getParent();
-        }
-        return path.toString();
-    }
-
-    /**
-     * Get the checkbox tree in this viewer.
-     *
-     * @return the checkbox tree.
-     * @since 4.0
-     */
-    public TriStateFilteredCheckboxTree getTriStateFilteredCheckboxTree() {
-        return fCheckboxTree;
-    }
-
-}
diff --git a/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/viewers/tree/AbstractSelectTreeViewer2.java b/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/viewers/tree/AbstractSelectTreeViewer2.java
index ea2fe56..e469ca5 100644
--- a/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/viewers/tree/AbstractSelectTreeViewer2.java
+++ b/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/viewers/tree/AbstractSelectTreeViewer2.java
@@ -251,19 +251,6 @@
     }
 
     /**
-     * Tell the chart viewer to listen to changes in the tree viewer
-     *
-     * @param listener
-     *            Chart listening to changes in the tree's selected entries
-     * @deprecated As of 6.0, there can be more than one listener for the tree,
-     *             use {@link #addTreeListener(ICheckboxTreeViewerListener)}
-     */
-    @Deprecated
-    public void setTreeListener(ICheckboxTreeViewerListener listener) {
-        addTreeListener(listener);
-    }
-
-    /**
      * Add a listener to changes in the tree viewer
      *
      * @param listener
@@ -677,27 +664,6 @@
     }
 
     /**
-     * Get the full path of the entry, from the trace to itself, to query the
-     * presentation provider.
-     *
-     * @param entry
-     *            entry whose legend needs to be resolved.
-     * @return the relevant series name.
-     * @deprecated The ID should be used to query the presentation provider
-     *             instead of the full path
-     */
-    @Deprecated
-    protected static @NonNull String getFullPath(TmfGenericTreeEntry<TmfTreeDataModel> entry) {
-        StringBuilder path = new StringBuilder(entry.getName());
-        ITmfTreeViewerEntry parent = entry.getParent();
-        while (parent instanceof TmfGenericTreeEntry) {
-            path.insert(0, parent.getName() + '/');
-            parent = parent.getParent();
-        }
-        return path.toString();
-    }
-
-    /**
      * Get the checkbox tree in this viewer.
      *
      * @return the checkbox tree.
diff --git a/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/viewers/xychart/linechart/TmfCommonXLineChartTooltipProvider.java b/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/viewers/xychart/linechart/TmfCommonXLineChartTooltipProvider.java
index 83f6500..9802a3f 100644
--- a/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/viewers/xychart/linechart/TmfCommonXLineChartTooltipProvider.java
+++ b/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/viewers/xychart/linechart/TmfCommonXLineChartTooltipProvider.java
@@ -19,7 +19,6 @@
 import java.util.List;
 
 import org.eclipse.swt.events.MouseEvent;
-import org.eclipse.swt.events.MouseTrackListener;
 import org.eclipse.swt.graphics.Color;
 import org.eclipse.swt.graphics.Point;
 import org.eclipse.swt.graphics.RGBA;
@@ -42,7 +41,7 @@
  *
  * @since 6.0
  */
-public class TmfCommonXLineChartTooltipProvider extends TmfBaseProvider implements MouseTrackListener {
+public class TmfCommonXLineChartTooltipProvider extends TmfBaseProvider {
 
     private final class XYToolTipHandler extends TmfAbstractToolTipHandler {
         private static final String HTML_COLOR_TOOLTIP = "<span style=\"color:%s;\">%s</span>"; //$NON-NLS-1$
@@ -143,35 +142,4 @@
     public void refresh() {
         // nothing to do
     }
-
-    // ------------------------------------------------------------------------
-    // MouseTrackListener
-    // ------------------------------------------------------------------------
-
-    /**
-     * @deprecated, do not extend, use as-is
-     */
-    @Deprecated
-    @Override
-    public void mouseEnter(MouseEvent e) {
-        // do nothing
-    }
-
-    /**
-     * @deprecated, do not extend, use as-is
-     */
-    @Deprecated
-    @Override
-    public void mouseExit(MouseEvent e) {
-        // do nothing
-    }
-
-    /**
-     * @deprecated, do not extend, use as-is
-     */
-    @Deprecated
-    @Override
-    public void mouseHover(MouseEvent e) {
-        // do nothing
-    }
 }
diff --git a/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/viewers/xycharts/AxisRange.java b/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/viewers/xycharts/AxisRange.java
deleted file mode 100644
index 5c687f9..0000000
--- a/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/viewers/xycharts/AxisRange.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/**********************************************************************
- * Copyright (c) 2019 Draeger, Auriga
- *
- * All rights reserved. This program and the accompanying materials are
- * made available under the terms of the Eclipse Public License 2.0 which
- * accompanies this distribution, and is available at
- * https://www.eclipse.org/legal/epl-2.0/
- *
- * SPDX-License-Identifier: EPL-2.0
- **********************************************************************/
-package org.eclipse.tracecompass.tmf.ui.viewers.xycharts;
-
-/**
- * Axis range with minimum and maximum values.
- *
- * @author Ivan Grinenko
- * @since 5.2
- * @deprecated use {@link org.eclipse.tracecompass.tmf.ui.viewers.xychart.AxisRange}
- *
- */
-@Deprecated
-public class AxisRange {
-
-    private final double fLower;
-    private final double fUpper;
-
-    /**
-     * Constructor
-     *
-     * @param start
-     *            starting value of the range
-     * @param end
-     *            ending value of the range
-     */
-    public AxisRange(double start, double end) {
-        fLower = (end > start) ? start : end;
-        fUpper = (end > start) ? end : start;
-    }
-
-    /**
-     * Gets the lower value of the range.
-     *
-     * @return The lower value of the range.
-     */
-    public double getLower() {
-        return fLower;
-    }
-
-    /**
-     * Gets the upper value of the range.
-     *
-     * @return The upper value of the range.
-     */
-    public double getUpper() {
-        return fUpper;
-    }
-
-    @Override
-    public String toString() {
-        return String.format("AxisRange[%f, %f]", getLower(), getUpper()); //$NON-NLS-1$
-    }
-
-}
diff --git a/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/viewers/xycharts/ITmfChartTimeProvider.java b/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/viewers/xycharts/ITmfChartTimeProvider.java
deleted file mode 100644
index 6a5e3fa..0000000
--- a/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/viewers/xycharts/ITmfChartTimeProvider.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/**********************************************************************
- * Copyright (c) 2013, 2014 Ericsson, École Polytechnique de Montréal
- *
- * All rights reserved. This program and the accompanying materials are
- * made available under the terms of the Eclipse Public License 2.0 which
- * accompanies this distribution, and is available at
- * https://www.eclipse.org/legal/epl-2.0/
- *
- * SPDX-License-Identifier: EPL-2.0
- *
- * Contributors:
- *   Bernd Hufmann - Initial API and implementation
- *   Geneviève Bastien - Moved some methods to ITmfTimeProvider
- **********************************************************************/
-package org.eclipse.tracecompass.tmf.ui.viewers.xycharts;
-
-import org.eclipse.tracecompass.tmf.ui.viewers.ITmfTimeProvider;
-
-/**
- * Interface adding some methods specific for SWT charts to the base time
- * provider interface. Typically, the time will be shown on the x-axis.
- *
- * @author Bernd Hufmann
- * @deprecated use {@link org.eclipse.tracecompass.tmf.ui.viewers.xychart.ITmfChartTimeProvider}
- */
-@Deprecated
-public interface ITmfChartTimeProvider extends ITmfTimeProvider {
-
-    /**
-     * Returns a constant time offset that is used to normalize the time values
-     * to a range of 0..53 bits to avoid loss of precision when converting long
-     * <-> double.
-     *
-     * Time values are stored in TMF as long values. The SWT chart library uses
-     * values of type double (on x and y axis). To avoid loss of precision when
-     * converting long <-> double the values need to fit within 53 bits.
-     *
-     * Subtract the offset when using time values provided externally for
-     * internal usage in SWT chart. Add the offset when using time values
-     * provided by SWT chart (e.g. for display purposes) and when broadcasting
-     * them externally (e.g. time synchronization signals).
-     *
-     * For example the offset can be calculated as the time of the first time
-     * value in the current time range to be displayed in the chart. Add +1 to
-     * avoid 0 when using logarithmic scale.
-     *
-     * t0=10000, t2=20000, tn=N -> timeOffset=t0-1 -> t0'=1, t1'=10001,
-     * tn'=N-timeOffset
-     *
-     * where t0 ... tn are times used externally and t0' ... tn' are times used
-     * internally by the SWT chart.
-     *
-     * @return the time offset
-     */
-    long getTimeOffset();
-
-}
diff --git a/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/viewers/xycharts/TmfBaseProvider.java b/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/viewers/xycharts/TmfBaseProvider.java
deleted file mode 100644
index af9d315..0000000
--- a/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/viewers/xycharts/TmfBaseProvider.java
+++ /dev/null
@@ -1,146 +0,0 @@
-/**********************************************************************
- * Copyright (c) 2013, 2019 Ericsson
- *
- * All rights reserved. This program and the accompanying materials are
- * made available under the terms of the Eclipse Public License 2.0 which
- * accompanies this distribution, and is available at
- * https://www.eclipse.org/legal/epl-2.0/
- *
- * SPDX-License-Identifier: EPL-2.0
- *
- * Contributors:
- *   Bernd Hufmann - Initial API and implementation
- **********************************************************************/
-package org.eclipse.tracecompass.tmf.ui.viewers.xycharts;
-
-import org.eclipse.tracecompass.internal.tmf.ui.viewers.xycharts.TmfXyUiUtils;
-import org.swtchart.Chart;
-import org.swtchart.IAxis;
-
-/**
- * Base class for any provider such as tool tip, zoom and selection providers.
- *
- * @author Bernd Hufmann
- * @deprecated use {@link org.eclipse.tracecompass.tmf.ui.viewers.xychart.TmfBaseProvider}
- */
-@Deprecated
-public abstract class TmfBaseProvider {
-
-    // ------------------------------------------------------------------------
-    // Attributes
-    // ------------------------------------------------------------------------
-    /** Reference to the chart viewer */
-    private final ITmfChartTimeProvider fChartViewer;
-
-    // ------------------------------------------------------------------------
-    // Constructors
-    // ------------------------------------------------------------------------
-
-    /**
-     * Standard constructor.
-     *
-     * @param tmfChartViewer
-     *            The parent histogram object
-     */
-    public TmfBaseProvider(ITmfChartTimeProvider tmfChartViewer) {
-        fChartViewer = tmfChartViewer;
-    }
-
-    // ------------------------------------------------------------------------
-    // Accessors
-    // ------------------------------------------------------------------------
-    /**
-     * Returns the chart viewer reference.
-     * @return the chart viewer reference
-     */
-    public ITmfChartTimeProvider getChartViewer() {
-        return fChartViewer;
-    }
-
-    /**
-     * Returns the SWT chart reference
-     *
-     * @return SWT chart reference.
-     */
-    protected Chart getChart() {
-        return (Chart) fChartViewer.getControl();
-    }
-
-    /**
-     * Limits x data coordinate to window start and window end range
-     *
-     * @param x
-     *          x to limit
-     * @return  x if x >= begin && x <= end
-     *          begin if x < begin
-     *          end if x > end
-     */
-    protected long limitXDataCoordinate(double x) {
-        return TmfXyUiUtils.limitXDataCoordinate(getChartViewer(), x);
-    }
-
-    /**
-     * Limits x pixel coordinate to window start and window end range
-     *
-     * @param axisIndex
-     *          index of x-axis
-     * @param x
-     *          x to limit
-     * @return  x if x >= begin && x <= end
-     *          begin if x < begin
-     *          end if x > end
-     */
-    protected int limitXPixelCoordinate(int axisIndex, int x) {
-        ITmfChartTimeProvider viewer = getChartViewer();
-        long windowStartTime = viewer.getWindowStartTime() - viewer.getTimeOffset();
-        long windowEndTime = viewer.getWindowEndTime() - viewer.getTimeOffset();
-
-        IAxis xAxis = getChart().getAxisSet().getXAxis(0);
-        int startX = xAxis.getPixelCoordinate(windowStartTime);
-        if (x < startX) {
-            return startX;
-        }
-
-        int endX = xAxis.getPixelCoordinate(windowEndTime);
-        if (x > endX) {
-            return endX;
-        }
-
-        return x;
-    }
-
-    // ------------------------------------------------------------------------
-    // Operations
-    // ------------------------------------------------------------------------
-    /**
-     * Method deregisters provider from chart viewer. Subclasses may override this method
-     * to dispose any resources.
-     */
-    public void dispose() {
-        deregister();
-    }
-
-    /**
-     * Method to refresh the viewer. It will redraw the viewer.
-     */
-    public void refresh() {
-        if (!TmfXYChartViewer.getDisplay().isDisposed()) {
-            TmfXYChartViewer.getDisplay().asyncExec(() -> {
-                if (!getChart().isDisposed()) {
-                    getChart().redraw();
-                }
-            });
-        }
-    }
-
-    /**
-     * Method to register the provider to chart viewer.
-     */
-    protected abstract void register();
-
-    /**
-     * Method to deregister the provider from chart viewer.
-     */
-    protected abstract void deregister();
-
-}
\ No newline at end of file
diff --git a/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/viewers/xycharts/TmfChartTimeStampFormat.java b/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/viewers/xycharts/TmfChartTimeStampFormat.java
deleted file mode 100644
index 0ddfbf4..0000000
--- a/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/viewers/xycharts/TmfChartTimeStampFormat.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/**********************************************************************
- * Copyright (c) 2013, 2014 Ericsson
- *
- * All rights reserved. This program and the accompanying materials are
- * made available under the terms of the Eclipse Public License 2.0 which
- * accompanies this distribution, and is available at
- * https://www.eclipse.org/legal/epl-2.0/
- *
- * SPDX-License-Identifier: EPL-2.0
- *
- * Contributors:
- *   Bernd Hufmann - Initial API and implementation
- **********************************************************************/
-package org.eclipse.tracecompass.tmf.ui.viewers.xycharts;
-
-import java.text.FieldPosition;
-import java.text.SimpleDateFormat;
-import java.util.Date;
-
-import org.eclipse.tracecompass.tmf.core.timestamp.TmfTimestampFormat;
-
-/**
- * SimpleDateFormat class for displaying time information in SWT charts
- * using the TmfTimestampFormat class.
- *
- * @author Bernd Hufmann
- * @deprecated use {@link org.eclipse.tracecompass.tmf.ui.viewers.xychart.TmfChartTimeStampFormat}
- */
-@Deprecated
-public class TmfChartTimeStampFormat extends SimpleDateFormat {
-
-    // ------------------------------------------------------------------------
-    // Constants
-    // ------------------------------------------------------------------------
-    private static final long serialVersionUID = 3719743469686142387L;
-
-    // ------------------------------------------------------------------------
-    // Attributes
-    // ------------------------------------------------------------------------
-    private long fOffset;
-
-    // ------------------------------------------------------------------------
-    // Constructors
-    // ------------------------------------------------------------------------
-    /**
-     * Standard Constructor
-     *
-     * @param offset
-     *        offset to apply before formatting time (time = time + offset)
-     */
-    public TmfChartTimeStampFormat(long offset) {
-        fOffset = offset;
-    }
-
-    // ------------------------------------------------------------------------
-    // Operations
-    // ------------------------------------------------------------------------
-    @Override
-    public StringBuffer format(Date date, StringBuffer toAppendTo, FieldPosition fieldPosition) {
-
-        long time = date.getTime() + fOffset;
-        toAppendTo.append(TmfTimestampFormat.getDefaulTimeFormat().format(time));
-        return toAppendTo;
-    }
-
-}
diff --git a/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/viewers/xycharts/TmfClosestDataPointTooltipProvider.java b/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/viewers/xycharts/TmfClosestDataPointTooltipProvider.java
deleted file mode 100644
index 9b0488e..0000000
--- a/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/viewers/xycharts/TmfClosestDataPointTooltipProvider.java
+++ /dev/null
@@ -1,288 +0,0 @@
-/**********************************************************************
- * Copyright (c) 2015 Ericsson
- *
- * All rights reserved. This program and the accompanying materials are
- * made available under the terms of the Eclipse Public License 2.0 which
- * accompanies this distribution, and is available at
- * https://www.eclipse.org/legal/epl-2.0/
- *
- * SPDX-License-Identifier: EPL-2.0
- *
- * Contributors:
- *   Bernd Hufmann - Initial API and implementation
- **********************************************************************/
-package org.eclipse.tracecompass.tmf.ui.viewers.xycharts;
-
-import java.util.Collections;
-import java.util.Map;
-import java.util.Map.Entry;
-
-import org.eclipse.jdt.annotation.NonNull;
-import org.eclipse.jdt.annotation.Nullable;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.MouseEvent;
-import org.eclipse.swt.events.MouseMoveListener;
-import org.eclipse.swt.events.PaintEvent;
-import org.eclipse.swt.events.PaintListener;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.tracecompass.tmf.core.timestamp.ITmfTimestamp;
-import org.eclipse.tracecompass.tmf.core.timestamp.TmfTimestamp;
-import org.eclipse.tracecompass.tmf.ui.viewers.TmfAbstractToolTipHandler;
-import org.swtchart.Chart;
-import org.swtchart.IAxis;
-import org.swtchart.ISeries;
-
-/**
- * Abstract tooltip provider for xy chart viewers. It displays the y value and y
- * value of the data point of the mouse position. Extending classes can provide
- * a custom tooltip text.
- *
- * @author Bernd Hufmann
- * @since 2.0
- * @deprecated use {@link org.eclipse.tracecompass.tmf.ui.viewers.xychart.TmfClosestDataPointTooltipProvider}
- */
-@Deprecated
-public class TmfClosestDataPointTooltipProvider extends TmfBaseProvider implements MouseMoveListener, PaintListener {
-
-    private static final @NonNull String OLD_TOOLTIP = ""; //$NON-NLS-1$
-
-    private final class XYToolTipHandler extends TmfAbstractToolTipHandler {
-        @Override
-        public void fill(Control control, MouseEvent e, Point pt) {
-            if ((getChartViewer().getWindowDuration() != 0) && (e != null)) {
-                Chart chart = getChart();
-                IAxis xAxis = chart.getAxisSet().getXAxis(0);
-                IAxis yAxis = chart.getAxisSet().getYAxis(0);
-
-                ISeries[] series = chart.getSeriesSet().getSeries();
-
-                double smallestDistance = Double.MAX_VALUE;
-                Parameter param = null;
-
-                // go over all series
-                for (int k = 0; k < series.length; k++) {
-                    ISeries serie = series[k];
-                    double[] xS = serie.getXSeries();
-                    double[] yS = serie.getYSeries();
-
-                    if ((xS == null) || (yS == null)) {
-                        continue;
-                    }
-                    // go over all data points
-                    for (int i = 0; i < xS.length; i++) {
-                        int xs = xAxis.getPixelCoordinate(xS[i]) - e.x;
-                        int ys = yAxis.getPixelCoordinate(yS[i]) - e.y;
-                        double currentDistance = xs * xs + ys * ys;
-
-                        /*
-                         * Check for smallest distance to mouse position and
-                         * only consider it if the mouse is close the data
-                         * point.
-                         */
-                        if ((currentDistance < smallestDistance) && (currentDistance < (HIGHLIGHT_RADIUS * HIGHLIGHT_RADIUS))) {
-                            smallestDistance = currentDistance;
-                            fHighlightX = xs + e.x;
-                            fHighlightY = ys + e.y;
-                            if (param == null) {
-                                param = new Parameter();
-                            }
-                            param.setSeriesIndex(k);
-                            param.setDataIndex(i);
-                        }
-                    }
-                }
-                Map<String, Map<String, Object>> tooltip = null;
-                if (param != null) {
-                    tooltip = createToolTipMap(param);
-                    if (tooltip == null) {
-                        return;
-                    }
-                    fIsHighlight = true;
-                    chart.redraw();
-                }
-                if (tooltip == null) {
-                    return;
-                }
-                /*
-                 * Note that tooltip might be null which will clear the previous
-                 * tooltip string. This is intentional.
-                 */
-                for (Entry<String, Map<String, Object>> entry : tooltip.entrySet()) {
-                    ToolTipString category = entry.getKey().isEmpty() || entry.getKey().equals(OLD_TOOLTIP) ? null : ToolTipString.fromString(entry.getKey());
-                    for (Entry<String, Object> secondEntry : entry.getValue().entrySet()) {
-
-                        Object value = secondEntry.getValue();
-                        String key = secondEntry.getKey();
-                        if (value instanceof Number) {
-                            addItem(category, ToolTipString.fromString(key), ToolTipString.fromDecimal((Number) value));
-                        } else if (value instanceof ITmfTimestamp) {
-                            addItem(category, ToolTipString.fromString(key), ToolTipString.fromTimestamp(String.valueOf(value), ((ITmfTimestamp) value).toNanos()));
-                        } else {
-                            addItem(category, ToolTipString.fromString(key), ToolTipString.fromString(String.valueOf(value)));
-                        }
-                    }
-                }
-            }
-        }
-    }
-
-    // ------------------------------------------------------------------------
-    // Constants
-    // ------------------------------------------------------------------------
-    private static final int ALPHA = 128;
-    private static final int HIGHLIGHT_RADIUS = 5;
-
-    // ------------------------------------------------------------------------
-    // Attributes
-    // ------------------------------------------------------------------------
-    /** X coordinate for highlighting */
-    private int fHighlightX;
-    /** y coordinate for highlighting */
-    private int fHighlightY;
-    /** Flag to do highlighting or not */
-    private boolean fIsHighlight;
-    /** Tooltip handler */
-    private TmfAbstractToolTipHandler fTooltipHandler = new XYToolTipHandler();
-
-    // ------------------------------------------------------------------------
-    // Constructors
-    // ------------------------------------------------------------------------
-    /**
-     * Constructor for a tool tip provider.
-     *
-     * @param tmfChartViewer
-     *            - the parent chart viewer
-     */
-    public TmfClosestDataPointTooltipProvider(ITmfChartTimeProvider tmfChartViewer) {
-        super(tmfChartViewer);
-        register();
-    }
-
-    // ------------------------------------------------------------------------
-    // TmfBaseProvider
-    // ------------------------------------------------------------------------
-    @Override
-    public void register() {
-        Chart chart = getChart();
-        chart.getPlotArea().addMouseMoveListener(this);
-        chart.getPlotArea().addPaintListener(this);
-        fTooltipHandler.activateHoverHelp(chart.getPlotArea());
-    }
-
-    @Override
-    public void deregister() {
-
-        Chart chart = getChart();
-        if ((chart != null) && !chart.isDisposed()) {
-            chart.getPlotArea().removeMouseMoveListener(this);
-            chart.getPlotArea().removePaintListener(this);
-            fTooltipHandler.deactivateHoverHelp(chart.getPlotArea());
-        }
-    }
-
-    @Override
-    public void refresh() {
-        // nothing to do
-    }
-
-    // ------------------------------------------------------------------------
-    // MouseMoveListener
-    // ------------------------------------------------------------------------
-    @Override
-    public void mouseMove(@Nullable MouseEvent e) {
-        if (fIsHighlight) {
-            fIsHighlight = false;
-            getChart().redraw();
-        }
-    }
-
-    // ------------------------------------------------------------------------
-    // PaintListener
-    // ------------------------------------------------------------------------
-
-    @Override
-    public void paintControl(PaintEvent e) {
-        if (fIsHighlight && e != null) {
-            e.gc.setBackground(Display.getDefault().getSystemColor(
-                    SWT.COLOR_RED));
-            e.gc.setAlpha(ALPHA);
-
-            e.gc.fillOval(fHighlightX - HIGHLIGHT_RADIUS, fHighlightY - HIGHLIGHT_RADIUS,
-                    2 * HIGHLIGHT_RADIUS, 2 * HIGHLIGHT_RADIUS);
-        }
-    }
-
-    /**
-     * Creates the tooltip based on the given parameter.
-     *
-     * @param param
-     *            parameter to create the tooltip string
-     * @return the tooltip map based on the given parameter. The Map<String,
-     *         Map<String, Object>> can be seen as a table. The first element is
-     *         the category, the second is the key, third is the value.
-     * @since 5.0
-     */
-    protected @Nullable Map<@NonNull String, @NonNull Map<@NonNull String, @NonNull Object>> createToolTipMap(@NonNull Parameter param) {
-        ISeries[] series = getChart().getSeriesSet().getSeries();
-        int seriesIndex = param.getSeriesIndex();
-        int dataIndex = param.getDataIndex();
-        if ((series != null) && (seriesIndex < series.length)) {
-            ISeries serie = series[seriesIndex];
-            double[] xS = serie.getXSeries();
-            double[] yS = serie.getYSeries();
-            if ((xS != null) && (yS != null) && (dataIndex < xS.length) && (dataIndex < yS.length)) {
-                StringBuilder buffer = new StringBuilder();
-                buffer.append("x="); //$NON-NLS-1$
-                buffer.append(TmfTimestamp.fromNanos((long) xS[dataIndex] + getChartViewer().getTimeOffset()).toString());
-                buffer.append('\n');
-                buffer.append("y="); //$NON-NLS-1$
-                buffer.append((long) yS[dataIndex]);
-                return Collections.singletonMap(OLD_TOOLTIP, Collections.singletonMap(OLD_TOOLTIP, buffer.toString()));
-            }
-        }
-        return null;
-    }
-
-    /**
-     * Parameter class
-     */
-    protected static class Parameter {
-        /* A series index */
-        private int seriesIndex;
-        /* A data point index within a series */
-        private int dataIndex;
-
-        /**
-         * @return the series index
-         */
-        public int getSeriesIndex() {
-            return seriesIndex;
-        }
-
-        /**
-         * @param seriesIndex
-         *            index the seriesIndex to set
-         */
-        public void setSeriesIndex(int seriesIndex) {
-            this.seriesIndex = seriesIndex;
-        }
-
-        /**
-         * @return the data index
-         */
-        public int getDataIndex() {
-            return dataIndex;
-        }
-
-        /**
-         * @param dataIndex
-         *            the data index to set
-         */
-        public void setDataIndex(int dataIndex) {
-            this.dataIndex = dataIndex;
-        }
-
-    }
-}
\ No newline at end of file
diff --git a/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/viewers/xycharts/TmfMouseDragProvider.java b/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/viewers/xycharts/TmfMouseDragProvider.java
deleted file mode 100644
index fc12a08..0000000
--- a/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/viewers/xycharts/TmfMouseDragProvider.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/**********************************************************************
- * Copyright (c) 2014 Ericsson
- *
- * All rights reserved. This program and the accompanying materials are
- * made available under the terms of the Eclipse Public License 2.0 which
- * accompanies this distribution, and is available at
- * https://www.eclipse.org/legal/epl-2.0/
- *
- * SPDX-License-Identifier: EPL-2.0
- *
- * Contributors:
- *   Bernd Hufmann - Initial API and implementation
- **********************************************************************/
-package org.eclipse.tracecompass.tmf.ui.viewers.xycharts;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.MouseEvent;
-import org.eclipse.swt.events.MouseListener;
-import org.eclipse.swt.events.MouseMoveListener;
-import org.swtchart.IAxis;
-import org.swtchart.Range;
-
-/**
- * Class for updating time ranges based on middle mouse button drag.
- * It also notifies the viewer about a change of range.
- *
- * @author Bernd Hufmann
- * @deprecated use {@link org.eclipse.tracecompass.tmf.ui.viewers.xychart.TmfMouseDragProvider}
- */
-@Deprecated
-public class TmfMouseDragProvider extends TmfBaseProvider implements MouseListener, MouseMoveListener {
-
-    // ------------------------------------------------------------------------
-    // Attributes
-    // ------------------------------------------------------------------------
-    /** Cached start time */
-    private long fStartTime;
-    /** Cached end time */
-    private long fEndTime;
-    /** Flag indicating that an update is ongoing */
-    private boolean fIsUpdate;
-    /** Cached position when mouse button was pressed */
-    private int fStartPosition;
-
-    // ------------------------------------------------------------------------
-    // Constructors
-    // ------------------------------------------------------------------------
-    /**
-     * Default constructor
-     *
-     * @param tmfChartViewer
-     *          the chart viewer reference.
-     */
-    public TmfMouseDragProvider(ITmfChartTimeProvider tmfChartViewer) {
-        super(tmfChartViewer);
-        register();
-    }
-
-    // ------------------------------------------------------------------------
-    // TmfBaseProvider
-    // ------------------------------------------------------------------------
-    @Override
-    public void register() {
-        getChart().getPlotArea().addMouseListener(this);
-        getChart().getPlotArea().addMouseMoveListener(this);
-    }
-
-    @Override
-    public void deregister() {
-        if ((getChartViewer().getControl() != null) && !getChartViewer().getControl().isDisposed()) {
-            getChart().getPlotArea().removeMouseListener(this);
-            getChart().getPlotArea().removeMouseMoveListener(this);
-        }
-    }
-
-    @Override
-    public void refresh() {
-        // nothing to do
-    }
-
-    // ------------------------------------------------------------------------
-    // MouseListener
-    // ------------------------------------------------------------------------
-    @Override
-    public void mouseDoubleClick(MouseEvent e) {
-        // Do nothing
-    }
-
-    @Override
-    public void mouseDown(MouseEvent e) {
-        if ((getChartViewer().getWindowDuration() != 0) && ((e.button == 2) || (e.button == 1 && (e.stateMask & SWT.CTRL) != 0))) {
-            fStartPosition = e.x;
-            fIsUpdate = true;
-        }
-    }
-
-    @Override
-    public void mouseUp(MouseEvent e) {
-        if ((fIsUpdate) && (fStartTime != fEndTime)) {
-            ITmfChartTimeProvider viewer = getChartViewer();
-            viewer.updateWindow(fStartTime, fEndTime);
-        }
-        fIsUpdate = false;
-    }
-
-    // ------------------------------------------------------------------------
-    // MouseMoveListener
-    // ------------------------------------------------------------------------
-    @Override
-    public void mouseMove(MouseEvent e) {
-        if (fIsUpdate) {
-            IAxis xAxis = getChart().getAxisSet().getXAxis(0);
-
-            ITmfChartTimeProvider viewer = getChartViewer();
-
-            fStartTime = viewer.getWindowStartTime();
-            fEndTime = viewer.getWindowEndTime();
-
-            long startTime = viewer.getStartTime();
-            long endTime = viewer.getEndTime();
-
-            long delta = 0;
-            if (fStartPosition > e.x) {
-                delta = (long) (xAxis.getDataCoordinate(fStartPosition) - xAxis.getDataCoordinate(e.x));
-                long max = endTime - fEndTime;
-                delta = Math.max(0, Math.min(delta, max));
-                fStartTime = fStartTime + delta;
-                fEndTime = fEndTime + delta;
-            } else if (fStartPosition < e.x) {
-                delta = (long) (xAxis.getDataCoordinate(e.x) - xAxis.getDataCoordinate(fStartPosition));
-                long max = fStartTime - startTime;
-                delta = Math.max(0, Math.min(delta, max));
-                fStartTime = fStartTime - delta;
-                fEndTime = fEndTime - delta;
-            }
-
-            xAxis.setRange(new Range(fStartTime - viewer.getTimeOffset(), fEndTime - viewer.getTimeOffset()));
-            getChart().redraw();
-        }
-    }
-}
\ No newline at end of file
diff --git a/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/viewers/xycharts/TmfMouseDragZoomProvider.java b/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/viewers/xycharts/TmfMouseDragZoomProvider.java
deleted file mode 100644
index e3876e4..0000000
--- a/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/viewers/xycharts/TmfMouseDragZoomProvider.java
+++ /dev/null
@@ -1,165 +0,0 @@
-/**********************************************************************
- * Copyright (c) 2013, 2014 Ericsson
- *
- * All rights reserved. This program and the accompanying materials are
- * made available under the terms of the Eclipse Public License 2.0 which
- * accompanies this distribution, and is available at
- * https://www.eclipse.org/legal/epl-2.0/
- *
- * SPDX-License-Identifier: EPL-2.0
- *
- * Contributors:
- *   Bernd Hufmann - Initial API and implementation
- **********************************************************************/
-package org.eclipse.tracecompass.tmf.ui.viewers.xycharts;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.MouseEvent;
-import org.eclipse.swt.events.MouseListener;
-import org.eclipse.swt.events.MouseMoveListener;
-import org.eclipse.swt.events.PaintEvent;
-import org.swtchart.IAxis;
-import org.swtchart.ICustomPaintListener;
-import org.swtchart.IPlotArea;
-
-/**
- * Class for providing zooming based on mouse drag with right mouse button.
- * It also notifies the viewer about a change of range.
- *
- * @author Bernd Hufmann
- * @deprecated use {@link org.eclipse.tracecompass.tmf.ui.viewers.xychart.TmfMouseDragZoomProvider}
- */
-@Deprecated
-public class TmfMouseDragZoomProvider extends TmfBaseProvider implements MouseListener, MouseMoveListener, ICustomPaintListener {
-
-    // ------------------------------------------------------------------------
-    // Attributes
-    // ------------------------------------------------------------------------
-    /** Cached start time */
-    private long fStartTime;
-    /** Cached end time */
-    private long fEndTime;
-    /** Flag indicating that an update is ongoing */
-    private boolean fIsUpdate;
-
-    // ------------------------------------------------------------------------
-    // Constructors
-    // ------------------------------------------------------------------------
-    /**
-     * Default constructor
-     *
-     * @param tmfChartViewer
-     *          the chart viewer reference.
-     */
-    public TmfMouseDragZoomProvider(ITmfChartTimeProvider tmfChartViewer) {
-        super(tmfChartViewer);
-        register();
-    }
-
-    // ------------------------------------------------------------------------
-    // TmfBaseProvider
-    // ------------------------------------------------------------------------
-    @Override
-    public void register() {
-        getChart().getPlotArea().addMouseListener(this);
-        getChart().getPlotArea().addMouseMoveListener(this);
-        ((IPlotArea) getChart().getPlotArea()).addCustomPaintListener(this);
-    }
-
-    @Override
-    public void deregister() {
-        if ((getChartViewer().getControl() != null) && !getChartViewer().getControl().isDisposed()) {
-            getChart().getPlotArea().removeMouseListener(this);
-            getChart().getPlotArea().removeMouseMoveListener(this);
-            ((IPlotArea) getChart().getPlotArea()).removeCustomPaintListener(this);
-        }
-    }
-
-    @Override
-    public void refresh() {
-        // nothing to do
-    }
-
-    // ------------------------------------------------------------------------
-    // MouseListener
-    // ------------------------------------------------------------------------
-    @Override
-    public void mouseDoubleClick(MouseEvent e) {
-        // Do nothing
-    }
-
-    @Override
-    public void mouseDown(MouseEvent e) {
-        if ((getChartViewer().getWindowDuration() != 0) && (e.button == 3)) {
-            IAxis xAxis = getChart().getAxisSet().getXAxis(0);
-            fStartTime = limitXDataCoordinate(xAxis.getDataCoordinate(e.x));
-            fEndTime = fStartTime;
-            fIsUpdate = true;
-        }
-    }
-
-    @Override
-    public void mouseUp(MouseEvent e) {
-        if ((fIsUpdate) && (fStartTime != fEndTime)) {
-            if (fStartTime > fEndTime) {
-                long tmp = fStartTime;
-                fStartTime = fEndTime;
-                fEndTime = tmp;
-            }
-            ITmfChartTimeProvider viewer = getChartViewer();
-            viewer.updateWindow(fStartTime + viewer.getTimeOffset(), fEndTime + viewer.getTimeOffset());
-        }
-
-        if (fIsUpdate) {
-            getChart().redraw();
-        }
-        fIsUpdate = false;
-    }
-
-    // ------------------------------------------------------------------------
-    // MouseMoveListener
-    // ------------------------------------------------------------------------
-    @Override
-    public void mouseMove(MouseEvent e) {
-        if (fIsUpdate) {
-            IAxis xAxis = getChart().getAxisSet().getXAxis(0);
-            fEndTime = limitXDataCoordinate(xAxis.getDataCoordinate(e.x));
-
-            ITmfChartTimeProvider viewer = getChartViewer();
-            if (viewer instanceof TmfXYChartViewer) {
-                TmfXYChartViewer xyChartViewer = (TmfXYChartViewer) viewer;
-                xyChartViewer.updateStatusLine(fStartTime, fEndTime, limitXDataCoordinate(xAxis.getDataCoordinate(e.x)));
-            }
-
-            getChart().redraw();
-        }
-    }
-
-    // ------------------------------------------------------------------------
-    // ICustomPaintListener
-    // ------------------------------------------------------------------------
-    @Override
-    public void paintControl(PaintEvent e) {
-        if (fIsUpdate && (fStartTime != fEndTime)) {
-            IAxis xAxis = getChart().getAxisSet().getXAxis(0);
-            int startX = xAxis.getPixelCoordinate(fStartTime);
-            int endX = xAxis.getPixelCoordinate(fEndTime);
-            int prevAlpha = e.gc.getAlpha();
-            e.gc.setAlpha(64);
-            e.gc.setBackground(TmfXYChartViewer.getDisplay().getSystemColor(SWT.COLOR_WIDGET_BACKGROUND));
-            if (fStartTime < fEndTime) {
-                e.gc.fillRectangle(startX, 0, endX - startX, e.height);
-            } else {
-                e.gc.fillRectangle(endX, 0, startX - endX, e.height);
-            }
-            e.gc.setAlpha(prevAlpha);
-            e.gc.drawLine(startX, 0, startX, e.height);
-            e.gc.drawLine(endX, 0, endX, e.height);
-        }
-    }
-
-    @Override
-    public boolean drawBehindSeries() {
-        return false;
-    }
-}
\ No newline at end of file
diff --git a/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/viewers/xycharts/TmfMouseSelectionProvider.java b/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/viewers/xycharts/TmfMouseSelectionProvider.java
deleted file mode 100644
index eb0161a..0000000
--- a/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/viewers/xycharts/TmfMouseSelectionProvider.java
+++ /dev/null
@@ -1,203 +0,0 @@
-/**********************************************************************
- * Copyright (c) 2013, 2014, 2017 Ericsson
- *
- * All rights reserved. This program and the accompanying materials are
- * made available under the terms of the Eclipse Public License 2.0 which
- * accompanies this distribution, and is available at
- * https://www.eclipse.org/legal/epl-2.0/
- *
- * SPDX-License-Identifier: EPL-2.0
- *
- * Contributors:
- *   Bernd Hufmann - Initial API and implementation
- **********************************************************************/
-package org.eclipse.tracecompass.tmf.ui.viewers.xycharts;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.MouseEvent;
-import org.eclipse.swt.events.MouseListener;
-import org.eclipse.swt.events.MouseMoveListener;
-import org.eclipse.swt.events.PaintEvent;
-import org.swtchart.IAxis;
-import org.swtchart.ICustomPaintListener;
-import org.swtchart.IPlotArea;
-
-/**
- * Class for providing selection of ranges with the left mouse button. It also
- * notifies the viewer about a change of selection.
- *
- * @author Bernd Hufmann
- * @deprecated use {@link org.eclipse.tracecompass.tmf.ui.viewers.xychart.TmfMouseSelectionProvider}
- */
-@Deprecated
-public class TmfMouseSelectionProvider extends TmfBaseProvider implements MouseListener, MouseMoveListener, ICustomPaintListener {
-
-    // ------------------------------------------------------------------------
-    // Attributes
-    // ------------------------------------------------------------------------
-    /** Cached start time */
-    private long fBeginTime;
-    /** Cached end time */
-    private long fEndTime;
-    /** Cached cursor time*/
-    private long fCursorTime;
-    /** Flag indicating that an update is ongoing */
-    private boolean fIsInternalUpdate;
-    /** Flag indicating that the begin marker is dragged */
-    private boolean fDragBeginMarker;
-
-    // ------------------------------------------------------------------------
-    // Constructors
-    // ------------------------------------------------------------------------
-    /**
-     * Default constructor
-     *
-     * @param tmfChartViewer
-     *            The chart viewer reference.
-     */
-    public TmfMouseSelectionProvider(ITmfChartTimeProvider tmfChartViewer) {
-        super(tmfChartViewer);
-        register();
-    }
-
-    // ------------------------------------------------------------------------
-    // TmfBaseProvider
-    // ------------------------------------------------------------------------
-    @Override
-    public void register() {
-        getChart().getPlotArea().addMouseListener(this);
-        getChart().getPlotArea().addMouseMoveListener(this);
-        ((IPlotArea) getChart().getPlotArea()).addCustomPaintListener(this);
-    }
-
-    @Override
-    public void deregister() {
-        if ((getChartViewer().getControl() != null) && !getChartViewer().getControl().isDisposed()) {
-            getChart().getPlotArea().removeMouseListener(this);
-            getChart().getPlotArea().removeMouseMoveListener(this);
-            ((IPlotArea) getChart().getPlotArea()).removeCustomPaintListener(this);
-        }
-    }
-
-    // ------------------------------------------------------------------------
-    // MouseListener
-    // ------------------------------------------------------------------------
-    @Override
-    public void mouseDoubleClick(MouseEvent e) {
-        // Do nothing
-    }
-
-    @Override
-    public void mouseDown(MouseEvent e) {
-        if ((getChartViewer().getWindowDuration() != 0) && (e.button == 1)) {
-            if ((e.stateMask & SWT.CTRL) != 0) {
-                return;
-            }
-            fDragBeginMarker = false;
-            if ((e.stateMask & SWT.SHIFT) != SWT.SHIFT) {
-                IAxis xAxis = getChart().getAxisSet().getXAxis(0);
-                fBeginTime = limitXDataCoordinate(xAxis.getDataCoordinate(e.x));
-                fEndTime = fBeginTime;
-            } else {
-                long selectionBegin = fBeginTime;
-                long selectionEnd = fEndTime;
-                IAxis xAxis = getChart().getAxisSet().getXAxis(0);
-                long time = limitXDataCoordinate(xAxis.getDataCoordinate(e.x));
-                if (Math.abs(time - selectionBegin) < Math.abs(time - selectionEnd)) {
-                    fDragBeginMarker = true;
-                    fBeginTime = time;
-                    fEndTime = selectionEnd;
-                } else {
-                    fBeginTime = selectionBegin;
-                    fEndTime = time;
-                }
-            }
-            fIsInternalUpdate = true;
-        }
-    }
-
-    @Override
-    public void mouseUp(MouseEvent e) {
-        if (fIsInternalUpdate) {
-            ITmfChartTimeProvider viewer = getChartViewer();
-            viewer.updateSelectionRange(fBeginTime + viewer.getTimeOffset(), fEndTime + viewer.getTimeOffset());
-
-            if (viewer instanceof TmfXYChartViewer) {
-                TmfXYChartViewer xyChartViewer = (TmfXYChartViewer) viewer;
-                xyChartViewer.updateStatusLine(fBeginTime, fEndTime, fCursorTime);
-            }
-
-            fIsInternalUpdate = false;
-            getChart().redraw();
-        }
-    }
-
-    // ------------------------------------------------------------------------
-    // MouseMoveListener
-    // ------------------------------------------------------------------------
-    @Override
-    public void mouseMove(MouseEvent e) {
-        IAxis xAxis = getChart().getAxisSet().getXAxis(0);
-        fCursorTime = limitXDataCoordinate(xAxis.getDataCoordinate(e.x));
-
-        if (fIsInternalUpdate) {
-            if (fDragBeginMarker) {
-                fBeginTime = limitXDataCoordinate(xAxis.getDataCoordinate(e.x));
-            } else {
-                fEndTime = limitXDataCoordinate(xAxis.getDataCoordinate(e.x));
-            }
-            getChart().redraw();
-        }
-
-        ITmfChartTimeProvider viewer = getChartViewer();
-        if (viewer instanceof TmfXYChartViewer) {
-            TmfXYChartViewer xyChartViewer = (TmfXYChartViewer) viewer;
-            xyChartViewer.updateStatusLine(fBeginTime, fEndTime, fCursorTime);
-        }
-    }
-
-    // ------------------------------------------------------------------------
-    // ICustomPaintListener
-    // ------------------------------------------------------------------------
-    @Override
-    public void paintControl(PaintEvent e) {
-        ITmfChartTimeProvider viewer = getChartViewer();
-
-        if (!fIsInternalUpdate) {
-            fBeginTime = viewer.getSelectionBeginTime() - viewer.getTimeOffset();
-            fEndTime = viewer.getSelectionEndTime() - viewer.getTimeOffset();
-        }
-        long windowStartTime = viewer.getWindowStartTime() - viewer.getTimeOffset();
-        long windowEndTime = viewer.getWindowEndTime() - viewer.getTimeOffset();
-
-        IAxis xAxis = getChart().getAxisSet().getXAxis(0);
-        e.gc.setBackground(TmfXYChartViewer.getDisplay().getSystemColor(SWT.COLOR_BLUE));
-        e.gc.setForeground(TmfXYChartViewer.getDisplay().getSystemColor(SWT.COLOR_BLUE));
-        e.gc.setLineStyle(SWT.LINE_SOLID);
-        if ((fBeginTime >= windowStartTime) && (fBeginTime <= windowEndTime)) {
-            int beginX = xAxis.getPixelCoordinate(fBeginTime);
-            e.gc.drawLine(beginX, 0, beginX, e.height);
-        }
-
-        if ((fEndTime >= windowStartTime) && (fEndTime <= windowEndTime) && (fBeginTime != fEndTime)) {
-            int endX = xAxis.getPixelCoordinate(fEndTime);
-            e.gc.drawLine(endX, 0, endX, e.height);
-        }
-        e.gc.setAlpha(64);
-        if (Math.abs(fEndTime - fBeginTime) > 1) {
-            e.gc.setBackground(TmfXYChartViewer.getDisplay().getSystemColor(SWT.COLOR_WIDGET_BACKGROUND));
-            int beginX = xAxis.getPixelCoordinate(fBeginTime);
-            int endX = xAxis.getPixelCoordinate(fEndTime);
-            if (fEndTime > fBeginTime) {
-                e.gc.fillRectangle(beginX + 1, 0, endX - beginX - 1, e.height);
-            } else {
-                e.gc.fillRectangle(endX + 1, 0, beginX - endX - 1, e.height);
-            }
-        }
-    }
-
-    @Override
-    public boolean drawBehindSeries() {
-        return false;
-    }
-}
diff --git a/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/viewers/xycharts/TmfMouseWheelZoomProvider.java b/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/viewers/xycharts/TmfMouseWheelZoomProvider.java
deleted file mode 100644
index c935398..0000000
--- a/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/viewers/xycharts/TmfMouseWheelZoomProvider.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2013, 2019 Ericsson
- *
- * All rights reserved. This program and the accompanying materials are
- * made available under the terms of the Eclipse Public License 2.0 which
- * accompanies this distribution, and is available at
- * https://www.eclipse.org/legal/epl-2.0/
- *
- * SPDX-License-Identifier: EPL-2.0
- *
- * Contributors:
- *   Bernd Hufmann - Initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.tracecompass.tmf.ui.viewers.xycharts;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.MouseEvent;
-import org.eclipse.swt.events.MouseWheelListener;
-import org.eclipse.tracecompass.internal.tmf.ui.viewers.xycharts.TmfXyUiUtils;
-import org.swtchart.Chart;
-
-/**
- * Class for providing zooming and scrolling based on mouse wheel. For zooming,
- * it centers the zoom on mouse position. For scrolling, it will move the zoom
- * window to another position while maintaining the window size. It also
- * notifies the viewer about a change of range.
- *
- * @author Bernd Hufmann
- * @deprecated use {@link org.eclipse.tracecompass.tmf.ui.viewers.xychart.TmfMouseWheelZoomProvider}
- */
-@Deprecated
-public class TmfMouseWheelZoomProvider extends TmfBaseProvider implements MouseWheelListener {
-
-    // ------------------------------------------------------------------------
-    // Constructors
-    // ------------------------------------------------------------------------
-    /**
-     * Standard constructor.
-     *
-     * @param tmfChartViewer
-     *            The parent histogram object
-     */
-    public TmfMouseWheelZoomProvider(ITmfChartTimeProvider tmfChartViewer) {
-        super(tmfChartViewer);
-        register();
-    }
-
-    // ------------------------------------------------------------------------
-    // TmfBaseProvider
-    // ------------------------------------------------------------------------
-    @Override
-    public void register() {
-        getChart().getPlotArea().addMouseWheelListener(this);
-    }
-
-    @Override
-    public void deregister() {
-        if ((getChartViewer().getControl() != null) && !getChartViewer().getControl().isDisposed()) {
-            getChart().getPlotArea().removeMouseWheelListener(this);
-        }
-    }
-
-    @Override
-    public void refresh() {
-        // nothing to do
-    }
-
-    // ------------------------------------------------------------------------
-    // MouseWheelListener
-    // ------------------------------------------------------------------------
-    @Override
-    public synchronized void mouseScrolled(MouseEvent event) {
-        final int count = event.count;
-        if ((event.stateMask & SWT.CTRL) != 0) {
-            final int x = event.x;
-            zoom(count, x);
-        } else if ((event.stateMask & SWT.SHIFT) != 0) {
-            scroll(count);
-        }
-    }
-
-    private void scroll(final int count) {
-        ITmfChartTimeProvider viewer = getChartViewer();
-        Chart chart = getChart();
-        if ((viewer != null) && (chart != null) && (count != 0)) {
-            TmfXyUiUtils.horizontalScroll(viewer, chart, count > 0);
-        }
-    }
-
-    private void zoom(final int count, final int x) {
-        ITmfChartTimeProvider viewer = getChartViewer();
-        Chart chart = getChart();
-        if ((viewer != null) && (chart != null) && (count != 0)) {
-            TmfXyUiUtils.zoom(viewer, chart, count > 0, x);
-        }
-    }
-}
\ No newline at end of file
diff --git a/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/viewers/xycharts/TmfSimpleTooltipProvider.java b/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/viewers/xycharts/TmfSimpleTooltipProvider.java
deleted file mode 100644
index b52c4f7..0000000
--- a/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/viewers/xycharts/TmfSimpleTooltipProvider.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/**********************************************************************
- * Copyright (c) 2013, 2019 Ericsson
- *
- * All rights reserved. This program and the accompanying materials are
- * made available under the terms of the Eclipse Public License 2.0 which
- * accompanies this distribution, and is available at
- * https://www.eclipse.org/legal/epl-2.0/
- *
- * SPDX-License-Identifier: EPL-2.0
- *
- * Contributors:
- *   Bernd Hufmann - Initial API and implementation
- **********************************************************************/
-package org.eclipse.tracecompass.tmf.ui.viewers.xycharts;
-
-import org.eclipse.swt.events.MouseEvent;
-import org.eclipse.swt.events.MouseTrackListener;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.tracecompass.tmf.core.timestamp.ITmfTimestamp;
-import org.eclipse.tracecompass.tmf.core.timestamp.TmfTimestamp;
-import org.eclipse.tracecompass.tmf.ui.viewers.TmfAbstractToolTipHandler;
-import org.swtchart.Chart;
-import org.swtchart.IAxis;
-import org.swtchart.IAxisSet;
-
-/**
- * Tool tip provider for TMF chart viewer. It displays the x and y value of the
- * current mouse position.
- *
- * @author Bernd Hufmann
- * @deprecated use {@link org.eclipse.tracecompass.tmf.ui.viewers.xychart.TmfSimpleTooltipProvider}
- */
-@Deprecated
-public class TmfSimpleTooltipProvider extends TmfBaseProvider implements MouseTrackListener {
-
-    private final class XYToolTipHandler extends TmfAbstractToolTipHandler {
-        @Override
-        public void fill(Control control, MouseEvent event, Point pt) {
-            Chart chart = getChart();
-            IAxisSet axisSet = chart.getAxisSet();
-            IAxis xAxis = axisSet.getXAxis(0);
-            IAxis yAxis = axisSet.getYAxis(0);
-
-            double xCoordinate = xAxis.getDataCoordinate(pt.x);
-            double yCoordinate = yAxis.getDataCoordinate(pt.y);
-
-            ITmfChartTimeProvider viewer = getChartViewer();
-
-            ITmfTimestamp time = TmfTimestamp.fromNanos((long) xCoordinate + viewer.getTimeOffset());
-            /* set tooltip of current data point */
-            addItem(null, ToolTipString.fromString("x"), ToolTipString.fromTimestamp(time.toString(), time.toNanos())); //$NON-NLS-1$
-            addItem(null, "y", Double.toString(yCoordinate)); //$NON-NLS-1$
-        }
-    }
-
-    private TmfAbstractToolTipHandler fTooltipHandler = new XYToolTipHandler();
-
-    // ------------------------------------------------------------------------
-    // Constructors
-    // ------------------------------------------------------------------------
-    /**
-     * Constructor for a tool tip provider.
-     *
-     * @param tmfChartViewer
-     *            The parent chart viewer
-     */
-    public TmfSimpleTooltipProvider(ITmfChartTimeProvider tmfChartViewer) {
-        super(tmfChartViewer);
-        register();
-    }
-
-    // ------------------------------------------------------------------------
-    // TmfBaseProvider
-    // ------------------------------------------------------------------------
-    @Override
-    public void register() {
-        fTooltipHandler.activateHoverHelp(getChart().getPlotArea());
-    }
-
-    @Override
-    public void deregister() {
-        if ((getChartViewer().getControl() != null) && !getChartViewer().getControl().isDisposed()) {
-            fTooltipHandler.deactivateHoverHelp(getChart().getPlotArea());
-        }
-    }
-
-    @Override
-    public void refresh() {
-        // nothing to do
-    }
-
-    // ------------------------------------------------------------------------
-    // MouseTrackListener
-    // ------------------------------------------------------------------------
-    @Override
-    public void mouseEnter(MouseEvent e) {
-        // Do nothing
-    }
-
-    @Override
-    public void mouseExit(MouseEvent e) {
-        // Do nothing
-    }
-
-    @Override
-    public void mouseHover(MouseEvent e) {
-        // Do nothing
-    }
-}
\ No newline at end of file
diff --git a/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/viewers/xycharts/TmfXYChartViewer.java b/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/viewers/xycharts/TmfXYChartViewer.java
deleted file mode 100644
index 8b7842d..0000000
--- a/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/viewers/xycharts/TmfXYChartViewer.java
+++ /dev/null
@@ -1,819 +0,0 @@
-/**********************************************************************
- * Copyright (c) 2013, 2020 Ericsson, École Polytechnique de Montréal, Draeger
- *
- * All rights reserved. This program and the accompanying materials are
- * made available under the terms of the Eclipse Public License 2.0 which
- * accompanies this distribution, and is available at
- * https://www.eclipse.org/legal/epl-2.0/
- *
- * SPDX-License-Identifier: EPL-2.0
- *
- * Contributors:
- *   Bernd Hufmann - Initial API and implementation
- *   Geneviève Bastien - Moved some methods to TmfTimeViewer
- *   Patrick Tasse - Fix setFocus
- *   Ivan Grinenko - Add ability to set fixed range for Y axis.
- **********************************************************************/
-package org.eclipse.tracecompass.tmf.ui.viewers.xycharts;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.jdt.annotation.NonNull;
-import org.eclipse.jdt.annotation.Nullable;
-import org.eclipse.jface.action.IStatusLineManager;
-import org.eclipse.jface.layout.GridDataFactory;
-import org.eclipse.jface.layout.GridLayoutFactory;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.FocusListener;
-import org.eclipse.swt.events.MouseAdapter;
-import org.eclipse.swt.events.MouseEvent;
-import org.eclipse.swt.events.PaintEvent;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.GC;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.tracecompass.internal.tmf.ui.viewers.xycharts.TmfXYChartTimeAdapter;
-import org.eclipse.tracecompass.internal.tmf.ui.viewers.xycharts.TmfXyUiUtils;
-import org.eclipse.tracecompass.internal.tmf.ui.views.ITmfTimeNavigationProvider;
-import org.eclipse.tracecompass.internal.tmf.ui.views.ITmfTimeZoomProvider;
-import org.eclipse.tracecompass.internal.tmf.ui.views.ITmfZoomToSelectionProvider;
-import org.eclipse.tracecompass.tmf.core.signal.TmfSelectionRangeUpdatedSignal;
-import org.eclipse.tracecompass.tmf.core.signal.TmfSignalHandler;
-import org.eclipse.tracecompass.tmf.core.signal.TmfTimestampFormatUpdateSignal;
-import org.eclipse.tracecompass.tmf.core.signal.TmfWindowRangeUpdatedSignal;
-import org.eclipse.tracecompass.tmf.core.timestamp.ITmfTimePreferencesConstants;
-import org.eclipse.tracecompass.tmf.core.timestamp.TmfTimePreferences;
-import org.eclipse.tracecompass.tmf.core.trace.ITmfTrace;
-import org.eclipse.tracecompass.tmf.core.trace.TmfTraceContext;
-import org.eclipse.tracecompass.tmf.core.trace.TmfTraceManager;
-import org.eclipse.tracecompass.tmf.ui.viewers.IImageSave;
-import org.eclipse.tracecompass.tmf.ui.viewers.TmfTimeViewer;
-import org.eclipse.tracecompass.tmf.ui.views.FormatTimeUtils;
-import org.eclipse.tracecompass.tmf.ui.views.FormatTimeUtils.Resolution;
-import org.eclipse.tracecompass.tmf.ui.views.FormatTimeUtils.TimeFormat;
-import org.eclipse.tracecompass.tmf.ui.widgets.timegraph.widgets.TimeGraphColorScheme;
-import org.eclipse.tracecompass.tmf.ui.widgets.timegraph.widgets.TimeGraphScale;
-import org.swtchart.Chart;
-import org.swtchart.IAxis;
-import org.swtchart.ICustomPaintListener;
-import org.swtchart.IPlotArea;
-import org.swtchart.ISeries;
-import org.swtchart.ISeriesSet;
-import org.swtchart.ITitle;
-import org.swtchart.LineStyle;
-import org.swtchart.Range;
-
-import com.google.common.annotations.VisibleForTesting;
-
-/**
- * Base class for a XY-Chart based on SWT chart. It provides a methods to define
- * zoom, selection and tool tip providers. It also provides call backs to be
- * notified by any changes caused by selection and zoom.
- *
- * @author Bernd Hufmann
- * @deprecated use {@link org.eclipse.tracecompass.tmf.ui.viewers.xychart.TmfXYChartViewer}
- */
-@Deprecated
-public abstract class TmfXYChartViewer extends TmfTimeViewer implements ITmfChartTimeProvider, IImageSave, IAdaptable {
-
-    // ------------------------------------------------------------------------
-    // Attributes
-    // ------------------------------------------------------------------------
-    private static final int DEFAULT_SCALE_HEIGHT = 22;
-
-    /** The composite to house the chart and time graph scale */
-    private Composite fCommonComposite;
-    /** The color scheme for the chart */
-    private @NonNull TimeGraphColorScheme fColorScheme = new TimeGraphColorScheme();
-    /** The SWT Chart reference */
-    private Chart fSwtChart;
-    /** The X axis for the chart */
-    private TimeGraphScale fTimeScaleCtrl;
-    /** The time format */
-    private @Nullable TimeFormat fTimeFormat = null;
-    /** The mouse selection provider */
-    private TmfBaseProvider fMouseSelectionProvider;
-    /** The mouse drag zoom provider */
-    private TmfBaseProvider fMouseDragZoomProvider;
-    /** The mouse wheel zoom provider */
-    private TmfBaseProvider fMouseWheelZoomProvider;
-    /** The tooltip provider */
-    private TmfBaseProvider fToolTipProvider;
-    /** The middle mouse drag provider */
-    private TmfBaseProvider fMouseDragProvider;
-    /**
-     * Whether or not to send time alignment signals. This should be set to true for
-     * viewers that are part of an aligned view.
-     */
-    private boolean fSendTimeAlignSignals = false;
-
-    private final TmfXYChartTimeAdapter fDataProvider;
-
-    private AxisRange fFixedYRange = null;
-
-    private IStatusLineManager fStatusLineManager;
-    // ------------------------------------------------------------------------
-    // Constructors
-    // ------------------------------------------------------------------------
-
-    /**
-     * Constructs a TmfXYChartViewer.
-     *
-     * @param parent
-     *            The parent composite
-     * @param title
-     *            The title of the viewer
-     * @param xLabel
-     *            The label of the xAxis
-     * @param yLabel
-     *            The label of the yAXIS
-     */
-    public TmfXYChartViewer(Composite parent, String title, String xLabel, String yLabel) {
-        fCommonComposite = new Composite(parent, parent.getStyle()) {
-            @Override
-            public void redraw() {
-                fSwtChart.redraw();
-                fTimeScaleCtrl.redraw();
-            }
-        };
-        fCommonComposite.addDisposeListener(e -> {
-            fColorScheme.dispose();
-        });
-        fCommonComposite.setLayout(GridLayoutFactory.fillDefaults().spacing(0, 0).margins(0, 0).create());
-        fCommonComposite.setLayoutData(GridDataFactory.fillDefaults().grab(true, true).create());
-        fSwtChart = new Chart(fCommonComposite, SWT.NONE) {
-            @Override
-            public void addFocusListener(FocusListener listener) {
-                fSwtChart.getPlotArea().addFocusListener(listener);
-            }
-            @Override
-            public void removeFocusListener(FocusListener listener) {
-                fSwtChart.getPlotArea().removeFocusListener(listener);
-            }
-            @Override
-            public boolean setFocus() {
-                return fSwtChart.getPlotArea().setFocus();
-            }
-            @Override
-            public boolean forceFocus() {
-                return fSwtChart.getPlotArea().forceFocus();
-            }
-        };
-        fSwtChart.getAxisSet().getXAxis(0).getGrid().setStyle(LineStyle.NONE);
-        ((IPlotArea) fSwtChart.getPlotArea()).addCustomPaintListener(new ICustomPaintListener() {
-
-            @Override
-            public void paintControl(PaintEvent e) {
-                drawGridLines(e.gc);
-            }
-
-            @Override
-            public boolean drawBehindSeries() {
-                return true;
-            }
-        });
-
-        fSwtChart.addPaintListener(e -> {
-            Rectangle bounds = fSwtChart.getPlotArea().getBounds();
-            int y = fTimeScaleCtrl.getLocation().y;
-            fTimeScaleCtrl.setBounds(bounds.x, y, bounds.width, DEFAULT_SCALE_HEIGHT);
-            fTimeScaleCtrl.redraw();
-        });
-
-        fTimeScaleCtrl = new TimeGraphScale(fCommonComposite, fColorScheme, SWT.BOTTOM);
-        Color backgroundColor = fColorScheme.getColor(TimeGraphColorScheme.TOOL_BACKGROUND);
-        fSwtChart.setBackground(backgroundColor);
-        fCommonComposite.setBackground(backgroundColor);
-        backgroundColor = fColorScheme.getColor(TimeGraphColorScheme.BACKGROUND);
-        fSwtChart.setBackgroundInPlotArea(backgroundColor);
-        fSwtChart.setForeground(fColorScheme.getColor(TimeGraphColorScheme.TOOL_FOREGROUND));
-        fTimeScaleCtrl.setLayoutData(new GridData(SWT.FILL, SWT.DEFAULT, true, false));
-        fTimeScaleCtrl.setHeight(DEFAULT_SCALE_HEIGHT);
-        fSwtChart.getPlotArea().addMouseListener(new MouseAdapter() {
-            @Override
-            public void mouseDown(MouseEvent e) {
-                fSwtChart.getPlotArea().setFocus();
-            }
-        });
-
-        IAxis xAxis = fSwtChart.getAxisSet().getXAxis(0);
-        IAxis yAxis = fSwtChart.getAxisSet().getYAxis(0);
-
-        /* Set the title/labels, or hide them if they are not provided */
-        initTitle(title, fSwtChart.getTitle());
-
-        initTitle(null, fSwtChart.getTitle());
-
-        xAxis.getTick().setVisible(false);
-        yAxis.getTick().setForeground(fColorScheme.getColor(TimeGraphColorScheme.TOOL_FOREGROUND));
-        initTitle(yLabel, yAxis.getTitle());
-
-        fMouseSelectionProvider = new TmfMouseSelectionProvider(this);
-        fMouseDragZoomProvider = new TmfMouseDragZoomProvider(this);
-        fMouseWheelZoomProvider = new TmfMouseWheelZoomProvider(this);
-        fToolTipProvider = new TmfSimpleTooltipProvider(this);
-        fMouseDragProvider = new TmfMouseDragProvider(this);
-
-        fSwtChart.addDisposeListener((e) -> {
-            internalDispose();
-        });
-
-        fDataProvider = new TmfXYChartTimeAdapter(this);
-        fTimeScaleCtrl.setTimeProvider(fDataProvider);
-        updateTimeFormat();
-    }
-
-    private void initTitle(String label, ITitle titleCtrl) {
-        titleCtrl.setForeground(fColorScheme.getColor(TimeGraphColorScheme.TOOL_FOREGROUND));
-        if (label == null) {
-            titleCtrl.setVisible(false);
-        } else {
-            titleCtrl.setText(label);
-        }
-    }
-
-    // ------------------------------------------------------------------------
-    // Getter/Setters
-    // ------------------------------------------------------------------------
-
-    /**
-     * Sets the SWT Chart reference
-     *
-     * @param chart
-     *            The SWT chart to set.
-     */
-    protected void setSwtChart(Chart chart) {
-        fSwtChart = chart;
-    }
-
-    /**
-     * Gets the SWT Chart reference
-     *
-     * @return the SWT chart to set.
-     * @since 3.2
-     */
-    public Chart getSwtChart() {
-        return fSwtChart;
-    }
-
-    /**
-     * Switches visibility of the time axis on and off.
-     *
-     * @param visible
-     *            {@code true} to make the time axis visible.
-     *            {@code false} to make it invisible
-     * @since 6.0
-     */
-    public void setTimeAxisVisible(boolean visible) {
-        GridData gridData = (GridData) fTimeScaleCtrl.getLayoutData();
-        gridData.exclude = !visible;
-        fTimeScaleCtrl.setVisible(visible);
-        fCommonComposite.requestLayout();
-    }
-
-    /**
-     * Sets a mouse selection provider. An existing provider will be disposed. Use
-     * <code>null</code> to disable the mouse selection provider.
-     *
-     * @param provider
-     *            The selection provider to set
-     */
-    public void setSelectionProvider(TmfBaseProvider provider) {
-        if (fMouseSelectionProvider != null) {
-            fMouseSelectionProvider.dispose();
-        }
-        fMouseSelectionProvider = provider;
-    }
-
-    /**
-     * Sets a mouse drag zoom provider. An existing provider will be disposed. Use
-     * <code>null</code> to disable the mouse drag zoom provider.
-     *
-     * @param provider
-     *            The mouse drag zoom provider to set
-     */
-    public void setMouseDragZoomProvider(TmfBaseProvider provider) {
-        if (fMouseDragZoomProvider != null) {
-            fMouseDragZoomProvider.dispose();
-        }
-        fMouseDragZoomProvider = provider;
-    }
-
-    /**
-     * Sets a mouse wheel zoom provider. An existing provider will be disposed. Use
-     * <code>null</code> to disable the mouse wheel zoom provider.
-     *
-     * @param provider
-     *            The mouse wheel zoom provider to set
-     */
-    public void setMouseWheelZoomProvider(TmfBaseProvider provider) {
-        if (fMouseWheelZoomProvider != null) {
-            fMouseWheelZoomProvider.dispose();
-        }
-        fMouseWheelZoomProvider = provider;
-    }
-
-    /**
-     * Sets a tooltip provider. An existing provider will be disposed. Use
-     * <code>null</code> to disable the tooltip provider.
-     *
-     * @param provider
-     *            The tooltip provider to set
-     */
-    public void setTooltipProvider(TmfBaseProvider provider) {
-        if (fToolTipProvider != null) {
-            fToolTipProvider.dispose();
-        }
-        fToolTipProvider = provider;
-    }
-
-    /**
-     * Sets a mouse drag provider. An existing provider will be disposed. Use
-     * <code>null</code> to disable the mouse drag provider.
-     *
-     * @param provider
-     *            The mouse drag provider to set
-     */
-    public void setMouseDrageProvider(TmfBaseProvider provider) {
-        if (fMouseDragProvider != null) {
-            fMouseDragProvider.dispose();
-        }
-        fMouseDragProvider = provider;
-    }
-
-    // ------------------------------------------------------------------------
-    // ITmfChartTimeProvider
-    // ------------------------------------------------------------------------
-
-    @Override
-    public long getTimeOffset() {
-        return getWindowStartTime() - 1;
-    }
-
-    // ------------------------------------------------------------------------
-    // ITmfViewer interface
-    // ------------------------------------------------------------------------
-    @Override
-    public Control getControl() {
-        return fSwtChart;
-    }
-
-    @Override
-    public void refresh() {
-        fSwtChart.redraw();
-    }
-
-    // ------------------------------------------------------------------------
-    // TmfComponent
-    // ------------------------------------------------------------------------
-
-    @Override
-    public void dispose() {
-        if (!fSwtChart.isDisposed()) {
-            fSwtChart.dispose();
-        }
-    }
-
-    private void internalDispose() {
-        super.dispose();
-
-        if (fMouseSelectionProvider != null) {
-            fMouseSelectionProvider.dispose();
-        }
-
-        if (fMouseDragZoomProvider != null) {
-            fMouseDragZoomProvider.dispose();
-        }
-
-        if (fMouseWheelZoomProvider != null) {
-            fMouseWheelZoomProvider.dispose();
-        }
-
-        if (fToolTipProvider != null) {
-            fToolTipProvider.dispose();
-        }
-
-        if (fMouseDragProvider != null) {
-            fMouseDragProvider.dispose();
-        }
-    }
-
-    // ------------------------------------------------------------------------
-    // Operations
-    // ------------------------------------------------------------------------
-    /**
-     * A Method to load a trace into the viewer.
-     *
-     * @param trace
-     *            A trace to apply in the viewer
-     */
-    @Override
-    public void loadTrace(ITmfTrace trace) {
-        super.loadTrace(trace);
-        clearContent();
-        updateContent();
-    }
-
-    /**
-     * Resets the content of the viewer
-     */
-    @Override
-    public void reset() {
-        super.reset();
-        setStartTime(0);
-        setEndTime(0);
-        clearContent();
-    }
-
-    /**
-     * Method to implement to update the chart content.
-     */
-    protected abstract void updateContent();
-
-    /**
-     * Returns whether or not this chart viewer is dirty. The viewer is considered
-     * dirty if it has yet to completely update its model.
-     *
-     * This method is meant to be used by tests in order to know when it is safe to
-     * proceed.
-     *
-     * @return true if the time graph view has yet to completely update its model,
-     *         false otherwise
-     * @since 2.2
-     */
-    @VisibleForTesting
-    public boolean isDirty() {
-        if (getTrace() == null) {
-            return false;
-        }
-
-        TmfTraceContext ctx = TmfTraceManager.getInstance().getCurrentTraceContext();
-        long startTime = ctx.getWindowRange().getStartTime().toNanos();
-        long endTime = ctx.getWindowRange().getEndTime().toNanos();
-
-        // If the chart viewer hasn't updated all the way to the end of
-        // the window range then it's dirty. A refresh should happen later.
-        return (getWindowStartTime() != startTime || getWindowEndTime() != endTime);
-    }
-
-    /**
-     * Draw the grid lines
-     *
-     * @param bounds
-     *            The bounds of the control
-     * @param gc
-     *            Graphics context
-     * @since 2.0
-     */
-    private void drawGridLines(GC gc) {
-        Rectangle bounds = fSwtChart.getPlotArea().getBounds();
-        Color foreground = fSwtChart.getAxisSet().getXAxis(0).getGrid().getForeground();
-        gc.setForeground(foreground);
-        gc.setAlpha(foreground.getAlpha());
-        gc.setLineStyle(SWT.LINE_DOT);
-        for (int x : fTimeScaleCtrl.getTickList()) {
-            gc.drawLine(x, 0, x,  bounds.height);
-        }
-        gc.setAlpha(255);
-    }
-
-    /**
-     * Sets the time format, or null to use the Time Format 'Date and Time
-     * format' preference (default).
-     *
-     * @param timeFormat
-     *            the {@link TimeFormat} used to display timestamps
-     * @since 5.0
-     */
-    protected void setTimeFormat(TimeFormat timeFormat) {
-        fTimeFormat = timeFormat;
-        if (fSwtChart != null) {
-            updateTimeFormat();
-            fSwtChart.getAxisSet().adjustRange();
-            fSwtChart.redraw();
-        }
-    }
-
-    // ------------------------------------------------------------------------
-    // Signal Handler
-    // ------------------------------------------------------------------------
-
-    /**
-     * Signal handler for handling of the time synch signal.
-     *
-     * @param signal
-     *            The time synch signal {@link TmfSelectionRangeUpdatedSignal}
-     */
-    @Override
-    @TmfSignalHandler
-    public void selectionRangeUpdated(TmfSelectionRangeUpdatedSignal signal) {
-        super.selectionRangeUpdated(signal);
-        if (signal != null && (signal.getSource() != this) && (getTrace() != null)) {
-            if (fMouseSelectionProvider != null) {
-                fMouseSelectionProvider.refresh();
-            }
-        }
-    }
-
-    /**
-     * Signal handler for handling of the window range signal.
-     *
-     * @param signal
-     *            The {@link TmfWindowRangeUpdatedSignal}
-     */
-    @Override
-    @TmfSignalHandler
-    public void windowRangeUpdated(TmfWindowRangeUpdatedSignal signal) {
-        super.windowRangeUpdated(signal);
-        updateContent();
-    }
-
-    /**
-     * Signal handler for handling the signal that notifies about an updated
-     * timestamp format.
-     *
-     * @param signal
-     *            The trace updated signal {@link TmfTimestampFormatUpdateSignal}
-     */
-    @TmfSignalHandler
-    public void timestampFormatUpdated(TmfTimestampFormatUpdateSignal signal) {
-        updateTimeFormat();
-        fSwtChart.getAxisSet().adjustRange();
-        fSwtChart.redraw();
-    }
-
-    /**
-     * Sets new fixed range for the Y axis.
-     *
-     * @param yRange
-     *            new fixed range for the Y axis or {@code null} to
-     *            make float again. If not {@code null} then
-     *            {@link IAxis#adjustRange} is not called for the Y
-     *            axis on updates.
-     * @since 5.2
-     */
-    public void setFixedYRange(@Nullable AxisRange yRange) {
-        fFixedYRange = yRange;
-        updateContent();
-    }
-
-    /**
-     * Gets current fixed range for the Y axis.
-     *
-     * @return Current fixed range or {@code null} if the range is not fixed.
-     * @since 5.2
-     */
-    public @Nullable AxisRange getFixedYRange() {
-        return fFixedYRange;
-    }
-
-    // ------------------------------------------------------------------------
-    // IAdaptable Interface
-    // ------------------------------------------------------------------------
-    /**
-     * @since 5.0
-     */
-    @SuppressWarnings("unchecked")
-    @Override
-    public <T> T getAdapter(Class<T> adapter) {
-        if (adapter == ITmfTimeNavigationProvider.class) {
-            return (T) getTimeNavigator();
-        }
-        if (adapter == ITmfTimeZoomProvider.class) {
-            return (T) getTimeZoomProvider();
-        }
-        if (adapter == ITmfZoomToSelectionProvider.class ) {
-            return (T) getZoomToSelectionProvider();
-        }
-        return null;
-    }
-
-    // ------------------------------------------------------------------------
-    // Helper Methods
-    // ------------------------------------------------------------------------
-
-    /**
-     * Clears the view content.
-     */
-    protected void clearContent() {
-        if (!fSwtChart.isDisposed()) {
-            ISeriesSet set = fSwtChart.getSeriesSet();
-            ISeries[] series = set.getSeries();
-            for (int i = 0; i < series.length; i++) {
-                set.deleteSeries(series[i].getId());
-            }
-            for (IAxis axis : fSwtChart.getAxisSet().getAxes()) {
-                axis.setRange(new Range(0, 1));
-            }
-            fSwtChart.redraw();
-        }
-    }
-
-    /**
-     * Returns the current or default display.
-     *
-     * @return the current or default display
-     */
-    protected static Display getDisplay() {
-        Display display = Display.getCurrent();
-        // may be null if outside the UI thread
-        if (display == null) {
-            display = Display.getDefault();
-        }
-        return display;
-    }
-
-    /**
-     * Get the offset of the point area, relative to the XY chart viewer control. We
-     * consider the point area to be from where the first point could be drawn to
-     * where the last point could be drawn.
-     *
-     * @return the offset in pixels
-     *
-     * @since 1.0
-     */
-    public int getPointAreaOffset() {
-
-        int pixelCoordinate = 0;
-        IAxis[] xAxes = getSwtChart().getAxisSet().getXAxes();
-        if (xAxes.length > 0) {
-            IAxis axis = xAxes[0];
-            pixelCoordinate = axis.getPixelCoordinate(axis.getRange().lower);
-        }
-        return getSwtChart().toControl(getSwtChart().getPlotArea().toDisplay(pixelCoordinate, 0)).x;
-    }
-
-    /**
-     * Get the width of the point area. We consider the point area to be from where
-     * the first point could be drawn to where the last point could be drawn. The
-     * point area differs from the plot area because there might be a gap between
-     * where the plot area start and where the fist point is drawn. This also
-     * matches the width that the use can select.
-     *
-     * @return the width in pixels
-     *
-     * @since 1.0
-     */
-    public int getPointAreaWidth() {
-        IAxis[] xAxes = getSwtChart().getAxisSet().getXAxes();
-        if (xAxes.length > 0) {
-            IAxis axis = xAxes[0];
-            int x1 = getPointAreaOffset();
-            int x2 = axis.getPixelCoordinate(axis.getRange().upper);
-            x2 = getSwtChart().toControl(getSwtChart().getPlotArea().toDisplay(x2, 0)).x;
-            int width = x2 - x1;
-            return width;
-        }
-
-        return getSwtChart().getPlotArea().getSize().x;
-    }
-
-    /**
-     * Sets whether or not to send time alignment signals. This should be set to
-     * true for viewers that are part of an aligned view.
-     *
-     * @param sendTimeAlignSignals
-     *            whether or not to send time alignment signals
-     * @since 1.0
-     */
-    public void setSendTimeAlignSignals(boolean sendTimeAlignSignals) {
-        fSendTimeAlignSignals = sendTimeAlignSignals;
-    }
-
-    /**
-     * Returns whether or not to send time alignment signals.
-     *
-     * @return whether or not to send time alignment signals.
-     * @since 1.0
-     */
-    public boolean isSendTimeAlignSignals() {
-        return fSendTimeAlignSignals;
-    }
-
-    @Override
-    public void saveImage(String filename, int format) {
-        getSwtChart().save(filename, format);
-    }
-
-    /**
-     * Set the status bar manager
-     *
-     * @param statusLineManager
-     *            Status bar manager
-     * @since 3.3
-     */
-    public void setStatusLineManager(IStatusLineManager statusLineManager) {
-        if (fStatusLineManager != null && statusLineManager == null) {
-            fStatusLineManager.setMessage(null);
-        }
-        fStatusLineManager = statusLineManager;
-    }
-
-    /**
-     * Update the status line to include time selection
-     *
-     * @param startTime
-     *            Selection start time
-     * @param endTime
-     *            Selection end time
-     * @param cursorTime
-     *            Cursor time
-     * @since 3.3
-     */
-    public void updateStatusLine(long startTime, long endTime, long cursorTime) {
-        TimeFormat timeFormat = fTimeScaleCtrl.getTimeProvider().getTimeFormat().convert();
-        boolean isCalendar = timeFormat == TimeFormat.CALENDAR;
-
-        StringBuilder message = new StringBuilder();
-        String spaces = "     "; //$NON-NLS-1$
-        if (cursorTime >= 0) {
-            message.append("T: "); //$NON-NLS-1$
-            if (isCalendar) {
-                message.append(FormatTimeUtils.formatDate(cursorTime + getTimeOffset()) + ' ');
-            }
-            message.append(FormatTimeUtils.formatTime(cursorTime + getTimeOffset(), timeFormat, Resolution.NANOSEC));
-            message.append(spaces);
-        }
-
-        if (startTime == endTime) {
-            message.append("T1: "); //$NON-NLS-1$
-            if (isCalendar) {
-                message.append(FormatTimeUtils.formatDate(startTime + getTimeOffset()) + ' ');
-            }
-            message.append(FormatTimeUtils.formatTime(startTime + getTimeOffset(), timeFormat, Resolution.NANOSEC));
-        } else {
-            message.append("T1: "); //$NON-NLS-1$
-            if (isCalendar) {
-                message.append(FormatTimeUtils.formatDate(startTime + getTimeOffset()) + ' ');
-            }
-            message.append(FormatTimeUtils.formatTime(startTime + getTimeOffset(), timeFormat, Resolution.NANOSEC));
-            message.append(spaces);
-            message.append("T2: "); //$NON-NLS-1$
-            if (isCalendar) {
-                message.append(FormatTimeUtils.formatDate(endTime + getTimeOffset()) + ' ');
-            }
-            message.append(FormatTimeUtils.formatTime(endTime + getTimeOffset(), timeFormat, Resolution.NANOSEC));
-            message.append(spaces);
-            message.append("\u0394: " + FormatTimeUtils.formatDelta(endTime - startTime, timeFormat, Resolution.NANOSEC)); //$NON-NLS-1$
-        }
-
-        fStatusLineManager.setMessage(message.toString());
-    }
-
-    private ITmfTimeZoomProvider getTimeZoomProvider() {
-        return (zoomIn, useMousePosition) -> {
-            Chart chart = getSwtChart();
-            if (chart == null) {
-                return;
-            }
-            Point cursorDisplayLocation = getDisplay().getCursorLocation();
-            Point cursorControlLocation = getSwtChart().getPlotArea().toControl(cursorDisplayLocation);
-            Point cursorParentLocation = getSwtChart().getPlotArea().getParent().toControl(cursorDisplayLocation);
-            Rectangle controlBounds = getSwtChart().getPlotArea().getBounds();
-            // check the X axis only
-            if (!controlBounds.contains(cursorParentLocation.x, controlBounds.y)) {
-                return;
-            }
-            if (useMousePosition) {
-                TmfXyUiUtils.zoom(this, chart, zoomIn, cursorControlLocation.x);
-            } else {
-                TmfXyUiUtils.zoom(this, chart, zoomIn);
-            }
-        };
-    }
-
-    private ITmfTimeNavigationProvider getTimeNavigator() {
-        return left -> {
-            Chart chart = getSwtChart();
-            if (chart != null) {
-                TmfXyUiUtils.horizontalScroll(this, chart, left);
-            }
-        };
-    }
-
-    private ITmfZoomToSelectionProvider getZoomToSelectionProvider() {
-        return () -> {
-            long selBegin = getSelectionBeginTime();
-            long selEnd = getSelectionEndTime();
-            if (selBegin != selEnd) {
-                updateWindow(selBegin, selEnd);
-            }
-        };
-    }
-
-    private void updateTimeFormat() {
-        if (fTimeFormat == null) {
-            String datime = TmfTimePreferences.getPreferenceMap().get(ITmfTimePreferencesConstants.DATIME);
-            if (ITmfTimePreferencesConstants.TIME_ELAPSED_FMT.equals(datime)) {
-                fDataProvider.setTimeFormat(TimeFormat.RELATIVE);
-            } else {
-                fDataProvider.setTimeFormat(TimeFormat.CALENDAR);
-            }
-        } else {
-            fDataProvider.setTimeFormat(fTimeFormat);
-        }
-    }
-}
diff --git a/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/viewers/xycharts/XYChartLegendImageProvider.java b/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/viewers/xycharts/XYChartLegendImageProvider.java
deleted file mode 100644
index ea39f20..0000000
--- a/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/viewers/xycharts/XYChartLegendImageProvider.java
+++ /dev/null
@@ -1,173 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2017 Ericsson
- *
- * All rights reserved. This program and the accompanying materials are
- * made available under the terms of the Eclipse Public License 2.0 which
- * accompanies this distribution, and is available at
- * https://www.eclipse.org/legal/epl-2.0/
- *
- * SPDX-License-Identifier: EPL-2.0
- *******************************************************************************/
-
-package org.eclipse.tracecompass.tmf.ui.viewers.xycharts;
-
-import org.eclipse.jdt.annotation.NonNull;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.GC;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.ImageData;
-import org.eclipse.swt.graphics.PaletteData;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.tracecompass.internal.provisional.tmf.ui.viewers.xychart.BaseXYPresentationProvider;
-import org.eclipse.tracecompass.internal.tmf.ui.util.SymbolHelper;
-import org.eclipse.tracecompass.tmf.core.model.OutputElementStyle;
-import org.eclipse.tracecompass.tmf.core.model.StyleProperties;
-import org.eclipse.tracecompass.tmf.core.presentation.IYAppearance;
-import org.eclipse.tracecompass.tmf.core.presentation.RGBAColor;
-import org.eclipse.tracecompass.tmf.ui.viewers.ILegendImageProvider;
-import org.eclipse.tracecompass.tmf.ui.viewers.xycharts.linecharts.TmfCommonXAxisChartViewer;
-import org.swtchart.LineStyle;
-
-/**
- * Provides a legend image from an XY chart viewer. With a name, desired height
- * and width, an image is created.
- *
- * @author Yonni Chen
- * @since 3.2
- * @deprecated use {@link org.eclipse.tracecompass.tmf.ui.viewers.xychart.XYChartLegendImageProvider}
- */
-@Deprecated
-public class XYChartLegendImageProvider implements ILegendImageProvider {
-
-    private static final @NonNull RGBAColor DEFAULT_COLOR = new RGBAColor(255, 255, 255);
-    private static final int DEFAULT_SYMBOL_SIZE = 4;
-
-    private final TmfCommonXAxisChartViewer fChartViewer;
-
-    /**
-     * Constructor
-     *
-     * @param chartViewer
-     *            XY Chart with which we create a legend image
-     */
-    public XYChartLegendImageProvider(TmfCommonXAxisChartViewer chartViewer) {
-        fChartViewer = chartViewer;
-    }
-
-    @Override
-    public Image getLegendImage(int imageHeight, int imageWidth, @NonNull Long id) {
-        /*
-         * If series exists in chart, then image legend match that series. Image will
-         * make sense if series exists in chart. If it does not exists, an image will
-         * still be created.
-         */
-        OutputElementStyle appearance = fChartViewer.getSeriesStyle(id);
-        BaseXYPresentationProvider presProvider = fChartViewer.getPresentationProvider2();
-        RGBAColor rgb = presProvider.getColorStyleOrDefault(appearance, StyleProperties.COLOR, DEFAULT_COLOR);
-
-
-        Color lineColor = new Color(Display.getDefault(), rgb.getRed(), rgb.getGreen(), rgb.getBlue());
-        Color background = Display.getDefault().getSystemColor(SWT.COLOR_WHITE);
-
-        PaletteData palette = new PaletteData(background.getRGB(), lineColor.getRGB());
-        ImageData imageData = new ImageData(imageWidth, imageHeight, 8, palette);
-        imageData.transparentPixel = 0;
-        Image image = new Image(Display.getDefault(), imageData);
-        GC gc = new GC(image);
-
-        gc.setBackground(background);
-        gc.fillRectangle(0, 0, imageWidth, imageHeight);
-        drawStyleLine(gc, lineColor, imageWidth, imageHeight, appearance);
-
-        drawStyledDot(gc, lineColor, imageWidth, imageHeight, appearance);
-
-        gc.dispose();
-        lineColor.dispose();
-        return image;
-    }
-
-    @Deprecated
-    @Override
-    public Image getLegendImage(int imageHeight, int imageWidth, @NonNull String name) {
-        /*
-         * If series exists in chart, then image legend match that series. Image will
-         * make sense if series exists in chart. If it does not exists, an image will
-         * still be created.
-         */
-        IYAppearance appearance = fChartViewer.getSeriesAppearance(name);
-        RGBAColor rgb = appearance.getColor();
-        Color lineColor = new Color(Display.getDefault(), rgb.getRed(), rgb.getGreen(), rgb.getBlue());
-        Color background = Display.getDefault().getSystemColor(SWT.COLOR_WHITE);
-
-        PaletteData palette = new PaletteData(background.getRGB(), lineColor.getRGB());
-        ImageData imageData = new ImageData(imageWidth, imageHeight, 8, palette);
-        imageData.transparentPixel = 0;
-        Image image = new Image(Display.getDefault(), imageData);
-        GC gc = new GC(image);
-
-        gc.setBackground(background);
-        gc.fillRectangle(0, 0, imageWidth, imageHeight);
-        drawStyleLine(gc, lineColor, imageWidth, imageHeight, appearance.toOutputElementStyle());
-
-        drawStyledDot(gc, lineColor, imageWidth, imageHeight, appearance.toOutputElementStyle());
-
-        gc.dispose();
-        lineColor.dispose();
-        return image;
-    }
-
-    private void drawStyleLine(GC gc, Color lineColor, int imageWidth, int imageHeight, @NonNull OutputElementStyle appearance) {
-        Color prev = gc.getForeground();
-        BaseXYPresentationProvider presProvider = fChartViewer.getPresentationProvider2();
-        LineStyle lineStyle = LineStyle.valueOf((String) presProvider.getStyleOrDefault(appearance, StyleProperties.SERIES_STYLE, StyleProperties.SeriesStyle.SOLID));
-        if (lineStyle != LineStyle.NONE) {
-            gc.setForeground(lineColor);
-            gc.setLineWidth(((Number) presProvider.getFloatStyleOrDefault(appearance, StyleProperties.WIDTH, 1.0f)).intValue());
-            gc.setLineStyle(lineStyle.ordinal());
-            gc.drawLine(0, imageHeight / 2, imageWidth, imageHeight / 2);
-            gc.setForeground(prev);
-        }
-    }
-
-    private void drawStyledDot(GC gc, Color lineColor, int imageWidth, int imageHeight, @NonNull OutputElementStyle appearance) {
-        BaseXYPresentationProvider presProvider = fChartViewer.getPresentationProvider2();
-        String symbolStyle = (String) presProvider.getStyleOrDefault(appearance, StyleProperties.SYMBOL_TYPE, StyleProperties.SymbolType.NONE);
-        int symbolSize = Math.round(presProvider.getFloatStyleOrDefault(appearance, StyleProperties.HEIGHT, 1.0f).floatValue() * DEFAULT_SYMBOL_SIZE);
-        int centerX = imageWidth / 2;
-        int centerY = imageHeight / 2;
-        Color prevBg = gc.getBackground();
-        Color prevFg = gc.getForeground();
-        switch(symbolStyle) {
-        case StyleProperties.SymbolType.CIRCLE:
-            SymbolHelper.drawCircle(gc, lineColor, symbolSize, centerX, centerY);
-            break;
-        case StyleProperties.SymbolType.DIAMOND:
-            SymbolHelper.drawDiamond(gc, lineColor, symbolSize, centerX, centerY);
-            break;
-        case StyleProperties.SymbolType.SQUARE:
-            SymbolHelper.drawSquare(gc, lineColor, symbolSize, centerX, centerY);
-            break;
-        case StyleProperties.SymbolType.CROSS:
-            SymbolHelper.drawCross(gc, lineColor, symbolSize, centerX, centerY);
-            break;
-        case StyleProperties.SymbolType.PLUS:
-            SymbolHelper.drawPlus(gc, lineColor, symbolSize, centerX, centerY);
-            break;
-
-        case StyleProperties.SymbolType.INVERTED_TRIANGLE:
-            SymbolHelper.drawInvertedTriangle(gc, lineColor, symbolSize, centerX, centerY);
-            break;
-        case StyleProperties.SymbolType.TRIANGLE:
-            SymbolHelper.drawTriangle(gc, lineColor, symbolSize, centerX, centerY);
-            break;
-
-        default:
-            // Default is nothing
-            break;
-        }
-        gc.setForeground(prevFg);
-        gc.setBackground(prevBg);
-    }
-
-}
diff --git a/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/viewers/xycharts/barcharts/TmfHistogramTooltipProvider.java b/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/viewers/xycharts/barcharts/TmfHistogramTooltipProvider.java
deleted file mode 100644
index 8b1ebc0..0000000
--- a/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/viewers/xycharts/barcharts/TmfHistogramTooltipProvider.java
+++ /dev/null
@@ -1,183 +0,0 @@
-/**********************************************************************
- * Copyright (c) 2013, 2014 Ericsson
- *
- * All rights reserved. This program and the accompanying materials are
- * made available under the terms of the Eclipse Public License 2.0 which
- * accompanies this distribution, and is available at
- * https://www.eclipse.org/legal/epl-2.0/
- *
- * SPDX-License-Identifier: EPL-2.0
- *
- * Contributors:
- *   Bernd Hufmann - Initial API and implementation
- **********************************************************************/
-package org.eclipse.tracecompass.tmf.ui.viewers.xycharts.barcharts;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.MouseEvent;
-import org.eclipse.swt.events.MouseMoveListener;
-import org.eclipse.swt.events.MouseTrackListener;
-import org.eclipse.swt.events.PaintEvent;
-import org.eclipse.swt.events.PaintListener;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.tracecompass.tmf.core.timestamp.TmfTimestamp;
-import org.eclipse.tracecompass.tmf.ui.viewers.xycharts.ITmfChartTimeProvider;
-import org.eclipse.tracecompass.tmf.ui.viewers.xycharts.TmfBaseProvider;
-import org.swtchart.IAxis;
-import org.swtchart.ISeries;
-
-/**
- * Tool tip provider for TMF bar chart viewer. It displays the y value of
- * position x as well as it highlights the bar of the x position.
- * It only considers the first series of the chart.
- *
- * @author Bernd Hufmann
- * @deprecated use {@link org.eclipse.tracecompass.tmf.ui.viewers.xychart.barchart.TmfHistogramTooltipProvider}
- */
-@Deprecated
-public class TmfHistogramTooltipProvider extends TmfBaseProvider implements MouseTrackListener, MouseMoveListener, PaintListener {
-
-    // ------------------------------------------------------------------------
-    // Attributes
-    // ------------------------------------------------------------------------
-    /** X coordinate for highlighting */
-    private int fHighlightX;
-    /** y coordinate for highlighting */
-    private int fHighlightY;
-    /** Flag to do highlighting or not */
-    private boolean fIsHighlight;
-
-    // ------------------------------------------------------------------------
-    // Constructors
-    // ------------------------------------------------------------------------
-    /**
-     * Constructor for a tool tip provider.
-     *
-     * @param tmfChartViewer
-     *                  - the parent chart viewer
-     */
-    public TmfHistogramTooltipProvider(ITmfChartTimeProvider tmfChartViewer) {
-        super(tmfChartViewer);
-        register();
-    }
-
-    // ------------------------------------------------------------------------
-    // TmfBaseProvider
-    // ------------------------------------------------------------------------
-    @Override
-    public void register() {
-        getChart().getPlotArea().addMouseTrackListener(this);
-        getChart().getPlotArea().addMouseMoveListener(this);
-        getChart().getPlotArea().addPaintListener(this);
-    }
-
-    @Override
-    public void deregister() {
-        if ((getChartViewer().getControl() != null) && !getChartViewer().getControl().isDisposed()) {
-            getChart().getPlotArea().removeMouseTrackListener(this);
-            getChart().getPlotArea().removeMouseMoveListener(this);
-            getChart().getPlotArea().removePaintListener(this);
-        }
-    }
-
-    @Override
-    public void refresh() {
-        // nothing to do
-    }
-
-    // ------------------------------------------------------------------------
-    // MouseTrackListener
-    // ------------------------------------------------------------------------
-    @Override
-    public void mouseEnter(MouseEvent e) {
-        // Do nothing
-    }
-
-    @Override
-    public void mouseExit(MouseEvent e) {
-        // Do nothing
-    }
-
-    @Override
-    public void mouseHover(MouseEvent e) {
-        if (getChartViewer().getWindowDuration() != 0) {
-            IAxis xAxis = getChart().getAxisSet().getXAxis(0);
-            IAxis yAxis = getChart().getAxisSet().getYAxis(0);
-
-            double xCoordinate = xAxis.getDataCoordinate(e.x);
-
-            ISeries[] series = getChart().getSeriesSet().getSeries();
-
-            if ((xCoordinate < 0) || (series.length == 0)) {
-                return;
-            }
-
-            double y = 0.0;
-            double rangeStart = 0.0;
-            double rangeEnd = 0.0;
-
-            // Consider first series only
-            double[] xS = series[0].getXSeries();
-            double[] yS = series[0].getYSeries();
-
-            if ((xS == null) || (yS == null)) {
-                return;
-            }
-
-            for (int i = 0; i < xS.length - 1; i++) {
-                int pixel = xAxis.getPixelCoordinate(xS[i]);
-                if (pixel <= e.x) {
-                    rangeStart = xS[i];
-                    rangeEnd = (long) xS[i + 1];
-                    if (xCoordinate >= rangeStart) {
-                        y = yS[i + 1];
-                    } else {
-                        y = yS[i];
-                    }
-                }
-            }
-
-            ITmfChartTimeProvider viewer = getChartViewer();
-
-            /* set tooltip of closest data point */
-            StringBuffer buffer = new StringBuffer();
-            buffer.append("Range=["); //$NON-NLS-1$
-            buffer.append(TmfTimestamp.fromNanos((long) rangeStart + viewer.getTimeOffset()).toString());
-            buffer.append(',');
-            buffer.append(TmfTimestamp.fromNanos((long) rangeEnd + viewer.getTimeOffset()).toString());
-            buffer.append("]\n"); //$NON-NLS-1$
-            buffer.append("y="); //$NON-NLS-1$
-            buffer.append((long) y);
-            getChart().getPlotArea().setToolTipText(buffer.toString());
-
-            fHighlightX = e.x;
-            fHighlightY = yAxis.getPixelCoordinate(y);
-            fIsHighlight = true;
-            getChart().redraw();
-        }
-    }
-
-    // ------------------------------------------------------------------------
-    // MouseMoveListener
-    // ------------------------------------------------------------------------
-    @Override
-    public void mouseMove(MouseEvent e) {
-        fIsHighlight = false;
-        getChart().redraw();
-    }
-
-    // ------------------------------------------------------------------------
-    // PaintListener
-    // ------------------------------------------------------------------------
-    @Override
-    public void paintControl(PaintEvent e) {
-        if (fIsHighlight) {
-            e.gc.setBackground(Display.getDefault().getSystemColor(
-                    SWT.COLOR_RED));
-            e.gc.setAlpha(128);
-
-            e.gc.fillOval(fHighlightX - 5, fHighlightY - 5, 10, 10);
-        }
-    }
-
-}
\ No newline at end of file
diff --git a/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/viewers/xycharts/linecharts/TmfCommonXAxisChartViewer.java b/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/viewers/xycharts/linecharts/TmfCommonXAxisChartViewer.java
deleted file mode 100644
index ca10f76..0000000
--- a/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/viewers/xycharts/linecharts/TmfCommonXAxisChartViewer.java
+++ /dev/null
@@ -1,717 +0,0 @@
-/**********************************************************************
- * Copyright (c) 2017, 2020 Ericsson, Draeger, Auriga
- *
- * All rights reserved. This program and the accompanying materials are
- * made available under the terms of the Eclipse Public License 2.0 which
- * accompanies this distribution, and is available at
- * https://www.eclipse.org/legal/epl-2.0/
- *
- * SPDX-License-Identifier: EPL-2.0
- **********************************************************************/
-
-package org.eclipse.tracecompass.tmf.ui.viewers.xycharts.linecharts;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.concurrent.atomic.AtomicInteger;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.jdt.annotation.NonNull;
-import org.eclipse.jdt.annotation.Nullable;
-import org.eclipse.jface.resource.ColorRegistry;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.graphics.RGBA;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.tracecompass.common.core.log.TraceCompassLog;
-import org.eclipse.tracecompass.common.core.log.TraceCompassLogUtils;
-import org.eclipse.tracecompass.common.core.log.TraceCompassLogUtils.FlowScopeLog;
-import org.eclipse.tracecompass.common.core.log.TraceCompassLogUtils.FlowScopeLogBuilder;
-import org.eclipse.tracecompass.internal.provisional.tmf.core.model.filters.TmfFilterAppliedSignal;
-import org.eclipse.tracecompass.internal.provisional.tmf.core.model.filters.TraceCompassFilter;
-import org.eclipse.tracecompass.internal.provisional.tmf.ui.viewers.xychart.BaseXYPresentationProvider;
-import org.eclipse.tracecompass.internal.tmf.core.model.filters.FetchParametersUtils;
-import org.eclipse.tracecompass.internal.tmf.ui.Activator;
-import org.eclipse.tracecompass.tmf.core.dataprovider.DataProviderParameterUtils;
-import org.eclipse.tracecompass.tmf.core.model.OutputElementStyle;
-import org.eclipse.tracecompass.tmf.core.model.StyleProperties;
-import org.eclipse.tracecompass.tmf.core.model.filters.TimeQueryFilter;
-import org.eclipse.tracecompass.tmf.core.model.timegraph.IFilterProperty;
-import org.eclipse.tracecompass.tmf.core.model.xy.ISeriesModel;
-import org.eclipse.tracecompass.tmf.core.model.xy.ITmfCommonXAxisModel;
-import org.eclipse.tracecompass.tmf.core.model.xy.ITmfXYDataProvider;
-import org.eclipse.tracecompass.tmf.core.model.xy.ITmfXyModel;
-import org.eclipse.tracecompass.tmf.core.presentation.IXYPresentationProvider;
-import org.eclipse.tracecompass.tmf.core.presentation.IYAppearance;
-import org.eclipse.tracecompass.tmf.core.presentation.RGBAColor;
-import org.eclipse.tracecompass.tmf.core.response.ITmfResponse;
-import org.eclipse.tracecompass.tmf.core.response.TmfModelResponse;
-import org.eclipse.tracecompass.tmf.core.signal.TmfSignalHandler;
-import org.eclipse.tracecompass.tmf.core.signal.TmfSignalManager;
-import org.eclipse.tracecompass.tmf.core.signal.TmfTraceClosedSignal;
-import org.eclipse.tracecompass.tmf.core.trace.ITmfTrace;
-import org.eclipse.tracecompass.tmf.ui.colors.RGBAUtil;
-import org.eclipse.tracecompass.tmf.ui.signal.TmfTimeViewAlignmentInfo;
-import org.eclipse.tracecompass.tmf.ui.signal.TmfTimeViewAlignmentSignal;
-import org.eclipse.tracecompass.tmf.ui.viewers.xycharts.AxisRange;
-import org.eclipse.tracecompass.tmf.ui.viewers.xycharts.TmfChartTimeStampFormat;
-import org.eclipse.tracecompass.tmf.ui.viewers.xycharts.TmfXYChartViewer;
-import org.swtchart.IAxisSet;
-import org.swtchart.IAxisTick;
-import org.swtchart.IBarSeries;
-import org.swtchart.ILineSeries;
-import org.swtchart.ISeries;
-import org.swtchart.ISeries.SeriesType;
-import org.swtchart.ISeriesSet;
-import org.swtchart.LineStyle;
-import org.swtchart.Range;
-
-import com.google.common.collect.HashMultimap;
-import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.ImmutableMap.Builder;
-import com.google.common.collect.Multimap;
-
-/**
- * XY Chart viewer class implementation. All series in this viewer use the same
- * X axis values. They are automatically created as values are provided for a
- * key. Series by default will be displayed as a line. Each series appearance
- * can be overridden when creating it.
- *
- * @author Yonni Chen
- * @since 3.2
- * @deprecated use {@link org.eclipse.tracecompass.tmf.ui.viewers.xychart.linechart.TmfCommonXAxisChartViewer}
- */
-@Deprecated
-public abstract class TmfCommonXAxisChartViewer extends TmfXYChartViewer {
-
-    private static final String DIRTY_UNDERFLOW_ERROR = "Dirty underflow error"; //$NON-NLS-1$
-    private static final @NonNull RGBAColor DEFAULT_COLOR = new RGBAColor(0, 0, 0);
-    private static final int DEFAULT_SYMBOL_SIZE = 4;
-
-    private static final Map<String, ILineSeries.PlotSymbolType> SYMBOL_MAP;
-    private static final ColorRegistry COLOR_REGISTRY = new ColorRegistry();
-
-    static {
-        ImmutableMap.Builder<String, ILineSeries.PlotSymbolType> builder = new Builder<>();
-        builder.put(StyleProperties.SymbolType.NONE, ILineSeries.PlotSymbolType.NONE);
-        builder.put(StyleProperties.SymbolType.CIRCLE, ILineSeries.PlotSymbolType.CIRCLE);
-        builder.put(StyleProperties.SymbolType.CROSS, ILineSeries.PlotSymbolType.CROSS);
-        builder.put(StyleProperties.SymbolType.DIAMOND, ILineSeries.PlotSymbolType.DIAMOND);
-        builder.put(StyleProperties.SymbolType.INVERTED_TRIANGLE, ILineSeries.PlotSymbolType.INVERTED_TRIANGLE);
-        builder.put(StyleProperties.SymbolType.TRIANGLE, ILineSeries.PlotSymbolType.TRIANGLE);
-        builder.put(StyleProperties.SymbolType.PLUS, ILineSeries.PlotSymbolType.PLUS);
-        builder.put(StyleProperties.SymbolType.SQUARE, ILineSeries.PlotSymbolType.SQUARE);
-        SYMBOL_MAP = builder.build();
-    }
-    private static final double DEFAULT_MAXY = Double.MIN_VALUE;
-    private static final double DEFAULT_MINY = Double.MAX_VALUE;
-
-    /** Timeout between updates in the updateData thread **/
-    private static final long BUILD_UPDATE_TIMEOUT = 500;
-
-    private static final @NonNull Logger LOGGER = TraceCompassLog.getLogger(TmfCommonXAxisChartViewer.class);
-    private static final int DEFAULT_SERIES_WIDTH = 1;
-    private static final String DIMMED_SERIES_SUFFIX = ".dimmed"; //$NON-NLS-1$
-
-    private final double fResolution;
-    private final AtomicInteger fDirty = new AtomicInteger();
-    private final Map<ITmfTrace, BaseXYPresentationProvider> fXYPresentationProvider;
-    private UpdateThread fUpdateThread;
-
-    /** Used for testing **/
-    private int fOverrideNbPoints = 0;
-
-    /**
-     * Constructor
-     *
-     * @param parent
-     *                     The parent composite
-     * @param settings
-     *                     See {@link TmfXYChartSettings} to know what it contains
-     */
-    public TmfCommonXAxisChartViewer(Composite parent, TmfXYChartSettings settings) {
-        super(parent, settings.getTitle(), settings.getXLabel(), settings.getYLabel());
-        getSwtChart().getTitle().setVisible(false);
-        getSwtChart().getLegend().setPosition(SWT.BOTTOM);
-        getSwtChart().getAxisSet().getXAxes()[0].getTitle().setVisible(false);
-        fResolution = settings.getResolution();
-        setTooltipProvider(new TmfCommonXLineChartTooltipProvider(this));
-        fXYPresentationProvider = new HashMap<>();
-    }
-
-    @Override
-    public void loadTrace(ITmfTrace trace) {
-        super.loadTrace(trace);
-        fXYPresentationProvider.computeIfAbsent(trace, t -> createPresentationProvider(trace));
-    }
-
-    /**
-     * Create a new presentation provider for this XY viewer. Sub-classes can
-     * overwrite this method to provide specific XY presentation provider
-     * instances.
-     *
-     * @param trace
-     *            The trace to get the provider for
-     *
-     * @return A new presentation provider
-     * @since 6.0
-     */
-    protected BaseXYPresentationProvider createPresentationProvider(ITmfTrace trace) {
-        return new BaseXYPresentationProvider();
-    }
-
-    @Override
-    public boolean isDirty() {
-        /* Check the parent's or this view's own dirtiness */
-        return super.isDirty() || (fDirty.get() != 0);
-    }
-
-    /**
-     * Force the number of points to a fixed value
-     *
-     * @param nbPoints
-     *                     The number of points to display, cannot be negative. 0
-     *                     means use native resolution. any positive integer means
-     *                     that number of points
-     */
-    public synchronized void setNbPoints(int nbPoints) {
-        if (nbPoints < 0) {
-            throw new IllegalArgumentException("Number of points cannot be negative"); //$NON-NLS-1$
-        }
-        fOverrideNbPoints = nbPoints;
-        updateContent();
-    }
-
-    /**
-     * Initialize the data provider of this viewer
-     *
-     * FIXME Make this abstract when incrementing the major version
-     *
-     * @param trace
-     *                  The trace
-     * @return the data provider
-     * @since 4.0
-     */
-    protected ITmfXYDataProvider initializeDataProvider(@NonNull ITmfTrace trace) {
-        throw new UnsupportedOperationException("This needs to be implemented concrete classes"); //$NON-NLS-1$
-    }
-
-    /**
-     * Gets the presentation provider
-     *
-     * @return The presentation provider
-     * @since 4.0
-     */
-    protected IXYPresentationProvider getPresentationProvider() {
-        return Objects.requireNonNull(fXYPresentationProvider.get(getTrace()));
-    }
-
-    /**
-     * Gets the presentation provider
-     *
-     * @return The presentation provider
-     * @since 6.0
-     */
-    public BaseXYPresentationProvider getPresentationProvider2() {
-        return Objects.requireNonNull(fXYPresentationProvider.get(getTrace()));
-    }
-
-    /**
-     * Create map of parameters that will be used by updateData method. If a
-     * viewer need a more specialized map than just the time requested it's its
-     * responsibility to override this method and provide the desired instance.
-     *
-     * @param start
-     *            The starting value
-     * @param end
-     *            The ending value
-     * @param nb
-     *            The number of entries
-     * @return Map of parameters
-     * @since 5.0
-     */
-    protected @NonNull Map<String, Object> createQueryParameters(long start, long end, int nb) {
-        Map<@NonNull String, @NonNull Object> parameters = FetchParametersUtils.timeQueryToMap(new TimeQueryFilter(start, end, nb));
-        Multimap<@NonNull Integer, @NonNull String> regexesMap = getRegexes();
-        if (!regexesMap.isEmpty()) {
-            parameters.put(DataProviderParameterUtils.REGEX_MAP_FILTERS_KEY, regexesMap.asMap());
-        }
-        return parameters;
-    }
-
-    /**
-     * Gets the appearance of a given series. If appearance doesn't exist, a new one
-     * will be created by the presentation provider
-     *
-     * @param seriesName
-     *                       The name of the series
-     * @return An {@link IYAppearance} instance for the series
-     * @since 4.0
-     * @deprecated As of 6.0, use {@link #getSeriesStyle(Long)} instead
-     */
-    @Deprecated
-    public @NonNull IYAppearance getSeriesAppearance(@NonNull String seriesName) {
-        return getPresentationProvider().getAppearance(seriesName, IYAppearance.Type.LINE, DEFAULT_SERIES_WIDTH);
-    }
-
-    /**
-     * Gets the style of a given series. If style doesn't exist, a new one will
-     * be created by the presentation provider
-     *
-     * @param seriesId
-     *            The unique ID of the series
-     * @return An {@link OutputElementStyle} instance for the series
-     * @since 6.0
-     */
-    public @NonNull OutputElementStyle getSeriesStyle(@NonNull Long seriesId) {
-        return getPresentationProvider().getSeriesStyle(seriesId, StyleProperties.SeriesType.LINE, DEFAULT_SERIES_WIDTH);
-    }
-
-    /**
-     * Cancels the currently running update thread. It is automatically called when
-     * the content is updated, but child viewers may want to call it manually to do
-     * some operations before calling
-     * {@link TmfCommonXAxisChartViewer#updateContent}
-     */
-    protected synchronized void cancelUpdate() {
-        if (fUpdateThread != null) {
-            fUpdateThread.cancel();
-        }
-    }
-
-    @Override
-    protected void updateContent() {
-        ITmfTrace trace = getTrace();
-        if (trace == null) {
-            return;
-        }
-        cancelUpdate();
-        try (FlowScopeLog parentScope = new FlowScopeLogBuilder(LOGGER, Level.FINE, "CommonXLineChart:ContentUpdateRequested").setCategory(getViewerId()).build()) { //$NON-NLS-1$
-            /*
-             * Content is not up to date, so we increment fDirty. It will be decremented at
-             * the end of the update thread
-             */
-            fDirty.incrementAndGet();
-            getDisplay().asyncExec(() -> {
-                if (!trace.equals(getTrace())) {
-                    return;
-                }
-                try (FlowScopeLog scope = new FlowScopeLogBuilder(LOGGER, Level.FINE, "CommonXLineChart:CreatingUpdateThread").setParentScope(parentScope).build()) { //$NON-NLS-1$
-                    newUpdateThread(trace, scope);
-                }
-            });
-        }
-    }
-
-    @Override
-    protected void clearContent() {
-        getSwtChart().getAxisSet().getXAxis(0).getTick().setFormat(null);
-        super.clearContent();
-    }
-
-    private @NonNull String getViewerId() {
-        return getClass().getName();
-    }
-
-    private class UpdateThread extends Thread {
-
-        private final ITmfTrace fTrace;
-        private final IProgressMonitor fMonitor;
-        private final int fNumRequests;
-        private final @NonNull FlowScopeLog fScope;
-
-        public UpdateThread(ITmfTrace trace, int numRequests, @NonNull FlowScopeLog log) {
-            super("Line chart update"); //$NON-NLS-1$
-            fTrace = trace;
-            fNumRequests = numRequests;
-            fMonitor = new NullProgressMonitor();
-            fScope = log;
-        }
-
-        @Override
-        public void run() {
-            try (FlowScopeLog scope = new FlowScopeLogBuilder(LOGGER, Level.FINE, "CommonXLineChart:UpdateThread", "numRequests=", fNumRequests).setParentScope(fScope).build()) { //$NON-NLS-1$ //$NON-NLS-2$
-                ITmfXYDataProvider dataProvider = null;
-                try (FlowScopeLog scopeDp = new FlowScopeLogBuilder(LOGGER, Level.FINE, "CommonXLineChart:InitializeDataProvider").setParentScope(fScope).build()) { //$NON-NLS-1$
-                    dataProvider = initializeDataProvider(fTrace);
-                }
-                if (dataProvider == null) {
-                    TraceCompassLogUtils.traceInstant(LOGGER, Level.WARNING, "Data provider for this viewer is not available"); //$NON-NLS-1$
-                    return;
-                }
-                try {
-                    int numRequests = fNumRequests;
-                    if (numRequests == 0) {
-                        return;
-                    }
-                    Map<String, Object> parameters = createQueryParameters(getWindowStartTime(), getWindowEndTime(), numRequests);
-                    updateData(dataProvider, parameters, fMonitor);
-                } finally {
-                    /*
-                     * fDirty should have been incremented before creating the thread, so we
-                     * decrement it once it is finished
-                     */
-                    if (fDirty.decrementAndGet() < 0) {
-                        Activator.getDefault().logError(DIRTY_UNDERFLOW_ERROR, new Throwable());
-                    }
-                }
-                updateThreadFinished(this);
-            }
-        }
-
-        public void cancel() {
-            TraceCompassLogUtils.traceInstant(LOGGER, Level.FINE, "CommonXLineChart:UpdateThreadCanceled"); //$NON-NLS-1$
-            fMonitor.setCanceled(true);
-        }
-
-        /**
-         * This method is responsible for calling the
-         * {@link UpdateThread#updateDisplay(ITmfCommonXAxisModel)} when needed for the
-         * new values to be displayed.
-         *
-         * @param dataProvider
-         *                         A data provider
-         * @param parameters
-         *                         A query filter
-         * @param monitor
-         *                         A monitor for canceling task
-         */
-        private void updateData(@NonNull ITmfXYDataProvider dataProvider, @NonNull Map<String, Object> parameters, IProgressMonitor monitor) {
-            boolean isComplete = false;
-            do {
-                TmfModelResponse<ITmfXyModel> response = dataProvider.fetchXY(parameters, monitor);
-                ITmfXyModel model = response.getModel();
-                if (model != null) {
-                    updateDisplay(model, monitor);
-                }
-
-                ITmfResponse.Status status = response.getStatus();
-                if (status == ITmfResponse.Status.COMPLETED) {
-                    /* Model is complete, no need to request again the data provider */
-                    isComplete = true;
-                } else if (status == ITmfResponse.Status.FAILED || status == ITmfResponse.Status.CANCELLED) {
-                    /* Error occurred, log and return */
-                    TraceCompassLogUtils.traceInstant(LOGGER, Level.WARNING, response.getStatusMessage());
-                    isComplete = true;
-                } else {
-                    /**
-                     * Status is RUNNING. Sleeping current thread to wait before request data
-                     * provider again
-                     **/
-                    try {
-                        Thread.sleep(BUILD_UPDATE_TIMEOUT);
-                    } catch (InterruptedException e) {
-                        /**
-                         * InterruptedException is throw by Thread.Sleep and we should retry querying
-                         * the data provider
-                         **/
-                        TraceCompassLogUtils.traceInstant(LOGGER, Level.INFO, e.getMessage());
-                        Thread.currentThread().interrupt();
-                    }
-                }
-            } while (!isComplete);
-        }
-
-        /**
-         * Update the chart's values before refreshing the viewer
-         */
-        private void updateDisplay(ITmfXyModel model, IProgressMonitor monitor) {
-            try (FlowScopeLog scope = new FlowScopeLogBuilder(LOGGER, Level.FINE, "TmfCommonXAxisChart:UpdateDisplayRequested").setCategory(getViewerId()).build()) { //$NON-NLS-1$
-                /* Content is not up to date, increment dirtiness */
-                final ITmfXyModel seriesValues = model;
-                fDirty.incrementAndGet();
-
-                Display.getDefault().asyncExec(() -> {
-                    final TmfChartTimeStampFormat tmfChartTimeStampFormat = new TmfChartTimeStampFormat(getTimeOffset());
-                    try (FlowScopeLog log = new FlowScopeLogBuilder(LOGGER, Level.FINE, "TmfCommonXAxisChart:UpdateDisplay").setParentScope(scope).build()) { //$NON-NLS-1$
-                        if (!fTrace.equals(getTrace())) {
-                            return;
-                        }
-                        if (getSwtChart().isDisposed()) {
-                            return;
-                        }
-                        if (monitor != null && monitor.isCanceled()) {
-                            return;
-                        }
-                        double maxy = DEFAULT_MAXY;
-                        double miny = DEFAULT_MINY;
-                        long delta = getWindowEndTime() - getWindowStartTime();
-                        if (delta > 0) {
-                            for (ISeriesModel entry : seriesValues.getSeriesData()) {
-                                double[] extractXValuesToDisplay = extractXValuesToDisplay(entry.getXAxis());
-                                List<Double> dimmedX = new ArrayList<>(extractXValuesToDisplay.length);
-                                List<Double> dimmedY = new ArrayList<>(extractXValuesToDisplay.length);
-                                List<Double> brightX = new ArrayList<>(extractXValuesToDisplay.length);
-                                List<Double> brightY = new ArrayList<>(extractXValuesToDisplay.length);
-
-                                int[] propertiesArray = entry.getProperties();
-                                double[] data = entry.getData();
-                                for (int i = 0; i < extractXValuesToDisplay.length; i++) {
-                                    double value = data[i];
-                                    /*
-                                     * Find the minimal and maximum values in this series
-                                     */
-                                    maxy = Math.max(maxy, value);
-                                    miny = Math.min(miny, value);
-                                    int properties = (i < propertiesArray.length) ? propertiesArray[i] : 0;
-                                    if ((properties & IFilterProperty.EXCLUDE) == 0) {
-                                        if ((properties & IFilterProperty.DIMMED) == 0) {
-                                            brightX.add(extractXValuesToDisplay[i]);
-                                            brightY.add(value);
-                                        } else {
-                                            dimmedX.add(extractXValuesToDisplay[i]);
-                                            dimmedY.add(value);
-                                        }
-                                    }
-                                }
-                                double[] brightXArray = new double[brightX.size()];
-                                double[] brightYArray = new double[brightY.size()];
-                                for (int i = 0; i < brightX.size(); i++) {
-                                    brightXArray[i] = brightX.get(i);
-                                    brightYArray[i] = brightY.get(i);
-                                }
-                                double[] dimmedXArray = new double[dimmedX.size()];
-                                double[] dimmedYArray = new double[dimmedY.size()];
-                                for (int i = 0; i < dimmedX.size(); i++) {
-                                    dimmedXArray[i] = dimmedX.get(i);
-                                    dimmedYArray[i] = dimmedY.get(i);
-                                }
-
-                                // Create and fill the series
-                                ISeriesSet seriesSet = getSwtChart().getSeriesSet();
-                                ISeries series = seriesSet.getSeries(entry.getName());
-                                ISeries dimmedSeries = seriesSet.getSeries(entry.getName() + DIMMED_SERIES_SUFFIX);
-                                if (brightX.isEmpty()) {
-                                    // Remove the base series since there is
-                                    // nothing to show
-                                    if (series != null) {
-                                        seriesSet.deleteSeries(entry.getName());
-                                    }
-                                } else {
-                                    if (series == null) {
-                                        series = createSWTSeriesFromModel(entry);
-                                    }
-                                    series.setXSeries(brightXArray);
-                                    series.setYSeries(brightYArray);
-                                }
-                                if (dimmedX.isEmpty()) {
-                                    // Remove the base series since there is
-                                    // nothing to show
-                                    if (dimmedSeries != null) {
-                                        seriesSet.deleteSeries(entry.getName() + DIMMED_SERIES_SUFFIX);
-                                    }
-                                } else {
-                                    if (dimmedSeries == null) {
-                                        dimmedSeries = createDimmedSeriesFromModel(entry);
-                                    }
-                                    dimmedSeries.setXSeries(dimmedXArray);
-                                    dimmedSeries.setYSeries(dimmedYArray);
-                                }
-                            }
-                            maxy = maxy == DEFAULT_MAXY ? 1.0 : maxy;
-                        } else {
-                            clearContent();
-                            delta = 1;
-                        }
-
-                        IAxisSet axisSet = getSwtChart().getAxisSet();
-                        IAxisTick xTick = axisSet.getXAxis(0).getTick();
-                        xTick.setFormat(tmfChartTimeStampFormat);
-                        final double start = 1.0;
-                        axisSet.getXAxis(0).setRange(new Range(start, start + delta));
-                        AxisRange fixedYRange = getFixedYRange();
-                        if (fixedYRange == null) {
-                            axisSet.getYAxis(0).adjustRange();
-                        } else {
-                            axisSet.getYAxis(0).setRange(
-                                    new Range(fixedYRange.getLower(), fixedYRange.getUpper()));
-                        }
-                        getSwtChart().redraw();
-
-                        if (isSendTimeAlignSignals()) {
-                            /*
-                             * The width of the chart might have changed and its time axis might be
-                             * misaligned with the other views
-                             */
-                            Composite parent = TmfCommonXAxisChartViewer.this.getParent();
-                            if (parent == null || parent.getParent() == null) {
-                                return;
-                            }
-                            Point viewPos = parent.getParent().toDisplay(0, 0);
-                            int axisPos = getSwtChart().toDisplay(0, 0).x + getPointAreaOffset();
-                            int timeAxisOffset = axisPos - viewPos.x;
-                            TmfTimeViewAlignmentInfo timeAlignmentInfo = new TmfTimeViewAlignmentInfo(getControl().getShell(), viewPos, timeAxisOffset);
-                            TmfSignalManager.dispatchSignal(new TmfTimeViewAlignmentSignal(TmfCommonXAxisChartViewer.this, timeAlignmentInfo, true));
-                        }
-
-                    } finally {
-                        /* Content has been updated, decrement dirtiness */
-                        if (fDirty.decrementAndGet() < 0) {
-                            Activator.getDefault().logError(DIRTY_UNDERFLOW_ERROR, new Throwable());
-                        }
-                    }
-                });
-            }
-        }
-
-        /**
-         * Since the XY Model returned by data provider contains directly the requested
-         * time as long array, we need to convert it to double array for the SWT Chart.
-         */
-        private double[] extractXValuesToDisplay(long[] xValuesRequested) {
-            double[] xValuesToDisplay = new double[xValuesRequested.length];
-            long offset = getTimeOffset();
-
-            for (int i = 0; i < xValuesRequested.length; ++i) {
-                xValuesToDisplay[i] = (xValuesRequested[i] - offset);
-            }
-            return xValuesToDisplay;
-        }
-
-        private @NonNull ISeries createSWTSeriesFromModel(ISeriesModel yModel) {
-            ISeriesSet seriesSet = getSwtChart().getSeriesSet();
-
-            String seriesName = yModel.getName();
-            OutputElementStyle appearance = getSeriesStyle(yModel.getId());
-            BaseXYPresentationProvider presProvider = getPresentationProvider2();
-
-            String type = (String) presProvider.getStyleOrDefault(appearance, StyleProperties.SERIES_TYPE, StyleProperties.SeriesType.LINE);
-            RGBAColor rgb = presProvider.getColorStyleOrDefault(appearance, StyleProperties.COLOR, DEFAULT_COLOR);
-            COLOR_REGISTRY.put(rgb.toString(), RGBAUtil.fromRGBAColor(rgb).rgb);
-            Color color = COLOR_REGISTRY.get(rgb.toString());
-            String symbolType = (String) presProvider.getStyle(appearance, StyleProperties.SYMBOL_TYPE);
-
-            if (type.equals(StyleProperties.SeriesType.BAR)) {
-                IBarSeries barSeries = (IBarSeries) seriesSet.createSeries(SeriesType.BAR, seriesName);
-                barSeries.enableStack(true);
-                barSeries.setBarColor(color);
-                barSeries.setBarPadding(0);
-                barSeries.setVisible(true);
-                return barSeries;
-            }
-
-            /**
-             * Default is line chart
-             */
-            ILineSeries lineSeries = (ILineSeries) seriesSet.createSeries(SeriesType.LINE, seriesName);
-            lineSeries.enableArea(StyleProperties.SeriesType.AREA.equals(type));
-            lineSeries.setLineStyle(LineStyle.valueOf((String) presProvider.getStyleOrDefault(appearance, StyleProperties.SERIES_STYLE, StyleProperties.SeriesStyle.SOLID)));
-            lineSeries.setSymbolType(SYMBOL_MAP.getOrDefault(symbolType, ILineSeries.PlotSymbolType.NONE));
-            lineSeries.setSymbolSize(Math.round(presProvider.getFloatStyleOrDefault(appearance, StyleProperties.HEIGHT, 1.0f).floatValue() * DEFAULT_SYMBOL_SIZE));
-            lineSeries.setLineColor(color);
-            lineSeries.setSymbolColor(color);
-            lineSeries.setVisible(true);
-            lineSeries.setLineWidth(((Number) presProvider.getFloatStyleOrDefault(appearance, StyleProperties.WIDTH, 1.0f)).intValue());
-            return lineSeries;
-        }
-
-        private @NonNull ISeries createDimmedSeriesFromModel(ISeriesModel yModel) {
-            ISeriesSet seriesSet = getSwtChart().getSeriesSet();
-
-            String seriesName = yModel.getName() + DIMMED_SERIES_SUFFIX;
-            OutputElementStyle appearance = getSeriesStyle(yModel.getId());
-            BaseXYPresentationProvider presProvider = getPresentationProvider2();
-
-            String type = (String) presProvider.getStyleOrDefault(appearance, StyleProperties.SERIES_TYPE, StyleProperties.SeriesType.LINE);
-            RGBAColor rgbaColor = presProvider.getColorStyleOrDefault(appearance, StyleProperties.COLOR, DEFAULT_COLOR);
-            float[] rgb = rgbaColor.getHSBA();
-            COLOR_REGISTRY.put(rgb.toString(), new RGBA(rgb[0], rgb[1] * 0.5f, rgb[2] * 0.5f, rgb[3]).rgb);
-            Color color = COLOR_REGISTRY.get(rgb.toString());
-            String symbolType = (String) presProvider.getStyle(appearance, StyleProperties.SYMBOL_TYPE);
-
-            if (type.equals(StyleProperties.SeriesType.BAR)) {
-                IBarSeries barSeries = (IBarSeries) seriesSet.createSeries(SeriesType.BAR, seriesName);
-                barSeries.enableStack(true);
-                barSeries.setBarColor(color);
-                barSeries.setBarPadding(0);
-                barSeries.setVisible(true);
-                return barSeries;
-            }
-
-            /**
-             * Default is line chart
-             */
-            ILineSeries lineSeries = (ILineSeries) seriesSet.createSeries(SeriesType.LINE, seriesName);
-            lineSeries.enableArea(StyleProperties.SeriesType.AREA.equals(type));
-            lineSeries.setLineStyle(LineStyle.valueOf((String) presProvider.getStyleOrDefault(appearance, StyleProperties.SERIES_STYLE, StyleProperties.SeriesStyle.SOLID)));
-            lineSeries.setSymbolType(SYMBOL_MAP.getOrDefault(symbolType, ILineSeries.PlotSymbolType.NONE));
-            lineSeries.setSymbolSize(Math.round(presProvider.getFloatStyleOrDefault(appearance, StyleProperties.HEIGHT, 1.0f).floatValue() * DEFAULT_SYMBOL_SIZE));
-            lineSeries.setLineColor(color);
-            lineSeries.setSymbolColor(color);
-            lineSeries.setVisible(true);
-            lineSeries.setLineWidth(((Number) presProvider.getFloatStyleOrDefault(appearance, StyleProperties.WIDTH, 1.0f)).intValue());
-            return lineSeries;
-        }
-
-        private synchronized void updateThreadFinished(UpdateThread thread) {
-            if (thread == fUpdateThread) {
-                fUpdateThread = null;
-            }
-        }
-    }
-
-    private synchronized void newUpdateThread(@NonNull ITmfTrace trace, @NonNull FlowScopeLog fScope) {
-        if (getSwtChart().isDisposed()) {
-            return;
-        }
-        int numRequests = fOverrideNbPoints != 0 ? fOverrideNbPoints : (int) Math.min(getWindowEndTime() - getWindowStartTime() + 1, (long) (getSwtChart().getPlotArea().getBounds().width * fResolution));
-        fUpdateThread = new UpdateThread(trace, numRequests, fScope);
-        fUpdateThread.start();
-    }
-
-    @TmfSignalHandler
-    @Override
-    public void traceClosed(@Nullable TmfTraceClosedSignal signal) {
-        cancelUpdate();
-        super.traceClosed(signal);
-        if (signal != null) {
-            fXYPresentationProvider.remove(signal.getTrace());
-        }
-    }
-
-    /**
-     * Set or remove the global regex filter value
-     *
-     * @param signal
-     *                   the signal carrying the regex value
-     * @since 4.2
-     */
-    @TmfSignalHandler
-    public void regexFilterApplied(TmfFilterAppliedSignal signal) {
-        updateContent();
-    }
-
-    /**
-     * This method build the multimap of regexes by property that will be used to
-     * filter the timegraph states
-     *
-     * Override this method to add other regexes with their properties. The data
-     * provider should handle everything after.
-     *
-     * @return The multimap of regexes by property
-     * @since 4.2
-     */
-    protected @NonNull Multimap<@NonNull Integer, @NonNull String> getRegexes() {
-        Multimap<@NonNull Integer, @NonNull String> regexes = HashMultimap.create();
-
-        ITmfTrace trace = getTrace();
-        if (trace == null) {
-            return regexes;
-        }
-        TraceCompassFilter globalFilter = TraceCompassFilter.getFilterForTrace(trace);
-        if (globalFilter == null) {
-            return regexes;
-        }
-        regexes.putAll(IFilterProperty.DIMMED, globalFilter.getRegexes());
-
-        return regexes;
-    }
-}
diff --git a/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/viewers/xycharts/linecharts/TmfCommonXLineChartTooltipProvider.java b/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/viewers/xycharts/linecharts/TmfCommonXLineChartTooltipProvider.java
deleted file mode 100644
index 54e2ae7..0000000
--- a/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/viewers/xycharts/linecharts/TmfCommonXLineChartTooltipProvider.java
+++ /dev/null
@@ -1,200 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2014, 2019 École Polytechnique de Montréal and others
- *
- * All rights reserved. This program and the accompanying materials are
- * made available under the terms of the Eclipse Public License 2.0 which
- * accompanies this distribution, and is available at
- * https://www.eclipse.org/legal/epl-2.0/
- *
- * SPDX-License-Identifier: EPL-2.0
- *
- * Contributors:
- *   Geneviève Bastien - Initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.tracecompass.tmf.ui.viewers.xycharts.linecharts;
-
-import java.text.Format;
-import java.util.Arrays;
-
-import org.eclipse.jdt.annotation.Nullable;
-import org.eclipse.swt.events.MouseEvent;
-import org.eclipse.swt.events.MouseTrackListener;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.graphics.RGBA;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.tracecompass.internal.tmf.ui.Messages;
-import org.eclipse.tracecompass.tmf.core.presentation.RGBAColor;
-import org.eclipse.tracecompass.tmf.core.timestamp.ITmfTimestamp;
-import org.eclipse.tracecompass.tmf.core.timestamp.TmfTimestamp;
-import org.eclipse.tracecompass.tmf.ui.viewers.TmfAbstractToolTipHandler;
-import org.eclipse.tracecompass.tmf.ui.viewers.xycharts.ITmfChartTimeProvider;
-import org.eclipse.tracecompass.tmf.ui.viewers.xycharts.TmfBaseProvider;
-import org.swtchart.Chart;
-import org.swtchart.IAxis;
-import org.swtchart.IAxisSet;
-import org.swtchart.IBarSeries;
-import org.swtchart.ILineSeries;
-import org.swtchart.ISeries;
-
-/**
- * Displays a tooltip on line charts. For each series, it shows the y value at
- * the selected x value. This tooltip assumes that all series share a common set
- * of X axis values. If the X series is not common, the tooltip text may not be
- * accurate.
- *
- * @author Geneviève Bastien
- * @deprecated use {@link org.eclipse.tracecompass.tmf.ui.viewers.xychart.linechart.TmfCommonXLineChartTooltipProvider}
- */
-@Deprecated
-public class TmfCommonXLineChartTooltipProvider extends TmfBaseProvider implements MouseTrackListener {
-
-    private final class XYToolTipHandler extends TmfAbstractToolTipHandler {
-        private static final String HTML_COLOR_TOOLTIP = "<span style=\"color:%s;\">%s</span>"; //$NON-NLS-1$
-
-        private boolean isValid(int index, ISeries serie) {
-            double[] ySeries = serie.getYSeries();
-            return serie.isVisible() && ySeries != null && ySeries.length > index;
-        }
-
-        @Override
-        public void fill(Control control, MouseEvent event, Point pt) {
-            if (getChartViewer().getWindowDuration() != 0) {
-                Chart chart = getChart();
-                IAxisSet axisSet = chart.getAxisSet();
-                IAxis xAxis = axisSet.getXAxis(0);
-
-                double xCoordinate = xAxis.getDataCoordinate(pt.x);
-
-                ISeries[] series = getChart().getSeriesSet().getSeries();
-
-                if ((xCoordinate < 0) || (series.length == 0)) {
-                    return;
-                }
-
-                /* Find the index of the value we want */
-                double[] xS = series[0].getXSeries();
-                if (xS == null) {
-                    return;
-                }
-                int index = Arrays.binarySearch(xS, xCoordinate);
-                index = index >= 0 ? index : -index - 1;
-                int maxLen = 0;
-                for (ISeries serie : series) {
-                    /* Make sure the series values and the value at index exist */
-                    if (isValid(index, serie)) {
-                        maxLen = Math.max(maxLen, serie.getId().length());
-                    }
-                }
-
-                TmfCommonXAxisChartViewer viewer = null;
-                Format format = null;
-                ITmfChartTimeProvider timeProvider = getChartViewer();
-                if (timeProvider instanceof TmfCommonXAxisChartViewer) {
-                    viewer = (TmfCommonXAxisChartViewer) timeProvider;
-                    format = viewer.getSwtChart().getAxisSet().getYAxes()[0].getTick().getFormat();
-                }
-                ITmfTimestamp time = TmfTimestamp.fromNanos((long) xCoordinate + getChartViewer().getTimeOffset());
-                addItem(null, ToolTipString.fromString(Messages.TmfCommonXLineChartTooltipProvider_time), ToolTipString.fromTimestamp(time.toString(), time.toNanos()));
-                /* For each series, get the value at the index */
-                for (ISeries serie : series) {
-                    double[] yS = serie.getYSeries();
-                    /* Make sure the series values and the value at index exist */
-                    if (isValid(index, serie)) {
-                        String key = serie.getId();
-                        Color color = getSeriesColor(serie);
-                        if (key != null && color != null) {
-                            RGBA rgba = color.getRGBA();
-                            RGBAColor rgbaColor = new RGBAColor(rgba.rgb.red, rgba.rgb.green, rgba.rgb.blue, rgba.alpha);
-                            key = String.format(HTML_COLOR_TOOLTIP, rgbaColor, key);
-                        }
-                        if (key == null) {
-                            key = ""; //$NON-NLS-1$
-                        }
-                        double yValue = yS[index];
-                        if (format == null) {
-                            addItem(null, ToolTipString.fromHtml(key), ToolTipString.fromDecimal(yValue));
-                        } else {
-                            addItem(null, ToolTipString.fromHtml(key), ToolTipString.fromString(format.format(yValue)));
-                        }
-                    }
-                }
-            }
-        }
-
-        private @Nullable Color getSeriesColor(ISeries series) {
-            if (series instanceof IBarSeries) {
-                return ((IBarSeries) series).getBarColor();
-            } else if (series instanceof ILineSeries) {
-                return ((ILineSeries) series).getLineColor();
-            }
-            return null;
-        }
-    }
-
-    private XYToolTipHandler fToolTipHandler = new XYToolTipHandler();
-
-    /**
-     * Constructor for the tooltip provider
-     *
-     * @param tmfChartViewer
-     *            The parent chart viewer
-     */
-    public TmfCommonXLineChartTooltipProvider(ITmfChartTimeProvider tmfChartViewer) {
-        super(tmfChartViewer);
-        register();
-    }
-
-    // ------------------------------------------------------------------------
-    // TmfBaseProvider
-    // ------------------------------------------------------------------------
-
-    @Override
-    public void register() {
-        fToolTipHandler.activateHoverHelp(getChart().getPlotArea());
-    }
-
-    @Override
-    public void deregister() {
-        if ((getChartViewer().getControl() != null) && !getChartViewer().getControl().isDisposed()) {
-            fToolTipHandler.deactivateHoverHelp(getChart().getPlotArea());
-        }
-    }
-
-    @Override
-    public void refresh() {
-        // nothing to do
-    }
-
-    // ------------------------------------------------------------------------
-    // MouseTrackListener
-    // ------------------------------------------------------------------------
-
-    /**
-     * @deprecated, do not extend, use as-is
-     */
-    @Deprecated
-    @Override
-    public void mouseEnter(MouseEvent e) {
-        // do nothing
-    }
-
-    /**
-     * @deprecated, do not extend, use as-is
-     */
-    @Deprecated
-    @Override
-    public void mouseExit(MouseEvent e) {
-        // do nothing
-    }
-
-    /**
-     * @deprecated, do not extend, use as-is
-     */
-    @Deprecated
-    @Override
-    public void mouseHover(MouseEvent e) {
-        // do nothing
-    }
-}
diff --git a/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/viewers/xycharts/linecharts/TmfFilteredXYChartViewer.java b/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/viewers/xycharts/linecharts/TmfFilteredXYChartViewer.java
deleted file mode 100644
index dcd2ab9..0000000
--- a/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/viewers/xycharts/linecharts/TmfFilteredXYChartViewer.java
+++ /dev/null
@@ -1,175 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2017, 2020 Ericsson
- *
- * All rights reserved. This program and the accompanying materials are
- * made available under the terms of the Eclipse Public License 2.0 which
- * accompanies this distribution, and is available at
- * https://www.eclipse.org/legal/epl-2.0/
- *
- * SPDX-License-Identifier: EPL-2.0
- *******************************************************************************/
-
-package org.eclipse.tracecompass.tmf.ui.viewers.xycharts.linecharts;
-
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.jdt.annotation.NonNull;
-import org.eclipse.jdt.annotation.Nullable;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.tracecompass.internal.provisional.tmf.ui.viewers.xychart.BaseXYPresentationProvider;
-import org.eclipse.tracecompass.internal.tmf.core.model.filters.FetchParametersUtils;
-import org.eclipse.tracecompass.tmf.core.dataprovider.DataProviderManager;
-import org.eclipse.tracecompass.tmf.core.dataprovider.DataProviderParameterUtils;
-import org.eclipse.tracecompass.tmf.core.model.IOutputStyleProvider;
-import org.eclipse.tracecompass.tmf.core.model.OutputElementStyle;
-import org.eclipse.tracecompass.tmf.core.model.filters.SelectionTimeQueryFilter;
-import org.eclipse.tracecompass.tmf.core.model.tree.TmfTreeDataModel;
-import org.eclipse.tracecompass.tmf.core.model.xy.ITmfTreeXYDataProvider;
-import org.eclipse.tracecompass.tmf.core.model.xy.ITmfXYDataProvider;
-import org.eclipse.tracecompass.tmf.core.presentation.IYAppearance;
-import org.eclipse.tracecompass.tmf.core.signal.TmfSignalHandler;
-import org.eclipse.tracecompass.tmf.core.signal.TmfTraceClosedSignal;
-import org.eclipse.tracecompass.tmf.core.signal.TmfTraceSelectedSignal;
-import org.eclipse.tracecompass.tmf.core.trace.ITmfTrace;
-import org.eclipse.tracecompass.tmf.ui.viewers.tree.ICheckboxTreeViewerListener;
-import org.eclipse.tracecompass.tmf.ui.viewers.tree.ITmfTreeViewerEntry;
-import org.eclipse.tracecompass.tmf.ui.viewers.tree.TmfGenericTreeEntry;
-import org.swtchart.Chart;
-
-import com.google.common.collect.Iterables;
-import com.google.common.collect.Multimap;
-import com.google.common.collect.Sets;
-
-/**
- * XY chart viewer which queries and displays selected entries.
- *
- * @author Loic Prieur-Drevon
- * @since 3.2
- * @deprecated use {@link org.eclipse.tracecompass.tmf.ui.viewers.xychart.linechart.TmfFilteredXYChartViewer}
- */
-@Deprecated
-public class TmfFilteredXYChartViewer extends TmfCommonXAxisChartViewer implements ICheckboxTreeViewerListener {
-
-    private static final int DEFAULT_SERIES_WIDTH = 2;
-
-    private @NonNull Collection<@NonNull Long> fSelectedIds = Collections.emptyList();
-
-    private final String fId;
-    private final Map<BaseXYPresentationProvider, Boolean> fUseDefaultStyleValues = new HashMap<>();
-
-    /**
-     * Constructor
-     *
-     * @param parent
-     *            The parent composite
-     * @param settings
-     *            See {@link TmfXYChartSettings} to know what it contains
-     * @param id
-     *            The ITmfXYDataProvider ID.
-     */
-    public TmfFilteredXYChartViewer(Composite parent, TmfXYChartSettings settings, String id) {
-        super(parent, settings);
-        Chart chart = getSwtChart();
-        // Avoid displaying chart title and axis titles (to reduce wasted space)
-        chart.getLegend().setVisible(false);
-        fId = id;
-    }
-
-    /**
-     * Update the chart depending on the selected entries.
-     *
-     * @param entries
-     *            Counters to display on the chart
-     */
-    @Override
-    public void handleCheckStateChangedEvent(Collection<ITmfTreeViewerEntry> entries) {
-        cancelUpdate();
-
-        Iterable<TmfGenericTreeEntry> counterEntries = Iterables.filter(entries, TmfGenericTreeEntry.class);
-        Collection<@NonNull Long> selectedIds = Sets.newHashSet(Iterables.transform(counterEntries, e -> e.getModel().getId()));
-        if (!selectedIds.containsAll(fSelectedIds)) {
-            clearContent();
-        }
-        fSelectedIds = selectedIds;
-        // Update the styles as well
-        BaseXYPresentationProvider presProvider = getPresentationProvider2();
-        for (ITmfTreeViewerEntry entry : entries) {
-            if (entry instanceof TmfGenericTreeEntry) {
-                TmfGenericTreeEntry<TmfTreeDataModel> genericEntry = (TmfGenericTreeEntry<TmfTreeDataModel>) entry;
-                TmfTreeDataModel model = genericEntry.getModel();
-                OutputElementStyle style = model.getStyle();
-                if (style != null) {
-                    presProvider.setStyle(model.getId(), style);
-                }
-            }
-        }
-
-        updateContent();
-    }
-
-    @TmfSignalHandler
-    @Override
-    public void traceSelected(@Nullable TmfTraceSelectedSignal signal) {
-        super.traceSelected(signal);
-        clearContent();
-        fSelectedIds.clear();
-    }
-
-    @TmfSignalHandler
-    @Override
-    public void traceClosed(@Nullable TmfTraceClosedSignal signal) {
-        if (signal != null && signal.getTrace().equals(getTrace())) {
-            fSelectedIds.clear();
-        }
-        fUseDefaultStyleValues.remove(getPresentationProvider2());
-        super.traceClosed(signal);
-    }
-
-    @Override
-    protected @NonNull Map<String, Object> createQueryParameters(long start, long end, int nb) {
-        Map<@NonNull String, @NonNull Object> parameters = FetchParametersUtils.selectionTimeQueryToMap(new SelectionTimeQueryFilter(start, end, nb, fSelectedIds));
-        Multimap<@NonNull Integer, @NonNull String> regexesMap = getRegexes();
-        if (!regexesMap.isEmpty()) {
-            parameters.put(DataProviderParameterUtils.REGEX_MAP_FILTERS_KEY, regexesMap.asMap());
-        }
-        return parameters;
-    }
-
-    /**
-     * Get the IDs of the selected entries
-     *
-     * @return a collection of the IDs of the selected entries
-     */
-    public @NonNull Collection<@NonNull Long> getSelected() {
-        return fSelectedIds;
-    }
-
-    @Override
-    public @NonNull IYAppearance getSeriesAppearance(@NonNull String seriesName) {
-        return getPresentationProvider().getAppearance(seriesName, IYAppearance.Type.LINE, DEFAULT_SERIES_WIDTH);
-    }
-
-    @Override
-    public @NonNull OutputElementStyle getSeriesStyle(@NonNull Long seriesId) {
-        BaseXYPresentationProvider presentationProvider = getPresentationProvider2();
-        return fUseDefaultStyleValues.getOrDefault(presentationProvider, true) ? presentationProvider.getSeriesStyle(seriesId, IYAppearance.Type.LINE, DEFAULT_SERIES_WIDTH) : presentationProvider.getSeriesStyle(seriesId);
-    }
-
-    @Override
-    protected ITmfXYDataProvider initializeDataProvider(ITmfTrace trace) {
-        ITmfTreeXYDataProvider<?> dataProvider = DataProviderManager.getInstance().getDataProvider(trace, fId, ITmfTreeXYDataProvider.class);
-        BaseXYPresentationProvider presentationProvider = getPresentationProvider2();
-        fUseDefaultStyleValues.computeIfAbsent(presentationProvider, pp -> {
-            if (dataProvider instanceof IOutputStyleProvider) {
-                pp.addProvider(dataProvider);
-                return false;
-            }
-            return true;
-        });
-        return dataProvider;
-    }
-
-}
diff --git a/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/viewers/xycharts/linecharts/TmfXYChartSettings.java b/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/viewers/xycharts/linecharts/TmfXYChartSettings.java
deleted file mode 100644
index 24c2a57..0000000
--- a/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/viewers/xycharts/linecharts/TmfXYChartSettings.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/**********************************************************************
- * Copyright (c) 2017 Ericsson
- *
- * All rights reserved. This program and the accompanying materials are
- * made available under the terms of the Eclipse Public License 2.0 which
- * accompanies this distribution, and is available at
- * https://www.eclipse.org/legal/epl-2.0/
- *
- * SPDX-License-Identifier: EPL-2.0
- **********************************************************************/
-
-package org.eclipse.tracecompass.tmf.ui.viewers.xycharts.linecharts;
-
-/**
- * Contains UI settings about an XY chart. For instance, it contains its title,
- * x and y label and resolution.
- *
- * @author Yonni Chen
- * @since 3.2
- * @deprecated use {@link org.eclipse.tracecompass.tmf.ui.viewers.xychart.linechart.TmfXYChartSettings}
- */
-@Deprecated
-public class TmfXYChartSettings {
-
-    private final String fTitle;
-    private final String fXLabel;
-    private final String fYLabel;
-    private final double fResolution;
-
-    /**
-     * Constructor
-     *
-     * @param title
-     *            Chart's title
-     * @param xLabel
-     *            Label describing x axis
-     * @param yLabel
-     *            Label describing y axis
-     * @param resolution
-     *            Chart's resolution. Used to calculate a sampling on x axis. It
-     *            will be used to calculate number of nanoseconds between two points
-     *            of the sampling
-     */
-    public TmfXYChartSettings(String title, String xLabel, String yLabel, double resolution) {
-        fTitle = title;
-        fXLabel = xLabel;
-        fYLabel = yLabel;
-        fResolution = resolution;
-    }
-
-    /**
-     * Gets the chart's title
-     *
-     * @return The chart's title
-     */
-    public String getTitle() {
-        return fTitle;
-    }
-
-    /**
-     * Gets the label describing x axis
-     *
-     * @return The x label
-     */
-    public String getXLabel() {
-        return fXLabel;
-    }
-
-    /**
-     * Gets the label describing x axis
-     *
-     * @return The y label
-     */
-    public String getYLabel() {
-        return fYLabel;
-    }
-
-    /**
-     * Gets the chart's resolution
-     *
-     * @return The chart's resolution
-     */
-    public double getResolution() {
-        return fResolution;
-    }
-}
diff --git a/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/views/TmfChartView.java b/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/views/TmfChartView.java
deleted file mode 100644
index 90d7ef5..0000000
--- a/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/views/TmfChartView.java
+++ /dev/null
@@ -1,563 +0,0 @@
-/**********************************************************************
- * Copyright (c) 2013, 2019 Ericsson, Draeger, Auriga
- *
- * All rights reserved. This program and the accompanying materials are
- * made available under the terms of the Eclipse Public License 2.0 which
- * accompanies this distribution, and is available at
- * https://www.eclipse.org/legal/epl-2.0/
- *
- * SPDX-License-Identifier: EPL-2.0
- *
- * Contributors:
- *   Bernd Hufmann - Initial API and implementation
- **********************************************************************/
-package org.eclipse.tracecompass.tmf.ui.views;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.jdt.annotation.NonNull;
-import org.eclipse.jdt.annotation.Nullable;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.IStatusLineManager;
-import org.eclipse.jface.action.IToolBarManager;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.SashForm;
-import org.eclipse.swt.events.FocusEvent;
-import org.eclipse.swt.events.FocusListener;
-import org.eclipse.swt.events.MouseAdapter;
-import org.eclipse.swt.events.MouseEvent;
-import org.eclipse.swt.events.PaintEvent;
-import org.eclipse.swt.events.PaintListener;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.swt.widgets.Sash;
-import org.eclipse.tracecompass.internal.tmf.ui.Activator;
-import org.eclipse.tracecompass.internal.tmf.ui.ITmfImageConstants;
-import org.eclipse.tracecompass.internal.tmf.ui.Messages;
-import org.eclipse.tracecompass.internal.tmf.ui.viewers.xycharts.TmfXyUiUtils;
-import org.eclipse.tracecompass.internal.tmf.ui.views.LockRangeDialog;
-import org.eclipse.tracecompass.tmf.core.signal.TmfSignalHandler;
-import org.eclipse.tracecompass.tmf.core.signal.TmfSignalManager;
-import org.eclipse.tracecompass.tmf.core.signal.TmfTraceClosedSignal;
-import org.eclipse.tracecompass.tmf.core.signal.TmfTraceOpenedSignal;
-import org.eclipse.tracecompass.tmf.core.signal.TmfTraceSelectedSignal;
-import org.eclipse.tracecompass.tmf.core.signal.TmfWindowRangeUpdatedSignal;
-import org.eclipse.tracecompass.tmf.core.timestamp.TmfTimeRange;
-import org.eclipse.tracecompass.tmf.core.trace.ITmfTrace;
-import org.eclipse.tracecompass.tmf.core.trace.TmfTraceManager;
-import org.eclipse.tracecompass.tmf.ui.signal.TmfTimeViewAlignmentInfo;
-import org.eclipse.tracecompass.tmf.ui.signal.TmfTimeViewAlignmentSignal;
-import org.eclipse.tracecompass.tmf.ui.viewers.ILegendImageProvider;
-import org.eclipse.tracecompass.tmf.ui.viewers.TmfTimeViewer;
-import org.eclipse.tracecompass.tmf.ui.viewers.TmfViewer;
-import org.eclipse.tracecompass.tmf.ui.viewers.tree.AbstractSelectTreeViewer;
-import org.eclipse.tracecompass.tmf.ui.viewers.xycharts.TmfXYChartViewer;
-import org.eclipse.tracecompass.tmf.ui.viewers.xycharts.XYChartLegendImageProvider;
-import org.eclipse.tracecompass.tmf.ui.viewers.xycharts.linecharts.TmfCommonXAxisChartViewer;
-import org.eclipse.tracecompass.tmf.ui.viewers.xycharts.linecharts.TmfFilteredXYChartViewer;
-import org.eclipse.tracecompass.tmf.ui.widgets.timegraph.dialogs.TriStateFilteredCheckboxTree;
-import org.eclipse.ui.IWorkbenchActionConstants;
-import org.eclipse.ui.IWorkbenchPartSite;
-import org.eclipse.ui.contexts.IContextActivation;
-import org.eclipse.ui.contexts.IContextService;
-import org.swtchart.Chart;
-
-/**
- * Base class to be used with a chart viewer {@link TmfXYChartViewer}.
- * It is responsible to instantiate the viewer class and load the trace
- * into the viewer when the view is created.
- *
- * @author Bernd Hufmann
- * @author Mikael Ferland
- * @deprecated use {@link org.eclipse.tracecompass.tmf.ui.views.xychart.TmfChartView}
- */
-@Deprecated
-public abstract class TmfChartView extends TmfView implements ITmfTimeAligned, ITimeReset, ITmfPinnable, ITmfAllowMultiple {
-
-    private static final int[] DEFAULT_WEIGHTS = {1, 3};
-    private static final String TMF_VIEW_UI_CONTEXT = "org.eclipse.tracecompass.tmf.ui.view.context"; //$NON-NLS-1$
-
-    // ------------------------------------------------------------------------
-    // Attributes
-    // ------------------------------------------------------------------------
-    /** The TMF XY Chart reference */
-    private TmfXYChartViewer fChartViewer;
-    /** A composite that allows us to add margins */
-    private Composite fXYViewerContainer;
-    private TmfViewer fTmfViewer;
-    private SashForm fSashForm;
-    private Listener fSashDragListener;
-    /** The original view title */
-    private String fOriginalTabLabel;
-
-    private final Action fResetScaleAction = ResetUtil.createResetAction(this);
-    private Action fZoomInAction;
-    private Action fZoomOutAction;
-
-    private List<IContextActivation> fActiveContexts = new ArrayList<>();
-    private IContextService fContextService;
-
-    /** The clamp to the Y axis action */
-    private @Nullable IAction fClampAction = null;
-
-    // ------------------------------------------------------------------------
-    // Constructors
-    // ------------------------------------------------------------------------
-    /**
-     * Standard Constructor
-     *
-     * @param viewName
-     *            The view name
-     */
-    public TmfChartView(String viewName) {
-        super(viewName);
-    }
-
-    // ------------------------------------------------------------------------
-    // Accessors
-    // ------------------------------------------------------------------------
-    /**
-     * Returns the TMF XY chart viewer implementation.
-     *
-     * @return the TMF XY chart viewer {@link TmfXYChartViewer}
-     * @since 5.0
-     */
-    public TmfXYChartViewer getChartViewer() {
-        return fChartViewer;
-    }
-
-    /**
-     * Returns the left TMF viewer implementation.
-     *
-     * @return the left TMF viewer {@link TmfViewer}
-     * @since 5.0
-     */
-    public TmfViewer getLeftChildViewer() {
-        return fTmfViewer;
-    }
-
-    /**
-     * Create a {@link TmfViewer} instance to be added to the left composite
-     * of the sash. Default implementation provides an empty composite and
-     * don't overwrite this method if not needed.
-     *
-     * @param parent
-     *          the parent control
-     * @return a {@link TmfViewer} instance
-     * @since 2.0
-     */
-    protected @NonNull TmfViewer createLeftChildViewer(Composite parent) {
-        return new EmptyViewer(parent);
-    }
-
-    /**
-     * Create the TMF XY chart viewer implementation
-     *
-     * @param parent
-     *            the parent control
-     *
-     * @return The TMF XY chart viewer {@link TmfXYChartViewer}
-     * @since 1.0
-     */
-    abstract protected TmfXYChartViewer createChartViewer(Composite parent);
-
-    /**
-     * Returns the ITmfTrace implementation
-     *
-     * @return the ITmfTrace implementation {@link ITmfTrace}
-     * @since 3.3
-     */
-    @Override
-    public ITmfTrace getTrace() {
-        TmfXYChartViewer chartViewer = getChartViewer();
-        if (chartViewer != null) {
-            return chartViewer.getTrace();
-        }
-        return null;
-    }
-
-    // ------------------------------------------------------------------------
-    // Operations
-    // ------------------------------------------------------------------------
-    @Override
-    public void createPartControl(Composite parent) {
-        super.createPartControl(parent);
-        IMenuManager menuManager = getViewSite().getActionBars().getMenuManager();
-
-        fClampAction = createClampAction();
-        menuManager.add(new Separator());
-        menuManager.add(fClampAction);
-
-        fSashForm = new SashForm(parent, SWT.NONE);
-        fTmfViewer = createLeftChildViewer(fSashForm);
-        fXYViewerContainer = new Composite(fSashForm, SWT.NONE);
-        GridLayout layout = new GridLayout();
-        layout.marginHeight = 0;
-        layout.marginWidth = 0;
-        fXYViewerContainer.setLayout(layout);
-
-        fChartViewer = createChartViewer(fXYViewerContainer);
-        fChartViewer.setSendTimeAlignSignals(true);
-        fChartViewer.getControl().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
-
-        fChartViewer.getSwtChart().addMouseListener(new MouseAdapter() {
-            @Override
-            public void mouseDoubleClick(MouseEvent e) {
-                super.mouseDoubleClick(e);
-                resetStartFinishTime();
-            }
-        });
-
-        fChartViewer.getControl().addPaintListener(new PaintListener() {
-            @Override
-            public void paintControl(PaintEvent e) {
-                // Sashes in a SashForm are being created on layout so add the
-                // drag listener here
-                if (fSashDragListener == null) {
-                    for (Control control : fSashForm.getChildren()) {
-                        if (control instanceof Sash) {
-                            fSashDragListener = event -> TmfSignalManager.dispatchSignal(new TmfTimeViewAlignmentSignal(fSashForm, getTimeViewAlignmentInfo()));
-                            control.removePaintListener(this);
-                            control.addListener(SWT.Selection, fSashDragListener);
-                            // There should be only one sash
-                            break;
-                        }
-                    }
-                }
-            }
-        });
-        fSashForm.setWeights(DEFAULT_WEIGHTS);
-        fZoomInAction = getZoomInAction();
-        fZoomOutAction = getZoomOutAction();
-
-        IToolBarManager toolBarManager = getViewSite().getActionBars().getToolBarManager();
-        toolBarManager.appendToGroup(IWorkbenchActionConstants.MB_ADDITIONS, fResetScaleAction);
-        toolBarManager.appendToGroup(IWorkbenchActionConstants.MB_ADDITIONS, fZoomInAction);
-        toolBarManager.appendToGroup(IWorkbenchActionConstants.MB_ADDITIONS, fZoomOutAction);
-        ITmfTrace trace = TmfTraceManager.getInstance().getActiveTrace();
-        if (trace != null) {
-            loadTrace();
-        }
-
-        IStatusLineManager statusLineManager = getViewSite().getActionBars().getStatusLineManager();
-        fChartViewer.setStatusLineManager(statusLineManager);
-
-        fOriginalTabLabel = getPartName();
-        coupleSelectViewer();
-
-        IWorkbenchPartSite site = getSite();
-        fContextService = site.getWorkbenchWindow().getService(IContextService.class);
-
-        TmfXYChartViewer chartViewer = getChartViewer();
-        if (chartViewer != null) {
-            chartViewer.getControl().addFocusListener(new FocusListener() {
-                @Override
-                public void focusLost(FocusEvent e) {
-                    deactivateContextService();
-                }
-                @Override
-                public void focusGained(FocusEvent e) {
-                    activateContextService();
-                }
-            });
-        }
-    }
-
-    @Override
-    protected IAction createSaveAction() {
-        // FIXME export tree viewer or legend.
-        return SaveImageUtil.createSaveAction(getName(), this::getChartViewer);
-    }
-
-    @Override
-    public void dispose() {
-        super.dispose();
-        if (fChartViewer != null) {
-            fChartViewer.dispose();
-        }
-
-        if (fTmfViewer != null) {
-            fTmfViewer.dispose();
-        }
-    }
-
-    @Override
-    public void setFocus() {
-        fChartViewer.getControl().setFocus();
-        /* Force activation because focus gained event is not always received */
-        activateContextService();
-    }
-
-    /**
-     * Load the trace into view.
-     */
-    protected void loadTrace() {
-        // Initialize the tree viewer with the currently selected trace
-        ITmfTrace trace = TmfTraceManager.getInstance().getActiveTrace();
-        if (trace != null) {
-            TmfTraceSelectedSignal signal = new TmfTraceSelectedSignal(this, trace);
-            TmfViewer leftViewer = getLeftChildViewer();
-            if (leftViewer instanceof TmfTimeViewer) {
-                ((TmfTimeViewer) leftViewer).traceSelected(signal);
-            }
-            TmfXYChartViewer chartViewer = getChartViewer();
-            if (chartViewer != null) {
-                chartViewer.traceSelected(signal);
-            }
-        }
-    }
-
-    /**
-     * @since 1.0
-     */
-    @Override
-    public TmfTimeViewAlignmentInfo getTimeViewAlignmentInfo() {
-        if (fChartViewer == null) {
-            return null;
-        }
-
-        return new TmfTimeViewAlignmentInfo(fChartViewer.getControl().getShell(), fSashForm.toDisplay(0, 0), getTimeAxisOffset());
-    }
-
-    private int getTimeAxisOffset() {
-        return fSashForm.getChildren()[0].getSize().x + fSashForm.getSashWidth() + fChartViewer.getPointAreaOffset();
-    }
-
-    /**
-     * @since 1.0
-     */
-    @Override
-    public int getAvailableWidth(int requestedOffset) {
-        if (fChartViewer == null) {
-            return 0;
-        }
-
-        int pointAreaWidth = fChartViewer.getPointAreaWidth();
-        int curTimeAxisOffset = getTimeAxisOffset();
-        if (pointAreaWidth <= 0) {
-            pointAreaWidth = fSashForm.getBounds().width - curTimeAxisOffset;
-        }
-        int endOffset = curTimeAxisOffset + pointAreaWidth;
-        GridLayout layout = (GridLayout) fXYViewerContainer.getLayout();
-        int endOffsetWithoutMargin = endOffset + layout.marginRight;
-        int availableWidth = endOffsetWithoutMargin - requestedOffset;
-        availableWidth = Math.min(fSashForm.getBounds().width, Math.max(0, availableWidth));
-        return availableWidth;
-    }
-
-    /**
-     * @since 1.0
-     */
-    @Override
-    public void performAlign(int offset, int width) {
-        int total = fSashForm.getBounds().width;
-        int plotAreaOffset = fChartViewer.getPointAreaOffset();
-        int width1 = Math.max(0, offset - plotAreaOffset - fSashForm.getSashWidth());
-        int width2 = Math.max(0, total - width1 - fSashForm.getSashWidth());
-        if (width1 >= 0 && width2 > 0 || width1 > 0 && width2 >= 0) {
-            fSashForm.setWeights(new int[] { width1, width2 });
-            fSashForm.layout();
-        }
-
-        Composite composite = fXYViewerContainer;
-        GridLayout layout = (GridLayout) composite.getLayout();
-        int timeAxisWidth = getAvailableWidth(offset);
-        int marginSize = timeAxisWidth - width;
-        layout.marginRight = Math.max(0, marginSize);
-        composite.layout();
-    }
-
-    @Override
-    public void resetStartFinishTime(boolean notify) {
-        TmfWindowRangeUpdatedSignal signal = new TmfWindowRangeUpdatedSignal(this, TmfTimeRange.ETERNITY, getTrace());
-        if (notify) {
-            broadcast(signal);
-        } else {
-            getChartViewer().windowRangeUpdated(signal);
-        }
-    }
-
-    @Override
-    public void setPinned(@Nullable ITmfTrace trace) {
-
-        TmfViewer leftViewer = getLeftChildViewer();
-        if (leftViewer instanceof ITmfPinnable) {
-            ((ITmfPinnable) leftViewer).setPinned(trace);
-        }
-
-        ITmfPinnable chartViewer = getChartViewer();
-        if (chartViewer != null) {
-            chartViewer.setPinned(trace);
-        }
-
-        if (trace != null) {
-            /* Ignore relevant inbound signals */
-            TmfSignalManager.addIgnoredInboundSignal(this, TmfTraceOpenedSignal.class);
-            TmfSignalManager.addIgnoredInboundSignal(this, TmfTraceSelectedSignal.class);
-            setPartName(String.format("%s <%s>", fOriginalTabLabel, TmfTraceManager.getInstance().getTraceUniqueName(trace))); //$NON-NLS-1$
-        } else {
-            /* Handle relevant inbound signals */
-            TmfSignalManager.removeIgnoredInboundSignal(this, TmfTraceOpenedSignal.class);
-            TmfSignalManager.removeIgnoredInboundSignal(this, TmfTraceSelectedSignal.class);
-            setPartName(fOriginalTabLabel);
-        }
-        if (fPinAction != null) {
-            fPinAction.setPinnedTrace(trace);
-        }
-    }
-
-    private IAction createClampAction() {
-        Action action = new Action(Messages.TmfChartView_LockYAxis, IAction.AS_PUSH_BUTTON) {
-            @Override
-            public void run() {
-                LockRangeDialog rangeDialog = new LockRangeDialog(getSite().getShell(), getChartViewer());
-                rangeDialog.open();
-            }
-        };
-        action.setChecked(false);
-        return action;
-    }
-
-    // ------------------------------------------------------------------------
-    // Helpers
-    // ------------------------------------------------------------------------
-    /**
-     * Empty @{link TmfViewer} class.
-     */
-    private class EmptyViewer extends TmfViewer {
-        private Composite fComposite;
-        public EmptyViewer(Composite parent) {
-            super(parent);
-            fComposite = new Composite(parent, SWT.NONE);
-        }
-        @Override
-        public void refresh() {
-            // Do nothing
-        }
-        @Override
-        public Control getControl() {
-            return fComposite;
-        }
-    }
-
-    /**
-     * Returns whether or not this chart viewer is dirty. The viewer is considered
-     * dirty if it has yet to completely update its model. This method is meant to
-     * be used by tests in order to know when it is safe to proceed.
-     *
-     * @return true if the time graph view has yet to completely update its model,
-     *         false otherwise
-     * @since 3.2
-     */
-    public boolean isDirty() {
-        return fChartViewer.isDirty();
-    }
-
-    /**
-     * Handles the trace closed signal
-     *
-     * @param signal
-     *            the signal
-     * @since 3.3
-     */
-    @TmfSignalHandler
-    public void traceClosed(final TmfTraceClosedSignal signal) {
-        ITmfTrace trace = getTrace();
-        if ((trace == null || signal.getTrace() == trace) && isPinned()) {
-            setPinned(null);
-        }
-    }
-
-    /**
-     * Method to couple {@link AbstractSelectTreeViewer} and
-     * {@link TmfFilteredXYChartViewer} so that they use the same legend and that
-     * the chart listens to selected items in the tree
-     */
-    private void coupleSelectViewer() {
-        TmfViewer tree = getLeftChildViewer();
-        TmfXYChartViewer chart = getChartViewer();
-        if (tree instanceof AbstractSelectTreeViewer && chart instanceof TmfFilteredXYChartViewer) {
-            ILegendImageProvider legendImageProvider = new XYChartLegendImageProvider((TmfCommonXAxisChartViewer) chart);
-            AbstractSelectTreeViewer selectTree = (AbstractSelectTreeViewer) tree;
-            selectTree.addTreeListener((TmfFilteredXYChartViewer) chart);
-            selectTree.setLegendImageProvider(legendImageProvider);
-            TriStateFilteredCheckboxTree checkboxTree = selectTree.getTriStateFilteredCheckboxTree();
-            checkboxTree.addPreCheckStateListener(new ManyEntriesSelectedDialogPreCheckedListener(checkboxTree));
-        }
-    }
-
-    private void activateContextService() {
-        if (fActiveContexts.isEmpty()) {
-            fActiveContexts.add(fContextService.activateContext(TMF_VIEW_UI_CONTEXT));
-        }
-    }
-
-    private void deactivateContextService() {
-        fContextService.deactivateContexts(fActiveContexts);
-        fActiveContexts.clear();
-    }
-
-    @Override
-    public <T> T getAdapter(Class<T> adapter) {
-        TmfXYChartViewer chart = getChartViewer();
-        if (chart != null) {
-            return chart.getAdapter(adapter);
-        }
-        return super.getAdapter(adapter);
-    }
-
-    private Action getZoomInAction() {
-        Action zoomInAction = fZoomInAction;
-        if (zoomInAction == null) {
-            zoomInAction = new Action() {
-                @Override
-                public void run() {
-                    TmfXYChartViewer viewer = getChartViewer();
-                    if (viewer == null) {
-                        return;
-                    }
-                    Chart chart = viewer.getSwtChart();
-                    if (chart == null) {
-                        return;
-                    }
-                    TmfXyUiUtils.zoom(viewer, chart, true);
-                }
-            };
-            zoomInAction.setText(Messages.TmfTimeGraphViewer_ZoomInActionNameText);
-            zoomInAction.setToolTipText(Messages.TmfTimeGraphViewer_ZoomInActionToolTipText);
-            zoomInAction.setImageDescriptor(Activator.getDefault().getImageDescripterFromPath(ITmfImageConstants.IMG_UI_ZOOM_IN_MENU));
-        }
-        return zoomInAction;
-    }
-
-    private Action getZoomOutAction() {
-        Action zoomOutAction = fZoomOutAction;
-        if (zoomOutAction == null) {
-            zoomOutAction = new Action() {
-                @Override
-                public void run() {
-                    TmfXYChartViewer viewer = getChartViewer();
-                    if (viewer == null) {
-                        return;
-                    }
-                    Chart chart = viewer.getSwtChart();
-                    if (chart == null) {
-                        return;
-                    }
-                    TmfXyUiUtils.zoom(viewer, chart, false);
-                }
-            };
-            zoomOutAction.setText(Messages.TmfTimeGraphViewer_ZoomOutActionNameText);
-            zoomOutAction.setToolTipText(Messages.TmfTimeGraphViewer_ZoomOutActionToolTipText);
-            zoomOutAction.setImageDescriptor(Activator.getDefault().getImageDescripterFromPath(ITmfImageConstants.IMG_UI_ZOOM_OUT_MENU));
-        }
-        return zoomOutAction;
-    }
-}
