Merge branch 'master' into trace-server

Conflicts:
	analyses/org.eclipse.tracecompass.incubator.kernel.core/src/org/eclipse/tracecompass/incubator/internal/kernel/core/fileaccess/FileAccessDataProvider.java
	tracetypes/org.eclipse.tracecompass.incubator.ros.core/src/org/eclipse/tracecompass/incubator/internal/ros/core/analysis/connections/RosConnectionsDataProvider.java
	tracetypes/org.eclipse.tracecompass.incubator.ros.core/src/org/eclipse/tracecompass/incubator/internal/ros/core/analysis/nodes/RosNodesDataProvider.java

Change-Id: I9dc2f59bd296cba1cfbc54d2dd20e39f7553187a
Signed-off-by: Simon Delisle <simon.delisle@ericsson.com>
diff --git a/analyses/org.eclipse.tracecompass.incubator.kernel.core/src/org/eclipse/tracecompass/incubator/internal/kernel/core/fileaccess/FileAccessDataProvider.java b/analyses/org.eclipse.tracecompass.incubator.kernel.core/src/org/eclipse/tracecompass/incubator/internal/kernel/core/fileaccess/FileAccessDataProvider.java
index d2cf6e1..8c03d86 100644
--- a/analyses/org.eclipse.tracecompass.incubator.kernel.core/src/org/eclipse/tracecompass/incubator/internal/kernel/core/fileaccess/FileAccessDataProvider.java
+++ b/analyses/org.eclipse.tracecompass.incubator.kernel.core/src/org/eclipse/tracecompass/incubator/internal/kernel/core/fileaccess/FileAccessDataProvider.java
@@ -20,9 +20,9 @@
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Map.Entry;
 import java.util.Objects;
 import java.util.Set;
-import java.util.Map.Entry;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.function.Predicate;
 import java.util.regex.Pattern;
@@ -37,12 +37,13 @@
 import org.eclipse.tracecompass.incubator.internal.kernel.core.filedescriptor.FileDescriptorStateProvider;
 import org.eclipse.tracecompass.incubator.internal.kernel.core.filedescriptor.ThreadEntryModel;
 import org.eclipse.tracecompass.incubator.internal.kernel.core.filedescriptor.TidTimeQueryFilter;
-import org.eclipse.tracecompass.internal.tmf.core.model.filters.TimeGraphStateQueryFilter;
+import org.eclipse.tracecompass.internal.tmf.core.model.filters.FetchParametersUtils;
 import org.eclipse.tracecompass.internal.tmf.core.model.timegraph.AbstractTimeGraphDataProvider;
 import org.eclipse.tracecompass.statesystem.core.ITmfStateSystem;
 import org.eclipse.tracecompass.statesystem.core.exceptions.AttributeNotFoundException;
 import org.eclipse.tracecompass.statesystem.core.exceptions.StateSystemDisposedException;
 import org.eclipse.tracecompass.statesystem.core.interval.ITmfStateInterval;
+import org.eclipse.tracecompass.tmf.core.dataprovider.DataProviderParameterUtils;
 import org.eclipse.tracecompass.tmf.core.model.CommonStatusMessage;
 import org.eclipse.tracecompass.tmf.core.model.filters.SelectionTimeQueryFilter;
 import org.eclipse.tracecompass.tmf.core.model.filters.TimeQueryFilter;
@@ -50,14 +51,16 @@
 import org.eclipse.tracecompass.tmf.core.model.timegraph.ITimeGraphRowModel;
 import org.eclipse.tracecompass.tmf.core.model.timegraph.ITimeGraphState;
 import org.eclipse.tracecompass.tmf.core.model.timegraph.TimeGraphEntryModel;
+import org.eclipse.tracecompass.tmf.core.model.timegraph.TimeGraphModel;
 import org.eclipse.tracecompass.tmf.core.model.timegraph.TimeGraphRowModel;
 import org.eclipse.tracecompass.tmf.core.model.timegraph.TimeGraphState;
+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.trace.ITmfTrace;
 
-import com.google.common.collect.ImmutableList.Builder;
 import com.google.common.collect.HashMultimap;
+import com.google.common.collect.ImmutableList.Builder;
 import com.google.common.collect.Multimap;
 import com.google.common.collect.Sets;
 import com.google.common.collect.TreeMultimap;
@@ -97,8 +100,15 @@
         super(trace, analysisModule);
     }
 
+    @Deprecated
     @Override
     public @NonNull TmfModelResponse<@NonNull List<@NonNull ITimeGraphArrow>> fetchArrows(@NonNull TimeQueryFilter filter, @Nullable IProgressMonitor monitor) {
+        Map<String, Object> parameters = FetchParametersUtils.timeQueryToMap(filter);
+        return fetchArrows(parameters, monitor);
+    }
+
+    @Override
+    public TmfModelResponse<List<ITimeGraphArrow>> fetchArrows(Map<String, Object> fetchParameters, @Nullable IProgressMonitor monitor) {
         return new TmfModelResponse<>(null, ITmfResponse.Status.COMPLETED, CommonStatusMessage.COMPLETED);
     }
 
@@ -108,7 +118,11 @@
     }
 
     @Override
-    protected @Nullable List<ITimeGraphRowModel> getRowModel(ITmfStateSystem ss, SelectionTimeQueryFilter filter, @Nullable IProgressMonitor monitor) throws StateSystemDisposedException {
+    protected @Nullable TimeGraphModel getRowModel(ITmfStateSystem ss, Map<String, Object> parameters, @Nullable IProgressMonitor monitor) throws StateSystemDisposedException {
+        SelectionTimeQueryFilter filter = FetchParametersUtils.createSelectionTimeQuery(parameters);
+        if (filter == null) {
+            return null;
+        }
         TreeMultimap<Integer, ITmfStateInterval> intervals = TreeMultimap.create(Comparator.naturalOrder(),
                 Comparator.comparing(ITmfStateInterval::getStartTime));
         Map<@NonNull Long, @NonNull Integer> entries = getSelectedEntries(filter);
@@ -116,19 +130,19 @@
         /* Do the actual query */
         for (ITmfStateInterval interval : ss.query2D(entries.values(), times)) {
             if (monitor != null && monitor.isCanceled()) {
-                return Collections.emptyList();
+                return new TimeGraphModel(Collections.emptyList());
             }
             intervals.put(interval.getAttribute(), interval);
         }
         Map<@NonNull Integer, @NonNull Predicate<@NonNull Multimap<@NonNull String, @NonNull String>>> predicates = new HashMap<>();
-        if (filter instanceof TimeGraphStateQueryFilter) {
-            TimeGraphStateQueryFilter timeEventFilter = (TimeGraphStateQueryFilter) filter;
-            predicates.putAll(computeRegexPredicate(timeEventFilter));
+        Multimap<@NonNull Integer, @NonNull String> regexesMap = DataProviderParameterUtils.extractRegexFilter(parameters);
+        if (regexesMap != null) {
+            predicates.putAll(computeRegexPredicate(regexesMap));
         }
         List<@NonNull ITimeGraphRowModel> rows = new ArrayList<>();
         for (Map.Entry<@NonNull Long, @NonNull Integer> entry : entries.entrySet()) {
             if (monitor != null && monitor.isCanceled()) {
-                return Collections.emptyList();
+                return new TimeGraphModel(Collections.emptyList());
             }
 
             List<ITimeGraphState> eventList = new ArrayList<>();
@@ -162,7 +176,7 @@
             rows.add(new TimeGraphRowModel(entry.getKey(), eventList));
 
         }
-        return rows;
+        return new TimeGraphModel(rows);
     }
 
     @Override
@@ -170,9 +184,20 @@
         return false;
     }
 
+    @Deprecated
     @Override
     public TmfModelResponse<Map<String, String>> fetchTooltip(SelectionTimeQueryFilter filter, @Nullable IProgressMonitor monitor) {
+        Map<String, Object> parameters = FetchParametersUtils.selectionTimeQueryToMap(filter);
+        return fetchTooltip(parameters, monitor);
+    }
+
+    @Override
+    public TmfModelResponse<Map<String, String>> fetchTooltip(Map<String, Object> fetchParameters, @Nullable IProgressMonitor monitor) {
         ITmfStateSystem ss = getAnalysisModule().getStateSystem();
+        SelectionTimeQueryFilter filter = FetchParametersUtils.createSelectionTimeQuery(fetchParameters);
+        if (filter == null) {
+            return new TmfModelResponse<>(null, ITmfResponse.Status.FAILED, CommonStatusMessage.INCORRECT_QUERY_PARAMETERS);
+        }
         Collection<@NonNull Integer> quarks = getSelectedEntries(filter).values();
         Map<String, String> retMap = new LinkedHashMap<>();
 
@@ -183,8 +208,8 @@
         long start = filter.getStart();
         if (ss == null || quarks.size() != 1 || !getAnalysisModule().isQueryable(start)) {
             /*
-             * We need the ss to query, we should only be querying one attribute and the
-             * query times should be valid.
+             * We need the ss to query, we should only be querying one attribute
+             * and the query times should be valid.
              */
             return new TmfModelResponse<>(retMap, ITmfResponse.Status.COMPLETED, CommonStatusMessage.COMPLETED);
         }
@@ -198,7 +223,8 @@
             }
             int parentQuark = ss.getParentAttributeQuark(quark);
             if (parentQuark == resQuark) {
-                // This is a file name, add the number of opened fd and full file name
+                // This is a file name, add the number of opened fd and full
+                // file name
                 String fileName = ss.getAttributeName(quark);
                 retMap.put("File Name", fileName); //$NON-NLS-1$
                 Object value = current.getValue();
@@ -230,8 +256,10 @@
 
 
     @Override
-    protected List<TimeGraphEntryModel> getTree(ITmfStateSystem ss, TimeQueryFilter filter, @Nullable IProgressMonitor monitor) throws StateSystemDisposedException {
+    protected TmfTreeModel<TimeGraphEntryModel> getTree(ITmfStateSystem ss, Map<String, Object> parameters, @Nullable IProgressMonitor monitor) throws StateSystemDisposedException {
         Collection<Integer> selectedTids = Collections.emptySet();
+        // TODO Why not SelectionTimeQueryFilter ?
+        TimeQueryFilter filter = FetchParametersUtils.createTimeQuery(parameters);
         if (filter instanceof TidTimeQueryFilter) {
             selectedTids = ((TidTimeQueryFilter) filter).getTids();
         }
@@ -245,7 +273,7 @@
             Activator.getInstance().logError(e.getMessage(), e);
         }
 
-        return builder.build();
+        return new TmfTreeModel<>(Collections.emptyList(), builder.build());
     }
 
     private void addResources(ITmfStateSystem ss, Builder<@NonNull TimeGraphEntryModel> builder, int quark, long parentId, Collection<Integer> filter) {
diff --git a/analyses/org.eclipse.tracecompass.incubator.kernel.ui/src/org/eclipse/tracecompass/incubator/internal/kernel/ui/views/fileaccess/FileAccessByFileView.java b/analyses/org.eclipse.tracecompass.incubator.kernel.ui/src/org/eclipse/tracecompass/incubator/internal/kernel/ui/views/fileaccess/FileAccessByFileView.java
index 26e9034..2f20a37 100644
--- a/analyses/org.eclipse.tracecompass.incubator.kernel.ui/src/org/eclipse/tracecompass/incubator/internal/kernel/ui/views/fileaccess/FileAccessByFileView.java
+++ b/analyses/org.eclipse.tracecompass.incubator.kernel.ui/src/org/eclipse/tracecompass/incubator/internal/kernel/ui/views/fileaccess/FileAccessByFileView.java
@@ -42,6 +42,7 @@
 import org.eclipse.tracecompass.incubator.internal.kernel.core.filedescriptor.TidTimeQueryFilter;
 import org.eclipse.tracecompass.incubator.internal.kernel.ui.Activator;
 import org.eclipse.tracecompass.internal.analysis.os.linux.ui.actions.FollowThreadAction;
+import org.eclipse.tracecompass.internal.tmf.core.model.filters.FetchParametersUtils;
 import org.eclipse.tracecompass.tmf.core.dataprovider.DataProviderManager;
 import org.eclipse.tracecompass.tmf.core.model.filters.SelectionTimeQueryFilter;
 import org.eclipse.tracecompass.tmf.core.model.filters.TimeQueryFilter;
@@ -244,7 +245,8 @@
                 TimeGraphEntry entry = (TimeGraphEntry) event.getEntry();
                 ITimeGraphDataProvider<? extends TimeGraphEntryModel> dataProvider = BaseDataProviderTimeGraphView.getProvider(entry);
                 TmfModelResponse<@NonNull Map<@NonNull String, @NonNull String>> response = dataProvider.fetchTooltip(
-                        new SelectionTimeQueryFilter(hoverTime, hoverTime, 1, Collections.singletonList(entry.getModel().getId())), null);
+                        FetchParametersUtils.selectionTimeQueryToMap(new SelectionTimeQueryFilter(hoverTime, hoverTime, 1, Collections.singletonList(entry.getModel().getId()))),
+                        null);
                 Map<@NonNull String, @NonNull String> map = response.getModel();
                 if (map != null) {
                     retMap.putAll(map);
diff --git a/callstack/org.eclipse.tracecompass.incubator.callstack.core.tests/src/org/eclipse/tracecompass/incubator/callstack/core/tests/flamechart/FlameChartDataProviderTest.java b/callstack/org.eclipse.tracecompass.incubator.callstack.core.tests/src/org/eclipse/tracecompass/incubator/callstack/core/tests/flamechart/FlameChartDataProviderTest.java
index 5b010b8..1dd2367 100644
--- a/callstack/org.eclipse.tracecompass.incubator.callstack.core.tests/src/org/eclipse/tracecompass/incubator/callstack/core/tests/flamechart/FlameChartDataProviderTest.java
+++ b/callstack/org.eclipse.tracecompass.incubator.callstack.core.tests/src/org/eclipse/tracecompass/incubator/callstack/core/tests/flamechart/FlameChartDataProviderTest.java
@@ -32,11 +32,14 @@
 import org.eclipse.tracecompass.incubator.internal.callstack.core.instrumented.provider.FlameChartDataProviderFactory;
 import org.eclipse.tracecompass.incubator.internal.callstack.core.instrumented.provider.FlameChartEntryModel;
 import org.eclipse.tracecompass.incubator.internal.callstack.core.instrumented.provider.FlameChartEntryModel.EntryType;
+import org.eclipse.tracecompass.internal.tmf.core.model.filters.FetchParametersUtils;
 import org.eclipse.tracecompass.tmf.core.model.filters.SelectionTimeQueryFilter;
 import org.eclipse.tracecompass.tmf.core.model.filters.TimeQueryFilter;
 import org.eclipse.tracecompass.tmf.core.model.timegraph.ITimeGraphRowModel;
 import org.eclipse.tracecompass.tmf.core.model.timegraph.ITimeGraphState;
+import org.eclipse.tracecompass.tmf.core.model.timegraph.TimeGraphModel;
 import org.eclipse.tracecompass.tmf.core.model.timegraph.TimeGraphState;
+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.junit.Test;
@@ -71,19 +74,20 @@
     public void testFetchTree() {
         FlameChartDataProvider dataProvider = getDataProvider();
 
-        TmfModelResponse<List<FlameChartEntryModel>> responseTree = dataProvider.fetchTree(new TimeQueryFilter(0, Long.MAX_VALUE, 2), new NullProgressMonitor());
+        TmfModelResponse<@NonNull TmfTreeModel<@NonNull FlameChartEntryModel>> responseTree = dataProvider.fetchTree(FetchParametersUtils.timeQueryToMap(new TimeQueryFilter(0, Long.MAX_VALUE, 2)), new NullProgressMonitor());
         assertTrue(responseTree.getStatus().equals(ITmfResponse.Status.COMPLETED));
 
         // Test the size of the tree
-        List<FlameChartEntryModel> model = responseTree.getModel();
+        TmfTreeModel<@NonNull FlameChartEntryModel> model = responseTree.getModel();
         assertNotNull(model);
-        assertEquals(18, model.size());
+        List<@NonNull FlameChartEntryModel> modelEntries = model.getEntries();
+        assertEquals(18, modelEntries.size());
 
         String traceName = getTrace().getName();
 
         // Test the hierarchy of the tree
-        for (FlameChartEntryModel entry : model) {
-            FlameChartEntryModel parent = findEntryById(model, entry.getParentId());
+        for (FlameChartEntryModel entry : modelEntries) {
+            FlameChartEntryModel parent = findEntryById(modelEntries, entry.getParentId());
             switch (entry.getEntryType()) {
             case FUNCTION:
                 assertNotNull(parent);
@@ -161,63 +165,65 @@
     public void testFetchModel() {
         FlameChartDataProvider dataProvider = getDataProvider();
 
-        TmfModelResponse<List<FlameChartEntryModel>> responseTree = dataProvider.fetchTree(new TimeQueryFilter(0, Long.MAX_VALUE, 2), new NullProgressMonitor());
+        TmfModelResponse<@NonNull TmfTreeModel<@NonNull FlameChartEntryModel>> responseTree = dataProvider.fetchTree(FetchParametersUtils.timeQueryToMap(new TimeQueryFilter(0, Long.MAX_VALUE, 2)), new NullProgressMonitor());
         assertTrue(responseTree.getStatus().equals(ITmfResponse.Status.COMPLETED));
-        List<FlameChartEntryModel> model = responseTree.getModel();
-
+        TmfTreeModel<@NonNull FlameChartEntryModel> model = responseTree.getModel();
+        assertNotNull(model);
+        List<@NonNull FlameChartEntryModel> modelEntries = model.getEntries();
         // Find the entries corresponding to threads 3 and 6 (along with pid 5)
         Set<@NonNull Long> selectedIds = new HashSet<>();
         // Thread 3
-        FlameChartEntryModel tid3 = findEntryByNameAndType(model, "3", EntryType.LEVEL);
+        FlameChartEntryModel tid3 = findEntryByNameAndType(modelEntries, "3", EntryType.LEVEL);
         assertNotNull(tid3);
         selectedIds.add(tid3.getId());
-        List<FlameChartEntryModel> tid3Children = findEntriesByParent(model, tid3.getId());
+        List<FlameChartEntryModel> tid3Children = findEntriesByParent(modelEntries, tid3.getId());
         assertEquals(2, tid3Children.size());
         tid3Children.forEach(child -> selectedIds.add(child.getId()));
         // Pid 5
-        FlameChartEntryModel pid5 = findEntryByNameAndType(model, "5", EntryType.LEVEL);
+        FlameChartEntryModel pid5 = findEntryByNameAndType(modelEntries, "5", EntryType.LEVEL);
         assertNotNull(pid5);
         selectedIds.add(pid5.getId());
         // Thread 6
-        FlameChartEntryModel tid6 = findEntryByNameAndType(model, "6", EntryType.LEVEL);
+        FlameChartEntryModel tid6 = findEntryByNameAndType(modelEntries, "6", EntryType.LEVEL);
         assertNotNull(tid6);
         selectedIds.add(tid6.getId());
-        List<FlameChartEntryModel> tid6Children = findEntriesByParent(model, tid6.getId());
+        List<FlameChartEntryModel> tid6Children = findEntriesByParent(modelEntries, tid6.getId());
         assertEquals(3, tid6Children.size());
         tid6Children.forEach(child -> selectedIds.add(child.getId()));
 
         // Get the row model for those entries with high resolution
-        TmfModelResponse<List<ITimeGraphRowModel>> rowModel = dataProvider.fetchRowModel(new SelectionTimeQueryFilter(3, 15, 50, selectedIds), new NullProgressMonitor());
-        assertEquals(ITmfResponse.Status.COMPLETED, rowModel.getStatus());
+        TmfModelResponse<@NonNull TimeGraphModel> rowResponse = dataProvider.fetchRowModel(FetchParametersUtils.selectionTimeQueryToMap(new SelectionTimeQueryFilter(3, 15, 50, selectedIds)), new NullProgressMonitor());
+        assertEquals(ITmfResponse.Status.COMPLETED, rowResponse.getStatus());
 
-        List<ITimeGraphRowModel> rowModels = rowModel.getModel();
-        assertNotNull(rowModels);
-        assertEquals(8, rowModels.size());
+        TimeGraphModel rowModel = rowResponse.getModel();
+        assertNotNull(rowModel);
+        List<@NonNull ITimeGraphRowModel> rows = rowModel.getRows();
+        assertEquals(8, rows.size());
 
         // Verify the level entries
-        verifyStates(rowModels, tid3, Collections.emptyList());
-        verifyStates(rowModels, pid5, Collections.emptyList());
-        verifyStates(rowModels, tid6, Collections.emptyList());
+        verifyStates(rows, tid3, Collections.emptyList());
+        verifyStates(rows, pid5, Collections.emptyList());
+        verifyStates(rows, tid6, Collections.emptyList());
         // Verify function level 1 of tid 3
-        verifyStates(rowModels, findEntryByDepthAndType(tid3Children, 1, EntryType.FUNCTION), ImmutableList.of(new TimeGraphState(3, 17, Integer.MIN_VALUE, "op2")));
+        verifyStates(rows, findEntryByDepthAndType(tid3Children, 1, EntryType.FUNCTION), ImmutableList.of(new TimeGraphState(3, 17, Integer.MIN_VALUE, "op2")));
         // Verify function level 2 of tid 3
-        verifyStates(rowModels, findEntryByDepthAndType(tid3Children, 2, EntryType.FUNCTION), ImmutableList.of(
+        verifyStates(rows, findEntryByDepthAndType(tid3Children, 2, EntryType.FUNCTION), ImmutableList.of(
                 new TimeGraphState(1, 4, Integer.MIN_VALUE),
                 new TimeGraphState(5, 1, Integer.MIN_VALUE, "op3"),
                 new TimeGraphState(6, 1, Integer.MIN_VALUE),
                 new TimeGraphState(7, 6, Integer.MIN_VALUE, "op2"),
                 new TimeGraphState(13, 8, Integer.MIN_VALUE)));
         // Verify function level 1 of tid 6
-        verifyStates(rowModels, findEntryByDepthAndType(tid6Children, 1, EntryType.FUNCTION), ImmutableList.of(new TimeGraphState(1, 19, Integer.MIN_VALUE, "op1")));
+        verifyStates(rows, findEntryByDepthAndType(tid6Children, 1, EntryType.FUNCTION), ImmutableList.of(new TimeGraphState(1, 19, Integer.MIN_VALUE, "op1")));
         // Verify function level 2 of tid 6
-        verifyStates(rowModels, findEntryByDepthAndType(tid6Children, 2, EntryType.FUNCTION), ImmutableList.of(
+        verifyStates(rows, findEntryByDepthAndType(tid6Children, 2, EntryType.FUNCTION), ImmutableList.of(
                 new TimeGraphState(2, 5, Integer.MIN_VALUE, "op3"),
                 new TimeGraphState(7, 1, Integer.MIN_VALUE),
                 new TimeGraphState(8, 3, Integer.MIN_VALUE, "op2"),
                 new TimeGraphState(11, 1, Integer.MIN_VALUE),
                 new TimeGraphState(12, 8, Integer.MIN_VALUE, "op4")));
         // Verify function level 3 of tid 6
-        verifyStates(rowModels, findEntryByDepthAndType(tid6Children, 3, EntryType.FUNCTION), ImmutableList.of(
+        verifyStates(rows, findEntryByDepthAndType(tid6Children, 3, EntryType.FUNCTION), ImmutableList.of(
                 new TimeGraphState(1, 3, Integer.MIN_VALUE),
                 new TimeGraphState(4, 2, Integer.MIN_VALUE, "op1"),
                 new TimeGraphState(6, 3, Integer.MIN_VALUE),
@@ -225,31 +231,32 @@
                 new TimeGraphState(10, 11, Integer.MIN_VALUE)));
 
         // Get the row model for those entries with low resolution
-        rowModel = dataProvider.fetchRowModel(new SelectionTimeQueryFilter(3, 15, 2, selectedIds), new NullProgressMonitor());
-        assertEquals(ITmfResponse.Status.COMPLETED, rowModel.getStatus());
+        rowResponse = dataProvider.fetchRowModel(FetchParametersUtils.selectionTimeQueryToMap(new SelectionTimeQueryFilter(3, 15, 2, selectedIds)), new NullProgressMonitor());
+        assertEquals(ITmfResponse.Status.COMPLETED, rowResponse.getStatus());
 
-        rowModels = rowModel.getModel();
-        assertNotNull(rowModels);
-        assertEquals(8, rowModels.size());
+        rowModel = rowResponse.getModel();
+        assertNotNull(rowModel);
+        rows = rowModel.getRows();
+        assertEquals(8, rows.size());
 
         // Verify the level entries
-        verifyStates(rowModels, tid3, Collections.emptyList());
-        verifyStates(rowModels, pid5, Collections.emptyList());
-        verifyStates(rowModels, tid6, Collections.emptyList());
+        verifyStates(rows, tid3, Collections.emptyList());
+        verifyStates(rows, pid5, Collections.emptyList());
+        verifyStates(rows, tid6, Collections.emptyList());
         // Verify function level 1 of tid 3
-        verifyStates(rowModels, findEntryByDepthAndType(tid3Children, 1, EntryType.FUNCTION), ImmutableList.of(new TimeGraphState(3, 17, Integer.MIN_VALUE, "op2")));
+        verifyStates(rows, findEntryByDepthAndType(tid3Children, 1, EntryType.FUNCTION), ImmutableList.of(new TimeGraphState(3, 17, Integer.MIN_VALUE, "op2")));
         // Verify function level 2 of tid 3
-        verifyStates(rowModels, findEntryByDepthAndType(tid3Children, 2, EntryType.FUNCTION), ImmutableList.of(
+        verifyStates(rows, findEntryByDepthAndType(tid3Children, 2, EntryType.FUNCTION), ImmutableList.of(
                 new TimeGraphState(1, 4, Integer.MIN_VALUE),
                 new TimeGraphState(13, 8, Integer.MIN_VALUE)));
         // Verify function level 1 of tid 6
-        verifyStates(rowModels, findEntryByDepthAndType(tid6Children, 1, EntryType.FUNCTION), ImmutableList.of(new TimeGraphState(1, 19, Integer.MIN_VALUE, "op1")));
+        verifyStates(rows, findEntryByDepthAndType(tid6Children, 1, EntryType.FUNCTION), ImmutableList.of(new TimeGraphState(1, 19, Integer.MIN_VALUE, "op1")));
         // Verify function level 2 of tid 6
-        verifyStates(rowModels, findEntryByDepthAndType(tid6Children, 2, EntryType.FUNCTION), ImmutableList.of(
+        verifyStates(rows, findEntryByDepthAndType(tid6Children, 2, EntryType.FUNCTION), ImmutableList.of(
                 new TimeGraphState(2, 5, Integer.MIN_VALUE, "op3"),
                 new TimeGraphState(12, 8, Integer.MIN_VALUE, "op4")));
         // Verify function level 3 of tid 6
-        verifyStates(rowModels, findEntryByDepthAndType(tid6Children, 3, EntryType.FUNCTION), ImmutableList.of(
+        verifyStates(rows, findEntryByDepthAndType(tid6Children, 3, EntryType.FUNCTION), ImmutableList.of(
                 new TimeGraphState(1, 3, Integer.MIN_VALUE),
                 new TimeGraphState(10, 11, Integer.MIN_VALUE)));
     }
@@ -261,68 +268,71 @@
     public void testFollowEvents() {
         FlameChartDataProvider dataProvider = getDataProvider();
 
-        TmfModelResponse<List<FlameChartEntryModel>> responseTree = dataProvider.fetchTree(new TimeQueryFilter(0, Long.MAX_VALUE, 2), new NullProgressMonitor());
+        TmfModelResponse<@NonNull TmfTreeModel<@NonNull FlameChartEntryModel>> responseTree = dataProvider.fetchTree(FetchParametersUtils.timeQueryToMap(new TimeQueryFilter(0, Long.MAX_VALUE, 2)), new NullProgressMonitor());
         assertTrue(responseTree.getStatus().equals(ITmfResponse.Status.COMPLETED));
-        List<FlameChartEntryModel> model = responseTree.getModel();
+        TmfTreeModel<@NonNull FlameChartEntryModel> model = responseTree.getModel();
+        assertNotNull(model);
+        List<@NonNull FlameChartEntryModel> modelEntries = model.getEntries();
 
         // Thread 2
-        FlameChartEntryModel tid2 = findEntryByNameAndType(model, "2", EntryType.LEVEL);
+        FlameChartEntryModel tid2 = findEntryByNameAndType(modelEntries, "2", EntryType.LEVEL);
         assertNotNull(tid2);
-        List<FlameChartEntryModel> tid2Children = findEntriesByParent(model, tid2.getId());
+        List<FlameChartEntryModel> tid2Children = findEntriesByParent(modelEntries, tid2.getId());
         assertEquals(3, tid2Children.size());
 
         // For each child, make sure the response is always the same
         for (FlameChartEntryModel tid2Child : tid2Children) {
-            TmfModelResponse<List<ITimeGraphRowModel>> rowModel = dataProvider.fetchRowModel(new SelectionTimeQueryFilter(6, Long.MAX_VALUE, 2, Collections.singleton(tid2Child.getId())), MONITOR);
+            TmfModelResponse<@NonNull TimeGraphModel> rowModel = dataProvider.fetchRowModel(FetchParametersUtils.selectionTimeQueryToMap(new SelectionTimeQueryFilter(6, Long.MAX_VALUE, 2, Collections.singleton(tid2Child.getId()))), MONITOR);
             verifyFollowResponse(rowModel, 1, 7);
         }
 
         // Go forward from time 7 till the end for one of the child element
         Set<@NonNull Long> selectedEntry = Objects.requireNonNull(Collections.singleton(tid2Children.get(1).getId()));
-        TmfModelResponse<List<ITimeGraphRowModel>> rowModel = dataProvider.fetchRowModel(new SelectionTimeQueryFilter(7, Long.MAX_VALUE, 2, selectedEntry), MONITOR);
+        TmfModelResponse<@NonNull TimeGraphModel> rowModel = dataProvider.fetchRowModel(FetchParametersUtils.selectionTimeQueryToMap(new SelectionTimeQueryFilter(7, Long.MAX_VALUE, 2, selectedEntry)), MONITOR);
         verifyFollowResponse(rowModel, 0, 10);
 
-        rowModel = dataProvider.fetchRowModel(new SelectionTimeQueryFilter(10, Long.MAX_VALUE, 2, selectedEntry), new NullProgressMonitor());
+        rowModel = dataProvider.fetchRowModel(FetchParametersUtils.selectionTimeQueryToMap(new SelectionTimeQueryFilter(10, Long.MAX_VALUE, 2, selectedEntry)), new NullProgressMonitor());
         verifyFollowResponse(rowModel, 1, 12);
 
-        rowModel = dataProvider.fetchRowModel(new SelectionTimeQueryFilter(12, Long.MAX_VALUE, 2, selectedEntry), new NullProgressMonitor());
+        rowModel = dataProvider.fetchRowModel(FetchParametersUtils.selectionTimeQueryToMap(new SelectionTimeQueryFilter(12, Long.MAX_VALUE, 2, selectedEntry)), new NullProgressMonitor());
         verifyFollowResponse(rowModel, 0, 20);
 
-        rowModel = dataProvider.fetchRowModel(new SelectionTimeQueryFilter(20, Long.MAX_VALUE, 2, selectedEntry), new NullProgressMonitor());
+        rowModel = dataProvider.fetchRowModel(FetchParametersUtils.selectionTimeQueryToMap(new SelectionTimeQueryFilter(20, Long.MAX_VALUE, 2, selectedEntry)), new NullProgressMonitor());
         verifyFollowResponse(rowModel, -1, -1);
 
         // Go backward from the back
-        rowModel = dataProvider.fetchRowModel(new SelectionTimeQueryFilter(Lists.newArrayList(Long.MIN_VALUE, 20L), selectedEntry), new NullProgressMonitor());
+        rowModel = dataProvider.fetchRowModel(FetchParametersUtils.selectionTimeQueryToMap(new SelectionTimeQueryFilter(Lists.newArrayList(Long.MIN_VALUE, 20L), selectedEntry)), new NullProgressMonitor());
         verifyFollowResponse(rowModel, 1, 12);
 
         // Go backward from time 7 till the beginning
-        rowModel = dataProvider.fetchRowModel(new SelectionTimeQueryFilter(Lists.newArrayList(Long.MIN_VALUE, 7L), selectedEntry), new NullProgressMonitor());
+        rowModel = dataProvider.fetchRowModel(FetchParametersUtils.selectionTimeQueryToMap(new SelectionTimeQueryFilter(Lists.newArrayList(Long.MIN_VALUE, 7L), selectedEntry)), new NullProgressMonitor());
         verifyFollowResponse(rowModel, 2, 5);
 
-        rowModel = dataProvider.fetchRowModel(new SelectionTimeQueryFilter(Lists.newArrayList(Long.MIN_VALUE, 5L), selectedEntry), new NullProgressMonitor());
+        rowModel = dataProvider.fetchRowModel(FetchParametersUtils.selectionTimeQueryToMap(new SelectionTimeQueryFilter(Lists.newArrayList(Long.MIN_VALUE, 5L), selectedEntry)), new NullProgressMonitor());
         verifyFollowResponse(rowModel, 3, 4);
 
-        rowModel = dataProvider.fetchRowModel(new SelectionTimeQueryFilter(Lists.newArrayList(Long.MIN_VALUE, 4L), selectedEntry), new NullProgressMonitor());
+        rowModel = dataProvider.fetchRowModel(FetchParametersUtils.selectionTimeQueryToMap(new SelectionTimeQueryFilter(Lists.newArrayList(Long.MIN_VALUE, 4L), selectedEntry)), new NullProgressMonitor());
         verifyFollowResponse(rowModel, 2, 3);
 
-        rowModel = dataProvider.fetchRowModel(new SelectionTimeQueryFilter(Lists.newArrayList(Long.MIN_VALUE, 3L), selectedEntry), new NullProgressMonitor());
+        rowModel = dataProvider.fetchRowModel(FetchParametersUtils.selectionTimeQueryToMap(new SelectionTimeQueryFilter(Lists.newArrayList(Long.MIN_VALUE, 3L), selectedEntry)), new NullProgressMonitor());
         verifyFollowResponse(rowModel, 1, 1);
 
-        rowModel = dataProvider.fetchRowModel(new SelectionTimeQueryFilter(Lists.newArrayList(Long.MIN_VALUE, 1L), selectedEntry), new NullProgressMonitor());
+        rowModel = dataProvider.fetchRowModel(FetchParametersUtils.selectionTimeQueryToMap(new SelectionTimeQueryFilter(Lists.newArrayList(Long.MIN_VALUE, 1L), selectedEntry)), new NullProgressMonitor());
         verifyFollowResponse(rowModel, -1, -1);
     }
 
-    private static void verifyFollowResponse(TmfModelResponse<List<ITimeGraphRowModel>> rowModel, int expectedDepth, int expectedTime) {
+    private static void verifyFollowResponse(TmfModelResponse<@NonNull TimeGraphModel> rowModel, int expectedDepth, int expectedTime) {
         assertEquals(ITmfResponse.Status.COMPLETED, rowModel.getStatus());
 
-        List<ITimeGraphRowModel> rowModels = rowModel.getModel();
+        TimeGraphModel model = rowModel.getModel();
         if (expectedDepth < 0) {
-            assertNull(rowModels);
+            assertNull(model);
             return;
         }
-        assertNotNull(rowModels);
-        assertEquals(1, rowModels.size());
-        List<ITimeGraphState> row = rowModels.get(0).getStates();
+        assertNotNull(model);
+        List<@NonNull ITimeGraphRowModel> rows = model.getRows();
+        assertEquals(1, rows.size());
+        List<ITimeGraphState> row = rows.get(0).getStates();
         assertEquals(1, row.size());
         ITimeGraphState stackInterval = row.get(0);
         long depth = stackInterval.getValue();
@@ -338,14 +348,15 @@
         assertNotNull(rowModel);
         List<ITimeGraphState> states = rowModel.getStates();
         for (int i = 0; i < states.size(); i++) {
+            String entryName = entry.getName();
             if (i > expectedStates.size() - 1) {
-                fail("Unexpected state at position " + i + " for entry " + entry.getName() + ": " + states.get(i));
+                fail("Unexpected state at position " + i + " for entry " + entryName + ": " + states.get(i));
             }
             ITimeGraphState actual = states.get(i);
             ITimeGraphState expected = expectedStates.get(i);
-            assertEquals("State start time at " + i + " for entry " + entry.getName(), expected.getStartTime(), actual.getStartTime());
-            assertEquals("Duration at " + i + " for entry " + entry.getName(), expected.getDuration(), actual.getDuration());
-            assertEquals("Label at " + i + " for entry " + entry.getName(), expected.getLabel(), actual.getLabel());
+            assertEquals("State start time at " + i + " for entry " + entryName, expected.getStartTime(), actual.getStartTime());
+            assertEquals("Duration at " + i + " for entry " + entryName, expected.getDuration(), actual.getDuration());
+            assertEquals("Label at " + i + " for entry " + entryName, expected.getLabel(), actual.getLabel());
 
         }
     }
diff --git a/callstack/org.eclipse.tracecompass.incubator.callstack.core/.settings/org.eclipse.jdt.core.prefs b/callstack/org.eclipse.tracecompass.incubator.callstack.core/.settings/org.eclipse.jdt.core.prefs
index f8a2fe1..221a1f8 100644
--- a/callstack/org.eclipse.tracecompass.incubator.callstack.core/.settings/org.eclipse.jdt.core.prefs
+++ b/callstack/org.eclipse.tracecompass.incubator.callstack.core/.settings/org.eclipse.jdt.core.prefs
@@ -33,7 +33,7 @@
 org.eclipse.jdt.core.compiler.problem.comparingIdentical=error
 org.eclipse.jdt.core.compiler.problem.deadCode=error
 org.eclipse.jdt.core.compiler.problem.deprecation=error
-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=enabled
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
 org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled
 org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
 org.eclipse.jdt.core.compiler.problem.emptyStatement=error
diff --git a/callstack/org.eclipse.tracecompass.incubator.callstack.core/src/org/eclipse/tracecompass/incubator/internal/callstack/core/instrumented/provider/FlameChartArrowProvider.java b/callstack/org.eclipse.tracecompass.incubator.callstack.core/src/org/eclipse/tracecompass/incubator/internal/callstack/core/instrumented/provider/FlameChartArrowProvider.java
index 6de9ee6..c5af35a 100644
--- a/callstack/org.eclipse.tracecompass.incubator.callstack.core/src/org/eclipse/tracecompass/incubator/internal/callstack/core/instrumented/provider/FlameChartArrowProvider.java
+++ b/callstack/org.eclipse.tracecompass.incubator.callstack.core/src/org/eclipse/tracecompass/incubator/internal/callstack/core/instrumented/provider/FlameChartArrowProvider.java
@@ -12,12 +12,14 @@
 import java.util.Collections;
 import java.util.Iterator;
 import java.util.List;
+import java.util.Map;
 
 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.tracecompass.incubator.callstack.core.instrumented.statesystem.InstrumentedCallStackAnalysis;
+import org.eclipse.tracecompass.internal.tmf.core.model.filters.FetchParametersUtils;
 import org.eclipse.tracecompass.statesystem.core.interval.ITmfStateInterval;
 import org.eclipse.tracecompass.tmf.core.model.filters.TimeQueryFilter;
 import org.eclipse.tracecompass.tmf.core.trace.ITmfTrace;
@@ -52,7 +54,11 @@
      *            the monitor
      * @return the corresponding state intervals
      */
-    public List<ITmfStateInterval> fetchArrows(TimeQueryFilter filter, @Nullable IProgressMonitor monitor) {
+    public List<ITmfStateInterval> fetchArrows(Map<String, Object> fetchParameters, @Nullable IProgressMonitor monitor) {
+        TimeQueryFilter filter = FetchParametersUtils.createTimeQuery(fetchParameters);
+        if (filter == null) {
+            return Collections.emptyList();
+        }
         long start = filter.getStart();
         long end = filter.getEnd();
 
diff --git a/callstack/org.eclipse.tracecompass.incubator.callstack.core/src/org/eclipse/tracecompass/incubator/internal/callstack/core/instrumented/provider/FlameChartDataProvider.java b/callstack/org.eclipse.tracecompass.incubator.callstack.core/src/org/eclipse/tracecompass/incubator/internal/callstack/core/instrumented/provider/FlameChartDataProvider.java
index 7670fa8..a7debca 100644
--- a/callstack/org.eclipse.tracecompass.incubator.callstack.core/src/org/eclipse/tracecompass/incubator/internal/callstack/core/instrumented/provider/FlameChartDataProvider.java
+++ b/callstack/org.eclipse.tracecompass.incubator.callstack.core/src/org/eclipse/tracecompass/incubator/internal/callstack/core/instrumented/provider/FlameChartDataProvider.java
@@ -47,6 +47,7 @@
 import org.eclipse.tracecompass.internal.analysis.os.linux.core.threadstatus.ThreadEntryModel;
 import org.eclipse.tracecompass.internal.analysis.os.linux.core.threadstatus.ThreadStatusDataProvider;
 import org.eclipse.tracecompass.internal.tmf.core.model.AbstractTmfTraceDataProvider;
+import org.eclipse.tracecompass.internal.tmf.core.model.filters.FetchParametersUtils;
 import org.eclipse.tracecompass.segmentstore.core.ISegment;
 import org.eclipse.tracecompass.statesystem.core.exceptions.StateSystemDisposedException;
 import org.eclipse.tracecompass.statesystem.core.exceptions.TimeRangeException;
@@ -60,8 +61,10 @@
 import org.eclipse.tracecompass.tmf.core.model.timegraph.ITimeGraphRowModel;
 import org.eclipse.tracecompass.tmf.core.model.timegraph.ITimeGraphState;
 import org.eclipse.tracecompass.tmf.core.model.timegraph.TimeGraphArrow;
+import org.eclipse.tracecompass.tmf.core.model.timegraph.TimeGraphModel;
 import org.eclipse.tracecompass.tmf.core.model.timegraph.TimeGraphRowModel;
 import org.eclipse.tracecompass.tmf.core.model.timegraph.TimeGraphState;
+import org.eclipse.tracecompass.tmf.core.model.tree.TmfTreeModel;
 import org.eclipse.tracecompass.tmf.core.response.ITmfResponse;
 import org.eclipse.tracecompass.tmf.core.response.ITmfResponse.Status;
 import org.eclipse.tracecompass.tmf.core.response.TmfModelResponse;
@@ -162,7 +165,7 @@
         public @Nullable Map<String, String> fetchTooltip(int threadId, long time, @Nullable IProgressMonitor monitor) {
             for (ThreadEntryModel entry : fThreadTree) {
                 if (entry.getThreadId() == threadId && entry.getStartTime() <= time && entry.getEndTime() >= time) {
-                    TmfModelResponse<Map<String, String>> tooltip = fThreadDataProvider.fetchTooltip(new SelectionTimeQueryFilter(Collections.singletonList(time), Collections.singleton(entry.getId())), monitor);
+                    TmfModelResponse<Map<String, String>> tooltip = fThreadDataProvider.fetchTooltip(FetchParametersUtils.selectionTimeQueryToMap(new SelectionTimeQueryFilter(Collections.singletonList(time), Collections.singleton(entry.getId()))), monitor);
                     return tooltip.getModel();
                 }
             }
@@ -209,7 +212,7 @@
     private final String fAnalysisId;
     private final ReentrantReadWriteLock fLock = new ReentrantReadWriteLock(false);
     private final FlameChartArrowProvider fArrowProvider;
-    private @Nullable TmfModelResponse<List<FlameChartEntryModel>> fCached;
+    private @Nullable TmfModelResponse<TmfTreeModel<FlameChartEntryModel>> fCached;
     private @Nullable ThreadData fThreadData = null;
 
     /**
@@ -231,8 +234,8 @@
     }
 
     @Override
-    public TmfModelResponse<List<ITimeGraphArrow>> fetchArrows(TimeQueryFilter filter, @Nullable IProgressMonitor monitor) {
-        List<ITmfStateInterval> arrows = fArrowProvider.fetchArrows(filter, monitor);
+    public TmfModelResponse<List<ITimeGraphArrow>> fetchArrows(Map<String, Object> fetchParameters, @Nullable IProgressMonitor monitor) {
+        List<ITmfStateInterval> arrows = fArrowProvider.fetchArrows(fetchParameters, monitor);
         List<ITimeGraphArrow> tgArrows = new ArrayList<>();
         // First, get the distinct callstacks
         fLock.readLock().lock();
@@ -290,9 +293,10 @@
     }
 
     @Override
-    public TmfModelResponse<Map<String, String>> fetchTooltip(SelectionTimeQueryFilter filter, @Nullable IProgressMonitor monitor) {
+    public TmfModelResponse<Map<String, String>> fetchTooltip(Map<String, Object> fetchParameters, @Nullable IProgressMonitor monitor) {
         try (FlowScopeLog scope = new FlowScopeLogBuilder(LOGGER, Level.FINE, "FlameChartDataProvider#fetchTooltip") //$NON-NLS-1$
                 .setCategory(getClass().getSimpleName()).build()) {
+            SelectionTimeQueryFilter filter = FetchParametersUtils.createSelectionTimeQuery(fetchParameters);
             Map<Long, FlameChartEntryModel> entries = getSelectedEntries(filter);
             if (entries.size() != 1) {
                 // Not the expected size of tooltip, just return empty
@@ -378,7 +382,7 @@
     }
 
     @Override
-    public TmfModelResponse<List<FlameChartEntryModel>> fetchTree(TimeQueryFilter filter, @Nullable IProgressMonitor monitor) {
+    public TmfModelResponse<TmfTreeModel<FlameChartEntryModel>> fetchTree(Map<String, Object> fetchParameters, @Nullable IProgressMonitor monitor) {
         if (fCached != null) {
             return fCached;
         }
@@ -397,7 +401,7 @@
 
             // Initialize the first element of the tree
             ImmutableList.Builder<FlameChartEntryModel> builder = ImmutableList.builder();
-            FlameChartEntryModel traceEntry = new FlameChartEntryModel(fTraceId, -1, getTrace().getName(), start, end, FlameChartEntryModel.EntryType.TRACE);
+            FlameChartEntryModel traceEntry = new FlameChartEntryModel(fTraceId, -1, Collections.singletonList(getTrace().getName()), start, end, FlameChartEntryModel.EntryType.TRACE);
             builder.add(traceEntry);
 
             FlameChartEntryModel callStackRoot = traceEntry;
@@ -417,12 +421,12 @@
             List<FlameChartEntryModel> tree = builder.build();
             tree.forEach(entry -> fEntries.put(entry.getId(), entry));
             if (complete) {
-                TmfModelResponse<List<FlameChartEntryModel>> response = new TmfModelResponse<>(tree,
+                TmfModelResponse<TmfTreeModel<FlameChartEntryModel>> response = new TmfModelResponse<>(new TmfTreeModel<>(Collections.emptyList(), tree),
                         ITmfResponse.Status.COMPLETED, CommonStatusMessage.COMPLETED);
                 fCached = response;
                 return response;
             }
-            return new TmfModelResponse<>(tree, ITmfResponse.Status.RUNNING, CommonStatusMessage.RUNNING);
+            return new TmfModelResponse<>(new TmfTreeModel<>(Collections.emptyList(), tree), ITmfResponse.Status.RUNNING, CommonStatusMessage.RUNNING);
         } finally {
             fLock.writeLock().unlock();
         }
@@ -440,10 +444,10 @@
             ThreadStatusDataProvider dataProvider = DataProviderManager.getInstance().getDataProvider(trace, ThreadStatusDataProvider.ID, ThreadStatusDataProvider.class);
             if (dataProvider != null) {
                 // Get the tree for the trace's current range
-                TmfModelResponse<List<ThreadEntryModel>> threadTreeResp = dataProvider.fetchTree(new TimeQueryFilter(start, Long.MAX_VALUE, 2), monitor);
-                List<ThreadEntryModel> threadTree = threadTreeResp.getModel();
+                TmfModelResponse<TmfTreeModel<ThreadEntryModel>> threadTreeResp = dataProvider.fetchTree(FetchParametersUtils.timeQueryToMap(new TimeQueryFilter(start, Long.MAX_VALUE, 2)), monitor);
+                TmfTreeModel<ThreadEntryModel> threadTree = threadTreeResp.getModel();
                 if (threadTree != null) {
-                    fThreadData = new ThreadData(dataProvider, threadTree, threadTreeResp.getStatus());
+                    fThreadData = new ThreadData(dataProvider, threadTree.getEntries(), threadTreeResp.getStatus());
                     break;
                 }
             }
@@ -453,7 +457,7 @@
     private boolean processCallStackElement(ICallStackElement element, Builder<FlameChartEntryModel> builder, FlameChartEntryModel parentEntry) {
 
         long elementId = getEntryId(element);
-        FlameChartEntryModel entry = new FlameChartEntryModel(elementId, parentEntry.getId(), element.getName(), parentEntry.getStartTime(), parentEntry.getEndTime(), FlameChartEntryModel.EntryType.LEVEL);
+        FlameChartEntryModel entry = new FlameChartEntryModel(elementId, parentEntry.getId(), Collections.singletonList(element.getName()), parentEntry.getStartTime(), parentEntry.getEndTime(), FlameChartEntryModel.EntryType.LEVEL);
         builder.add(entry);
 
         boolean needsKernel = false;
@@ -464,12 +468,12 @@
             InstrumentedCallStackElement finalElement = (InstrumentedCallStackElement) element;
             CallStack callStack = finalElement.getCallStack();
             for (int depth = 0; depth < callStack.getMaxDepth(); depth++) {
-                FlameChartEntryModel flameChartEntry = new FlameChartEntryModel(getEntryId(new CallStackDepth(callStack, depth + 1)), entry.getId(), element.getName(), parentEntry.getStartTime(), parentEntry.getEndTime(),
+                FlameChartEntryModel flameChartEntry = new FlameChartEntryModel(getEntryId(new CallStackDepth(callStack, depth + 1)), entry.getId(), Collections.singletonList(element.getName()), parentEntry.getStartTime(), parentEntry.getEndTime(),
                         FlameChartEntryModel.EntryType.FUNCTION, depth + 1);
                 builder.add(flameChartEntry);
                 if (depth == 0 && callStack.hasKernelStatuses()) {
                     needsKernel = true;
-                    builder.add(new FlameChartEntryModel(getKernelEntryId(flameChartEntry.getId()), entry.getId(), String.valueOf(Messages.FlameChartDataProvider_KernelStatusTitle), parentEntry.getStartTime(), parentEntry.getEndTime(),
+                    builder.add(new FlameChartEntryModel(getKernelEntryId(flameChartEntry.getId()), entry.getId(), Collections.singletonList(String.valueOf(Messages.FlameChartDataProvider_KernelStatusTitle)), parentEntry.getStartTime(), parentEntry.getEndTime(),
                             FlameChartEntryModel.EntryType.KERNEL));
                 }
             }
@@ -501,18 +505,26 @@
     }
 
     @Override
-    public TmfModelResponse<List<ITimeGraphRowModel>> fetchRowModel(SelectionTimeQueryFilter filter, @Nullable IProgressMonitor monitor) {
+    public TmfModelResponse<TimeGraphModel> fetchRowModel(Map<String, Object> fetchParameters, @Nullable IProgressMonitor monitor) {
         try (FlowScopeLog scope = new FlowScopeLogBuilder(LOGGER, Level.FINE, "FlameChartDataProvider#fetchRowModel") //$NON-NLS-1$
                 .setCategory(getClass().getSimpleName()).build()) {
 
+            SelectionTimeQueryFilter filter = FetchParametersUtils.createSelectionTimeQuery(fetchParameters);
+            if (filter == null) {
+                return new TmfModelResponse<>(null, ITmfResponse.Status.FAILED, CommonStatusMessage.INCORRECT_QUERY_PARAMETERS);
+            }
             Map<Long, FlameChartEntryModel> entries = getSelectedEntries(filter);
             if (entries.size() == 1 && filter.getTimesRequested().length == 2) {
                 // this is a request for a follow event.
                 Entry<@NonNull Long, @NonNull FlameChartEntryModel> entry = entries.entrySet().iterator().next();
                 if (filter.getStart() == Long.MIN_VALUE) {
-                    return new TmfModelResponse<>(getFollowEvent(entry, filter.getEnd(), false), ITmfResponse.Status.COMPLETED, CommonStatusMessage.COMPLETED);
+                    List<ITimeGraphRowModel> followEvents = getFollowEvent(entry, filter.getEnd(), false);
+                    TimeGraphModel model = followEvents == null ? null : new TimeGraphModel(followEvents);
+                    return new TmfModelResponse<>(model, ITmfResponse.Status.COMPLETED, CommonStatusMessage.COMPLETED);
                 } else if (filter.getEnd() == Long.MAX_VALUE) {
-                    return new TmfModelResponse<>(getFollowEvent(entry, filter.getStart(), true), ITmfResponse.Status.COMPLETED, CommonStatusMessage.COMPLETED);
+                    List<ITimeGraphRowModel> followEvents = getFollowEvent(entry, filter.getStart(), true);
+                    TimeGraphModel model = followEvents == null ? null : new TimeGraphModel(followEvents);
+                    return new TmfModelResponse<>(model, ITmfResponse.Status.COMPLETED, CommonStatusMessage.COMPLETED);
                 }
             }
             // For each kernel status entry, add the first row of the callstack
@@ -528,7 +540,7 @@
                 return new TmfModelResponse<>(null, ITmfResponse.Status.CANCELLED, CommonStatusMessage.TASK_CANCELLED);
             }
             List<ITimeGraphRowModel> collect = csRows.entrySet().stream().map(entry -> new TimeGraphRowModel(entry.getKey(), entry.getValue())).collect(Collectors.toList());
-            return new TmfModelResponse<>(collect, complete ? Status.COMPLETED : Status.RUNNING,
+            return new TmfModelResponse<>(new TimeGraphModel(collect), complete ? Status.COMPLETED : Status.RUNNING,
                     complete ? CommonStatusMessage.COMPLETED : CommonStatusMessage.RUNNING);
         } catch (IndexOutOfBoundsException | TimeRangeException | StateSystemDisposedException e) {
             return new TmfModelResponse<>(null, Status.FAILED, String.valueOf(e.getMessage()));
@@ -627,12 +639,12 @@
         // and the trace filtered the right host.
         BiMap<Long, Integer> threadModelIds = filterThreads(tree, tids);
         SelectionTimeQueryFilter tidFilter = new SelectionTimeQueryFilter(times, threadModelIds.keySet());
-        TmfModelResponse<List<ITimeGraphRowModel>> rowModel = threadData.fThreadDataProvider.fetchRowModel(tidFilter, monitor);
-        List<ITimeGraphRowModel> rowModels = rowModel.getModel();
+        TmfModelResponse<TimeGraphModel> rowModel = threadData.fThreadDataProvider.fetchRowModel(FetchParametersUtils.selectionTimeQueryToMap(tidFilter), monitor);
+        TimeGraphModel rowModels = rowModel.getModel();
         if (rowModel.getStatus().equals(Status.CANCELLED) || rowModel.getStatus().equals(Status.FAILED) || rowModels == null) {
             return Collections.emptyMap();
         }
-        return mapThreadStates(rowModels, threadModelIds, tids);
+        return mapThreadStates(rowModels.getRows(), threadModelIds, tids);
     }
 
     private static Map<Long, List<ITimeGraphState>> mapThreadStates(List<ITimeGraphRowModel> rowModels, BiMap<Long, Integer> threadModelIds, List<TidInformation> tids) {
@@ -796,4 +808,45 @@
         return null;
     }
 
+    @Deprecated
+    @Override
+    public TmfModelResponse<List<FlameChartEntryModel>> fetchTree(@NonNull TimeQueryFilter filter, @Nullable IProgressMonitor monitor) {
+        Map<String, Object> parameters = FetchParametersUtils.timeQueryToMap(filter);
+        TmfModelResponse<@NonNull TmfTreeModel<@NonNull FlameChartEntryModel>> response = fetchTree(parameters, monitor);
+        TmfTreeModel<@NonNull FlameChartEntryModel> model = response.getModel();
+        List<FlameChartEntryModel> treeModel = null;
+        if (model != null) {
+            treeModel = model.getEntries();
+        }
+        return new TmfModelResponse<>(treeModel, response.getStatus(),
+                response.getStatusMessage());
+    }
+
+    @Deprecated
+    @Override
+    public TmfModelResponse<List<ITimeGraphRowModel>> fetchRowModel(@NonNull SelectionTimeQueryFilter filter, @Nullable IProgressMonitor monitor) {
+        Map<String, Object> parameters = FetchParametersUtils.selectionTimeQueryToMap(filter);
+        TmfModelResponse<TimeGraphModel> response = fetchRowModel(parameters, monitor);
+        TimeGraphModel model = response.getModel();
+        List<ITimeGraphRowModel> rows = null;
+        if (model != null) {
+            rows = model.getRows();
+        }
+        return new TmfModelResponse<>(rows, response.getStatus(), response.getStatusMessage());
+    }
+
+    @Deprecated
+    @Override
+    public @NonNull TmfModelResponse<@NonNull List<@NonNull ITimeGraphArrow>> fetchArrows(@NonNull TimeQueryFilter filter, @Nullable IProgressMonitor monitor) {
+        Map<String, Object> parameters = FetchParametersUtils.timeQueryToMap(filter);
+        return fetchArrows(parameters, monitor);
+    }
+
+    @Deprecated
+    @Override
+    public @NonNull TmfModelResponse<@NonNull Map<@NonNull String, @NonNull String>> fetchTooltip(@NonNull SelectionTimeQueryFilter filter, @Nullable IProgressMonitor monitor) {
+        Map<String, Object> parameters = FetchParametersUtils.selectionTimeQueryToMap(filter);
+        return fetchTooltip(parameters, monitor);
+    }
+
 }
diff --git a/callstack/org.eclipse.tracecompass.incubator.callstack.core/src/org/eclipse/tracecompass/incubator/internal/callstack/core/instrumented/provider/FlameChartEntryModel.java b/callstack/org.eclipse.tracecompass.incubator.callstack.core/src/org/eclipse/tracecompass/incubator/internal/callstack/core/instrumented/provider/FlameChartEntryModel.java
index 43e341f..39aec16 100644
--- a/callstack/org.eclipse.tracecompass.incubator.callstack.core/src/org/eclipse/tracecompass/incubator/internal/callstack/core/instrumented/provider/FlameChartEntryModel.java
+++ b/callstack/org.eclipse.tracecompass.incubator.callstack.core/src/org/eclipse/tracecompass/incubator/internal/callstack/core/instrumented/provider/FlameChartEntryModel.java
@@ -9,6 +9,7 @@
 
 package org.eclipse.tracecompass.incubator.internal.callstack.core.instrumented.provider;
 
+import java.util.List;
 import java.util.Objects;
 
 import org.eclipse.jdt.annotation.Nullable;
@@ -63,7 +64,7 @@
      * @param entryType
      *            The type of this entry
      */
-    public FlameChartEntryModel(long id, long parentId, String name, long startTime, long endTime, EntryType entryType) {
+    public FlameChartEntryModel(long id, long parentId, List<String> name, long startTime, long endTime, EntryType entryType) {
         super(id, parentId, name, startTime, endTime);
         fEntryType = entryType;
         fDepth = -1;
@@ -87,7 +88,7 @@
      * @param depth
      *            entry's PID or TID if is a thread
      */
-    public FlameChartEntryModel(long elementId, long parentId, String name, long startTime, long endTime, EntryType entryType, int depth) {
+    public FlameChartEntryModel(long elementId, long parentId, List<String> name, long startTime, long endTime, EntryType entryType, int depth) {
         super(elementId, parentId, name, startTime, endTime);
         fEntryType = entryType;
         fDepth = depth;
diff --git a/callstack/org.eclipse.tracecompass.incubator.callstack.ui/src/org/eclipse/tracecompass/incubator/internal/callstack/ui/views/flamechart/FlameChartPresentationProvider.java b/callstack/org.eclipse.tracecompass.incubator.callstack.ui/src/org/eclipse/tracecompass/incubator/internal/callstack/ui/views/flamechart/FlameChartPresentationProvider.java
index 4fe29cd..54bc81c 100644
--- a/callstack/org.eclipse.tracecompass.incubator.callstack.ui/src/org/eclipse/tracecompass/incubator/internal/callstack/ui/views/flamechart/FlameChartPresentationProvider.java
+++ b/callstack/org.eclipse.tracecompass.incubator.callstack.ui/src/org/eclipse/tracecompass/incubator/internal/callstack/ui/views/flamechart/FlameChartPresentationProvider.java
@@ -23,6 +23,7 @@
 import org.eclipse.tracecompass.incubator.internal.callstack.core.instrumented.provider.FlameChartEntryModel;
 import org.eclipse.tracecompass.incubator.internal.callstack.core.instrumented.provider.FlameChartEntryModel.EntryType;
 import org.eclipse.tracecompass.incubator.internal.callstack.ui.FlameViewPalette;
+import org.eclipse.tracecompass.internal.tmf.core.model.filters.FetchParametersUtils;
 import org.eclipse.tracecompass.tmf.core.model.filters.SelectionTimeQueryFilter;
 import org.eclipse.tracecompass.tmf.core.model.timegraph.ITimeGraphDataProvider;
 import org.eclipse.tracecompass.tmf.core.model.timegraph.ITimeGraphEntryModel;
@@ -164,7 +165,8 @@
         TimeGraphEntry entry = (TimeGraphEntry) event.getEntry();
         ITimeGraphDataProvider<? extends TimeGraphEntryModel> dataProvider = BaseDataProviderTimeGraphView.getProvider(entry);
         TmfModelResponse<@NonNull Map<@NonNull String, @NonNull String>> response = dataProvider.fetchTooltip(
-                new SelectionTimeQueryFilter(hoverTime, hoverTime, 1, Collections.singletonList(entry.getModel().getId())), null);
+                FetchParametersUtils.selectionTimeQueryToMap(new SelectionTimeQueryFilter(hoverTime, hoverTime, 1, Collections.singletonList(entry.getModel().getId()))),
+                null);
         Map<@NonNull String, @NonNull String> map = response.getModel();
         if (map != null) {
             retMap.putAll(map);
diff --git a/callstack/org.eclipse.tracecompass.incubator.callstack.ui/src/org/eclipse/tracecompass/incubator/internal/callstack/ui/views/flamechart/FlameChartView.java b/callstack/org.eclipse.tracecompass.incubator.callstack.ui/src/org/eclipse/tracecompass/incubator/internal/callstack/ui/views/flamechart/FlameChartView.java
index 28b5f0c..8ad4735 100644
--- a/callstack/org.eclipse.tracecompass.incubator.callstack.ui/src/org/eclipse/tracecompass/incubator/internal/callstack/ui/views/flamechart/FlameChartView.java
+++ b/callstack/org.eclipse.tracecompass.incubator.callstack.ui/src/org/eclipse/tracecompass/incubator/internal/callstack/ui/views/flamechart/FlameChartView.java
@@ -35,6 +35,7 @@
 import org.eclipse.tracecompass.incubator.internal.callstack.core.instrumented.provider.FlameChartEntryModel;
 import org.eclipse.tracecompass.incubator.internal.callstack.core.instrumented.provider.FlameChartEntryModel.EntryType;
 import org.eclipse.tracecompass.incubator.internal.callstack.ui.Activator;
+import org.eclipse.tracecompass.internal.tmf.core.model.filters.FetchParametersUtils;
 import org.eclipse.tracecompass.tmf.core.dataprovider.DataProviderManager;
 import org.eclipse.tracecompass.tmf.core.model.filters.SelectionTimeQueryFilter;
 import org.eclipse.tracecompass.tmf.core.model.timegraph.ITimeGraphDataProvider;
@@ -42,6 +43,7 @@
 import org.eclipse.tracecompass.tmf.core.model.timegraph.ITimeGraphRowModel;
 import org.eclipse.tracecompass.tmf.core.model.timegraph.ITimeGraphState;
 import org.eclipse.tracecompass.tmf.core.model.timegraph.TimeGraphEntryModel;
+import org.eclipse.tracecompass.tmf.core.model.timegraph.TimeGraphModel;
 import org.eclipse.tracecompass.tmf.core.response.TmfModelResponse;
 import org.eclipse.tracecompass.tmf.core.signal.TmfSelectionRangeUpdatedSignal;
 import org.eclipse.tracecompass.tmf.core.signal.TmfSignalHandler;
@@ -437,10 +439,10 @@
                 Map<Long, TimeGraphEntry> map = Maps.uniqueIndex(filtered, e -> e.getModel().getId());
                 // use time -1 as a lower bound for the end of Time events to be included.
                 SelectionTimeQueryFilter filter = new SelectionTimeQueryFilter(Math.max(traceEntry.getStartTime(), time - 1), time, 2, map.keySet());
-                TmfModelResponse<@NonNull List<@NonNull ITimeGraphRowModel>> response = traceEntry.getProvider().fetchRowModel(filter, null);
-                List<@NonNull ITimeGraphRowModel> model = response.getModel();
+                TmfModelResponse<@NonNull TimeGraphModel> response = traceEntry.getProvider().fetchRowModel(FetchParametersUtils.selectionTimeQueryToMap(filter), null);
+                TimeGraphModel model = response.getModel();
                 if (model != null) {
-                    for (ITimeGraphRowModel row : model) {
+                    for (ITimeGraphRowModel row : model.getRows()) {
                         syncToRow(row, time, map);
                     }
                 }
@@ -522,13 +524,13 @@
                         TimeGraphEntry callStackEntry = (TimeGraphEntry) entry;
                         ITimeGraphDataProvider<? extends TimeGraphEntryModel> provider = getProvider(callStackEntry);
                         long selectionBegin = viewer.getSelectionBegin();
-                        SelectionTimeQueryFilter filter = new SelectionTimeQueryFilter(selectionBegin, Long.MAX_VALUE, 2, Collections.singleton(callStackEntry.getModel().getId()));
-                        TmfModelResponse<@NonNull List<@NonNull ITimeGraphRowModel>> response = provider.fetchRowModel(filter, null);
-                        List<@NonNull ITimeGraphRowModel> model = response.getModel();
-                        if (model == null || model.size() != 1) {
+                        Map<@NonNull String, @NonNull Object> parameters = FetchParametersUtils.selectionTimeQueryToMap(new SelectionTimeQueryFilter(selectionBegin, Long.MAX_VALUE, 2, Collections.singleton(callStackEntry.getModel().getId())));
+                        TmfModelResponse<@NonNull TimeGraphModel> response = provider.fetchRowModel(parameters, null);
+                        TimeGraphModel model = response.getModel();
+                        if (model == null || model.getRows().size() != 1) {
                             return;
                         }
-                        List<@NonNull ITimeGraphState> row = model.get(0).getStates();
+                        List<@NonNull ITimeGraphState> row = model.getRows().get(0).getStates();
                         if (row.size() != 1) {
                             return;
                         }
@@ -572,13 +574,13 @@
                         TimeGraphEntry callStackEntry = (TimeGraphEntry) entry;
                         ITimeGraphDataProvider<? extends TimeGraphEntryModel> provider = getProvider(callStackEntry);
                         long selectionBegin = viewer.getSelectionBegin();
-                        SelectionTimeQueryFilter filter = new SelectionTimeQueryFilter(Lists.newArrayList(Long.MIN_VALUE, selectionBegin), Collections.singleton(callStackEntry.getModel().getId()));
-                        TmfModelResponse<@NonNull List<@NonNull ITimeGraphRowModel>> response = provider.fetchRowModel(filter, null);
-                        List<@NonNull ITimeGraphRowModel> model = response.getModel();
-                        if (model == null || model.size() != 1) {
+                        Map<@NonNull String, @NonNull Object> parameters = FetchParametersUtils.selectionTimeQueryToMap(new SelectionTimeQueryFilter(Lists.newArrayList(Long.MIN_VALUE, selectionBegin), Collections.singleton(callStackEntry.getModel().getId())));
+                        TmfModelResponse<@NonNull TimeGraphModel> response = provider.fetchRowModel(parameters, null);
+                        TimeGraphModel model = response.getModel();
+                        if (model == null || model.getRows().size() != 1) {
                             return;
                         }
-                        List<@NonNull ITimeGraphState> row = model.get(0).getStates();
+                        List<@NonNull ITimeGraphState> row = model.getRows().get(0).getStates();
                         if (row.size() != 1) {
                             return;
                         }
diff --git a/common/org.eclipse.tracecompass.incubator.target/tracecompass-incubator-master.target b/common/org.eclipse.tracecompass.incubator.target/tracecompass-incubator-master.target
index 37c5d15..f344c87 100644
--- a/common/org.eclipse.tracecompass.incubator.target/tracecompass-incubator-master.target
+++ b/common/org.eclipse.tracecompass.incubator.target/tracecompass-incubator-master.target
@@ -138,7 +138,7 @@
 <unit id="org.eclipse.tracecompass.lttng2.kernel.feature.group" version="0.0.0"/>
 <unit id="org.eclipse.tracecompass.lttng2.control.feature.group" version="0.0.0"/>
 <unit id="org.eclipse.tracecompass.jsontrace.feature.group" version="0.0.0"/>
-<repository location="http://download.eclipse.org/tracecompass/master/repository"/>
+<repository location="http://download.eclipse.org/tracecompass/trace-server/repository"/>
 </location>
 <location includeAllPlatforms="false" includeConfigurePhase="false" includeMode="planner" includeSource="true" type="InstallableUnit">
 <unit id="org.eclipse.nebula.widgets.opal.notifier.feature.feature.group" version="0.0.0"/>
diff --git a/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core.tests/META-INF/MANIFEST.MF b/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core.tests/META-INF/MANIFEST.MF
index f492aac..e0c583e 100644
--- a/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core.tests/META-INF/MANIFEST.MF
+++ b/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core.tests/META-INF/MANIFEST.MF
@@ -26,6 +26,7 @@
 Import-Package: com.fasterxml.jackson.annotation,
  com.fasterxml.jackson.jaxrs.base,
  com.fasterxml.jackson.jaxrs.json,
+ com.google.common.base,
  com.google.common.collect,
  javax.ws.rs.client,
  javax.ws.rs.core,
diff --git a/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core.tests/src/org/eclipse/tracecompass/incubator/trace/server/jersey/rest/core/tests/services/DataProviderServiceTest.java b/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core.tests/src/org/eclipse/tracecompass/incubator/trace/server/jersey/rest/core/tests/services/DataProviderServiceTest.java
index ac282d6..301579a 100644
--- a/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core.tests/src/org/eclipse/tracecompass/incubator/trace/server/jersey/rest/core/tests/services/DataProviderServiceTest.java
+++ b/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core.tests/src/org/eclipse/tracecompass/incubator/trace/server/jersey/rest/core/tests/services/DataProviderServiceTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2018 Ericsson
+ * 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 v1.0 which
@@ -10,13 +10,23 @@
 package org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core.tests.services;
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
 
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+
+import javax.ws.rs.client.Entity;
 import javax.ws.rs.client.WebTarget;
-import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
 
+import org.eclipse.tracecompass.incubator.internal.trace.server.jersey.rest.core.model.views.QueryParameters;
 import org.eclipse.tracecompass.incubator.internal.trace.server.jersey.rest.core.services.DataProviderService;
+import org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core.tests.stubs.DataProviderDescriptorStub;
 import org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core.tests.utils.RestServerTest;
+import org.eclipse.tracecompass.internal.tmf.core.model.filters.FetchParametersUtils;
+import org.eclipse.tracecompass.tmf.core.model.filters.TimeQueryFilter;
 import org.junit.Test;
 
 /**
@@ -25,9 +35,26 @@
  * @author Loic Prieur-Drevon
  */
 public class DataProviderServiceTest extends RestServerTest {
-    static final String PROVIDERS_PATH = "providers";
     private static final String CALL_STACK_DATAPROVIDER_ID = "org.eclipse.tracecompass.internal.analysis.profiling.callstack.provider.CallStackDataProvider";
-    static final String TREE_PATH = "tree";
+
+    /**
+     * Test getting the data provider descriptors
+     */
+    @Test
+    public void testProviders() {
+
+        WebTarget traces = getApplicationEndpoint().path(TRACES);
+        RestServerTest.assertPost(traces, CONTEXT_SWITCHES_UST_STUB);
+
+        WebTarget experiments = getApplicationEndpoint().path(EXPERIMENTS);
+        WebTarget providers = experiments.path(CONTEXT_SWITCHES_UST_UUID.toString())
+                .path(OUTPUTS_PATH);
+
+        Set<DataProviderDescriptorStub> descriptors = getDataProviderDescriptors(providers);
+        for (DataProviderDescriptorStub desc : EXPECTED_DATA_PROVIDER_DESCRIPTOR) {
+            assertTrue(desc.getName(), descriptors.contains(desc));
+        }
+    }
 
     /**
      * Ensure that the Call Stack data provider exists for the trace.
@@ -37,20 +64,15 @@
         WebTarget traces = getApplicationEndpoint().path(TRACES);
         RestServerTest.assertPost(traces, CONTEXT_SWITCHES_UST_STUB);
 
-        WebTarget callstackTree = traces.path(CONTEXT_SWITCHES_UST_UUID.toString())
-                .path(PROVIDERS_PATH)
-                .path(CALL_STACK_DATAPROVIDER_ID)
-                .path(TREE_PATH);
+        WebTarget callstackTree = getTimeGraphTreeEndpoint(CONTEXT_SWITCHES_UST_UUID.toString(), CALL_STACK_DATAPROVIDER_ID);
 
-        Response tree = callstackTree
-                .queryParam("start", 0L)
-                .queryParam("end", Long.MAX_VALUE)
-                .queryParam("nb", 2)
-                .request(MediaType.APPLICATION_JSON).get();
+        Map<String, Object> parameters = FetchParametersUtils.timeQueryToMap(new TimeQueryFilter(0L, Long.MAX_VALUE, 2));
+        Response tree = callstackTree.request().post(Entity.json(new QueryParameters(parameters , Collections.emptyList())));
         assertEquals("There should be a positive response for the data provider", 200, tree.getStatus());
 
-        Response defaults = callstackTree
-                .request(MediaType.APPLICATION_JSON).get();
+        parameters = new HashMap<>();
+        parameters.put("timeRequested", Collections.emptyList());
+        Response defaults = callstackTree.request().post(Entity.json(new QueryParameters(parameters , Collections.emptyList())));
         assertEquals("Default values should return OK code", 200, defaults.getStatus());
     }
 
diff --git a/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core.tests/src/org/eclipse/tracecompass/incubator/trace/server/jersey/rest/core/tests/services/ExperimentManagerServiceTest.java b/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core.tests/src/org/eclipse/tracecompass/incubator/trace/server/jersey/rest/core/tests/services/ExperimentManagerServiceTest.java
index 2720c70..9022f91 100644
--- a/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core.tests/src/org/eclipse/tracecompass/incubator/trace/server/jersey/rest/core/tests/services/ExperimentManagerServiceTest.java
+++ b/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core.tests/src/org/eclipse/tracecompass/incubator/trace/server/jersey/rest/core/tests/services/ExperimentManagerServiceTest.java
@@ -38,7 +38,7 @@
     private static final @NonNull String EXPERIMENT_UUID = "bb12687f-9866-3a9f-bf55-b4d9da0137ed";
     private static final @NonNull ImmutableSet<TraceModelStub> CONTEXT_SWITCH_SET = ImmutableSet.of(CONTEXT_SWITCHES_KERNEL_STUB, CONTEXT_SWITCHES_UST_STUB);
     private static final ExperimentModelStub EXPECTED = new ExperimentModelStub(TEST,
-            UUID.fromString(EXPERIMENT_UUID), 0L, 0L, 0L, CONTEXT_SWITCH_SET);
+            UUID.fromString(EXPERIMENT_UUID), 0L, 0L, 0L, "RUNNING", CONTEXT_SWITCH_SET);
 
     /**
      * Basic test for the {@link ExperimentManagerService}
diff --git a/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core.tests/src/org/eclipse/tracecompass/incubator/trace/server/jersey/rest/core/tests/services/XmlManagerServiceTest.java b/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core.tests/src/org/eclipse/tracecompass/incubator/trace/server/jersey/rest/core/tests/services/XmlManagerServiceTest.java
index b078cd2..15df372 100644
--- a/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core.tests/src/org/eclipse/tracecompass/incubator/trace/server/jersey/rest/core/tests/services/XmlManagerServiceTest.java
+++ b/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core.tests/src/org/eclipse/tracecompass/incubator/trace/server/jersey/rest/core/tests/services/XmlManagerServiceTest.java
@@ -16,6 +16,7 @@
 import java.net.URISyntaxException;
 import java.net.URL;
 import java.util.Collections;
+import java.util.HashMap;
 import java.util.Map;
 
 import javax.ws.rs.client.Entity;
@@ -29,6 +30,7 @@
 import org.eclipse.core.runtime.Path;
 import org.eclipse.core.runtime.Platform;
 import org.eclipse.jdt.annotation.NonNull;
+import org.eclipse.tracecompass.incubator.internal.trace.server.jersey.rest.core.model.views.QueryParameters;
 import org.eclipse.tracecompass.incubator.internal.trace.server.jersey.rest.core.services.XmlManagerService;
 import org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core.tests.utils.RestServerTest;
 import org.junit.Test;
@@ -40,6 +42,7 @@
  * @author Loic Prieur-Drevon
  */
 public class XmlManagerServiceTest extends RestServerTest {
+    private static final String PATH = "path";
     private static final Bundle XML_CORE_TESTS = Platform.getBundle("org.eclipse.tracecompass.tmf.analysis.xml.core.tests");
     private static final GenericType<Map<String, String>> MAP_STRING_STRING_TYPE = new GenericType<Map<String, String>>() {
     };
@@ -77,12 +80,10 @@
         WebTarget traces = application.path("traces");
         assertPost(traces, CONTEXT_SWITCHES_KERNEL_STUB);
 
-        WebTarget xmlProviderPath = traces.path(CONTEXT_SWITCHES_KERNEL_UUID.toString())
-                .path(DataProviderServiceTest.PROVIDERS_PATH)
-                // path to the tree XY data provider from the valid XML file
-                .path("org.eclipse.linuxtools.tmf.analysis.xml.core.tests.xy")
-                .path(DataProviderServiceTest.TREE_PATH);
-        Response xmlTree = xmlProviderPath.request(MediaType.APPLICATION_JSON).get();
+        WebTarget xmlProviderPath = getXYTreeEndpoint(CONTEXT_SWITCHES_KERNEL_UUID.toString(), "org.eclipse.linuxtools.tmf.analysis.xml.core.tests.xy");
+        Map<String, Object> parameters = new HashMap<>();
+        parameters.put("timeRequested", Collections.emptyList());
+        Response xmlTree = xmlProviderPath.request().post(Entity.json(new QueryParameters(parameters , Collections.emptyList())));
         assertEquals("The end point for the XML data provider should be available.", 200, xmlTree.getStatus());
 
         assertEquals(200, xmlEndpoint.path("test_valid.xml").request().delete().getStatus());
diff --git a/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core.tests/src/org/eclipse/tracecompass/incubator/trace/server/jersey/rest/core/tests/stubs/AbstractModelStub.java b/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core.tests/src/org/eclipse/tracecompass/incubator/trace/server/jersey/rest/core/tests/stubs/AbstractModelStub.java
index 0b299ad..4860f1b 100644
--- a/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core.tests/src/org/eclipse/tracecompass/incubator/trace/server/jersey/rest/core/tests/stubs/AbstractModelStub.java
+++ b/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core.tests/src/org/eclipse/tracecompass/incubator/trace/server/jersey/rest/core/tests/stubs/AbstractModelStub.java
@@ -28,6 +28,7 @@
     private final long fNbEvents;
     private final long fStart;
     private final long fEnd;
+    private final String fIndexingStatus;
 
     /**
      * Constructor
@@ -43,12 +44,13 @@
      * @param end
      *            the current end time
      */
-    public AbstractModelStub(String name, UUID uuid, long nbEvents, long start, long end) {
+    public AbstractModelStub(String name, UUID uuid, long nbEvents, long start, long end, String indexingStatus) {
         fName = name;
         fUUID = uuid;
         fNbEvents = nbEvents;
         fStart = start;
         fEnd = end;
+        fIndexingStatus = indexingStatus;
     }
 
     /**
@@ -96,6 +98,10 @@
         return fEnd;
     }
 
+    public String getIndexingStatus() {
+        return fIndexingStatus;
+    }
+
     @Override
     public int hashCode() {
         return Objects.hash(fName, fUUID);
diff --git a/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core.tests/src/org/eclipse/tracecompass/incubator/trace/server/jersey/rest/core/tests/stubs/DataProviderDescriptorStub.java b/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core.tests/src/org/eclipse/tracecompass/incubator/trace/server/jersey/rest/core/tests/stubs/DataProviderDescriptorStub.java
new file mode 100644
index 0000000..98f785e
--- /dev/null
+++ b/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core.tests/src/org/eclipse/tracecompass/incubator/trace/server/jersey/rest/core/tests/stubs/DataProviderDescriptorStub.java
@@ -0,0 +1,137 @@
+/*******************************************************************************
+ * Copyright (c) 2019 Ericsson
+ *
+ * All rights reserved. This program and the accompanying materials are
+ * made available under the terms of the Eclipse Public License v1.0 which
+ * accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *******************************************************************************/
+
+package org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core.tests.stubs;
+
+import java.io.Serializable;
+import java.util.Objects;
+import java.util.UUID;
+
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+/**
+ * Basic Implementation of the serialized data descriptor model used by clients.
+ *
+ * TODO Equality of two stubs is determined by equality of names, paths and
+ * {@link UUID}, as the start time, end time and number of events may be unknown
+ * due to incomplete indexing.
+ *
+ * @author Bernd Hufmann
+ */
+public class DataProviderDescriptorStub implements Serializable {
+
+    /**
+     * Generated Serial Version UID
+     */
+    private static final long serialVersionUID = -6380168132081665386L;
+    private final String fId;
+    private final String fName;
+    private final String fDescription;
+    private final String fTypeId;
+
+    /**
+     * {@link JsonCreator} Constructor for final fields
+     *
+     * @param id
+     *            the id
+     * @param name
+     *            the name
+     * @param description
+     *            the help text
+     * @param type
+     *            the type id
+     *
+     */
+    @JsonCreator
+    public DataProviderDescriptorStub(@JsonProperty("id") String id,
+            @JsonProperty("name") String name,
+            @JsonProperty("description") String description,
+            @JsonProperty("type") String type) {
+        fId = id;
+        fName = name;
+        fDescription = description;
+        fTypeId = type;
+    }
+
+    /**
+     * Gets the ID
+     *
+     * @return the ID
+     */
+    public String getId() {
+        return fId;
+    }
+
+    /**
+     * Gets the name
+     *
+     * @return the name
+     */
+    public String getName() {
+        return fName;
+    }
+
+    /**
+     * Gets the help text
+     *
+     * @return the help text
+     */
+    public String getDescription() {
+        return fDescription;
+    }
+
+    /**
+     * Gets the type ID
+     *
+     * @return the type ID
+     */
+    public String getTypeId() {
+        return fTypeId;
+    }
+
+    @Override
+    public String toString() {
+        return "DataProviderDescriptorStub[fId=" + getId() + ", fName=" + fName + ", fDescription=" + fDescription
+                + ", fTypeId=" + fTypeId+ "]";
+        }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(fId, fName, fDescription, fTypeId);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+
+        if (this == obj) {
+            return true;
+        }
+        if (obj == null) {
+            return false;
+        }
+
+        if (obj instanceof DataProviderDescriptorStub) {
+            DataProviderDescriptorStub other = (DataProviderDescriptorStub) obj;
+            if (!Objects.equals(fId, other.fId)) {
+                return false;
+            }
+            if (!Objects.equals(fName, other.fName)) {
+                return false;
+            }
+            if (!Objects.equals(fDescription, other.fDescription)) {
+                return false;
+            }
+            if (Objects.equals(fTypeId, other.fTypeId)) {
+                return true;
+            }
+        }
+        return false;
+    }
+}
diff --git a/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core.tests/src/org/eclipse/tracecompass/incubator/trace/server/jersey/rest/core/tests/stubs/ExperimentModelStub.java b/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core.tests/src/org/eclipse/tracecompass/incubator/trace/server/jersey/rest/core/tests/stubs/ExperimentModelStub.java
index 02fa2ca..113e954 100644
--- a/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core.tests/src/org/eclipse/tracecompass/incubator/trace/server/jersey/rest/core/tests/stubs/ExperimentModelStub.java
+++ b/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core.tests/src/org/eclipse/tracecompass/incubator/trace/server/jersey/rest/core/tests/stubs/ExperimentModelStub.java
@@ -53,8 +53,9 @@
             @JsonProperty("nbEvents") long nbEvents,
             @JsonProperty("start") long start,
             @JsonProperty("end") long end,
+            @JsonProperty("indexingStatus") String indexingStatus,
             @JsonProperty("traces") Set<TraceModelStub> traces) {
-        super(name, uuid, nbEvents, start, end);
+        super(name, uuid, nbEvents, start, end, indexingStatus);
         fTraces = traces;
     }
 
diff --git a/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core.tests/src/org/eclipse/tracecompass/incubator/trace/server/jersey/rest/core/tests/stubs/TraceModelStub.java b/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core.tests/src/org/eclipse/tracecompass/incubator/trace/server/jersey/rest/core/tests/stubs/TraceModelStub.java
index 491e15f..e227e57 100644
--- a/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core.tests/src/org/eclipse/tracecompass/incubator/trace/server/jersey/rest/core/tests/stubs/TraceModelStub.java
+++ b/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core.tests/src/org/eclipse/tracecompass/incubator/trace/server/jersey/rest/core/tests/stubs/TraceModelStub.java
@@ -54,8 +54,9 @@
             @JsonProperty("UUID") UUID uuid,
             @JsonProperty("nbEvents") long nbEvents,
             @JsonProperty("start") long start,
-            @JsonProperty("end") long end) {
-        super(name, uuid, nbEvents, start, end);
+            @JsonProperty("end") long end,
+            @JsonProperty("indexingStatus") String indexingStatus) {
+        super(name, uuid, nbEvents, start, end, indexingStatus);
         fPath = path;
     }
 
@@ -70,7 +71,7 @@
      *            the stub's UUID
      */
     public TraceModelStub(String name, String path, UUID uuid) {
-        this(name, path, uuid, 0, 0L, 0L);
+        this(name, path, uuid, 0, 0L, 0L, "RUNNING");
     }
 
     /**
diff --git a/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core.tests/src/org/eclipse/tracecompass/incubator/trace/server/jersey/rest/core/tests/utils/RestServerTest.java b/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core.tests/src/org/eclipse/tracecompass/incubator/trace/server/jersey/rest/core/tests/utils/RestServerTest.java
index 7763671..f7e3459 100644
--- a/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core.tests/src/org/eclipse/tracecompass/incubator/trace/server/jersey/rest/core/tests/utils/RestServerTest.java
+++ b/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core.tests/src/org/eclipse/tracecompass/incubator/trace/server/jersey/rest/core/tests/utils/RestServerTest.java
@@ -13,6 +13,9 @@
 
 import java.io.IOException;
 import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
 import java.util.Set;
 import java.util.UUID;
 
@@ -20,21 +23,24 @@
 import javax.ws.rs.client.ClientBuilder;
 import javax.ws.rs.client.Entity;
 import javax.ws.rs.client.WebTarget;
-import javax.ws.rs.core.Form;
 import javax.ws.rs.core.GenericType;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
 
 import org.eclipse.core.runtime.FileLocator;
+import org.eclipse.tracecompass.incubator.internal.trace.server.jersey.rest.core.model.views.QueryParameters;
 import org.eclipse.tracecompass.incubator.internal.trace.server.jersey.rest.core.webapp.WebApplication;
+import org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core.tests.stubs.DataProviderDescriptorStub;
 import org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core.tests.stubs.ExperimentModelStub;
 import org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core.tests.stubs.TraceModelStub;
 import org.eclipse.tracecompass.testtraces.ctf.CtfTestTrace;
+import org.eclipse.tracecompass.tmf.core.dataprovider.IDataProviderDescriptor.ProviderType;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.BeforeClass;
 
 import com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider;
+import com.google.common.collect.ImmutableList;
 
 /**
  * Rest server test abstract class, handles starting the server in test mode,
@@ -44,7 +50,7 @@
  * @author Loic Prieur-Drevon
  */
 public abstract class RestServerTest {
-    private static final String SERVER = "http://localhost:8378/tracecompass"; //$NON-NLS-1$
+    private static final String SERVER = "http://localhost:8378/tsp/api"; //$NON-NLS-1$
     private static final WebApplication fWebApp = new WebApplication(WebApplication.TEST_PORT);
     /**
      * Traces endpoint path (relative to application).
@@ -54,6 +60,27 @@
      * Experiments endpoint path (relative to application).
      */
     public static final String EXPERIMENTS = "experiments";
+
+    /**
+     * Outputs path segment
+     */
+    public static final String OUTPUTS_PATH = "outputs";
+
+    /**
+     * Tree path segment
+     */
+    public static final String TREE_PATH = "tree";
+
+    /**
+     * Time Graph path segment
+     */
+    public static final String TIMEGRAPH_PATH = "timeGraph";
+
+    /**
+     * XY path segment
+     */
+    public static final String XY_PATH = "XY";
+
     /**
      * <b>name</b> constant
      */
@@ -61,12 +88,14 @@
     /**
      * <b>path</b> constant
      */
-    public static final String PATH = "path";
+    public static final String URI = "uri";
 
     private static final GenericType<Set<TraceModelStub>> TRACE_MODEL_SET_TYPE = new GenericType<Set<TraceModelStub>>() {
     };
     private static final GenericType<Set<ExperimentModelStub>> EXPERIMENT_MODEL_SET_TYPE = new GenericType<Set<ExperimentModelStub>>() {
     };
+    private static final GenericType<Set<DataProviderDescriptorStub>> DATAPROVIDER_DESCR_MODEL_SET_TYPE = new GenericType<Set<DataProviderDescriptorStub>>() {
+    };
 
     /**
      * {@link UUID} for {@link CtfTestTrace#CONTEXT_SWITCHES_UST}.
@@ -89,6 +118,11 @@
     protected static TraceModelStub CONTEXT_SWITCHES_KERNEL_STUB;
 
     /**
+     * Expected toString() of all data providers for this experiment
+     */
+    protected static List<DataProviderDescriptorStub> EXPECTED_DATA_PROVIDER_DESCRIPTOR = null;
+
+    /**
      * Create the {@link TraceModelStub}s before running the tests
      *
      * @throws IOException
@@ -101,6 +135,20 @@
 
         String contextSwitchesKernelPath = FileLocator.toFileURL(CtfTestTrace.CONTEXT_SWITCHES_KERNEL.getTraceURL()).getPath();
         CONTEXT_SWITCHES_KERNEL_STUB = new TraceModelStub("kernel", contextSwitchesKernelPath, CONTEXT_SWITCHES_KERNEL_UUID);
+        ImmutableList.Builder<DataProviderDescriptorStub> b = ImmutableList.builder();
+        b.add(new DataProviderDescriptorStub("org.eclipse.tracecompass.internal.analysis.timing.core.segmentstore.scatter.dataprovider:org.eclipse.linuxtools.lttng2.ust.analysis.callstack",
+                "LTTng-UST CallStack - Latency vs Time",
+                "Show latencies provided by Analysis module: LTTng-UST CallStack",
+                ProviderType.TREE_TIME_XY.name()));
+        b.add(new DataProviderDescriptorStub("org.eclipse.tracecompass.internal.analysis.profiling.callstack.provider.CallStackDataProvider",
+                "Flame Chart",
+                "Show a call stack over time",
+                ProviderType.TIME_GRAPH.name()));
+        b.add(new DataProviderDescriptorStub("org.eclipse.tracecompass.internal.tmf.core.histogram.HistogramDataProvider",
+                "Histogram",
+                "Show a histogram of number of events to time for a trace",
+                ProviderType.TREE_TIME_XY.name()));
+        EXPECTED_DATA_PROVIDER_DESCRIPTOR = b.build();
     }
 
     /**
@@ -145,6 +193,42 @@
     }
 
     /**
+     * Get the {@link WebTarget} for the time graph tree endpoint.
+     *
+     * @param UUID
+     *            Trace or experiment UUID
+     * @param dataProviderId
+     *            Data provider ID
+     * @return The time graph tree endpoint
+     */
+    public static WebTarget getTimeGraphTreeEndpoint(String UUID, String dataProviderId) {
+        return getApplicationEndpoint().path(EXPERIMENTS)
+                .path(UUID)
+                .path(OUTPUTS_PATH)
+                .path(TIMEGRAPH_PATH)
+                .path(dataProviderId)
+                .path(TREE_PATH);
+    }
+
+    /**
+     * Get the {@link WebTarget} for the XY tree endpoint.
+     *
+     * @param UUID
+     *            Trace or experiment UUID
+     * @param dataProviderId
+     *            Data provider ID
+     * @return The XY tree endpoint
+     */
+    public static WebTarget getXYTreeEndpoint(String UUID, String dataProviderId) {
+        return getApplicationEndpoint().path(EXPERIMENTS)
+                .path(UUID)
+                .path(OUTPUTS_PATH)
+                .path(XY_PATH)
+                .path(dataProviderId)
+                .path(TREE_PATH);
+    }
+
+    /**
      * Get the traces currently open on the server.
      *
      * @param traces
@@ -167,6 +251,17 @@
     }
 
     /**
+     * Get a set of {@link DataProviderDescriptorStub}
+     *
+     * @param outputs
+     *            {@link WebTarget} for the outputs endpoint
+     * @return Set of {@link DataProviderDescriptorStub} given by the server
+     */
+    public static Set<DataProviderDescriptorStub> getDataProviderDescriptors(WebTarget outputs) {
+        return outputs.request(MediaType.APPLICATION_JSON).get(DATAPROVIDER_DESCR_MODEL_SET_TYPE);
+    }
+
+    /**
      * Post the trace from an expected {@link TraceModelStub}, ensure that the post
      * returned correctly and that the returned model was that of the expected stub.
      *
@@ -176,9 +271,10 @@
      *            expected trace stub
      */
     public static void assertPost(WebTarget traces, TraceModelStub stub) {
-        Form form = new Form(PATH, stub.getPath());
-        form.param(NAME, stub.getName());
-        Response response = traces.request().post(Entity.form(form));
+        Map<String, Object> parameters = new HashMap<>();
+        parameters.put(NAME, stub.getName());
+        parameters.put(URI, stub.getPath());
+        Response response = traces.request().post(Entity.json(new QueryParameters(parameters , Collections.emptyList())));
         int code = response.getStatus();
         assertEquals("Failed to POST " + stub.getName() + ", error code=" + code, 200, code);
         assertEquals(stub, response.readEntity(TraceModelStub.class));
diff --git a/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core/src/org/eclipse/tracecompass/incubator/internal/trace/server/jersey/rest/core/model/views/Filter.java b/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core/src/org/eclipse/tracecompass/incubator/internal/trace/server/jersey/rest/core/model/views/Filter.java
new file mode 100644
index 0000000..fcdc42b
--- /dev/null
+++ b/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core/src/org/eclipse/tracecompass/incubator/internal/trace/server/jersey/rest/core/model/views/Filter.java
@@ -0,0 +1,104 @@
+/**********************************************************************
+ * Copyright (c) 2019 Ericsson
+ *
+ * All rights reserved. This program and the accompanying materials are
+ * made available under the terms of the Eclipse Public License v1.0 which
+ * accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ **********************************************************************/
+
+package org.eclipse.tracecompass.incubator.internal.trace.server.jersey.rest.core.model.views;
+
+/**
+ * Filter that is received by the server to be applied on the response.
+ *
+ * @author Simon Delisle
+ */
+public class Filter {
+    private long fId;
+    private String fName;
+    private long fStartTime;
+    private long fEndTime;
+    private String fExpression;
+    private int fTags;
+
+    /**
+     * Constructor.
+     *
+     * @param id
+     *            Filter ID
+     * @param name
+     *            Human readable name
+     * @param startTime
+     *            Filter start time
+     * @param endTime
+     *            Filter end time
+     * @param expression
+     *            Filter expression (eg. regex)
+     * @param tags
+     *            Tags to be apply on responses (with the filter does)
+     */
+    public Filter(long id, String name, long startTime, long endTime, String expression, int tags) {
+        super();
+        fId = id;
+        fName = name;
+        fStartTime = startTime;
+        fEndTime = endTime;
+        fExpression = expression;
+        fTags = tags;
+    }
+
+    /**
+     * Getter for filter ID
+     *
+     * @return Filter ID
+     */
+    public long getId() {
+        return fId;
+    }
+
+    /**
+     * Getter for filter name
+     *
+     * @return Human readable name
+     */
+    public String getName() {
+        return fName;
+    }
+
+    /**
+     * Getter for filter start time
+     *
+     * @return Filter start time
+     */
+    public long getStartTime() {
+        return fStartTime;
+    }
+
+    /**
+     * Getter for filter end time
+     *
+     * @return Filter end time
+     */
+    public long getEndTime() {
+        return fEndTime;
+    }
+
+    /**
+     * Getter for filter expression
+     *
+     * @return Filter expression
+     */
+    public String getExpression() {
+        return fExpression;
+    }
+
+    /**
+     * Getter for filter tags
+     *
+     * @return Tags to apply
+     */
+    public int getTags() {
+        return fTags;
+    }
+}
diff --git a/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core/src/org/eclipse/tracecompass/incubator/internal/trace/server/jersey/rest/core/model/views/QueryParameters.java b/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core/src/org/eclipse/tracecompass/incubator/internal/trace/server/jersey/rest/core/model/views/QueryParameters.java
new file mode 100644
index 0000000..7ca6199
--- /dev/null
+++ b/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core/src/org/eclipse/tracecompass/incubator/internal/trace/server/jersey/rest/core/model/views/QueryParameters.java
@@ -0,0 +1,57 @@
+/**********************************************************************
+ * Copyright (c) 2019 Ericsson
+ *
+ * All rights reserved. This program and the accompanying materials are
+ * made available under the terms of the Eclipse Public License v1.0 which
+ * accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ **********************************************************************/
+
+package org.eclipse.tracecompass.incubator.internal.trace.server.jersey.rest.core.model.views;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Definition of a parameters object received by the server from a client.
+ *
+ * @author Simon Delisle
+ */
+public class QueryParameters {
+    private Map<String, Object> parameters;
+    private List<Filter> filters;
+
+    /**
+     * Constructor for Jackson
+     */
+    public QueryParameters() {
+        // Default constructor for Jackson
+    }
+
+    /**
+     * Constructor.
+     *
+     * @param parameters
+     *            Map of parameters
+     * @param filters
+     *            List of filters
+     */
+    public QueryParameters(Map<String, Object> parameters, List<Filter> filters) {
+        this.parameters = parameters;
+        this.filters = filters;
+    }
+
+    /**
+     * @return Map of parameters
+     */
+    public Map<String, Object> getParameters() {
+        return parameters;
+    }
+
+    /**
+     * @return List of filters
+     */
+    public List<Filter> getFilters() {
+        return filters;
+    }
+}
diff --git a/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core/src/org/eclipse/tracecompass/incubator/internal/trace/server/jersey/rest/core/services/DataProviderService.java b/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core/src/org/eclipse/tracecompass/incubator/internal/trace/server/jersey/rest/core/services/DataProviderService.java
index ce10932..1d547c0 100644
--- a/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core/src/org/eclipse/tracecompass/incubator/internal/trace/server/jersey/rest/core/services/DataProviderService.java
+++ b/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core/src/org/eclipse/tracecompass/incubator/internal/trace/server/jersey/rest/core/services/DataProviderService.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2017 Ericsson
+ * 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 v1.0 which
@@ -9,53 +9,44 @@
 
 package org.eclipse.tracecompass.incubator.internal.trace.server.jersey.rest.core.services;
 
+import java.util.Arrays;
 import java.util.EnumSet;
-import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Set;
 import java.util.UUID;
 
-import javax.validation.constraints.Min;
-import javax.validation.constraints.NotNull;
 import javax.ws.rs.Consumes;
-import javax.ws.rs.DefaultValue;
-import javax.ws.rs.FormParam;
 import javax.ws.rs.GET;
-import javax.ws.rs.PUT;
+import javax.ws.rs.POST;
 import javax.ws.rs.Path;
 import javax.ws.rs.PathParam;
 import javax.ws.rs.Produces;
 import javax.ws.rs.QueryParam;
 import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.MultivaluedMap;
 import javax.ws.rs.core.Response;
 import javax.ws.rs.core.Response.Status;
 
 import org.eclipse.jdt.annotation.NonNull;
 import org.eclipse.jdt.annotation.Nullable;
 import org.eclipse.tracecompass.incubator.internal.trace.server.jersey.rest.core.model.views.GenericView;
-import org.eclipse.tracecompass.internal.provisional.tmf.core.model.events.TmfEventTableDataProvider;
-import org.eclipse.tracecompass.internal.provisional.tmf.core.model.events.TmfEventTableFilterModel;
-import org.eclipse.tracecompass.internal.provisional.tmf.core.model.filters.EventTableQueryFilter;
+import org.eclipse.tracecompass.incubator.internal.trace.server.jersey.rest.core.model.views.QueryParameters;
 import org.eclipse.tracecompass.internal.provisional.tmf.core.model.filters.VirtualTableQueryFilter;
-import org.eclipse.tracecompass.internal.provisional.tmf.core.model.table.EventTableLine;
 import org.eclipse.tracecompass.internal.provisional.tmf.core.model.table.ITmfVirtualTableDataProvider;
-import org.eclipse.tracecompass.internal.provisional.tmf.core.model.table.ITmfVirtualTableModel;
 import org.eclipse.tracecompass.internal.provisional.tmf.core.model.table.IVirtualTableLine;
 import org.eclipse.tracecompass.internal.tmf.analysis.xml.core.module.XmlOutputElement;
 import org.eclipse.tracecompass.internal.tmf.analysis.xml.core.module.XmlUtils;
 import org.eclipse.tracecompass.internal.tmf.analysis.xml.core.module.XmlUtils.OutputType;
+import org.eclipse.tracecompass.internal.tmf.core.model.filters.FetchParametersUtils;
 import org.eclipse.tracecompass.tmf.analysis.xml.core.module.TmfXmlUtils;
 import org.eclipse.tracecompass.internal.tmf.analysis.xml.core.output.XmlDataProviderManager;
 import org.eclipse.tracecompass.tmf.core.dataprovider.DataProviderManager;
+import org.eclipse.tracecompass.tmf.core.dataprovider.IDataProviderDescriptor;
 import org.eclipse.tracecompass.tmf.core.model.filters.SelectionTimeQueryFilter;
 import org.eclipse.tracecompass.tmf.core.model.filters.TimeQueryFilter;
 import org.eclipse.tracecompass.tmf.core.model.timegraph.ITimeGraphArrow;
 import org.eclipse.tracecompass.tmf.core.model.timegraph.ITimeGraphDataProvider;
 import org.eclipse.tracecompass.tmf.core.model.timegraph.ITimeGraphEntryModel;
-import org.eclipse.tracecompass.tmf.core.model.timegraph.ITimeGraphRowModel;
+import org.eclipse.tracecompass.tmf.core.model.timegraph.TimeGraphModel;
 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.xy.ITmfTreeXYDataProvider;
@@ -65,7 +56,6 @@
 import org.w3c.dom.Element;
 
 import com.google.common.collect.Iterables;
-import com.google.common.primitives.Longs;
 
 /**
  * Service to query the {@link ITmfTreeDataProvider}s
@@ -73,56 +63,52 @@
  * @author Loic Prieur-Drevon
  */
 @SuppressWarnings("restriction")
-@Path("/traces/{uuid}/providers/{providerId}")
+@Path("/experiments/{uuid}/outputs")
 public class DataProviderService {
+    private static final String WRONG_PARAMETERS = "Wrong query parameters"; //$NON-NLS-1$
     private static final String NO_PROVIDER = "Analysis cannot run"; //$NON-NLS-1$
     private static final String NO_SUCH_TRACE = "No Such Trace"; //$NON-NLS-1$
 
     private final DataProviderManager manager = DataProviderManager.getInstance();
 
     /**
-     * Query the provider for the entry tree
+     * Getter for the list of data provider descriptions
+     *
+     * @param uuid
+     *            UUID of the trace to search for
+     * @return the data provider descriptions with the queried {@link UUID} if it exists.
+     */
+    @GET
+    @Produces(MediaType.APPLICATION_JSON)
+    public Response getProviders(@PathParam("uuid") UUID uuid) {
+        ITmfTrace trace = TraceManagerService.getTraceByUUID(uuid);
+        if (trace == null) {
+            return Response.status(Status.NOT_FOUND).build();
+        }
+        List<IDataProviderDescriptor> list = DataProviderManager.getInstance().getAvailableProviders(trace);
+
+        return Response.ok(list).build();
+    }
+
+    /**
+     * Query the provider for the XY tree
      *
      * @param uuid
      *            desired trace UUID
-     * @param providerId
+     * @param outputId
      *            Eclipse extension point ID for the data provider to query
-     * @param start
-     *            lower bound for the query
-     * @param end
-     *            upper bound for the query
-     * @param nb
-     *            nanoseconds between two data points
+     * @param queryParameters
+     *            Parameters to fetch an XY tree as described by
+     *            {@link QueryParameters}
      * @return an {@link GenericView} with the results
      */
-    @GET
-    @Path("/tree")
+    @POST
+    @Path("/XY/{outputId}/tree")
+    @Consumes(MediaType.APPLICATION_JSON)
     @Produces(MediaType.APPLICATION_JSON)
-    public Response getTree(@PathParam("uuid") UUID uuid,
-            @PathParam("providerId") String providerId,
-            @QueryParam("start") long start,
-            @QueryParam("end") @DefaultValue("1") long end,
-            @QueryParam("nb") @DefaultValue("2") int nb) {
-        ITmfTrace trace = TraceManagerService.getTraceByUUID(uuid);
-        if (trace == null) {
-            return Response.status(Status.NOT_FOUND).entity(NO_SUCH_TRACE).build();
-        }
-
-        ITmfTreeDataProvider<? extends @NonNull ITmfTreeDataModel> provider = manager.getDataProvider(trace,
-                providerId, ITmfTreeDataProvider.class);
-
-        if (provider == null && providerId != null) {
-            // try and find the XML provider for the ID.
-            provider = getXmlProvider(trace, providerId, EnumSet.allOf(OutputType.class));
-        }
-
-        if (provider == null) {
-            // The analysis cannot be run on this trace
-            return Response.status(Status.METHOD_NOT_ALLOWED).entity(NO_PROVIDER).build();
-        }
-
-        TmfModelResponse<?> treeResponse = provider.fetchTree(new TimeQueryFilter(start, end, nb), null);
-        return Response.ok(new GenericView<>(trace, treeResponse)).build();
+    public Response getXYTree(@PathParam("uuid") UUID uuid,
+            @PathParam("outputId") String outputId, QueryParameters queryParameters) {
+        return getTree(uuid, outputId, queryParameters);
     }
 
     /**
@@ -130,38 +116,29 @@
      *
      * @param uuid
      *            {@link UUID} of the trace to query
-     * @param providerId
+     * @param outputId
      *            Eclipse extension point ID for the data provider to query
-     * @param start
-     *            lower bound for the query
-     * @param end
-     *            upper bound for the query
-     * @param nb
-     *            nanoseconds between two data points
-     * @param ids
-     *            ids of the entries to query
+     * @param queryParameters
+     *            Parameters to fetch XY as described by {@link QueryParameters}
      * @return an {@link GenericView} with the results
      */
-    @GET
-    @Path("/xy")
+    @POST
+    @Path("/XY/{outputId}/xy")
+    @Consumes(MediaType.APPLICATION_JSON)
     @Produces(MediaType.APPLICATION_JSON)
     public Response getXY(@PathParam("uuid") UUID uuid,
-            @PathParam("providerId") String providerId,
-            @QueryParam("start") long start,
-            @QueryParam("end") long end,
-            @QueryParam("nb") @Min(1) int nb,
-            @QueryParam("ids") @NotNull Set<Long> ids) {
+            @PathParam("outputId") String outputId, QueryParameters queryParameters) {
         ITmfTrace trace = TraceManagerService.getTraceByUUID(uuid);
         if (trace == null) {
             return Response.status(Status.NOT_FOUND).entity(NO_SUCH_TRACE).build();
         }
 
         ITmfTreeXYDataProvider<@NonNull ITmfTreeDataModel> provider = manager.getDataProvider(trace,
-                providerId, ITmfTreeXYDataProvider.class);
+                outputId, ITmfTreeXYDataProvider.class);
 
-        if (provider == null && providerId != null) {
+        if (provider == null && outputId != null) {
             // try and find the XML provider for the ID.
-            provider = getXmlProvider(trace, providerId, EnumSet.of(OutputType.XY));
+            provider = getXmlProvider(trace, outputId, EnumSet.of(OutputType.XY));
         }
 
         if (provider == null) {
@@ -169,8 +146,62 @@
             return Response.status(Status.METHOD_NOT_ALLOWED).entity(NO_PROVIDER).build();
         }
 
-        TmfModelResponse<@NonNull ITmfXyModel> response = provider.fetchXY(new SelectionTimeQueryFilter(start, end, nb, ids), null);
-        return Response.ok(new GenericView<>(trace, response)).build();
+        SelectionTimeQueryFilter selectionTimeQueryFilter = FetchParametersUtils.createSelectionTimeQuery(queryParameters.getParameters());
+        if (selectionTimeQueryFilter == null) {
+            return Response.status(Status.UNAUTHORIZED).entity(WRONG_PARAMETERS).build();
+        }
+
+        TmfModelResponse<@NonNull ITmfXyModel> response = provider.fetchXY(queryParameters.getParameters(), null);
+        return Response.ok(response).build();
+    }
+
+    /**
+     * Query the provider for XY tooltip, currently not implemented
+     *
+     * @param uuid
+     *            {@link UUID} of the trace to query
+     * @param outputId
+     *            Eclipse extension point ID for the data provider to query
+     * @param xValue
+     *            Given X value to fetch the tooltip
+     * @param yValue
+     *            Given Y value to help fetch the tooltip, used to get the right
+     *            point if two points have the same X value
+     * @param entryId
+     *            Entry Id or series Id
+     * @return {@link GenericView} with the results
+     */
+    @GET
+    @Path("/XY/{outputId}/tooltip")
+    @Produces(MediaType.APPLICATION_JSON)
+    public Response getXYTooltip(@PathParam("uuid") UUID uuid,
+            @PathParam("outputId") String outputId,
+            @QueryParam("xValue") long xValue,
+            @QueryParam("yValue") long yValue,
+            @QueryParam("entryId") long entryId) {
+        return Response.status(Status.NOT_IMPLEMENTED).entity("XY tooltip are not implemented yet").build(); //$NON-NLS-1$
+    }
+
+    /**
+     * Query the provider for the time graph tree
+     *
+     * @param uuid
+     *            {@link UUID} of the trace to query
+     * @param outputId
+     *            Eclipse extension point ID for the data provider to query
+     * @param queryParameters
+     *            Parameters to fetch time graph tree as described by
+     *            {@link QueryParameters}
+     * @return {@link GenericView} with the results
+     */
+    @POST
+    @Path("/timeGraph/{outputId}/tree")
+    @Consumes(MediaType.APPLICATION_JSON)
+    @Produces(MediaType.APPLICATION_JSON)
+    public Response getTimeGraphTree(@PathParam("uuid") UUID uuid,
+            @PathParam("outputId") String outputId,
+            QueryParameters queryParameters) {
+        return getTree(uuid, outputId, queryParameters);
     }
 
     /**
@@ -178,41 +209,39 @@
      *
      * @param uuid
      *            desired trace UUID
-     * @param providerId
+     * @param outputId
      *            Eclipse extension point ID for the data provider to query
-     * @param start
-     *            lower bound for the query
-     * @param end
-     *            upper bound for the query
-     * @param nb
-     *            nanoseconds between two data points
-     * @param ids
-     *            ids of the entries to query
-     * @return an {@link GenericView} with the results
+     * @param queryParameters
+     *            Parameters to fetch time graph states as described by
+     *            {@link QueryParameters}
+     * @return {@link GenericView} with the results
      */
-    @GET
-    @Path("/states")
+    @POST
+    @Path("/timeGraph/{outputId}/states")
+    @Consumes(MediaType.APPLICATION_JSON)
     @Produces(MediaType.APPLICATION_JSON)
     public Response getStates(@PathParam("uuid") UUID uuid,
-            @PathParam("providerId") String providerId,
-            @QueryParam("start") long start,
-            @QueryParam("end") long end,
-            @QueryParam("nb") int nb,
-            @QueryParam("ids") @NotNull Set<Long> ids) {
+            @PathParam("outputId") String outputId,
+            QueryParameters queryParameters) {
         ITmfTrace trace = TraceManagerService.getTraceByUUID(uuid);
         if (trace == null) {
             return Response.status(Status.NOT_FOUND).entity(NO_SUCH_TRACE).build();
         }
 
-        ITimeGraphDataProvider<@NonNull ITimeGraphEntryModel> provider = getTimeGraphProvider(trace, providerId);
+        ITimeGraphDataProvider<@NonNull ITimeGraphEntryModel> provider = getTimeGraphProvider(trace, outputId);
 
         if (provider == null) {
             // The analysis cannot be run on this trace
             return Response.status(Status.METHOD_NOT_ALLOWED).entity(NO_PROVIDER).build();
         }
 
-        TmfModelResponse<List<@NonNull ITimeGraphRowModel>> response = provider.fetchRowModel(new SelectionTimeQueryFilter(start, end, nb, ids), null);
-        return Response.ok(new GenericView<>(trace, response)).build();
+        SelectionTimeQueryFilter selectionTimeQueryFilter = FetchParametersUtils.createSelectionTimeQuery(queryParameters.getParameters());
+        if (selectionTimeQueryFilter == null) {
+            return Response.status(Status.UNAUTHORIZED).entity(WRONG_PARAMETERS).build();
+        }
+
+        TmfModelResponse<TimeGraphModel> response = provider.fetchRowModel(queryParameters.getParameters(), null);
+        return Response.ok(response).build();
     }
 
     /**
@@ -220,38 +249,39 @@
      *
      * @param uuid
      *            desired trace UUID
-     * @param providerId
+     * @param outputId
      *            Eclipse extension point ID for the data provider to query
-     * @param start
-     *            lower bound for the query
-     * @param end
-     *            upper bound for the query
-     * @param nb
-     *            nanoseconds between two data points
-     * @return an {@link GenericView} with the results
+     * @param queryParameters
+     *            Parameters to fetch time graph arrows as described by
+     *            {@link QueryParameters}
+     * @return {@link GenericView} with the results
      */
-    @GET
-    @Path("/arrows")
+    @POST
+    @Path("/timeGraph/{outputId}/arrows")
+    @Consumes(MediaType.APPLICATION_JSON)
     @Produces(MediaType.APPLICATION_JSON)
     public Response getArrows(@PathParam("uuid") UUID uuid,
-            @PathParam("providerId") String providerId,
-            @QueryParam("start") long start,
-            @QueryParam("end") long end,
-            @QueryParam("nb") int nb) {
+            @PathParam("outputId") String outputId,
+            QueryParameters queryParameters) {
         ITmfTrace trace = TraceManagerService.getTraceByUUID(uuid);
         if (trace == null) {
             return Response.status(Status.NOT_FOUND).entity(NO_SUCH_TRACE).build();
         }
 
-        ITimeGraphDataProvider<@NonNull ITimeGraphEntryModel> provider = getTimeGraphProvider(trace, providerId);
+        ITimeGraphDataProvider<@NonNull ITimeGraphEntryModel> provider = getTimeGraphProvider(trace, outputId);
 
         if (provider == null) {
             // The analysis cannot be run on this trace
             return Response.status(Status.METHOD_NOT_ALLOWED).entity(NO_PROVIDER).build();
         }
 
-        TmfModelResponse<@NonNull List<@NonNull ITimeGraphArrow>> response = provider.fetchArrows(new TimeQueryFilter(start, end, nb), null);
-        return Response.ok(new GenericView<>(trace, response)).build();
+        TimeQueryFilter timeQueryFilter = FetchParametersUtils.createTimeQuery(queryParameters.getParameters());
+        if (timeQueryFilter == null) {
+            return Response.status(Status.UNAUTHORIZED).entity(WRONG_PARAMETERS).build();
+        }
+
+        TmfModelResponse<@NonNull List<@NonNull ITimeGraphArrow>> response = provider.fetchArrows(queryParameters.getParameters(), null);
+        return Response.ok(response).build();
     }
 
     /**
@@ -259,165 +289,112 @@
      *
      * @param uuid
      *            desired trace UUID
-     * @param providerId
+     * @param outputId
      *            Eclipse extension point ID for the data provider to query
-     * @param start
-     *            lower bound for the query
-     * @param end
-     *            upper bound for the query
-     * @param nb
-     *            nanoseconds between two data points
-     * @param ids
-     *            ids of the entries to query
-     * @return an {@link GenericView} with the results
+     * @param time
+     *            Time where to fetch the tooltip
+     * @param entryId
+     *            Entry Id to identify the state for the tooltip
+     * @param targetId
+     *            Target Id if the tooltip is for an arrow
+     * @return {@link GenericView} with the results
      */
     @GET
-    @Path("/tooltip")
+    @Path("/timeGraph/{outputId}/tooltip")
     @Produces(MediaType.APPLICATION_JSON)
-    public Response getTooltip(@PathParam("uuid") UUID uuid,
-            @PathParam("providerId") String providerId,
-            @QueryParam("start") long start,
-            @QueryParam("end") long end,
-            @QueryParam("nb") int nb,
-            @QueryParam("ids") @NotNull Set<Long> ids) {
+    public Response getTimeGraphTooltip(@PathParam("uuid") UUID uuid,
+            @PathParam("outputId") String outputId,
+            @QueryParam("time") long time,
+            @QueryParam("entryId") long entryId,
+            @QueryParam("targetId") long targetId) {
         ITmfTrace trace = TraceManagerService.getTraceByUUID(uuid);
         if (trace == null) {
             return Response.status(Status.NOT_FOUND).entity(NO_SUCH_TRACE).build();
         }
 
-        ITimeGraphDataProvider<@NonNull ITimeGraphEntryModel> provider = getTimeGraphProvider(trace, providerId);
+        ITimeGraphDataProvider<@NonNull ITimeGraphEntryModel> provider = getTimeGraphProvider(trace, outputId);
 
         if (provider == null) {
             // The analysis cannot be run on this trace
             return Response.status(Status.METHOD_NOT_ALLOWED).entity(NO_PROVIDER).build();
         }
-
-        TmfModelResponse<@NonNull Map<@NonNull String, @NonNull String>> response = provider.fetchTooltip(new SelectionTimeQueryFilter(start, end, nb, ids), null);
-        return Response.ok(new GenericView<>(trace, response)).build();
+        TmfModelResponse<@NonNull Map<@NonNull String, @NonNull String>> response = provider.fetchTooltip(FetchParametersUtils.selectionTimeQueryToMap(new SelectionTimeQueryFilter(time, time, 1, Arrays.asList(entryId, targetId))), null);
+        return Response.ok(response).build();
     }
 
-    private ITimeGraphDataProvider<@NonNull ITimeGraphEntryModel> getTimeGraphProvider(@NonNull ITmfTrace trace, String providerId) {
+    private ITimeGraphDataProvider<@NonNull ITimeGraphEntryModel> getTimeGraphProvider(@NonNull ITmfTrace trace, String outputId) {
         ITimeGraphDataProvider<@NonNull ITimeGraphEntryModel> provider = manager.getDataProvider(trace,
-                providerId, ITimeGraphDataProvider.class);
+                outputId, ITimeGraphDataProvider.class);
 
-        if (provider == null && providerId != null) {
+        if (provider == null && outputId != null) {
             // try and find the XML provider for the ID.
-            provider = getXmlProvider(trace, providerId, EnumSet.of(OutputType.TIME_GRAPH));
+            provider = getXmlProvider(trace, outputId, EnumSet.of(OutputType.TIME_GRAPH));
         }
         return provider;
     }
 
     /**
+     * Query the provider for table columns
+     *
+     * @param uuid
+     *            desired trace UUID
+     * @param outputId
+     *            Eclipse extension point ID for the data provider to query
+     * @param queryParameters
+     *            Parameters to fetch table columns as described by
+     *            {@link QueryParameters}
+     * @return {@link GenericView} with the results
+     */
+    @POST
+    @Path("/table/{outputId}/columns")
+    @Consumes(MediaType.APPLICATION_JSON)
+    @Produces(MediaType.APPLICATION_JSON)
+    public Response getColumns(@PathParam("uuid") UUID uuid,
+            @PathParam("outputId") String outputId,
+            QueryParameters queryParameters) {
+        return getTree(uuid, outputId, queryParameters);
+    }
+
+    /**
      * Query the provider for table lines
      *
      * @param uuid
-     *            Trace UUID
-     * @param providerId
+     *            desired trace UUID
+     * @param outputId
      *            Eclipse extension point ID for the data provider to query
-     * @param low
-     *            Low index
-     * @param size
-     *            Number of lines to return
-     * @param columnIds
-     *            Desired column IDs
-     * @return A {@link GenericView} with the results
+     * @param queryParameters
+     *            Parameters to fetch table lines as described by
+     *            {@link QueryParameters}
+     * @return {@link GenericView} with the results
      */
-    @GET
-    @Path("/lines")
+    @POST
+    @Path("/table/{outputId}/lines")
+    @Consumes(MediaType.APPLICATION_JSON)
     @Produces(MediaType.APPLICATION_JSON)
     public Response getLines(@PathParam("uuid") UUID uuid,
-            @PathParam("providerId") String providerId,
-            @QueryParam("low") @Min(0) long low,
-            @QueryParam("size") @Min(0) int size,
-            @QueryParam("columnId") List<@NonNull Long> columnIds) {
-
+            @PathParam("outputId") String outputId,
+            QueryParameters queryParameters) {
         ITmfTrace trace = TraceManagerService.getTraceByUUID(uuid);
         if (trace == null) {
             return Response.status(Status.NOT_FOUND).entity(NO_SUCH_TRACE).build();
         }
 
-        ITmfVirtualTableDataProvider<? extends IVirtualTableLine, ? extends ITmfTreeDataModel> provider = manager.getDataProvider(trace, providerId, ITmfVirtualTableDataProvider.class);
+        ITmfVirtualTableDataProvider<? extends IVirtualTableLine, ? extends ITmfTreeDataModel> provider = manager.getDataProvider(trace, outputId, ITmfVirtualTableDataProvider.class);
         if (provider == null) {
             return Response.status(Status.METHOD_NOT_ALLOWED).entity(NO_PROVIDER).build();
         }
 
-        VirtualTableQueryFilter queryFilter = new VirtualTableQueryFilter(columnIds, low, size);
-        TmfModelResponse<?> response = provider.fetchLines(queryFilter, null);
-        return Response.ok(new GenericView<>(trace, response)).build();
+        VirtualTableQueryFilter tableQueryFilter = FetchParametersUtils.createVirtualTableQueryFilter(queryParameters.getParameters());
+        if (tableQueryFilter == null) {
+            return Response.status(Status.UNAUTHORIZED).entity(WRONG_PARAMETERS).build();
+        }
+        TmfModelResponse<?> response = provider.fetchLines(queryParameters.getParameters(), null);
+        return Response.ok(response).build();
     }
 
     /**
-     * Query the provider for event table lines with filters
-     *
-     * @param uuid
-     *            Trace UUID
-     * @param providerId
-     *            Eclipse extension point ID for the data provider to query
-     * @param low
-     *            Low index
-     * @param size
-     *            Number of lines to return
-     * @param columnIds
-     *            Desired column IDs
-     * @param presetFilter
-     *            List of preset filter IDs to apply
-     * @param isCollapseFilterEnabled
-     *            True if a collapse filter should be applied
-     * @param multivaluedMap
-     *            Map that contains the table filter (column ID with the associated
-     *            regex)
-     * @return A {@link GenericView} with the results
-     */
-    @PUT
-    @Path("/lines")
-    @Consumes(MediaType.APPLICATION_FORM_URLENCODED)
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response getLines(@PathParam("uuid") UUID uuid,
-            @PathParam("providerId") String providerId,
-            @QueryParam("low") @Min(0) long low,
-            @QueryParam("size") @Min(0) int size,
-            @QueryParam("columnId") List<@NonNull Long> columnIds,
-            @FormParam("presetFilterId") List<@NonNull String> presetFilter,
-            @FormParam("collapseFilter") boolean isCollapseFilterEnabled,
-            MultivaluedMap<@NonNull String, @NonNull String> multivaluedMap) {
-
-        ITmfTrace trace = TraceManagerService.getTraceByUUID(uuid);
-        if (trace == null) {
-            return Response.status(Status.NOT_FOUND).entity(NO_SUCH_TRACE).build();
-        }
-
-        TmfEventTableDataProvider provider = manager.getDataProvider(trace, providerId, TmfEventTableDataProvider.class);
-        if (provider == null) {
-            return Response.status(Status.METHOD_NOT_ALLOWED).entity(NO_PROVIDER).build();
-        }
-
-        /*
-         * The multivaluedMap contains all the entry from the form, including the
-         * presetFilter list and the collapse boolean. In order to extract the table
-         * filters (mapping between column ID and regex) the tryParse is use to capture
-         * just the keys that are longs (column IDs)
-         */
-        Map<@NonNull Long, @NonNull String> tableFilter = null;
-        for (Entry<String, List<String>> paramEntry : multivaluedMap.entrySet()) {
-            Long columnId = Longs.tryParse(paramEntry.getKey());
-            if (columnId == null) {
-                continue;
-            }
-
-            if (tableFilter == null) {
-                tableFilter = new HashMap<>();
-            }
-            tableFilter.put(columnId, paramEntry.getValue().get(0));
-        }
-
-        TmfEventTableFilterModel filters = new TmfEventTableFilterModel(tableFilter, null, presetFilter, null, isCollapseFilterEnabled);
-        EventTableQueryFilter queryFilter = new EventTableQueryFilter(columnIds, low, size, filters);
-        TmfModelResponse<@NonNull ITmfVirtualTableModel<@NonNull EventTableLine>> response = provider.fetchLines(queryFilter, null);
-        return Response.ok(new GenericView<>(trace, response)).build();
-    }
-
-    /**
-     * Get the XML data provider for a trace, provider id and XML {@link OutputType}
+     * Get the XML data provider for a trace, provider id and XML
+     * {@link OutputType}
      *
      * @param trace
      *            the queried trace
@@ -425,11 +402,10 @@
      *            the queried ID
      * @param types
      *            the data provider type
-     * @return the provider if an XML containing the ID exists and applies to the
-     *         trace, else null
+     * @return the provider if an XML containing the ID exists and applies to
+     *         the trace, else null
      */
-    private static <@Nullable P extends ITmfTreeDataProvider<? extends @NonNull ITmfTreeDataModel>> P
-        getXmlProvider(@NonNull ITmfTrace trace, @NonNull String id, EnumSet<OutputType> types) {
+    private static <@Nullable P extends ITmfTreeDataProvider<? extends @NonNull ITmfTreeDataModel>> P getXmlProvider(@NonNull ITmfTrace trace, @NonNull String id, EnumSet<OutputType> types) {
         for (OutputType viewType : types) {
             for (XmlOutputElement element : Iterables.filter(XmlUtils.getXmlOutputElements().values(),
                     element -> element.getXmlElem().equals(viewType.getXmlElem()) && id.equals(element.getId()))) {
@@ -444,4 +420,31 @@
         return null;
     }
 
+    private Response getTree(UUID uuid, String outputId, QueryParameters queryParameters) {
+        ITmfTrace trace = TraceManagerService.getTraceByUUID(uuid);
+        if (trace == null) {
+            return Response.status(Status.NOT_FOUND).entity(NO_SUCH_TRACE).build();
+        }
+
+        ITmfTreeDataProvider<? extends @NonNull ITmfTreeDataModel> provider = manager.getDataProvider(trace,
+                outputId, ITmfTreeDataProvider.class);
+
+        if (provider == null && outputId != null) {
+            // try and find the XML provider for the ID.
+            provider = getXmlProvider(trace, outputId, EnumSet.allOf(OutputType.class));
+        }
+
+        if (provider == null) {
+            // The analysis cannot be run on this trace
+            return Response.status(Status.METHOD_NOT_ALLOWED).entity(NO_PROVIDER).build();
+        }
+
+        TimeQueryFilter timeQueryFilter = FetchParametersUtils.createTimeQuery(queryParameters.getParameters());
+        if (timeQueryFilter == null) {
+            return Response.status(Status.UNAUTHORIZED).entity(WRONG_PARAMETERS).build();
+        }
+
+        TmfModelResponse<?> treeResponse = provider.fetchTree(queryParameters.getParameters(), null);
+        return Response.ok(treeResponse).build();
+    }
 }
diff --git a/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core/src/org/eclipse/tracecompass/incubator/internal/trace/server/jersey/rest/core/services/ExperimentManagerService.java b/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core/src/org/eclipse/tracecompass/incubator/internal/trace/server/jersey/rest/core/services/ExperimentManagerService.java
index 12913dc..ea1038e 100644
--- a/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core/src/org/eclipse/tracecompass/incubator/internal/trace/server/jersey/rest/core/services/ExperimentManagerService.java
+++ b/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core/src/org/eclipse/tracecompass/incubator/internal/trace/server/jersey/rest/core/services/ExperimentManagerService.java
@@ -80,6 +80,14 @@
         return Response.status(Status.NOT_FOUND).build();
     }
 
+    @GET
+    @Path("/{uuid}/outputs")
+    @Produces(MediaType.APPLICATION_JSON)
+    public Response getOutputs(@PathParam("uuid") UUID uuid) {
+        return Response.status(Status.NOT_IMPLEMENTED).entity("Not implemented for " + uuid).build();
+    }
+
+
     /**
      * Delete an experiment by {@link UUID}.
      *
diff --git a/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core/src/org/eclipse/tracecompass/incubator/internal/trace/server/jersey/rest/core/services/FilterService.java b/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core/src/org/eclipse/tracecompass/incubator/internal/trace/server/jersey/rest/core/services/FilterService.java
new file mode 100644
index 0000000..5118672
--- /dev/null
+++ b/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core/src/org/eclipse/tracecompass/incubator/internal/trace/server/jersey/rest/core/services/FilterService.java
@@ -0,0 +1,102 @@
+/**********************************************************************
+ * Copyright (c) 2019 Ericsson
+ *
+ * All rights reserved. This program and the accompanying materials are
+ * made available under the terms of the Eclipse Public License v1.0 which
+ * accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ **********************************************************************/
+
+package org.eclipse.tracecompass.incubator.internal.trace.server.jersey.rest.core.services;
+
+import javax.ws.rs.Consumes;
+import javax.ws.rs.DELETE;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.PUT;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.Response.Status;
+
+/**
+ * Service to manage filters
+ *
+ * @author Simon Delisle
+ */
+@Path("/filters")
+public class FilterService {
+
+    /**
+     * Get a list of all the filters available on the server
+     *
+     * @return List of filters
+     */
+    @GET
+    @Produces(MediaType.APPLICATION_JSON)
+    public Response getFilters() {
+        return Response.status(Status.NOT_IMPLEMENTED).build();
+    }
+
+    /**
+     * Create a new filter on the server
+     *
+     * @param filter
+     *            Filter to create
+     * @return Created filter
+     */
+    @POST
+    @Consumes(MediaType.APPLICATION_JSON)
+    @Produces(MediaType.APPLICATION_JSON)
+    public Response createFilter(Object filter) {
+        return Response.status(Status.NOT_IMPLEMENTED).build();
+    }
+
+    /**
+     * Get a specific filter
+     *
+     * @param filterId
+     *            Filter Id
+     * @return Filter
+     */
+    @GET
+    @Path("/{filterId}")
+    @Produces(MediaType.APPLICATION_JSON)
+    public Response getFilter(@PathParam("filterId") String filterId) {
+        return Response.status(Status.NOT_IMPLEMENTED).build();
+    }
+
+    /**
+     * Update a specific filter
+     *
+     * @param filterId
+     *            Filter Id
+     * @param filter
+     *            Filter used to update the given filter
+     * @return Updated filter
+     */
+    @PUT
+    @Path("/{filterId}")
+    @Consumes(MediaType.APPLICATION_JSON)
+    @Produces(MediaType.APPLICATION_JSON)
+    public Response updateFilter(@PathParam("filterId") String filterId,
+            Object filter) {
+        return Response.status(Status.NOT_IMPLEMENTED).build();
+    }
+
+    /**
+     * Delete a specific filter
+     *
+     * @param filterId
+     *            Id of the filter to delete
+     * @return Deleted filter
+     */
+    @DELETE
+    @Path("/{filterId}")
+    @Produces(MediaType.APPLICATION_JSON)
+    public Response deleteFilter(@PathParam("filterId") String filterId) {
+        return Response.status(Status.NOT_IMPLEMENTED).build();
+    }
+}
diff --git a/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core/src/org/eclipse/tracecompass/incubator/internal/trace/server/jersey/rest/core/services/TraceManagerService.java b/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core/src/org/eclipse/tracecompass/incubator/internal/trace/server/jersey/rest/core/services/TraceManagerService.java
index 7472064..e24eda0 100644
--- a/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core/src/org/eclipse/tracecompass/incubator/internal/trace/server/jersey/rest/core/services/TraceManagerService.java
+++ b/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core/src/org/eclipse/tracecompass/incubator/internal/trace/server/jersey/rest/core/services/TraceManagerService.java
@@ -12,13 +12,12 @@
 import java.io.File;
 import java.nio.file.Paths;
 import java.util.List;
+import java.util.Map;
 import java.util.UUID;
 
 import javax.validation.constraints.NotNull;
-import javax.validation.constraints.Size;
 import javax.ws.rs.Consumes;
 import javax.ws.rs.DELETE;
-import javax.ws.rs.FormParam;
 import javax.ws.rs.GET;
 import javax.ws.rs.POST;
 import javax.ws.rs.Path;
@@ -40,6 +39,7 @@
 import org.eclipse.jdt.annotation.NonNull;
 import org.eclipse.jdt.annotation.Nullable;
 import org.eclipse.tracecompass.incubator.internal.trace.server.jersey.rest.core.Activator;
+import org.eclipse.tracecompass.incubator.internal.trace.server.jersey.rest.core.model.views.QueryParameters;
 import org.eclipse.tracecompass.tmf.core.TmfCommonConstants;
 import org.eclipse.tracecompass.tmf.core.event.ITmfEvent;
 import org.eclipse.tracecompass.tmf.core.exceptions.TmfTraceException;
@@ -83,20 +83,20 @@
      * Method to open the trace, initialize it, index it and add it to the trace
      * manager.
      *
-     * @param name
-     *            the name to assign to the trace files
-     * @param path
-     *            the path to the trace
-     * @param typeID
-     *            the ID of a trace (like "o.e.l.specifictrace" )
+     * @param queryParameters
+     *            Parameters to post a trace as described by
+     *            {@link QueryParameters}
      * @return the new trace model object or the exception if it failed to load.
      */
     @POST
-    @Consumes({ MediaType.APPLICATION_FORM_URLENCODED })
-    @Produces({ MediaType.APPLICATION_JSON })
-    public Response putTrace(@FormParam("name") @NotNull @Size(min = 1) String name,
-            @FormParam("path") String path,
-            @FormParam("typeID") String typeID) {
+    @Consumes(MediaType.APPLICATION_JSON)
+    @Produces(MediaType.APPLICATION_JSON)
+    public Response putTrace(QueryParameters queryParameters) {
+        Map<String, Object> parameters = queryParameters.getParameters();
+        String name = (String) parameters.get("name");
+        String path = (String) parameters.get("uri");
+        Object typeIDObject = parameters.get("typeID");
+        String typeID = typeIDObject != null ? (String) typeIDObject : "";
         Optional<@NonNull ITmfTrace> optional = Iterables.tryFind(TmfTraceManager.getInstance().getOpenedTraces(), t -> t.getPath().equals(path));
         if (optional.isPresent()) {
             return Response.status(Status.CONFLICT).entity(optional.get()).build();
diff --git a/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core/src/org/eclipse/tracecompass/incubator/internal/trace/server/jersey/rest/core/webapp/DataProviderDescriptorSerializer.java b/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core/src/org/eclipse/tracecompass/incubator/internal/trace/server/jersey/rest/core/webapp/DataProviderDescriptorSerializer.java
new file mode 100644
index 0000000..cf72a3f
--- /dev/null
+++ b/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core/src/org/eclipse/tracecompass/incubator/internal/trace/server/jersey/rest/core/webapp/DataProviderDescriptorSerializer.java
@@ -0,0 +1,50 @@
+/*******************************************************************************
+ * Copyright (c) 2018 Ericsson
+ *
+ * All rights reserved. This program and the accompanying materials are
+ * made available under the terms of the Eclipse Public License v1.0 which
+ * accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *******************************************************************************/
+
+package org.eclipse.tracecompass.incubator.internal.trace.server.jersey.rest.core.webapp;
+
+import java.io.IOException;
+
+import org.eclipse.tracecompass.tmf.core.dataprovider.IDataProviderDescriptor;
+
+import com.fasterxml.jackson.core.JsonGenerator;
+import com.fasterxml.jackson.databind.SerializerProvider;
+import com.fasterxml.jackson.databind.ser.std.StdSerializer;
+
+/**
+ * {@link StdSerializer} for {@link IDataProviderDescriptor} to avoid building intermediate
+ * representations.
+ *
+ * @author Bernd Hufmann
+ */
+public class DataProviderDescriptorSerializer extends StdSerializer<IDataProviderDescriptor> {
+
+    /**
+     * Generated serialVersionUID
+     */
+    private static final long serialVersionUID = 9170252203750031947L;
+
+    /**
+     * Public constructor
+     */
+    public DataProviderDescriptorSerializer() {
+        super(IDataProviderDescriptor.class);
+    }
+
+    @Override
+    public void serialize(IDataProviderDescriptor value, JsonGenerator gen, SerializerProvider provider) throws IOException {
+        gen.writeStartObject();
+        gen.writeStringField("id", value.getId()); //$NON-NLS-1$
+        gen.writeStringField("name", value.getName()); //$NON-NLS-1$
+        gen.writeStringField("description", value.getDescription()); //$NON-NLS-1$
+        gen.writeStringField("type", value.getType().name()); //$NON-NLS-1$
+        gen.writeEndObject();
+    }
+
+}
diff --git a/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core/src/org/eclipse/tracecompass/incubator/internal/trace/server/jersey/rest/core/webapp/SeriesModelSerializer.java b/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core/src/org/eclipse/tracecompass/incubator/internal/trace/server/jersey/rest/core/webapp/SeriesModelSerializer.java
new file mode 100644
index 0000000..72fc7e9
--- /dev/null
+++ b/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core/src/org/eclipse/tracecompass/incubator/internal/trace/server/jersey/rest/core/webapp/SeriesModelSerializer.java
@@ -0,0 +1,50 @@
+/**********************************************************************
+ * Copyright (c) 2019 Ericsson
+ *
+ * All rights reserved. This program and the accompanying materials are
+ * made available under the terms of the Eclipse Public License v1.0 which
+ * accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ **********************************************************************/
+
+package org.eclipse.tracecompass.incubator.internal.trace.server.jersey.rest.core.webapp;
+
+import java.io.IOException;
+
+import org.eclipse.jdt.annotation.NonNull;
+import org.eclipse.tracecompass.tmf.core.model.xy.ISeriesModel;
+
+import com.fasterxml.jackson.core.JsonGenerator;
+import com.fasterxml.jackson.databind.SerializerProvider;
+import com.fasterxml.jackson.databind.ser.std.StdSerializer;
+
+/**
+ * Serializer for XY series model {@link ISeriesModel}
+ *
+ * @author Simon Delisle
+ */
+public class SeriesModelSerializer extends StdSerializer<@NonNull ISeriesModel> {
+
+    /**
+     * Generated serialVersionUID
+     */
+    private static final long serialVersionUID = -4359431726167157401L;
+
+    /**
+     * Constructor.
+     */
+    protected SeriesModelSerializer() {
+        super(ISeriesModel.class);
+    }
+
+    @Override
+    public void serialize(ISeriesModel value, JsonGenerator gen, SerializerProvider provider) throws IOException {
+        gen.writeStartObject();
+        gen.writeNumberField("id", value.getId()); //$NON-NLS-1$
+        gen.writeStringField("name", value.getName()); //$NON-NLS-1$
+        gen.writeObjectField("xValues", value.getXValues()); //$NON-NLS-1$
+        gen.writeObjectField("yValues", value.getYValues()); //$NON-NLS-1$
+        gen.writeEndObject();
+    }
+
+}
diff --git a/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core/src/org/eclipse/tracecompass/incubator/internal/trace/server/jersey/rest/core/webapp/TraceSerializer.java b/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core/src/org/eclipse/tracecompass/incubator/internal/trace/server/jersey/rest/core/webapp/TraceSerializer.java
index 06547a3..165d419 100644
--- a/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core/src/org/eclipse/tracecompass/incubator/internal/trace/server/jersey/rest/core/webapp/TraceSerializer.java
+++ b/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core/src/org/eclipse/tracecompass/incubator/internal/trace/server/jersey/rest/core/webapp/TraceSerializer.java
@@ -48,6 +48,9 @@
         gen.writeNumberField("nbEvents", value.getNbEvents()); //$NON-NLS-1$
         gen.writeNumberField("start", value.getStartTime().toNanos()); //$NON-NLS-1$
         gen.writeNumberField("end", value.getEndTime().toNanos()); //$NON-NLS-1$
+        // TODO Find a better way, no support for cancel
+        String indexingStatus = value.isIndexing() ? "RUNNING" : "COMPLETED"; //$NON-NLS-1$ //$NON-NLS-2$
+        gen.writeStringField("indexingStatus", indexingStatus); //$NON-NLS-1$
         gen.writeEndObject();
     }
 
diff --git a/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core/src/org/eclipse/tracecompass/incubator/internal/trace/server/jersey/rest/core/webapp/WebApplication.java b/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core/src/org/eclipse/tracecompass/incubator/internal/trace/server/jersey/rest/core/webapp/WebApplication.java
index 09378c9..59c490a 100644
--- a/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core/src/org/eclipse/tracecompass/incubator/internal/trace/server/jersey/rest/core/webapp/WebApplication.java
+++ b/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core/src/org/eclipse/tracecompass/incubator/internal/trace/server/jersey/rest/core/webapp/WebApplication.java
@@ -15,9 +15,13 @@
 import org.eclipse.jetty.servlet.ServletHolder;
 import org.eclipse.tracecompass.incubator.internal.trace.server.jersey.rest.core.services.DataProviderService;
 import org.eclipse.tracecompass.incubator.internal.trace.server.jersey.rest.core.services.ExperimentManagerService;
+import org.eclipse.tracecompass.incubator.internal.trace.server.jersey.rest.core.services.FilterService;
 import org.eclipse.tracecompass.incubator.internal.trace.server.jersey.rest.core.services.TraceManagerService;
 import org.eclipse.tracecompass.incubator.internal.trace.server.jersey.rest.core.services.XmlManagerService;
+import org.eclipse.tracecompass.internal.tmf.core.model.DataProviderDescriptor;
 import org.eclipse.tracecompass.tmf.core.TmfCommonConstants;
+import org.eclipse.tracecompass.tmf.core.model.xy.ISeriesModel;
+import org.eclipse.tracecompass.tmf.core.model.xy.ITmfXyModel;
 import org.eclipse.tracecompass.tmf.core.trace.ITmfTrace;
 import org.eclipse.tracecompass.tmf.core.trace.experiment.TmfExperiment;
 import org.glassfish.jersey.server.ResourceConfig;
@@ -37,7 +41,7 @@
  */
 public class WebApplication {
 
-    private static final String CONTEXT_PATH = "/tracecompass"; //$NON-NLS-1$
+    private static final String CONTEXT_PATH = "/tsp/api"; //$NON-NLS-1$
     private static final String PATH_SPEC = "/*"; //$NON-NLS-1$
     /**
      * Port value which boots the server in testing mode.
@@ -80,6 +84,7 @@
         rc.register(TraceManagerService.class);
         rc.register(ExperimentManagerService.class);
         rc.register(DataProviderService.class);
+        rc.register(FilterService.class);
         rc.register(XmlManagerService.class);
         rc.register(CORSFilter.class);
         rc.register(registerCustomMappers());
@@ -116,6 +121,9 @@
         SimpleModule module = new SimpleModule();
         module.addSerializer(ITmfTrace.class, new TraceSerializer());
         module.addSerializer(TmfExperiment.class, new ExperimentSerializer());
+        module.addSerializer(DataProviderDescriptor.class, new DataProviderDescriptorSerializer());
+        module.addSerializer(ITmfXyModel.class, new XYModelSerializer());
+        module.addSerializer(ISeriesModel.class, new SeriesModelSerializer());
         mapper.registerModule(module);
         return provider;
     }
diff --git a/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core/src/org/eclipse/tracecompass/incubator/internal/trace/server/jersey/rest/core/webapp/XYModelSerializer.java b/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core/src/org/eclipse/tracecompass/incubator/internal/trace/server/jersey/rest/core/webapp/XYModelSerializer.java
new file mode 100644
index 0000000..3684ad1
--- /dev/null
+++ b/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core/src/org/eclipse/tracecompass/incubator/internal/trace/server/jersey/rest/core/webapp/XYModelSerializer.java
@@ -0,0 +1,48 @@
+/**********************************************************************
+ * Copyright (c) 2019 Ericsson
+ *
+ * All rights reserved. This program and the accompanying materials are
+ * made available under the terms of the Eclipse Public License v1.0 which
+ * accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ **********************************************************************/
+
+package org.eclipse.tracecompass.incubator.internal.trace.server.jersey.rest.core.webapp;
+
+import java.io.IOException;
+
+import org.eclipse.jdt.annotation.NonNull;
+import org.eclipse.tracecompass.tmf.core.model.xy.ITmfXyModel;
+
+import com.fasterxml.jackson.core.JsonGenerator;
+import com.fasterxml.jackson.databind.SerializerProvider;
+import com.fasterxml.jackson.databind.ser.std.StdSerializer;
+
+/**
+ * Serializer for XY model {@link ITmfXyModel}
+ *
+ * @author Simon Delisle
+ */
+public class XYModelSerializer extends StdSerializer<@NonNull ITmfXyModel> {
+
+    /**
+     * Generated serialVersionUID
+     */
+    private static final long serialVersionUID = -7271194941789981571L;
+
+    /**
+     * Constructor.
+     */
+    protected XYModelSerializer() {
+        super(ITmfXyModel.class);
+    }
+
+    @Override
+    public void serialize(@NonNull ITmfXyModel value, JsonGenerator gen, SerializerProvider provider) throws IOException {
+        gen.writeStartObject();
+        gen.writeStringField("title", value.getTitle()); //$NON-NLS-1$
+        gen.writeObjectField("series", value.getData()); //$NON-NLS-1$
+        gen.writeEndObject();
+    }
+
+}
diff --git a/trace-server/org.eclipse.tracecompass.incubator.trace.server.product/pom.xml b/trace-server/org.eclipse.tracecompass.incubator.trace.server.product/pom.xml
index 78789db..91b7784 100644
--- a/trace-server/org.eclipse.tracecompass.incubator.trace.server.product/pom.xml
+++ b/trace-server/org.eclipse.tracecompass.incubator.trace.server.product/pom.xml
@@ -71,6 +71,126 @@
 
   <profiles>
     <profile>
+      <id>sign-update-site</id>
+      <build>
+        <plugins>
+            <plugin>
+                <groupId>org.eclipse.tycho</groupId>
+                <artifactId>tycho-p2-director-plugin</artifactId>
+                <version>${tycho-version}</version>
+                <executions>
+                    <execution>
+                        <id>materialize-products</id>
+                        <goals>
+                            <goal>materialize-products</goal>
+                        </goals>
+                    </execution>
+                    <execution>
+                        <id>archive-products</id>
+                        <phase>pre-integration-test</phase>
+                        <goals>
+                            <goal>archive-products</goal>
+                        </goals>
+                        <configuration>
+                            <formats>
+                                <linux>tar.gz</linux>
+                                <macosx>tar.gz</macosx>
+                                <solaris>zip</solaris>
+                                <win32>zip</win32>
+                            </formats>
+                        </configuration>
+                    </execution>
+                </executions>
+                <configuration>
+                    <products>
+                        <product>
+                            <archiveFileName>${archiveFileName}</archiveFileName>
+                            <id>${productId}</id>
+                            <rootFolder>${rootFolder}</rootFolder>
+                            <rootFolders>
+                                <macosx>${rootFolderMac}</macosx>
+                            </rootFolders>
+                        </product>
+                    </products>
+                    <source>repository</source>
+                </configuration>
+            </plugin>
+<!--
+          <plugin>
+            <groupId>org.eclipse.cbi.maven.plugins</groupId>
+            <artifactId>eclipse-macsigner-plugin</artifactId>
+            <version>${cbi-plugins.version}</version>
+            <executions>
+              <execution>
+                <goals>
+                  <goal>sign</goal>
+                </goals>
+                <configuration>
+                  <signFiles>
+                    <signFile>${project.build.directory}/products/${productId}/macosx/cocoa/x86_64/${rootFolderMac}</signFile>
+                  </signFiles>
+                </configuration>
+              </execution>
+            </executions>
+          </plugin>
+ -->
+        </plugins>
+      </build>
+    </profile>
+  <!-- Deploy RCP builds and update site to the downloads area -->
+    <profile>
+      <id>deploy-rcp</id>
+      <properties>
+        <rcpDestination>/home/data/httpd/download.eclipse.org/tracecompass.incubator/trace-server/rcp/</rcpDestination>
+        <rcpSiteDestination>/home/data/httpd/download.eclipse.org/tracecompass.incubator/trace-server/rcp-repository</rcpSiteDestination>
+      </properties>
+      <build>
+        <plugins>
+          <plugin>
+            <artifactId>maven-antrun-plugin</artifactId>
+            <executions>
+              <execution>
+                <id>deploy</id>
+                <phase>install</phase>
+                <goals>
+                  <goal>run</goal>
+                </goals>
+                <configuration>
+                  <target>
+                    <!-- Cleanup the "rcp" destination, and copy over the new archives -->
+                    <delete includeemptydirs="false">
+                      <fileset dir="${rcpDestination}">
+                        <include name="*.tar.gz" />
+                        <include name="*.zip" />
+                      </fileset>
+                    </delete>
+                    <copy includeemptydirs="false" todir="${rcpDestination}">
+                      <fileset dir="target/products">
+                        <include name="trace-compass-*" />
+                      </fileset>
+                    </copy>
+
+                    <!-- Cleanup the "rcp-repository" update site, and copy over the new one -->
+                    <delete includeemptydirs="false">
+                      <fileset
+                        dir="${rcpSiteDestination}">
+                        <include name="**" />
+                      </fileset>
+                    </delete>
+                    <copy includeemptydirs="false" todir="${rcpSiteDestination}">
+                      <fileset dir="target/repository">
+                        <include name="**" />
+                      </fileset>
+                    </copy>
+                  </target>
+                </configuration>
+              </execution>
+            </executions>
+          </plugin>
+        </plugins>
+      </build>
+    </profile>
+    <profile>
       <id>build-one-rcp</id>
         <build>
           <plugins>
diff --git a/trace-server/pom.xml b/trace-server/pom.xml
index 1030c97..49e5abd 100644
--- a/trace-server/pom.xml
+++ b/trace-server/pom.xml
@@ -28,7 +28,7 @@
     <module>org.eclipse.tracecompass.incubator.trace.server.jersey.rest</module>
     <module>org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core</module>
     <module>org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core.tests</module>
-    <!--module>org.eclipse.tracecompass.incubator.trace.server.product</module-->    
+    <module>org.eclipse.tracecompass.incubator.trace.server.product</module>
     <!-- insert modules here -->
   </modules>
 
diff --git a/tracetypes/org.eclipse.tracecompass.incubator.opentracing.core/src/org/eclipse/tracecompass/incubator/internal/opentracing/core/analysis/spanlife/SpanLifeDataProvider.java b/tracetypes/org.eclipse.tracecompass.incubator.opentracing.core/src/org/eclipse/tracecompass/incubator/internal/opentracing/core/analysis/spanlife/SpanLifeDataProvider.java
index caa88aa..f6ddd14 100644
--- a/tracetypes/org.eclipse.tracecompass.incubator.opentracing.core/src/org/eclipse/tracecompass/incubator/internal/opentracing/core/analysis/spanlife/SpanLifeDataProvider.java
+++ b/tracetypes/org.eclipse.tracecompass.incubator.opentracing.core/src/org/eclipse/tracecompass/incubator/internal/opentracing/core/analysis/spanlife/SpanLifeDataProvider.java
@@ -23,13 +23,14 @@
 import org.eclipse.jdt.annotation.Nullable;
 import org.eclipse.tracecompass.incubator.internal.opentracing.core.analysis.spanlife.SpanLifeEntryModel.LogEvent;
 import org.eclipse.tracecompass.incubator.internal.opentracing.core.event.IOpenTracingConstants;
-import org.eclipse.tracecompass.internal.tmf.core.model.filters.TimeGraphStateQueryFilter;
+import org.eclipse.tracecompass.internal.tmf.core.model.filters.FetchParametersUtils;
 import org.eclipse.tracecompass.internal.tmf.core.model.timegraph.AbstractTimeGraphDataProvider;
 import org.eclipse.tracecompass.statesystem.core.ITmfStateSystem;
 import org.eclipse.tracecompass.statesystem.core.exceptions.AttributeNotFoundException;
 import org.eclipse.tracecompass.statesystem.core.exceptions.StateSystemDisposedException;
 import org.eclipse.tracecompass.statesystem.core.exceptions.TimeRangeException;
 import org.eclipse.tracecompass.statesystem.core.interval.ITmfStateInterval;
+import org.eclipse.tracecompass.tmf.core.dataprovider.DataProviderParameterUtils;
 import org.eclipse.tracecompass.tmf.core.model.CommonStatusMessage;
 import org.eclipse.tracecompass.tmf.core.model.filters.SelectionTimeQueryFilter;
 import org.eclipse.tracecompass.tmf.core.model.filters.TimeQueryFilter;
@@ -37,8 +38,10 @@
 import org.eclipse.tracecompass.tmf.core.model.timegraph.ITimeGraphRowModel;
 import org.eclipse.tracecompass.tmf.core.model.timegraph.ITimeGraphState;
 import org.eclipse.tracecompass.tmf.core.model.timegraph.TimeGraphEntryModel;
+import org.eclipse.tracecompass.tmf.core.model.timegraph.TimeGraphModel;
 import org.eclipse.tracecompass.tmf.core.model.timegraph.TimeGraphRowModel;
 import org.eclipse.tracecompass.tmf.core.model.timegraph.TimeGraphState;
+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.timestamp.TmfTimestamp;
@@ -83,13 +86,17 @@
     }
 
     @Override
-    public @NonNull TmfModelResponse<@NonNull List<@NonNull ITimeGraphArrow>> fetchArrows(@NonNull TimeQueryFilter filter, @Nullable IProgressMonitor monitor) {
+    public @NonNull TmfModelResponse<@NonNull List<@NonNull ITimeGraphArrow>> fetchArrows(Map<String, Object> fetchParameters, @Nullable IProgressMonitor monitor) {
         return new TmfModelResponse<>(null, ITmfResponse.Status.COMPLETED, CommonStatusMessage.COMPLETED);
     }
 
     @Override
-    public @NonNull TmfModelResponse<@NonNull Map<@NonNull String, @NonNull String>> fetchTooltip(@NonNull SelectionTimeQueryFilter filter, @Nullable IProgressMonitor monitor) {
+    public @NonNull TmfModelResponse<@NonNull Map<@NonNull String, @NonNull String>> fetchTooltip(Map<String, Object> fetchParameters, @Nullable IProgressMonitor monitor) {
         ITmfStateSystem ss = getAnalysisModule().getStateSystem();
+        SelectionTimeQueryFilter filter = FetchParametersUtils.createSelectionTimeQuery(fetchParameters);
+        if (filter == null) {
+            return new TmfModelResponse<>(null, ITmfResponse.Status.FAILED, CommonStatusMessage.INCORRECT_QUERY_PARAMETERS);
+        }
         Map<@NonNull Long, @NonNull Integer> entries = getSelectedEntries(filter);
         Collection<@NonNull Integer> quarks = entries.values();
         long startTime = filter.getStart();
@@ -143,27 +150,28 @@
     }
 
     @Override
-    protected @Nullable List<@NonNull ITimeGraphRowModel> getRowModel(@NonNull ITmfStateSystem ss, @NonNull SelectionTimeQueryFilter filter, @Nullable IProgressMonitor monitor) throws StateSystemDisposedException {
+    protected @Nullable TimeGraphModel getRowModel(@NonNull ITmfStateSystem ss, Map<String, Object> parameters, @Nullable IProgressMonitor monitor) throws StateSystemDisposedException {
         TreeMultimap<Integer, ITmfStateInterval> intervals = TreeMultimap.create(Comparator.naturalOrder(),
                 Comparator.comparing(ITmfStateInterval::getStartTime));
+        SelectionTimeQueryFilter filter = FetchParametersUtils.createSelectionTimeQuery(parameters);
         Map<@NonNull Long, @NonNull Integer> entries = getSelectedEntries(filter);
         Collection<Long> times = getTimes(filter, ss.getStartTime(), ss.getCurrentEndTime());
         /* Do the actual query */
         for (ITmfStateInterval interval : ss.query2D(entries.values(), times)) {
             if (monitor != null && monitor.isCanceled()) {
-                return Collections.emptyList();
+                return new TimeGraphModel(Collections.emptyList());
             }
             intervals.put(interval.getAttribute(), interval);
         }
         Map<@NonNull Integer, @NonNull Predicate<@NonNull Multimap<@NonNull String, @NonNull String>>> predicates = new HashMap<>();
-        if (filter instanceof TimeGraphStateQueryFilter) {
-            TimeGraphStateQueryFilter timeEventFilter = (TimeGraphStateQueryFilter) filter;
-            predicates.putAll(computeRegexPredicate(timeEventFilter));
+        Multimap<@NonNull Integer, @NonNull String> regexesMap = DataProviderParameterUtils.extractRegexFilter(parameters);
+        if (regexesMap != null) {
+            predicates.putAll(computeRegexPredicate(regexesMap));
         }
         List<@NonNull ITimeGraphRowModel> rows = new ArrayList<>();
         for (Map.Entry<@NonNull Long, @NonNull Integer> entry : entries.entrySet()) {
             if (monitor != null && monitor.isCanceled()) {
-                return Collections.emptyList();
+                return new TimeGraphModel(Collections.emptyList());
             }
 
             List<ITimeGraphState> eventList = new ArrayList<>();
@@ -177,7 +185,7 @@
             rows.add(new TimeGraphRowModel(entry.getKey(), eventList));
 
         }
-        return rows;
+        return new TimeGraphModel(rows);
     }
 
     @Override
@@ -186,16 +194,16 @@
     }
 
     @Override
-    protected @NonNull List<@NonNull TimeGraphEntryModel> getTree(@NonNull ITmfStateSystem ss, @NonNull TimeQueryFilter filter, @Nullable IProgressMonitor monitor) throws StateSystemDisposedException {
+    protected @NonNull TmfTreeModel<@NonNull TimeGraphEntryModel> getTree(@NonNull ITmfStateSystem ss, Map<String, Object> parameters, @Nullable IProgressMonitor monitor) throws StateSystemDisposedException {
         Builder<@NonNull TimeGraphEntryModel> builder = new Builder<>();
         long rootId = getId(ITmfStateSystem.ROOT_ATTRIBUTE);
-        builder.add(new TimeGraphEntryModel(rootId, -1, String.valueOf(getTrace().getName()), ss.getStartTime(), ss.getCurrentEndTime()));
+        builder.add(new TimeGraphEntryModel(rootId, -1, Collections.singletonList(String.valueOf(getTrace().getName())), ss.getStartTime(), ss.getCurrentEndTime()));
 
         for (int traceQuark : ss.getSubAttributes(ITmfStateSystem.ROOT_ATTRIBUTE, false)) {
             addTrace(ss, builder, traceQuark, rootId);
         }
 
-        return builder.build();
+        return new TmfTreeModel<>(Collections.emptyList(), builder.build());
     }
 
     private void addTrace(ITmfStateSystem ss, Builder<@NonNull TimeGraphEntryModel> builder, int quark, long parentId) {
@@ -215,7 +223,7 @@
         }
 
         long traceQuarkId = getId(quark);
-        builder.add(new TimeGraphEntryModel(traceQuarkId, parentId, ss.getAttributeName(quark), ss.getStartTime(), ss.getCurrentEndTime()));
+        builder.add(new TimeGraphEntryModel(traceQuarkId, parentId, Collections.singletonList(ss.getAttributeName(quark)), ss.getStartTime(), ss.getCurrentEndTime()));
 
         int ustSpansQuark;
         try {
@@ -242,7 +250,7 @@
                     }
                 } catch (IndexOutOfBoundsException | TimeRangeException | StateSystemDisposedException e) {
                 }
-                builder.add(new SpanLifeEntryModel(childId, parentId, getSpanName(childName), ss.getStartTime(), ss.getCurrentEndTime(), logs, getErrorTag(childName), getProcessName(childName)));
+                builder.add(new SpanLifeEntryModel(childId, parentId, Collections.singletonList(getSpanName(childName)), ss.getStartTime(), ss.getCurrentEndTime(), logs, getErrorTag(childName), getProcessName(childName)));
                 addChildren(ss, builder, child, childId, logsQuarks);
             }
         }
@@ -272,7 +280,7 @@
                 return;
             }
             long childId = getId(ustSpan);
-            builder.add(new SpanLifeEntryModel(childId, parentId, getSpanName(childName), ss.getStartTime(), ss.getCurrentEndTime(), logs, getErrorTag(childName), getProcessName(childName)));
+            builder.add(new SpanLifeEntryModel(childId, parentId, Collections.singletonList(getSpanName(childName)), ss.getStartTime(), ss.getCurrentEndTime(), logs, getErrorTag(childName), getProcessName(childName)));
             addUstChildren(ss, builder, child, ustQuark, childId, logsQuarks);
         }
     }
@@ -327,4 +335,18 @@
             return OTHER;
         }
     }
+
+    @Deprecated
+    @Override
+    public TmfModelResponse<List<ITimeGraphArrow>> fetchArrows(TimeQueryFilter filter, @Nullable IProgressMonitor monitor) {
+        Map<String, Object> parameters = FetchParametersUtils.timeQueryToMap(filter);
+        return fetchArrows(parameters, monitor);
+    }
+
+    @Deprecated
+    @Override
+    public TmfModelResponse<Map<String, String>> fetchTooltip(SelectionTimeQueryFilter filter, @Nullable IProgressMonitor monitor) {
+        Map<String, Object> parameters = FetchParametersUtils.selectionTimeQueryToMap(filter);
+        return fetchTooltip(parameters, monitor);
+    }
 }
diff --git a/tracetypes/org.eclipse.tracecompass.incubator.opentracing.core/src/org/eclipse/tracecompass/incubator/internal/opentracing/core/analysis/spanlife/SpanLifeEntryModel.java b/tracetypes/org.eclipse.tracecompass.incubator.opentracing.core/src/org/eclipse/tracecompass/incubator/internal/opentracing/core/analysis/spanlife/SpanLifeEntryModel.java
index 3e90171..b16b9d7 100644
--- a/tracetypes/org.eclipse.tracecompass.incubator.opentracing.core/src/org/eclipse/tracecompass/incubator/internal/opentracing/core/analysis/spanlife/SpanLifeEntryModel.java
+++ b/tracetypes/org.eclipse.tracecompass.incubator.opentracing.core/src/org/eclipse/tracecompass/incubator/internal/opentracing/core/analysis/spanlife/SpanLifeEntryModel.java
@@ -86,7 +86,7 @@
      * @param processName
      *            process name
      */
-    public SpanLifeEntryModel(long id, long parentId, String name, long startTime, long endTime, List<LogEvent> logs, boolean errorTag, String processName) {
+    public SpanLifeEntryModel(long id, long parentId, List<String> name, long startTime, long endTime, List<LogEvent> logs, boolean errorTag, String processName) {
         super(id, parentId, name, startTime, endTime);
         fLogs = logs;
         fErrorTag = errorTag;
diff --git a/tracetypes/org.eclipse.tracecompass.incubator.opentracing.ui/src/org/eclipse/tracecompass/incubator/internal/opentracing/ui/view/spanlife/SpanLifePresentationProvider.java b/tracetypes/org.eclipse.tracecompass.incubator.opentracing.ui/src/org/eclipse/tracecompass/incubator/internal/opentracing/ui/view/spanlife/SpanLifePresentationProvider.java
index a0ea659..a26a917 100644
--- a/tracetypes/org.eclipse.tracecompass.incubator.opentracing.ui/src/org/eclipse/tracecompass/incubator/internal/opentracing/ui/view/spanlife/SpanLifePresentationProvider.java
+++ b/tracetypes/org.eclipse.tracecompass.incubator.opentracing.ui/src/org/eclipse/tracecompass/incubator/internal/opentracing/ui/view/spanlife/SpanLifePresentationProvider.java
@@ -22,6 +22,7 @@
 import org.eclipse.swt.graphics.RGB;
 import org.eclipse.swt.graphics.RGBA;
 import org.eclipse.tracecompass.incubator.internal.opentracing.core.analysis.spanlife.SpanLifeEntryModel;
+import org.eclipse.tracecompass.internal.tmf.core.model.filters.FetchParametersUtils;
 import org.eclipse.tracecompass.tmf.core.model.filters.SelectionTimeQueryFilter;
 import org.eclipse.tracecompass.tmf.core.model.timegraph.ITimeGraphDataProvider;
 import org.eclipse.tracecompass.tmf.core.model.timegraph.TimeGraphEntryModel;
@@ -113,7 +114,7 @@
             times.add(windowEndTime);
 
             SelectionTimeQueryFilter filter = new SelectionTimeQueryFilter(times, Collections.singleton(id));
-            TmfModelResponse<@NonNull Map<@NonNull String, @NonNull String>> tooltipResponse = provider.fetchTooltip(filter, new NullProgressMonitor());
+            TmfModelResponse<@NonNull Map<@NonNull String, @NonNull String>> tooltipResponse = provider.fetchTooltip(FetchParametersUtils.selectionTimeQueryToMap(filter), new NullProgressMonitor());
             Map<@NonNull String, @NonNull String> tooltipModel = tooltipResponse.getModel();
             if (tooltipModel != null) {
                 eventHoverToolTipInfo.putAll(tooltipModel);
diff --git a/tracetypes/org.eclipse.tracecompass.incubator.ros.core/src/org/eclipse/tracecompass/incubator/internal/ros/core/analysis/connections/RosConnectionsDataProvider.java b/tracetypes/org.eclipse.tracecompass.incubator.ros.core/src/org/eclipse/tracecompass/incubator/internal/ros/core/analysis/connections/RosConnectionsDataProvider.java
index 002fc07..3b27f3b 100644
--- a/tracetypes/org.eclipse.tracecompass.incubator.ros.core/src/org/eclipse/tracecompass/incubator/internal/ros/core/analysis/connections/RosConnectionsDataProvider.java
+++ b/tracetypes/org.eclipse.tracecompass.incubator.ros.core/src/org/eclipse/tracecompass/incubator/internal/ros/core/analysis/connections/RosConnectionsDataProvider.java
@@ -22,11 +22,12 @@
 import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.jdt.annotation.NonNull;
 import org.eclipse.jdt.annotation.Nullable;
-import org.eclipse.tracecompass.internal.tmf.core.model.filters.TimeGraphStateQueryFilter;
+import org.eclipse.tracecompass.internal.tmf.core.model.filters.FetchParametersUtils;
 import org.eclipse.tracecompass.internal.tmf.core.model.timegraph.AbstractTimeGraphDataProvider;
 import org.eclipse.tracecompass.statesystem.core.ITmfStateSystem;
 import org.eclipse.tracecompass.statesystem.core.exceptions.StateSystemDisposedException;
 import org.eclipse.tracecompass.statesystem.core.interval.ITmfStateInterval;
+import org.eclipse.tracecompass.tmf.core.dataprovider.DataProviderParameterUtils;
 import org.eclipse.tracecompass.tmf.core.model.CommonStatusMessage;
 import org.eclipse.tracecompass.tmf.core.model.filters.SelectionTimeQueryFilter;
 import org.eclipse.tracecompass.tmf.core.model.filters.TimeQueryFilter;
@@ -34,15 +35,16 @@
 import org.eclipse.tracecompass.tmf.core.model.timegraph.ITimeGraphRowModel;
 import org.eclipse.tracecompass.tmf.core.model.timegraph.ITimeGraphState;
 import org.eclipse.tracecompass.tmf.core.model.timegraph.TimeGraphEntryModel;
+import org.eclipse.tracecompass.tmf.core.model.timegraph.TimeGraphModel;
 import org.eclipse.tracecompass.tmf.core.model.timegraph.TimeGraphRowModel;
 import org.eclipse.tracecompass.tmf.core.model.timegraph.TimeGraphState;
+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.trace.ITmfTrace;
 
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Multimap;
 import com.google.common.collect.ImmutableList.Builder;
+import com.google.common.collect.Multimap;
 import com.google.common.collect.TreeMultimap;
 
 /**
@@ -72,13 +74,27 @@
         // fModule = analysisModule;
     }
 
+    @Deprecated
     @Override
     public @NonNull TmfModelResponse<@NonNull List<@NonNull ITimeGraphArrow>> fetchArrows(@NonNull TimeQueryFilter filter, @Nullable IProgressMonitor monitor) {
-        return new TmfModelResponse<>(null, ITmfResponse.Status.COMPLETED, CommonStatusMessage.COMPLETED);
+        Map<String, Object> parameters = FetchParametersUtils.timeQueryToMap(filter);
+        return fetchArrows(parameters, monitor);
     }
 
     @Override
+    public @NonNull TmfModelResponse<@NonNull List<@NonNull ITimeGraphArrow>> fetchArrows(@NonNull Map<@NonNull String, @NonNull Object> fetchParameters, @Nullable IProgressMonitor monitor) {
+        return new TmfModelResponse<>(null, ITmfResponse.Status.COMPLETED, CommonStatusMessage.COMPLETED);
+    }
+
+    @Deprecated
+    @Override
     public @NonNull TmfModelResponse<@NonNull Map<@NonNull String, @NonNull String>> fetchTooltip(@NonNull SelectionTimeQueryFilter filter, @Nullable IProgressMonitor monitor) {
+        Map<String, Object> parameters = FetchParametersUtils.selectionTimeQueryToMap(filter);
+        return fetchTooltip(parameters, monitor);
+    }
+
+    @Override
+    public @NonNull TmfModelResponse<@NonNull Map<@NonNull String, @NonNull String>> fetchTooltip(@NonNull Map<@NonNull String, @NonNull Object> fetchParameters, @Nullable IProgressMonitor monitor) {
         return new TmfModelResponse<>(null, ITmfResponse.Status.COMPLETED, CommonStatusMessage.COMPLETED);
     }
 
@@ -88,30 +104,34 @@
     }
 
     @Override
-    protected @Nullable List<@NonNull ITimeGraphRowModel> getRowModel(@NonNull ITmfStateSystem ss, @NonNull SelectionTimeQueryFilter filter, @Nullable IProgressMonitor monitor) throws StateSystemDisposedException {
+    protected @Nullable TimeGraphModel getRowModel(@NonNull ITmfStateSystem ss, Map<@NonNull String, @NonNull Object> parameters, @Nullable IProgressMonitor monitor) throws StateSystemDisposedException {
         TreeMultimap<Integer, ITmfStateInterval> intervals = TreeMultimap.create(Comparator.naturalOrder(),
                 Comparator.comparing(ITmfStateInterval::getStartTime));
+        SelectionTimeQueryFilter filter = FetchParametersUtils.createSelectionTimeQuery(parameters);
+        if (filter == null) {
+            return null;
+        }
         Map<@NonNull Long, @NonNull Integer> entries = getSelectedEntries(filter);
         Collection<Long> times = getTimes(filter, ss.getStartTime(), ss.getCurrentEndTime());
 
         // Query
         for (ITmfStateInterval interval : ss.query2D(entries.values(), times)) {
             if (monitor != null && monitor.isCanceled()) {
-                return Collections.emptyList();
+                return new TimeGraphModel(Collections.emptyList());
             }
             intervals.put(interval.getAttribute(), interval);
         }
 
         Map<@NonNull Integer, @NonNull Predicate<@NonNull Multimap<@NonNull String, @NonNull String>>> predicates = new HashMap<>();
-        if (filter instanceof TimeGraphStateQueryFilter) {
-            TimeGraphStateQueryFilter timeEventFilter = (TimeGraphStateQueryFilter) filter;
-            predicates.putAll(computeRegexPredicate(timeEventFilter));
+        Multimap<@NonNull Integer, @NonNull String> regexesMap = DataProviderParameterUtils.extractRegexFilter(parameters);
+        if (regexesMap != null) {
+            predicates.putAll(computeRegexPredicate(regexesMap));
         }
 
         List<@NonNull ITimeGraphRowModel> rows = new ArrayList<>();
         for (Map.Entry<@NonNull Long, @NonNull Integer> entry : entries.entrySet()) {
             if (monitor != null && monitor.isCanceled()) {
-                return Collections.emptyList();
+                return new TimeGraphModel(Collections.emptyList());
             }
 
             List<ITimeGraphState> eventList = new ArrayList<>();
@@ -127,7 +147,7 @@
             }
             rows.add(new TimeGraphRowModel(entry.getKey(), eventList));
         }
-        return rows;
+        return new TimeGraphModel(rows);
     }
 
     @Override
@@ -136,13 +156,12 @@
     }
 
     @Override
-    protected @NonNull List<@NonNull TimeGraphEntryModel> getTree(@NonNull ITmfStateSystem ss, @NonNull TimeQueryFilter filter, @Nullable IProgressMonitor monitor) throws StateSystemDisposedException {
+    protected @NonNull TmfTreeModel<@NonNull TimeGraphEntryModel> getTree(@NonNull ITmfStateSystem ss, Map<String, Object> parameters, @Nullable IProgressMonitor monitor) throws StateSystemDisposedException {
         Builder<@NonNull TimeGraphEntryModel> builder = new Builder<>();
         long parentId = getId(ITmfStateSystem.ROOT_ATTRIBUTE);
         builder.add(new TimeGraphEntryModel(parentId, -1, String.valueOf(getTrace().getName()), ss.getStartTime(), ss.getCurrentEndTime()));
         addChildren(ss, builder, ITmfStateSystem.ROOT_ATTRIBUTE, parentId);
-        ImmutableList<@NonNull TimeGraphEntryModel> models = builder.build();
-        return models;
+        return new TmfTreeModel<>(Collections.emptyList(), builder.build());
     }
 
     private void addChildren(ITmfStateSystem ss, Builder<@NonNull TimeGraphEntryModel> builder, int quark, long parentId) {
diff --git a/tracetypes/org.eclipse.tracecompass.incubator.ros.core/src/org/eclipse/tracecompass/incubator/internal/ros/core/analysis/messageflow/RosMessageFlowDataProvider.java b/tracetypes/org.eclipse.tracecompass.incubator.ros.core/src/org/eclipse/tracecompass/incubator/internal/ros/core/analysis/messageflow/RosMessageFlowDataProvider.java
index bbb40de..4839e75 100644
--- a/tracetypes/org.eclipse.tracecompass.incubator.ros.core/src/org/eclipse/tracecompass/incubator/internal/ros/core/analysis/messageflow/RosMessageFlowDataProvider.java
+++ b/tracetypes/org.eclipse.tracecompass.incubator.ros.core/src/org/eclipse/tracecompass/incubator/internal/ros/core/analysis/messageflow/RosMessageFlowDataProvider.java
@@ -11,6 +11,7 @@
 
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -24,7 +25,8 @@
 import org.eclipse.tracecompass.incubator.internal.ros.core.analysis.model.messageflow.RosMessageFlowSegment;
 import org.eclipse.tracecompass.incubator.internal.ros.core.analysis.model.messageflow.RosMessageFlowSegment.SegmentType;
 import org.eclipse.tracecompass.internal.tmf.core.model.AbstractTmfTraceDataProvider;
-import org.eclipse.tracecompass.internal.tmf.core.model.filters.TimeGraphStateQueryFilter;
+import org.eclipse.tracecompass.internal.tmf.core.model.filters.FetchParametersUtils;
+import org.eclipse.tracecompass.tmf.core.dataprovider.DataProviderParameterUtils;
 import org.eclipse.tracecompass.tmf.core.model.CommonStatusMessage;
 import org.eclipse.tracecompass.tmf.core.model.filters.SelectionTimeQueryFilter;
 import org.eclipse.tracecompass.tmf.core.model.filters.TimeQueryFilter;
@@ -34,8 +36,10 @@
 import org.eclipse.tracecompass.tmf.core.model.timegraph.ITimeGraphState;
 import org.eclipse.tracecompass.tmf.core.model.timegraph.TimeGraphArrow;
 import org.eclipse.tracecompass.tmf.core.model.timegraph.TimeGraphEntryModel;
+import org.eclipse.tracecompass.tmf.core.model.timegraph.TimeGraphModel;
 import org.eclipse.tracecompass.tmf.core.model.timegraph.TimeGraphRowModel;
 import org.eclipse.tracecompass.tmf.core.model.timegraph.TimeGraphState;
+import org.eclipse.tracecompass.tmf.core.model.tree.TmfTreeModel;
 import org.eclipse.tracecompass.tmf.core.response.ITmfResponse;
 import org.eclipse.tracecompass.tmf.core.response.ITmfResponse.Status;
 import org.eclipse.tracecompass.tmf.core.response.TmfModelResponse;
@@ -87,9 +91,25 @@
         return fSegmentToId.computeIfAbsent(segment, i -> ATOMIC_LONG.getAndIncrement());
     }
 
+    @Deprecated
     @Override
-    public @NonNull TmfModelResponse<@NonNull List<@NonNull TimeGraphEntryModel>> fetchTree(
-            @NonNull TimeQueryFilter filter, @Nullable IProgressMonitor monitor) {
+    public @NonNull TmfModelResponse<@NonNull List<@NonNull TimeGraphEntryModel>> fetchTree(@NonNull TimeQueryFilter filter, @Nullable IProgressMonitor monitor) {
+        TmfModelResponse<@NonNull TmfTreeModel<@NonNull TimeGraphEntryModel>> response = fetchTree(FetchParametersUtils.timeQueryToMap(filter), monitor);
+        TmfTreeModel<@NonNull TimeGraphEntryModel> model = response.getModel();
+        List<@NonNull TimeGraphEntryModel> treeModel = null;
+        if (model != null) {
+            treeModel = model.getEntries();
+        }
+        return new TmfModelResponse<>(treeModel, response.getStatus(), response.getStatusMessage());
+    }
+
+    @Override
+    public @NonNull TmfModelResponse<@NonNull TmfTreeModel<@NonNull TimeGraphEntryModel>> fetchTree(@NonNull Map<@NonNull String, @NonNull Object> fetchParameters, @Nullable IProgressMonitor monitor) {
+        TimeQueryFilter filter = FetchParametersUtils.createTimeQuery(fetchParameters);
+        if (filter == null) {
+            return new TmfModelResponse<>(null, Status.FAILED, CommonStatusMessage.INCORRECT_QUERY_PARAMETERS);
+        }
+
         if (!fModel.isModelDone()) {
             return new TmfModelResponse<>(null, Status.RUNNING, CommonStatusMessage.RUNNING);
         }
@@ -99,7 +119,7 @@
         entries.add(new TimeGraphEntryModel(rootId, -1, String.valueOf(getTrace().getName()), filter.getStart(), filter.getEnd()));
         RosMessageFlowSegment firstSegment = fModel.getFirstSegment();
         addTreeChildren(entries, firstSegment, rootId);
-        return new TmfModelResponse<>(entries, Status.COMPLETED, CommonStatusMessage.COMPLETED);
+        return new TmfModelResponse<>(new TmfTreeModel<>(Collections.emptyList(), entries), Status.COMPLETED, CommonStatusMessage.COMPLETED);
     }
 
     private void addTreeChildren(List<@NonNull TimeGraphEntryModel> entries, RosMessageFlowSegment segment, long parentId) {
@@ -114,23 +134,40 @@
         }
     }
 
+    @Deprecated
     @Override
-    public @NonNull TmfModelResponse<@NonNull List<@NonNull ITimeGraphRowModel>> fetchRowModel(
-            @NonNull SelectionTimeQueryFilter filter, @Nullable IProgressMonitor monitor) {
+    public @NonNull TmfModelResponse<@NonNull List<@NonNull ITimeGraphRowModel>> fetchRowModel(@NonNull SelectionTimeQueryFilter filter, @Nullable IProgressMonitor monitor) {
+        @NonNull Map<@NonNull String, @NonNull Object> parameters = FetchParametersUtils.selectionTimeQueryToMap(filter);
+        TmfModelResponse<@NonNull TimeGraphModel> response = fetchRowModel(parameters, monitor);
+        TimeGraphModel model = response.getModel();
+        List<@NonNull ITimeGraphRowModel> rows = null;
+        if (model != null) {
+            rows = model.getRows();
+        }
+        return new TmfModelResponse<>(rows, response.getStatus(), response.getStatusMessage());
+    }
+
+    @Override
+    public @NonNull TmfModelResponse<@NonNull TimeGraphModel> fetchRowModel(@NonNull Map<@NonNull String, @NonNull Object> fetchParameters, @Nullable IProgressMonitor monitor) {
+        SelectionTimeQueryFilter filter = FetchParametersUtils.createSelectionTimeQuery(fetchParameters);
+        if (filter == null) {
+            return new TmfModelResponse<>(null, Status.FAILED, CommonStatusMessage.INCORRECT_QUERY_PARAMETERS);
+        }
+
         if (!fModel.isModelDone()) {
             return new TmfModelResponse<>(null, Status.RUNNING, CommonStatusMessage.RUNNING);
         }
 
         @NonNull Map<@NonNull Integer, @NonNull Predicate<@NonNull Multimap<@NonNull String, @NonNull String>>> predicates = new HashMap<>();
-        if (filter instanceof TimeGraphStateQueryFilter) {
-            TimeGraphStateQueryFilter timeEventFilter = (TimeGraphStateQueryFilter) filter;
-            predicates.putAll(computeRegexPredicate(timeEventFilter));
+        Multimap<@NonNull Integer, @NonNull String> regexesMap = DataProviderParameterUtils.extractRegexFilter(fetchParameters);
+        if (regexesMap != null) {
+            predicates.putAll(computeRegexPredicate(regexesMap));
         }
 
         List<@NonNull ITimeGraphRowModel> rows = new ArrayList<>();
         RosMessageFlowSegment firstSegment = fModel.getFirstSegment();
         addRowModels(rows, firstSegment, predicates, monitor);
-        return new TmfModelResponse<>(rows, Status.COMPLETED, CommonStatusMessage.COMPLETED);
+        return new TmfModelResponse<>(new TimeGraphModel(rows), Status.COMPLETED, CommonStatusMessage.COMPLETED);
     }
 
     private void addRowModels(
@@ -171,8 +208,19 @@
         return 4;
     }
 
+    @Deprecated
     @Override
     public @NonNull TmfModelResponse<@NonNull List<@NonNull ITimeGraphArrow>> fetchArrows(@NonNull TimeQueryFilter filter, @Nullable IProgressMonitor monitor) {
+        return fetchArrows(FetchParametersUtils.timeQueryToMap(filter), monitor);
+    }
+
+    @Override
+    public @NonNull TmfModelResponse<@NonNull List<@NonNull ITimeGraphArrow>> fetchArrows(@NonNull Map<@NonNull String, @NonNull Object> fetchParameters, @Nullable IProgressMonitor monitor) {
+        TimeQueryFilter filter = FetchParametersUtils.createTimeQuery(fetchParameters);
+        if (filter == null) {
+            return new TmfModelResponse<>(null, Status.FAILED, CommonStatusMessage.INCORRECT_QUERY_PARAMETERS);
+        }
+
         if (!fModel.isModelDone()) {
             return new TmfModelResponse<>(null, Status.RUNNING, CommonStatusMessage.RUNNING);
         }
@@ -217,8 +265,14 @@
         return 7;
     }
 
+    @Deprecated
     @Override
     public @NonNull TmfModelResponse<@NonNull Map<@NonNull String, @NonNull String>> fetchTooltip(@NonNull SelectionTimeQueryFilter filter, @Nullable IProgressMonitor monitor) {
+        return fetchTooltip(FetchParametersUtils.selectionTimeQueryToMap(filter), monitor);
+    }
+
+    @Override
+    public @NonNull TmfModelResponse<@NonNull Map<@NonNull String, @NonNull String>> fetchTooltip(@NonNull Map<@NonNull String, @NonNull Object> fetchParameters, @Nullable IProgressMonitor monitor) {
         // TODO
         return new TmfModelResponse<>(null, ITmfResponse.Status.COMPLETED, CommonStatusMessage.COMPLETED);
     }
diff --git a/tracetypes/org.eclipse.tracecompass.incubator.ros.core/src/org/eclipse/tracecompass/incubator/internal/ros/core/analysis/nodes/RosNodesDataProvider.java b/tracetypes/org.eclipse.tracecompass.incubator.ros.core/src/org/eclipse/tracecompass/incubator/internal/ros/core/analysis/nodes/RosNodesDataProvider.java
index b750276..d5adfd7 100644
--- a/tracetypes/org.eclipse.tracecompass.incubator.ros.core/src/org/eclipse/tracecompass/incubator/internal/ros/core/analysis/nodes/RosNodesDataProvider.java
+++ b/tracetypes/org.eclipse.tracecompass.incubator.ros.core/src/org/eclipse/tracecompass/incubator/internal/ros/core/analysis/nodes/RosNodesDataProvider.java
@@ -22,11 +22,12 @@
 import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.jdt.annotation.NonNull;
 import org.eclipse.jdt.annotation.Nullable;
-import org.eclipse.tracecompass.internal.tmf.core.model.filters.TimeGraphStateQueryFilter;
+import org.eclipse.tracecompass.internal.tmf.core.model.filters.FetchParametersUtils;
 import org.eclipse.tracecompass.internal.tmf.core.model.timegraph.AbstractTimeGraphDataProvider;
 import org.eclipse.tracecompass.statesystem.core.ITmfStateSystem;
 import org.eclipse.tracecompass.statesystem.core.exceptions.StateSystemDisposedException;
 import org.eclipse.tracecompass.statesystem.core.interval.ITmfStateInterval;
+import org.eclipse.tracecompass.tmf.core.dataprovider.DataProviderParameterUtils;
 import org.eclipse.tracecompass.tmf.core.model.CommonStatusMessage;
 import org.eclipse.tracecompass.tmf.core.model.filters.SelectionTimeQueryFilter;
 import org.eclipse.tracecompass.tmf.core.model.filters.TimeQueryFilter;
@@ -34,13 +35,14 @@
 import org.eclipse.tracecompass.tmf.core.model.timegraph.ITimeGraphRowModel;
 import org.eclipse.tracecompass.tmf.core.model.timegraph.ITimeGraphState;
 import org.eclipse.tracecompass.tmf.core.model.timegraph.TimeGraphEntryModel;
+import org.eclipse.tracecompass.tmf.core.model.timegraph.TimeGraphModel;
 import org.eclipse.tracecompass.tmf.core.model.timegraph.TimeGraphRowModel;
 import org.eclipse.tracecompass.tmf.core.model.timegraph.TimeGraphState;
+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.trace.ITmfTrace;
 
-import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableList.Builder;
 import com.google.common.collect.Multimap;
 import com.google.common.collect.TreeMultimap;
@@ -68,13 +70,27 @@
         super(trace, analysisModule);
     }
 
+    @Deprecated
     @Override
     public @NonNull TmfModelResponse<@NonNull List<@NonNull ITimeGraphArrow>> fetchArrows(@NonNull TimeQueryFilter filter, @Nullable IProgressMonitor monitor) {
-        return new TmfModelResponse<>(null, ITmfResponse.Status.COMPLETED, CommonStatusMessage.COMPLETED);
+        Map<String, Object> parameters = FetchParametersUtils.timeQueryToMap(filter);
+        return fetchArrows(parameters, monitor);
     }
 
     @Override
+    public @NonNull TmfModelResponse<@NonNull List<@NonNull ITimeGraphArrow>> fetchArrows(@NonNull Map<@NonNull String, @NonNull Object> fetchParameters, @Nullable IProgressMonitor monitor) {
+        return new TmfModelResponse<>(null, ITmfResponse.Status.COMPLETED, CommonStatusMessage.COMPLETED);
+    }
+
+    @Deprecated
+    @Override
     public @NonNull TmfModelResponse<@NonNull Map<@NonNull String, @NonNull String>> fetchTooltip(@NonNull SelectionTimeQueryFilter filter, @Nullable IProgressMonitor monitor) {
+        Map<String, Object> parameters = FetchParametersUtils.selectionTimeQueryToMap(filter);
+        return fetchTooltip(parameters, monitor);
+    }
+
+    @Override
+    public @NonNull TmfModelResponse<@NonNull Map<@NonNull String, @NonNull String>> fetchTooltip(@NonNull Map<@NonNull String, @NonNull Object> fetchParameters, @Nullable IProgressMonitor monitor) {
         return new TmfModelResponse<>(null, ITmfResponse.Status.COMPLETED, CommonStatusMessage.COMPLETED);
     }
 
@@ -84,30 +100,34 @@
     }
 
     @Override
-    protected @Nullable List<@NonNull ITimeGraphRowModel> getRowModel(@NonNull ITmfStateSystem ss, @NonNull SelectionTimeQueryFilter filter, @Nullable IProgressMonitor monitor) throws StateSystemDisposedException {
+    protected @Nullable TimeGraphModel getRowModel(@NonNull ITmfStateSystem ss, @NonNull Map<@NonNull String, @NonNull Object> parameters, @Nullable IProgressMonitor monitor) throws StateSystemDisposedException {
         TreeMultimap<Integer, ITmfStateInterval> intervals = TreeMultimap.create(Comparator.naturalOrder(),
                 Comparator.comparing(ITmfStateInterval::getStartTime));
+        SelectionTimeQueryFilter filter = FetchParametersUtils.createSelectionTimeQuery(parameters);
+        if (filter == null) {
+            return null;
+        }
         Map<@NonNull Long, @NonNull Integer> entries = getSelectedEntries(filter);
         Collection<Long> times = getTimes(filter, ss.getStartTime(), ss.getCurrentEndTime());
 
         // Query
         for (ITmfStateInterval interval : ss.query2D(entries.values(), times)) {
             if (monitor != null && monitor.isCanceled()) {
-                return Collections.emptyList();
+                return new TimeGraphModel(Collections.emptyList());
             }
             intervals.put(interval.getAttribute(), interval);
         }
 
         Map<@NonNull Integer, @NonNull Predicate<@NonNull Multimap<@NonNull String, @NonNull String>>> predicates = new HashMap<>();
-        if (filter instanceof TimeGraphStateQueryFilter) {
-            TimeGraphStateQueryFilter timeEventFilter = (TimeGraphStateQueryFilter) filter;
-            predicates.putAll(computeRegexPredicate(timeEventFilter));
+        Multimap<@NonNull Integer, @NonNull String> regexesMap = DataProviderParameterUtils.extractRegexFilter(parameters);
+        if (regexesMap != null) {
+            predicates.putAll(computeRegexPredicate(regexesMap));
         }
 
         List<@NonNull ITimeGraphRowModel> rows = new ArrayList<>();
         for (Map.Entry<@NonNull Long, @NonNull Integer> entry : entries.entrySet()) {
             if (monitor != null && monitor.isCanceled()) {
-                return Collections.emptyList();
+                return new TimeGraphModel(Collections.emptyList());
             }
 
             List<ITimeGraphState> eventList = new ArrayList<>();
@@ -123,7 +143,7 @@
             }
             rows.add(new TimeGraphRowModel(entry.getKey(), eventList));
         }
-        return rows;
+        return new TimeGraphModel(rows);
     }
 
     @Override
@@ -132,13 +152,12 @@
     }
 
     @Override
-    protected @NonNull List<@NonNull TimeGraphEntryModel> getTree(@NonNull ITmfStateSystem ss, @NonNull TimeQueryFilter filter, @Nullable IProgressMonitor monitor) throws StateSystemDisposedException {
+    protected @NonNull TmfTreeModel<@NonNull TimeGraphEntryModel> getTree(@NonNull ITmfStateSystem ss, @NonNull Map<@NonNull String, @NonNull Object> parameters, @Nullable IProgressMonitor monitor) throws StateSystemDisposedException {
         Builder<@NonNull TimeGraphEntryModel> builder = new Builder<>();
         long parentId = getId(ITmfStateSystem.ROOT_ATTRIBUTE);
         builder.add(new TimeGraphEntryModel(parentId, -1, String.valueOf(getTrace().getName()), ss.getStartTime(), ss.getCurrentEndTime()));
         addChildren(ss, builder, ITmfStateSystem.ROOT_ATTRIBUTE, parentId);
-        ImmutableList<@NonNull TimeGraphEntryModel> models = builder.build();
-        return models;
+        return new TmfTreeModel<>(Collections.emptyList(), builder.build());
     }
 
     private void addChildren(ITmfStateSystem ss, Builder<@NonNull TimeGraphEntryModel> builder, int quark, long parentId) {
diff --git a/tracetypes/org.eclipse.tracecompass.incubator.ros.core/src/org/eclipse/tracecompass/incubator/internal/ros/core/analysis/queues/RosQueuesDataProvider.java b/tracetypes/org.eclipse.tracecompass.incubator.ros.core/src/org/eclipse/tracecompass/incubator/internal/ros/core/analysis/queues/RosQueuesDataProvider.java
index 1b78870..f106fc1 100644
--- a/tracetypes/org.eclipse.tracecompass.incubator.ros.core/src/org/eclipse/tracecompass/incubator/internal/ros/core/analysis/queues/RosQueuesDataProvider.java
+++ b/tracetypes/org.eclipse.tracecompass.incubator.ros.core/src/org/eclipse/tracecompass/incubator/internal/ros/core/analysis/queues/RosQueuesDataProvider.java
@@ -23,11 +23,12 @@
 import org.eclipse.jdt.annotation.Nullable;
 import org.eclipse.tracecompass.incubator.internal.ros.core.analysis.AbstractRosStateProvider;
 import org.eclipse.tracecompass.incubator.internal.ros.core.analysis.ElementReferenceState;
-import org.eclipse.tracecompass.internal.tmf.core.model.filters.TimeGraphStateQueryFilter;
+import org.eclipse.tracecompass.internal.tmf.core.model.filters.FetchParametersUtils;
 import org.eclipse.tracecompass.internal.tmf.core.model.timegraph.AbstractTimeGraphDataProvider;
 import org.eclipse.tracecompass.statesystem.core.ITmfStateSystem;
 import org.eclipse.tracecompass.statesystem.core.exceptions.StateSystemDisposedException;
 import org.eclipse.tracecompass.statesystem.core.interval.ITmfStateInterval;
+import org.eclipse.tracecompass.tmf.core.dataprovider.DataProviderParameterUtils;
 import org.eclipse.tracecompass.tmf.core.model.CommonStatusMessage;
 import org.eclipse.tracecompass.tmf.core.model.filters.SelectionTimeQueryFilter;
 import org.eclipse.tracecompass.tmf.core.model.filters.TimeQueryFilter;
@@ -35,13 +36,14 @@
 import org.eclipse.tracecompass.tmf.core.model.timegraph.ITimeGraphRowModel;
 import org.eclipse.tracecompass.tmf.core.model.timegraph.ITimeGraphState;
 import org.eclipse.tracecompass.tmf.core.model.timegraph.TimeGraphEntryModel;
+import org.eclipse.tracecompass.tmf.core.model.timegraph.TimeGraphModel;
 import org.eclipse.tracecompass.tmf.core.model.timegraph.TimeGraphRowModel;
 import org.eclipse.tracecompass.tmf.core.model.timegraph.TimeGraphState;
+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.trace.ITmfTrace;
 
-import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableList.Builder;
 import com.google.common.collect.Multimap;
 import com.google.common.collect.TreeMultimap;
@@ -69,13 +71,27 @@
         super(trace, analysisModule);
     }
 
+    @Deprecated
     @Override
     public @NonNull TmfModelResponse<@NonNull List<@NonNull ITimeGraphArrow>> fetchArrows(@NonNull TimeQueryFilter filter, @Nullable IProgressMonitor monitor) {
+        Map<String, Object> parameters = FetchParametersUtils.timeQueryToMap(filter);
+        return fetchArrows(parameters, monitor);
+    }
+
+    @Deprecated
+    @Override
+    public @NonNull TmfModelResponse<@NonNull Map<@NonNull String, @NonNull String>> fetchTooltip(@NonNull SelectionTimeQueryFilter filter, @Nullable IProgressMonitor monitor) {
+        Map<String, Object> parameters = FetchParametersUtils.selectionTimeQueryToMap(filter);
+        return fetchTooltip(parameters, monitor);
+    }
+
+    @Override
+    public @NonNull TmfModelResponse<@NonNull List<@NonNull ITimeGraphArrow>> fetchArrows(@NonNull Map<@NonNull String, @NonNull Object> fetchParameters, @Nullable IProgressMonitor monitor) {
         return new TmfModelResponse<>(null, ITmfResponse.Status.COMPLETED, CommonStatusMessage.COMPLETED);
     }
 
     @Override
-    public @NonNull TmfModelResponse<@NonNull Map<@NonNull String, @NonNull String>> fetchTooltip(@NonNull SelectionTimeQueryFilter filter, @Nullable IProgressMonitor monitor) {
+    public @NonNull TmfModelResponse<@NonNull Map<@NonNull String, @NonNull String>> fetchTooltip(@NonNull Map<@NonNull String, @NonNull Object> fetchParameters, @Nullable IProgressMonitor monitor) {
         return new TmfModelResponse<>(null, ITmfResponse.Status.COMPLETED, CommonStatusMessage.COMPLETED);
     }
 
@@ -85,30 +101,34 @@
     }
 
     @Override
-    protected @Nullable List<@NonNull ITimeGraphRowModel> getRowModel(@NonNull ITmfStateSystem ss, @NonNull SelectionTimeQueryFilter filter, @Nullable IProgressMonitor monitor) throws StateSystemDisposedException {
+    protected @Nullable TimeGraphModel getRowModel(@NonNull ITmfStateSystem ss, @NonNull Map<@NonNull String, @NonNull Object> parameters, @Nullable IProgressMonitor monitor) throws StateSystemDisposedException {
         TreeMultimap<Integer, ITmfStateInterval> intervals = TreeMultimap.create(Comparator.naturalOrder(),
                 Comparator.comparing(ITmfStateInterval::getStartTime));
+        SelectionTimeQueryFilter filter = FetchParametersUtils.createSelectionTimeQuery(parameters);
+        if (filter == null) {
+            return null;
+        }
         Map<@NonNull Long, @NonNull Integer> entries = getSelectedEntries(filter);
         Collection<Long> times = getTimes(filter, ss.getStartTime(), ss.getCurrentEndTime());
 
         // Query
         for (ITmfStateInterval interval : ss.query2D(entries.values(), times)) {
             if (monitor != null && monitor.isCanceled()) {
-                return Collections.emptyList();
+                return new TimeGraphModel(Collections.emptyList());
             }
             intervals.put(interval.getAttribute(), interval);
         }
 
         Map<@NonNull Integer, @NonNull Predicate<@NonNull Multimap<@NonNull String, @NonNull String>>> predicates = new HashMap<>();
-        if (filter instanceof TimeGraphStateQueryFilter) {
-            TimeGraphStateQueryFilter timeEventFilter = (TimeGraphStateQueryFilter) filter;
-            predicates.putAll(computeRegexPredicate(timeEventFilter));
+        Multimap<@NonNull Integer, @NonNull String> regexesMap = DataProviderParameterUtils.extractRegexFilter(parameters);
+        if (regexesMap != null) {
+            predicates.putAll(computeRegexPredicate(regexesMap));
         }
 
         List<@NonNull ITimeGraphRowModel> rows = new ArrayList<>();
         for (Map.Entry<@NonNull Long, @NonNull Integer> entry : entries.entrySet()) {
             if (monitor != null && monitor.isCanceled()) {
-                return Collections.emptyList();
+                return new TimeGraphModel(Collections.emptyList());
             }
 
             List<ITimeGraphState> eventList = new ArrayList<>();
@@ -131,7 +151,7 @@
             rows.add(new TimeGraphRowModel(entry.getKey(), eventList));
 
         }
-        return rows;
+        return new TimeGraphModel(rows);
     }
 
     @Override
@@ -140,13 +160,12 @@
     }
 
     @Override
-    protected @NonNull List<@NonNull TimeGraphEntryModel> getTree(@NonNull ITmfStateSystem ss, @NonNull TimeQueryFilter filter, @Nullable IProgressMonitor monitor) throws StateSystemDisposedException {
+    protected @NonNull TmfTreeModel<@NonNull TimeGraphEntryModel> getTree(@NonNull ITmfStateSystem ss, @NonNull Map<@NonNull String, @NonNull Object> parameters, @Nullable IProgressMonitor monitor) throws StateSystemDisposedException {
         Builder<@NonNull TimeGraphEntryModel> builder = new Builder<>();
         long parentId = getId(ITmfStateSystem.ROOT_ATTRIBUTE);
         builder.add(new TimeGraphEntryModel(parentId, -1, String.valueOf(getTrace().getName()), ss.getStartTime(), ss.getCurrentEndTime()));
         addChildren(ss, builder, ITmfStateSystem.ROOT_ATTRIBUTE, parentId);
-        ImmutableList<@NonNull TimeGraphEntryModel> models = builder.build();
-        return models;
+        return new TmfTreeModel<>(Collections.emptyList(), builder.build());
     }
 
     private void addChildren(ITmfStateSystem ss, Builder<@NonNull TimeGraphEntryModel> builder, int quark, long parentId) {
diff --git a/tracetypes/org.eclipse.tracecompass.incubator.ros.core/src/org/eclipse/tracecompass/incubator/internal/ros/core/analysis/tasks/RosTasksDataProvider.java b/tracetypes/org.eclipse.tracecompass.incubator.ros.core/src/org/eclipse/tracecompass/incubator/internal/ros/core/analysis/tasks/RosTasksDataProvider.java
index b57d389..bdd813e 100644
--- a/tracetypes/org.eclipse.tracecompass.incubator.ros.core/src/org/eclipse/tracecompass/incubator/internal/ros/core/analysis/tasks/RosTasksDataProvider.java
+++ b/tracetypes/org.eclipse.tracecompass.incubator.ros.core/src/org/eclipse/tracecompass/incubator/internal/ros/core/analysis/tasks/RosTasksDataProvider.java
@@ -21,11 +21,12 @@
 import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.jdt.annotation.NonNull;
 import org.eclipse.jdt.annotation.Nullable;
-import org.eclipse.tracecompass.internal.tmf.core.model.filters.TimeGraphStateQueryFilter;
+import org.eclipse.tracecompass.internal.tmf.core.model.filters.FetchParametersUtils;
 import org.eclipse.tracecompass.internal.tmf.core.model.timegraph.AbstractTimeGraphDataProvider;
 import org.eclipse.tracecompass.statesystem.core.ITmfStateSystem;
 import org.eclipse.tracecompass.statesystem.core.exceptions.StateSystemDisposedException;
 import org.eclipse.tracecompass.statesystem.core.interval.ITmfStateInterval;
+import org.eclipse.tracecompass.tmf.core.dataprovider.DataProviderParameterUtils;
 import org.eclipse.tracecompass.tmf.core.model.CommonStatusMessage;
 import org.eclipse.tracecompass.tmf.core.model.filters.SelectionTimeQueryFilter;
 import org.eclipse.tracecompass.tmf.core.model.filters.TimeQueryFilter;
@@ -33,13 +34,14 @@
 import org.eclipse.tracecompass.tmf.core.model.timegraph.ITimeGraphRowModel;
 import org.eclipse.tracecompass.tmf.core.model.timegraph.ITimeGraphState;
 import org.eclipse.tracecompass.tmf.core.model.timegraph.TimeGraphEntryModel;
+import org.eclipse.tracecompass.tmf.core.model.timegraph.TimeGraphModel;
 import org.eclipse.tracecompass.tmf.core.model.timegraph.TimeGraphRowModel;
 import org.eclipse.tracecompass.tmf.core.model.timegraph.TimeGraphState;
+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.trace.ITmfTrace;
 
-import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableList.Builder;
 import com.google.common.collect.Multimap;
 import com.google.common.collect.TreeMultimap;
@@ -67,13 +69,27 @@
         super(trace, analysisModule);
     }
 
+    @Deprecated
     @Override
     public @NonNull TmfModelResponse<@NonNull List<@NonNull ITimeGraphArrow>> fetchArrows(@NonNull TimeQueryFilter filter, @Nullable IProgressMonitor monitor) {
+        Map<String, Object> parameters = FetchParametersUtils.timeQueryToMap(filter);
+        return fetchArrows(parameters, monitor);
+    }
+
+    @Deprecated
+    @Override
+    public @NonNull TmfModelResponse<@NonNull Map<@NonNull String, @NonNull String>> fetchTooltip(@NonNull SelectionTimeQueryFilter filter, @Nullable IProgressMonitor monitor) {
+        Map<String, Object> parameters = FetchParametersUtils.selectionTimeQueryToMap(filter);
+        return fetchTooltip(parameters, monitor);
+    }
+
+    @Override
+    public @NonNull TmfModelResponse<@NonNull List<@NonNull ITimeGraphArrow>> fetchArrows(@NonNull Map<@NonNull String, @NonNull Object> fetchParameters, @Nullable IProgressMonitor monitor) {
         return new TmfModelResponse<>(null, ITmfResponse.Status.COMPLETED, CommonStatusMessage.COMPLETED);
     }
 
     @Override
-    public @NonNull TmfModelResponse<@NonNull Map<@NonNull String, @NonNull String>> fetchTooltip(@NonNull SelectionTimeQueryFilter filter, @Nullable IProgressMonitor monitor) {
+    public @NonNull TmfModelResponse<@NonNull Map<@NonNull String, @NonNull String>> fetchTooltip(@NonNull Map<@NonNull String, @NonNull Object> fetchParameters, @Nullable IProgressMonitor monitor) {
         return new TmfModelResponse<>(null, ITmfResponse.Status.COMPLETED, CommonStatusMessage.COMPLETED);
     }
 
@@ -83,30 +99,34 @@
     }
 
     @Override
-    protected @Nullable List<@NonNull ITimeGraphRowModel> getRowModel(@NonNull ITmfStateSystem ss, @NonNull SelectionTimeQueryFilter filter, @Nullable IProgressMonitor monitor) throws StateSystemDisposedException {
+    protected @Nullable TimeGraphModel getRowModel(@NonNull ITmfStateSystem ss, @NonNull Map<@NonNull String, @NonNull Object> parameters, @Nullable IProgressMonitor monitor) throws StateSystemDisposedException {
         TreeMultimap<Integer, ITmfStateInterval> intervals = TreeMultimap.create(Comparator.naturalOrder(),
                 Comparator.comparing(ITmfStateInterval::getStartTime));
+        SelectionTimeQueryFilter filter = FetchParametersUtils.createSelectionTimeQuery(parameters);
+        if (filter == null) {
+            return null;
+        }
         Map<@NonNull Long, @NonNull Integer> entries = getSelectedEntries(filter);
         Collection<Long> times = getTimes(filter, ss.getStartTime(), ss.getCurrentEndTime());
 
         // Query
         for (ITmfStateInterval interval : ss.query2D(entries.values(), times)) {
             if (monitor != null && monitor.isCanceled()) {
-                return Collections.emptyList();
+                return new TimeGraphModel(Collections.emptyList());
             }
             intervals.put(interval.getAttribute(), interval);
         }
 
         Map<@NonNull Integer, @NonNull Predicate<@NonNull Multimap<@NonNull String, @NonNull String>>> predicates = new HashMap<>();
-        if (filter instanceof TimeGraphStateQueryFilter) {
-            TimeGraphStateQueryFilter timeEventFilter = (TimeGraphStateQueryFilter) filter;
-            predicates.putAll(computeRegexPredicate(timeEventFilter));
+        Multimap<@NonNull Integer, @NonNull String> regexesMap = DataProviderParameterUtils.extractRegexFilter(parameters);
+        if (regexesMap != null) {
+            predicates.putAll(computeRegexPredicate(regexesMap));
         }
 
         List<@NonNull ITimeGraphRowModel> rows = new ArrayList<>();
         for (Map.Entry<@NonNull Long, @NonNull Integer> entry : entries.entrySet()) {
             if (monitor != null && monitor.isCanceled()) {
-                return Collections.emptyList();
+                return new TimeGraphModel(Collections.emptyList());
             }
 
             List<ITimeGraphState> eventList = new ArrayList<>();
@@ -123,7 +143,7 @@
             rows.add(new TimeGraphRowModel(entry.getKey(), eventList));
 
         }
-        return rows;
+        return new TimeGraphModel(rows);
     }
 
     @Override
@@ -132,13 +152,12 @@
     }
 
     @Override
-    protected @NonNull List<@NonNull TimeGraphEntryModel> getTree(@NonNull ITmfStateSystem ss, @NonNull TimeQueryFilter filter, @Nullable IProgressMonitor monitor) throws StateSystemDisposedException {
+    protected @NonNull TmfTreeModel<@NonNull TimeGraphEntryModel> getTree(@NonNull ITmfStateSystem ss, @NonNull Map<@NonNull String, @NonNull Object> parameters, @Nullable IProgressMonitor monitor) throws StateSystemDisposedException {
         Builder<@NonNull TimeGraphEntryModel> builder = new Builder<>();
         long parentId = getId(ITmfStateSystem.ROOT_ATTRIBUTE);
         builder.add(new TimeGraphEntryModel(parentId, -1, String.valueOf(getTrace().getName()), ss.getStartTime(), ss.getCurrentEndTime()));
         addChildren(ss, builder, ITmfStateSystem.ROOT_ATTRIBUTE, parentId);
-        ImmutableList<@NonNull TimeGraphEntryModel> models = builder.build();
-        return models;
+        return new TmfTreeModel<>(Collections.emptyList(), builder.build());
     }
 
     private void addChildren(ITmfStateSystem ss, Builder<@NonNull TimeGraphEntryModel> builder, int quark, long parentId) {
diff --git a/tracetypes/org.eclipse.tracecompass.incubator.ros.core/src/org/eclipse/tracecompass/incubator/internal/ros/core/analysis/timers/RosTimersDataProvider.java b/tracetypes/org.eclipse.tracecompass.incubator.ros.core/src/org/eclipse/tracecompass/incubator/internal/ros/core/analysis/timers/RosTimersDataProvider.java
index ca57108..ee97484 100644
--- a/tracetypes/org.eclipse.tracecompass.incubator.ros.core/src/org/eclipse/tracecompass/incubator/internal/ros/core/analysis/timers/RosTimersDataProvider.java
+++ b/tracetypes/org.eclipse.tracecompass.incubator.ros.core/src/org/eclipse/tracecompass/incubator/internal/ros/core/analysis/timers/RosTimersDataProvider.java
@@ -23,11 +23,12 @@
 import org.eclipse.jdt.annotation.Nullable;
 import org.eclipse.tracecompass.incubator.internal.ros.core.analysis.ElementReferenceState;
 import org.eclipse.tracecompass.incubator.internal.ros.core.analysis.PeriodState;
-import org.eclipse.tracecompass.internal.tmf.core.model.filters.TimeGraphStateQueryFilter;
+import org.eclipse.tracecompass.internal.tmf.core.model.filters.FetchParametersUtils;
 import org.eclipse.tracecompass.internal.tmf.core.model.timegraph.AbstractTimeGraphDataProvider;
 import org.eclipse.tracecompass.statesystem.core.ITmfStateSystem;
 import org.eclipse.tracecompass.statesystem.core.exceptions.StateSystemDisposedException;
 import org.eclipse.tracecompass.statesystem.core.interval.ITmfStateInterval;
+import org.eclipse.tracecompass.tmf.core.dataprovider.DataProviderParameterUtils;
 import org.eclipse.tracecompass.tmf.core.model.CommonStatusMessage;
 import org.eclipse.tracecompass.tmf.core.model.filters.SelectionTimeQueryFilter;
 import org.eclipse.tracecompass.tmf.core.model.filters.TimeQueryFilter;
@@ -35,13 +36,14 @@
 import org.eclipse.tracecompass.tmf.core.model.timegraph.ITimeGraphRowModel;
 import org.eclipse.tracecompass.tmf.core.model.timegraph.ITimeGraphState;
 import org.eclipse.tracecompass.tmf.core.model.timegraph.TimeGraphEntryModel;
+import org.eclipse.tracecompass.tmf.core.model.timegraph.TimeGraphModel;
 import org.eclipse.tracecompass.tmf.core.model.timegraph.TimeGraphRowModel;
 import org.eclipse.tracecompass.tmf.core.model.timegraph.TimeGraphState;
+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.trace.ITmfTrace;
 
-import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableList.Builder;
 import com.google.common.collect.Multimap;
 import com.google.common.collect.TreeMultimap;
@@ -69,13 +71,27 @@
         super(trace, analysisModule);
     }
 
+    @Deprecated
     @Override
     public @NonNull TmfModelResponse<@NonNull List<@NonNull ITimeGraphArrow>> fetchArrows(@NonNull TimeQueryFilter filter, @Nullable IProgressMonitor monitor) {
+        Map<String, Object> parameters = FetchParametersUtils.timeQueryToMap(filter);
+        return fetchArrows(parameters, monitor);
+    }
+
+    @Deprecated
+    @Override
+    public @NonNull TmfModelResponse<@NonNull Map<@NonNull String, @NonNull String>> fetchTooltip(@NonNull SelectionTimeQueryFilter filter, @Nullable IProgressMonitor monitor) {
+        Map<String, Object> parameters = FetchParametersUtils.selectionTimeQueryToMap(filter);
+        return fetchTooltip(parameters, monitor);
+    }
+
+    @Override
+    public @NonNull TmfModelResponse<@NonNull List<@NonNull ITimeGraphArrow>> fetchArrows(@NonNull Map<@NonNull String, @NonNull Object> fetchParameters, @Nullable IProgressMonitor monitor) {
         return new TmfModelResponse<>(null, ITmfResponse.Status.COMPLETED, CommonStatusMessage.COMPLETED);
     }
 
     @Override
-    public @NonNull TmfModelResponse<@NonNull Map<@NonNull String, @NonNull String>> fetchTooltip(@NonNull SelectionTimeQueryFilter filter, @Nullable IProgressMonitor monitor) {
+    public @NonNull TmfModelResponse<@NonNull Map<@NonNull String, @NonNull String>> fetchTooltip(@NonNull Map<@NonNull String, @NonNull Object> fetchParameters, @Nullable IProgressMonitor monitor) {
         return new TmfModelResponse<>(null, ITmfResponse.Status.COMPLETED, CommonStatusMessage.COMPLETED);
     }
 
@@ -85,30 +101,34 @@
     }
 
     @Override
-    protected @Nullable List<@NonNull ITimeGraphRowModel> getRowModel(@NonNull ITmfStateSystem ss, @NonNull SelectionTimeQueryFilter filter, @Nullable IProgressMonitor monitor) throws StateSystemDisposedException {
+    protected @Nullable TimeGraphModel getRowModel(@NonNull ITmfStateSystem ss, @NonNull Map<@NonNull String, @NonNull Object> parameters, @Nullable IProgressMonitor monitor) throws StateSystemDisposedException {
         TreeMultimap<Integer, ITmfStateInterval> intervals = TreeMultimap.create(Comparator.naturalOrder(),
                 Comparator.comparing(ITmfStateInterval::getStartTime));
+        SelectionTimeQueryFilter filter = FetchParametersUtils.createSelectionTimeQuery(parameters);
+        if (filter == null) {
+            return null;
+        }
         Map<@NonNull Long, @NonNull Integer> entries = getSelectedEntries(filter);
         Collection<Long> times = getTimes(filter, ss.getStartTime(), ss.getCurrentEndTime());
 
         // Query
         for (ITmfStateInterval interval : ss.query2D(entries.values(), times)) {
             if (monitor != null && monitor.isCanceled()) {
-                return Collections.emptyList();
+                return new TimeGraphModel(Collections.emptyList());
             }
             intervals.put(interval.getAttribute(), interval);
         }
 
         Map<@NonNull Integer, @NonNull Predicate<@NonNull Multimap<@NonNull String, @NonNull String>>> predicates = new HashMap<>();
-        if (filter instanceof TimeGraphStateQueryFilter) {
-            TimeGraphStateQueryFilter timeEventFilter = (TimeGraphStateQueryFilter) filter;
-            predicates.putAll(computeRegexPredicate(timeEventFilter));
+        Multimap<@NonNull Integer, @NonNull String> regexesMap = DataProviderParameterUtils.extractRegexFilter(parameters);
+        if (regexesMap != null) {
+            predicates.putAll(computeRegexPredicate(regexesMap));
         }
 
         List<@NonNull ITimeGraphRowModel> rows = new ArrayList<>();
         for (Map.Entry<@NonNull Long, @NonNull Integer> entry : entries.entrySet()) {
             if (monitor != null && monitor.isCanceled()) {
-                return Collections.emptyList();
+                return new TimeGraphModel(Collections.emptyList());
             }
 
             List<ITimeGraphState> eventList = new ArrayList<>();
@@ -139,7 +159,7 @@
             rows.add(new TimeGraphRowModel(entry.getKey(), eventList));
 
         }
-        return rows;
+        return new TimeGraphModel(rows);
     }
 
     @Override
@@ -148,13 +168,12 @@
     }
 
     @Override
-    protected @NonNull List<@NonNull TimeGraphEntryModel> getTree(@NonNull ITmfStateSystem ss, @NonNull TimeQueryFilter filter, @Nullable IProgressMonitor monitor) throws StateSystemDisposedException {
+    protected @NonNull TmfTreeModel<@NonNull TimeGraphEntryModel> getTree(@NonNull ITmfStateSystem ss, @NonNull Map<@NonNull String, @NonNull Object> parameters, @Nullable IProgressMonitor monitor) throws StateSystemDisposedException {
         Builder<@NonNull TimeGraphEntryModel> builder = new Builder<>();
         long parentId = getId(ITmfStateSystem.ROOT_ATTRIBUTE);
         builder.add(new TimeGraphEntryModel(parentId, -1, String.valueOf(getTrace().getName()), ss.getStartTime(), ss.getCurrentEndTime()));
         addChildren(ss, builder, ITmfStateSystem.ROOT_ATTRIBUTE, parentId);
-        ImmutableList<@NonNull TimeGraphEntryModel> models = builder.build();
-        return models;
+        return new TmfTreeModel<>(Collections.emptyList(), builder.build());
     }
 
     private void addChildren(ITmfStateSystem ss, Builder<@NonNull TimeGraphEntryModel> builder, int quark, long parentId) {
diff --git a/tracetypes/org.eclipse.tracecompass.incubator.traceevent.core.tests/src/org/eclipse/tracecompass/incubator/traceevent/core/tests/ContextTest.java b/tracetypes/org.eclipse.tracecompass.incubator.traceevent.core.tests/src/org/eclipse/tracecompass/incubator/traceevent/core/tests/ContextTest.java
index a68bb00..7456688 100644
--- a/tracetypes/org.eclipse.tracecompass.incubator.traceevent.core.tests/src/org/eclipse/tracecompass/incubator/traceevent/core/tests/ContextTest.java
+++ b/tracetypes/org.eclipse.tracecompass.incubator.traceevent.core.tests/src/org/eclipse/tracecompass/incubator/traceevent/core/tests/ContextTest.java
@@ -22,15 +22,17 @@
 import org.eclipse.tracecompass.incubator.internal.traceevent.core.analysis.context.ContextDataProvider;
 import org.eclipse.tracecompass.incubator.internal.traceevent.core.analysis.context.ContextDataProviderFactory;
 import org.eclipse.tracecompass.incubator.internal.traceevent.core.trace.TraceEventTrace;
+import org.eclipse.tracecompass.internal.tmf.core.model.filters.FetchParametersUtils;
 import org.eclipse.tracecompass.tmf.core.analysis.IAnalysisModule;
 import org.eclipse.tracecompass.tmf.core.event.ITmfEvent;
 import org.eclipse.tracecompass.tmf.core.exceptions.TmfAnalysisException;
 import org.eclipse.tracecompass.tmf.core.exceptions.TmfTraceException;
 import org.eclipse.tracecompass.tmf.core.model.filters.SelectionTimeQueryFilter;
 import org.eclipse.tracecompass.tmf.core.model.filters.TimeQueryFilter;
-import org.eclipse.tracecompass.tmf.core.model.timegraph.ITimeGraphRowModel;
 import org.eclipse.tracecompass.tmf.core.model.timegraph.ITimeGraphState;
 import org.eclipse.tracecompass.tmf.core.model.timegraph.TimeGraphEntryModel;
+import org.eclipse.tracecompass.tmf.core.model.timegraph.TimeGraphModel;
+import org.eclipse.tracecompass.tmf.core.model.tree.TmfTreeModel;
 import org.eclipse.tracecompass.tmf.core.response.TmfModelResponse;
 import org.eclipse.tracecompass.tmf.core.trace.ITmfContext;
 import org.eclipse.tracecompass.tmf.core.trace.ITmfTrace;
@@ -80,25 +82,25 @@
              */
             assertNotNull(provider);
             TimeQueryFilter filter = new TimeQueryFilter(trace.getStartTime().toNanos(), trace.getEndTime().toNanos(), 1000);
-            TmfModelResponse<@NonNull List<@NonNull TimeGraphEntryModel>> tree = provider.fetchTree(filter, new NullProgressMonitor());
+            TmfModelResponse<@NonNull TmfTreeModel<@NonNull TimeGraphEntryModel>> tree = provider.fetchTree(FetchParametersUtils.timeQueryToMap(filter), new NullProgressMonitor());
             assertEquals(tree.getStatus(), TmfModelResponse.Status.COMPLETED);
-            List<@NonNull TimeGraphEntryModel> model = tree.getModel();
+            TmfTreeModel<@NonNull TimeGraphEntryModel> model = tree.getModel();
             /*
              * Does the query have the right data?
              */
             assertNotNull(model);
-            TimeGraphEntryModel rootEntry = model.get(0);
+            TimeGraphEntryModel rootEntry = model.getEntries().get(0);
             assertEquals("blink", rootEntry.getName());
             SelectionTimeQueryFilter selectionFilter = new SelectionTimeQueryFilter(trace.getStartTime().toNanos(), trace.getEndTime().toNanos(), 1000, Collections.singleton(rootEntry.getId()));
-            TmfModelResponse<@NonNull List<@NonNull ITimeGraphRowModel>> rowModel = provider.fetchRowModel(selectionFilter, new NullProgressMonitor());
+            TmfModelResponse<@NonNull TimeGraphModel> rowModel = provider.fetchRowModel(FetchParametersUtils.selectionTimeQueryToMap(selectionFilter), new NullProgressMonitor());
             /*
              * Does the second query have the bookmarks?
              */
             assertNotNull(rowModel);
-            List<@NonNull ITimeGraphRowModel> markerList = rowModel.getModel();
+            TimeGraphModel markerList = rowModel.getModel();
             assertNotNull(markerList);
-            assertFalse(markerList.isEmpty());
-            List<@NonNull ITimeGraphState> bookmarks = markerList.get(0).getStates();
+            assertFalse(markerList.getRows().isEmpty());
+            List<@NonNull ITimeGraphState> bookmarks = markerList.getRows().get(0).getStates();
             assertEquals(3, bookmarks.size());
             assertEquals(Collections.singleton("FrameBlameContext"), Sets.newHashSet(Lists.transform(bookmarks, bookmark -> bookmark.getLabel())));
         } finally {
diff --git a/tracetypes/org.eclipse.tracecompass.incubator.traceevent.core.tests/src/org/eclipse/tracecompass/incubator/traceevent/core/tests/ObjectLifeAnalysisTest.java b/tracetypes/org.eclipse.tracecompass.incubator.traceevent.core.tests/src/org/eclipse/tracecompass/incubator/traceevent/core/tests/ObjectLifeAnalysisTest.java
index b0be4a9..ba283fd 100644
--- a/tracetypes/org.eclipse.tracecompass.incubator.traceevent.core.tests/src/org/eclipse/tracecompass/incubator/traceevent/core/tests/ObjectLifeAnalysisTest.java
+++ b/tracetypes/org.eclipse.tracecompass.incubator.traceevent.core.tests/src/org/eclipse/tracecompass/incubator/traceevent/core/tests/ObjectLifeAnalysisTest.java
@@ -21,12 +21,15 @@
 import org.eclipse.tracecompass.incubator.internal.traceevent.core.analysis.objectlife.ObjectLifeAnalysis;
 import org.eclipse.tracecompass.incubator.internal.traceevent.core.analysis.objectlife.ObjectLifeDataProvider;
 import org.eclipse.tracecompass.incubator.internal.traceevent.core.trace.TraceEventTrace;
+import org.eclipse.tracecompass.internal.tmf.core.model.filters.FetchParametersUtils;
 import org.eclipse.tracecompass.tmf.core.event.ITmfEvent;
 import org.eclipse.tracecompass.tmf.core.exceptions.TmfTraceException;
 import org.eclipse.tracecompass.tmf.core.model.filters.SelectionTimeQueryFilter;
 import org.eclipse.tracecompass.tmf.core.model.filters.TimeQueryFilter;
 import org.eclipse.tracecompass.tmf.core.model.timegraph.ITimeGraphRowModel;
 import org.eclipse.tracecompass.tmf.core.model.timegraph.TimeGraphEntryModel;
+import org.eclipse.tracecompass.tmf.core.model.timegraph.TimeGraphModel;
+import org.eclipse.tracecompass.tmf.core.model.tree.TmfTreeModel;
 import org.eclipse.tracecompass.tmf.core.response.ITmfResponse.Status;
 import org.eclipse.tracecompass.tmf.core.response.TmfModelResponse;
 import org.eclipse.tracecompass.tmf.core.signal.TmfTraceOpenedSignal;
@@ -102,15 +105,15 @@
     @Test
     @SuppressWarnings("restriction")
     public void test() {
-        TmfModelResponse<@NonNull List<@NonNull TimeGraphEntryModel>> tree = fDataProvider.fetchTree(new TimeQueryFilter(fStart, fEnd, 1000), new NullProgressMonitor());
+        TmfModelResponse<@NonNull TmfTreeModel<@NonNull TimeGraphEntryModel>> tree = fDataProvider.fetchTree(FetchParametersUtils.timeQueryToMap(new TimeQueryFilter(fStart, fEnd, 1000)), new NullProgressMonitor());
         assertEquals(Status.COMPLETED, tree.getStatus());
-        List<@NonNull TimeGraphEntryModel> treeModel = tree.getModel();
+        TmfTreeModel<@NonNull TimeGraphEntryModel> treeModel = tree.getModel();
         assertNotNull(treeModel);
 
-        TimeGraphEntryModel mufasaEntry = getValueEntry(treeModel, "Mufasa");
-        TimeGraphEntryModel sarabiEntry = getValueEntry(treeModel, "Sarabi");
-        TimeGraphEntryModel scarEntry = getValueEntry(treeModel, "Scar");
-        TimeGraphEntryModel simbaEntry = getValueEntry(treeModel, "Simba");
+        TimeGraphEntryModel mufasaEntry = getValueEntry(treeModel.getEntries(), "Mufasa");
+        TimeGraphEntryModel sarabiEntry = getValueEntry(treeModel.getEntries(), "Sarabi");
+        TimeGraphEntryModel scarEntry = getValueEntry(treeModel.getEntries(), "Scar");
+        TimeGraphEntryModel simbaEntry = getValueEntry(treeModel.getEntries(), "Simba");
         assertNotNull(mufasaEntry);
         assertNotNull(sarabiEntry);
         assertNotNull(scarEntry);
@@ -120,25 +123,26 @@
          * Remember, state system is in nanos, time range is known since we know the
          * trace
          */
-        TmfModelResponse<@NonNull List<@NonNull ITimeGraphRowModel>> resp = fDataProvider.fetchRowModel(new SelectionTimeQueryFilter(100000L, 300000L, 200, items), new NullProgressMonitor());
+        TmfModelResponse<@NonNull TimeGraphModel> resp = fDataProvider.fetchRowModel(FetchParametersUtils.selectionTimeQueryToMap(new SelectionTimeQueryFilter(100000L, 300000L, 200, items)), new NullProgressMonitor());
         assertEquals(Status.COMPLETED, resp.getStatus());
-        List<@NonNull ITimeGraphRowModel> models = resp.getModel();
-        assertNotNull(models);
-        ImmutableMap<Long, @NonNull ITimeGraphRowModel> groupRowsById = Maps.uniqueIndex(models, ITimeGraphRowModel::getEntryID);
+        TimeGraphModel model = resp.getModel();
+        assertNotNull(model);
+        List<@NonNull ITimeGraphRowModel> modelRows = model.getRows();
+        ImmutableMap<Long, @NonNull ITimeGraphRowModel> groupRowsById = Maps.uniqueIndex(modelRows, ITimeGraphRowModel::getEntryID);
         ITimeGraphRowModel mufasaRow = groupRowsById.get(mufasaEntry.getId());
         assertNotNull(mufasaRow);
         assertEquals("", mufasaRow.getStates().get(0).getLabel());
         assertEquals(null, mufasaRow.getStates().get(1).getLabel());
-        ITimeGraphRowModel sarabiRow = models.get(1);
+        ITimeGraphRowModel sarabiRow = modelRows.get(1);
         assertNotNull(sarabiRow);
         assertEquals(null, sarabiRow.getStates().get(0).getLabel());
         assertEquals("", sarabiRow.getStates().get(1).getLabel());
         assertEquals(null, sarabiRow.getStates().get(2).getLabel());
-        ITimeGraphRowModel scarRow = models.get(2);
+        ITimeGraphRowModel scarRow = modelRows.get(2);
         assertNotNull(scarRow); // The bad guy
         assertEquals(null, scarRow.getStates().get(0).getLabel());
         assertEquals("", scarRow.getStates().get(1).getLabel());
-        ITimeGraphRowModel simbaRow = models.get(3);
+        ITimeGraphRowModel simbaRow = modelRows.get(3);
         assertNotNull(simbaRow);
         assertEquals(null, simbaRow.getStates().get(0).getLabel());
         assertEquals("", simbaRow.getStates().get(1).getLabel());
diff --git a/tracetypes/org.eclipse.tracecompass.incubator.traceevent.core/src/org/eclipse/tracecompass/incubator/internal/traceevent/core/analysis/context/ContextDataProvider.java b/tracetypes/org.eclipse.tracecompass.incubator.traceevent.core/src/org/eclipse/tracecompass/incubator/internal/traceevent/core/analysis/context/ContextDataProvider.java
index d961fa2..0abc217 100644
--- a/tracetypes/org.eclipse.tracecompass.incubator.traceevent.core/src/org/eclipse/tracecompass/incubator/internal/traceevent/core/analysis/context/ContextDataProvider.java
+++ b/tracetypes/org.eclipse.tracecompass.incubator.traceevent.core/src/org/eclipse/tracecompass/incubator/internal/traceevent/core/analysis/context/ContextDataProvider.java
@@ -21,6 +21,7 @@
 import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.jdt.annotation.NonNull;
 import org.eclipse.jdt.annotation.Nullable;
+import org.eclipse.tracecompass.internal.tmf.core.model.filters.FetchParametersUtils;
 import org.eclipse.tracecompass.internal.tmf.core.model.timegraph.AbstractTimeGraphDataProvider;
 import org.eclipse.tracecompass.statesystem.core.ITmfStateSystem;
 import org.eclipse.tracecompass.statesystem.core.exceptions.StateSystemDisposedException;
@@ -28,11 +29,12 @@
 import org.eclipse.tracecompass.tmf.core.model.filters.SelectionTimeQueryFilter;
 import org.eclipse.tracecompass.tmf.core.model.filters.TimeQueryFilter;
 import org.eclipse.tracecompass.tmf.core.model.timegraph.ITimeGraphArrow;
-import org.eclipse.tracecompass.tmf.core.model.timegraph.ITimeGraphRowModel;
 import org.eclipse.tracecompass.tmf.core.model.timegraph.ITimeGraphState;
 import org.eclipse.tracecompass.tmf.core.model.timegraph.TimeGraphEntryModel;
+import org.eclipse.tracecompass.tmf.core.model.timegraph.TimeGraphModel;
 import org.eclipse.tracecompass.tmf.core.model.timegraph.TimeGraphRowModel;
 import org.eclipse.tracecompass.tmf.core.model.timegraph.TimeGraphState;
+import org.eclipse.tracecompass.tmf.core.model.tree.TmfTreeModel;
 import org.eclipse.tracecompass.tmf.core.response.ITmfResponse.Status;
 import org.eclipse.tracecompass.tmf.core.response.TmfModelResponse;
 import org.eclipse.tracecompass.tmf.core.trace.ITmfTrace;
@@ -119,24 +121,39 @@
         return true;
     }
 
+    @Deprecated
     @Override
     public @NonNull TmfModelResponse<@NonNull List<@NonNull ITimeGraphArrow>> fetchArrows(@NonNull TimeQueryFilter filter, @Nullable IProgressMonitor monitor) {
+        Map<String, Object> parameters = FetchParametersUtils.timeQueryToMap(filter);
+        return fetchArrows(parameters, monitor);
+    }
+
+    @Override
+    public @NonNull TmfModelResponse<@NonNull List<@NonNull ITimeGraphArrow>> fetchArrows(Map<String, Object> fetchParameters, @Nullable IProgressMonitor monitor) {
         return new TmfModelResponse<>(null, Status.COMPLETED, "Not supported"); //$NON-NLS-1$
     }
 
+    @Deprecated
     @Override
     public @NonNull TmfModelResponse<@NonNull Map<@NonNull String, @NonNull String>> fetchTooltip(@NonNull SelectionTimeQueryFilter filter, @Nullable IProgressMonitor monitor) {
+        Map<String, Object> parameters = FetchParametersUtils.selectionTimeQueryToMap(filter);
+        return fetchTooltip(parameters, monitor);
+    }
+
+    @Override
+    public @NonNull TmfModelResponse<@NonNull Map<@NonNull String, @NonNull String>> fetchTooltip(Map<String, Object> fetchParameters, @Nullable IProgressMonitor monitor) {
         return new TmfModelResponse<>(null, Status.COMPLETED, "Not supported"); //$NON-NLS-1$
     }
 
     @Override
-    protected @Nullable List<@NonNull ITimeGraphRowModel> getRowModel(@NonNull ITmfStateSystem ss, @NonNull SelectionTimeQueryFilter filter, @Nullable IProgressMonitor monitor) throws StateSystemDisposedException {
+    protected @Nullable TimeGraphModel getRowModel(@NonNull ITmfStateSystem ss, Map<String, Object> parameters, @Nullable IProgressMonitor monitor) throws StateSystemDisposedException {
         /*
          * Order is not important here
          */
         Map<Integer, String[]> paths = new HashMap<>();
         List<ITimeGraphState> markerList = new ArrayList<>();
 
+        SelectionTimeQueryFilter filter = FetchParametersUtils.createSelectionTimeQuery(parameters);
         Collection<Long> times = getTimes(filter, ss.getStartTime(), ss.getCurrentEndTime());
         Set<Integer> quarks = new HashSet<>();
         Map<@NonNull Long, @NonNull Integer> selectedEntries = getSelectedEntries(filter);
@@ -150,7 +167,7 @@
         /* Do the actual query */
         for (ITmfStateInterval interval : ss.query2D(quarks, times)) {
             if (monitor != null && monitor.isCanceled()) {
-                return Collections.emptyList();
+                return new TimeGraphModel(Collections.emptyList());
             }
             if (interval.getValue() instanceof Integer) {
                 long startTime = interval.getStartTime();
@@ -161,21 +178,21 @@
         }
 
         if (monitor != null && monitor.isCanceled()) {
-            return Collections.emptyList();
+            return new TimeGraphModel(Collections.emptyList());
         }
-        return Collections.singletonList(new TimeGraphRowModel(getId(ITmfStateSystem.ROOT_ATTRIBUTE), markerList));
+        return new TimeGraphModel(Collections.singletonList(new TimeGraphRowModel(getId(ITmfStateSystem.ROOT_ATTRIBUTE), markerList)));
     }
 
     @Override
-    protected @NonNull List<@NonNull TimeGraphEntryModel> getTree(@NonNull ITmfStateSystem ss, @NonNull TimeQueryFilter filter, @Nullable IProgressMonitor monitor) throws StateSystemDisposedException {
+    protected TmfTreeModel<@NonNull TimeGraphEntryModel> getTree(@NonNull ITmfStateSystem ss, Map<String, Object> parameters, @Nullable IProgressMonitor monitor) throws StateSystemDisposedException {
         long rootId = getId(ITmfStateSystem.ROOT_ATTRIBUTE);
         List<@NonNull Integer> attribs = ss.getSubAttributes(ITmfStateSystem.ROOT_ATTRIBUTE, false);
         List<@NonNull TimeGraphEntryModel> retVal = new ArrayList<>();
         for (Integer attrib : attribs) {
             String[] strings = ss.getFullAttributePathArray(attrib);
-            retVal.add(new TimeGraphEntryModel(getId(attrib), rootId, strings[0], ss.getStartTime(), ss.getCurrentEndTime()));
+            retVal.add(new TimeGraphEntryModel(getId(attrib), rootId, Collections.singletonList(strings[0]), ss.getStartTime(), ss.getCurrentEndTime()));
         }
-        return retVal;
+        return new TmfTreeModel<>(Collections.emptyList(), retVal);
     }
 
 }
diff --git a/tracetypes/org.eclipse.tracecompass.incubator.traceevent.core/src/org/eclipse/tracecompass/incubator/internal/traceevent/core/analysis/objectlife/ObjectLifeDataProvider.java b/tracetypes/org.eclipse.tracecompass.incubator.traceevent.core/src/org/eclipse/tracecompass/incubator/internal/traceevent/core/analysis/objectlife/ObjectLifeDataProvider.java
index e46ee2a..cd0a07e 100644
--- a/tracetypes/org.eclipse.tracecompass.incubator.traceevent.core/src/org/eclipse/tracecompass/incubator/internal/traceevent/core/analysis/objectlife/ObjectLifeDataProvider.java
+++ b/tracetypes/org.eclipse.tracecompass.incubator.traceevent.core/src/org/eclipse/tracecompass/incubator/internal/traceevent/core/analysis/objectlife/ObjectLifeDataProvider.java
@@ -19,6 +19,7 @@
 import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.jdt.annotation.NonNull;
 import org.eclipse.jdt.annotation.Nullable;
+import org.eclipse.tracecompass.internal.tmf.core.model.filters.FetchParametersUtils;
 import org.eclipse.tracecompass.internal.tmf.core.model.timegraph.AbstractTimeGraphDataProvider;
 import org.eclipse.tracecompass.statesystem.core.ITmfStateSystem;
 import org.eclipse.tracecompass.statesystem.core.exceptions.StateSystemDisposedException;
@@ -30,8 +31,10 @@
 import org.eclipse.tracecompass.tmf.core.model.timegraph.ITimeGraphRowModel;
 import org.eclipse.tracecompass.tmf.core.model.timegraph.ITimeGraphState;
 import org.eclipse.tracecompass.tmf.core.model.timegraph.TimeGraphEntryModel;
+import org.eclipse.tracecompass.tmf.core.model.timegraph.TimeGraphModel;
 import org.eclipse.tracecompass.tmf.core.model.timegraph.TimeGraphRowModel;
 import org.eclipse.tracecompass.tmf.core.model.timegraph.TimeGraphState;
+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.trace.ITmfTrace;
@@ -64,14 +67,32 @@
         super(trace, analysisModule);
     }
 
+    @Deprecated
     @Override
     public @NonNull TmfModelResponse<@NonNull List<@NonNull ITimeGraphArrow>> fetchArrows(@NonNull TimeQueryFilter filter, @Nullable IProgressMonitor monitor) {
-        return new TmfModelResponse<>(null, ITmfResponse.Status.COMPLETED, CommonStatusMessage.COMPLETED);
+        Map<String, Object> parameters = FetchParametersUtils.timeQueryToMap(filter);
+        return fetchArrows(parameters, monitor);
     }
 
     @Override
+    public @NonNull TmfModelResponse<@NonNull List<@NonNull ITimeGraphArrow>> fetchArrows(Map<String, Object> fetchParameters, @Nullable IProgressMonitor monitor) {
+        return new TmfModelResponse<>(null, ITmfResponse.Status.COMPLETED, CommonStatusMessage.COMPLETED);
+    }
+
+    @Deprecated
+    @Override
     public @NonNull TmfModelResponse<@NonNull Map<@NonNull String, @NonNull String>> fetchTooltip(@NonNull SelectionTimeQueryFilter filter, @Nullable IProgressMonitor monitor) {
+        Map<String, Object> parameters = FetchParametersUtils.selectionTimeQueryToMap(filter);
+        return fetchTooltip(parameters, monitor);
+    }
+
+    @Override
+    public @NonNull TmfModelResponse<@NonNull Map<@NonNull String, @NonNull String>> fetchTooltip(Map<String, Object> fetchParameters, @Nullable IProgressMonitor monitor) {
         ITmfStateSystem ss = getAnalysisModule().getStateSystem();
+        SelectionTimeQueryFilter filter = FetchParametersUtils.createSelectionTimeQuery(fetchParameters);
+        if (filter == null) {
+            return new TmfModelResponse<>(null, ITmfResponse.Status.FAILED, CommonStatusMessage.INCORRECT_QUERY_PARAMETERS);
+        }
         Map<@NonNull Long, @NonNull Integer> entries = getSelectedEntries(filter);
         Collection<@NonNull Integer> quarks = entries.values();
         long start = filter.getStart();
@@ -105,9 +126,10 @@
     }
 
     @Override
-    protected @Nullable List<@NonNull ITimeGraphRowModel> getRowModel(@NonNull ITmfStateSystem ss, @NonNull SelectionTimeQueryFilter filter, @Nullable IProgressMonitor monitor) throws StateSystemDisposedException {
+    protected @Nullable TimeGraphModel getRowModel(@NonNull ITmfStateSystem ss, Map<String, Object> parameters, @Nullable IProgressMonitor monitor) throws StateSystemDisposedException {
         TreeMultimap<Integer, ITmfStateInterval> intervals = TreeMultimap.create(Comparator.naturalOrder(),
                 Comparator.comparing(ITmfStateInterval::getStartTime));
+        SelectionTimeQueryFilter filter = FetchParametersUtils.createSelectionTimeQuery(parameters);
         Map<@NonNull Long, @NonNull Integer> entries = getSelectedEntries(filter);
         Collection<Long> times = getTimes(filter, ss.getStartTime(), ss.getCurrentEndTime());
         /* Do the actual query */
@@ -134,7 +156,7 @@
             rows.add(new TimeGraphRowModel(entry.getKey(), eventList));
 
         }
-        return rows;
+        return new TimeGraphModel(rows);
     }
 
     @Override
@@ -144,18 +166,18 @@
 
     @SuppressWarnings("restriction")
     @Override
-    protected @NonNull List<@NonNull TimeGraphEntryModel> getTree(@NonNull ITmfStateSystem ss, @NonNull TimeQueryFilter filter, @Nullable IProgressMonitor monitor) throws StateSystemDisposedException {
+    protected @NonNull TmfTreeModel<@NonNull TimeGraphEntryModel> getTree(@NonNull ITmfStateSystem ss, Map<String, Object> parameters, @Nullable IProgressMonitor monitor) throws StateSystemDisposedException {
         Builder<@NonNull TimeGraphEntryModel> builder = new Builder<>();
         long parentId = getId(ITmfStateSystem.ROOT_ATTRIBUTE);
-        builder.add(new TimeGraphEntryModel(parentId, -1, getTrace().getName(), ss.getStartTime(), ss.getCurrentEndTime()));
+        builder.add(new TimeGraphEntryModel(parentId, -1, Collections.singletonList(getTrace().getName()), ss.getStartTime(), ss.getCurrentEndTime()));
         addChildren(ss, builder, ITmfStateSystem.ROOT_ATTRIBUTE, parentId);
-        return builder.build();
+        return new TmfTreeModel<>(Collections.emptyList(), builder.build());
     }
 
     private void addChildren(ITmfStateSystem ss, Builder<@NonNull TimeGraphEntryModel> builder, int quark, long parentId) {
         for (Integer child : ss.getSubAttributes(quark, false)) {
             long childId = getId(child);
-            builder.add(new TimeGraphEntryModel(childId, parentId, ss.getAttributeName(child), ss.getStartTime(), ss.getCurrentEndTime()));
+            builder.add(new TimeGraphEntryModel(childId, parentId, Collections.singletonList(ss.getAttributeName(child)), ss.getStartTime(), ss.getCurrentEndTime()));
             addChildren(ss, builder, child, childId);
         }
     }
diff --git a/tracetypes/org.eclipse.tracecompass.incubator.traceevent.ui/src/org/eclipse/tracecompass/incubator/internal/traceevent/ui/markers/ContextMarkers.java b/tracetypes/org.eclipse.tracecompass.incubator.traceevent.ui/src/org/eclipse/tracecompass/incubator/internal/traceevent/ui/markers/ContextMarkers.java
index e3f7938..e7cd5b9 100644
--- a/tracetypes/org.eclipse.tracecompass.incubator.traceevent.ui/src/org/eclipse/tracecompass/incubator/internal/traceevent/ui/markers/ContextMarkers.java
+++ b/tracetypes/org.eclipse.tracecompass.incubator.traceevent.ui/src/org/eclipse/tracecompass/incubator/internal/traceevent/ui/markers/ContextMarkers.java
@@ -21,13 +21,16 @@
 import org.eclipse.swt.graphics.RGBA;
 import org.eclipse.tracecompass.incubator.internal.traceevent.core.analysis.context.ContextDataProvider;
 import org.eclipse.tracecompass.incubator.internal.traceevent.core.analysis.context.ContextDataProvider.MarkerModel;
+import org.eclipse.tracecompass.internal.tmf.core.model.filters.FetchParametersUtils;
 import org.eclipse.tracecompass.tmf.core.dataprovider.DataProviderManager;
 import org.eclipse.tracecompass.tmf.core.model.filters.SelectionTimeQueryFilter;
 import org.eclipse.tracecompass.tmf.core.model.filters.TimeQueryFilter;
 import org.eclipse.tracecompass.tmf.core.model.timegraph.ITimeGraphRowModel;
 import org.eclipse.tracecompass.tmf.core.model.timegraph.ITimeGraphState;
 import org.eclipse.tracecompass.tmf.core.model.timegraph.TimeGraphEntryModel;
+import org.eclipse.tracecompass.tmf.core.model.timegraph.TimeGraphModel;
 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.TmfModelResponse;
 import org.eclipse.tracecompass.tmf.core.trace.ITmfTrace;
 import org.eclipse.tracecompass.tmf.core.trace.TmfTraceManager;
@@ -68,14 +71,14 @@
         if (dataProvider == null) {
             return Collections.emptyList();
         }
-        TmfModelResponse<@NonNull List<@NonNull TimeGraphEntryModel>> tree = dataProvider.fetchTree(new TimeQueryFilter(Collections.emptyList()), new NullProgressMonitor());
-        List<@NonNull TimeGraphEntryModel> model = tree.getModel();
+        TmfModelResponse<@NonNull TmfTreeModel<@NonNull TimeGraphEntryModel>> tree = dataProvider.fetchTree(FetchParametersUtils.timeQueryToMap(new TimeQueryFilter(Collections.emptyList())), new NullProgressMonitor());
+        TmfTreeModel<@NonNull TimeGraphEntryModel> model = tree.getModel();
 
         if (model == null) {
             return Collections.emptyList();
         }
         Set<String> data = new HashSet<>();
-        for (TmfTreeDataModel elem : model) {
+        for (TmfTreeDataModel elem : model.getEntries()) {
             data.add(elem.getName());
         }
         List<String> dataList = Lists.newArrayList(data);
@@ -93,25 +96,25 @@
         if (dataProvider == null) {
             return Collections.emptyList();
         }
-        TmfModelResponse<@NonNull List<@NonNull TimeGraphEntryModel>> tree = dataProvider.fetchTree(new TimeQueryFilter(Collections.emptyList()), monitor);
-        List<@NonNull TimeGraphEntryModel> treeModels = tree.getModel();
+        TmfModelResponse<@NonNull TmfTreeModel<@NonNull TimeGraphEntryModel>> tree = dataProvider.fetchTree(FetchParametersUtils.timeQueryToMap(new TimeQueryFilter(Collections.emptyList())), monitor);
+        TmfTreeModel<@NonNull TimeGraphEntryModel> treeModels = tree.getModel();
 
         if (treeModels == null) {
             return Collections.emptyList();
         }
         List<Long> ids = new ArrayList<>();
-        for (TmfTreeDataModel treeModel : treeModels) {
+        for (TmfTreeDataModel treeModel : treeModels.getEntries()) {
             if (treeModel.getName().startsWith(category)) {
                 ids.add(treeModel.getId());
             }
         }
-        TmfModelResponse<@NonNull List<@NonNull ITimeGraphRowModel>> res = dataProvider.fetchRowModel(new SelectionTimeQueryFilter(startTime, endTime, (int) Math.max(2, (((double) endTime - startTime) / resolution)), ids), monitor);
-        List<@NonNull ITimeGraphRowModel> rowModels = res.getModel();
-        if (rowModels == null || rowModels.isEmpty()) {
+        TmfModelResponse<@NonNull TimeGraphModel> res = dataProvider.fetchRowModel(FetchParametersUtils.selectionTimeQueryToMap(new SelectionTimeQueryFilter(startTime, endTime, (int) Math.max(2, (((double) endTime - startTime) / resolution)), ids)), monitor);
+        TimeGraphModel rowModels = res.getModel();
+        if (rowModels == null || rowModels.getRows().isEmpty()) {
             return Collections.emptyList();
         }
         List<IMarkerEvent> events = new ArrayList<>();
-        for (ITimeGraphRowModel rowModel : rowModels) {
+        for (ITimeGraphRowModel rowModel : rowModels.getRows()) {
             for (ITimeGraphState model : rowModel.getStates()) {
                 if (model instanceof MarkerModel) {
                     events.add(new MarkerEvent(null, model.getStartTime(), model.getDuration(), ((MarkerModel) model).getCategory(), ONE_TRUE_COLOUR, model.getLabel(), true));