tmf: Add configuration source extension point and classes

Introduction of "org.eclipse.tracecompass.tmf.core.config" extension
point. Extensions need to implement the interface
"ITmfConfigurationSource". The "TmfConfigurationSourceManager" will
read all extensions and interested parties can get all configuration
source types implementing"ITmfConfigurationSourceType" and their
"ITmfConfigurationSource". Using the "ITmfConfigurationSource"
instances of "ITmfConfiguration" can be instantiated and managed, e.g.
updated or removed.

This commit also contains relevant JUnit tests of the new classes.

[Added] org.eclipse.tracecompass.tmf.core.config extension point

Change-Id: Iff1935178515cafab015bbcad3ddc7a519e63f8c
Signed-off-by: Bernd Hufmann <bernd.hufmann@ericsson.com>
Reviewed-on: https://git.eclipse.org/r/c/tracecompass/org.eclipse.tracecompass/+/204455
Tested-by: Patrick Tasse <patrick.tasse@gmail.com>
Tested-by: Trace Compass Bot <tracecompass-bot@eclipse.org>
Reviewed-by: Patrick Tasse <patrick.tasse@gmail.com>
diff --git a/tmf/org.eclipse.tracecompass.tmf.core.tests/META-INF/MANIFEST.MF b/tmf/org.eclipse.tracecompass.tmf.core.tests/META-INF/MANIFEST.MF
index b10093b..623af1f 100644
--- a/tmf/org.eclipse.tracecompass.tmf.core.tests/META-INF/MANIFEST.MF
+++ b/tmf/org.eclipse.tracecompass.tmf.core.tests/META-INF/MANIFEST.MF
@@ -34,6 +34,7 @@
  org.eclipse.tracecompass.tmf.core.tests.io,
  org.eclipse.tracecompass.tmf.core.tests.markers,
  org.eclipse.tracecompass.tmf.core.tests.model,
+ org.eclipse.tracecompass.tmf.core.tests.model.config,
  org.eclipse.tracecompass.tmf.core.tests.parsers.custom,
  org.eclipse.tracecompass.tmf.core.tests.perf.synchronization,
  org.eclipse.tracecompass.tmf.core.tests.request,
diff --git a/tmf/org.eclipse.tracecompass.tmf.core.tests/plugin.xml b/tmf/org.eclipse.tracecompass.tmf.core.tests/plugin.xml
index edfb31c..0e12c5b 100644
--- a/tmf/org.eclipse.tracecompass.tmf.core.tests/plugin.xml
+++ b/tmf/org.eclipse.tracecompass.tmf.core.tests/plugin.xml
@@ -207,5 +207,12 @@
             file="testfiles/markers.xml">
       </customMarker>
    </extension>
+   <extension
+         point="org.eclipse.tracecompass.tmf.core.config">
+      <source
+            id="org.eclipse.tracecompass.tmf.tests.stubs.model.config.testsourcetype"
+            class="org.eclipse.tracecompass.tmf.tests.stubs.model.config.TestConfigurationSource">
+      </source>
+   </extension>
 
 </plugin>
diff --git a/tmf/org.eclipse.tracecompass.tmf.core.tests/src/org/eclipse/tracecompass/tmf/core/tests/model/config/TmfConfigParamDescriptorTest.java b/tmf/org.eclipse.tracecompass.tmf.core.tests/src/org/eclipse/tracecompass/tmf/core/tests/model/config/TmfConfigParamDescriptorTest.java
new file mode 100644
index 0000000..64f011d
--- /dev/null
+++ b/tmf/org.eclipse.tracecompass.tmf.core.tests/src/org/eclipse/tracecompass/tmf/core/tests/model/config/TmfConfigParamDescriptorTest.java
@@ -0,0 +1,162 @@
+/**********************************************************************
+ * Copyright (c) 2023 Ericsson
+ *
+ * All rights reserved. This program and the accompanying materials are
+ * made available under the terms of the Eclipse Public License 2.0 which
+ * accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ **********************************************************************/
+package org.eclipse.tracecompass.tmf.core.tests.model.config;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotEquals;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import org.eclipse.tracecompass.tmf.core.config.ITmfConfigParamDescriptor;
+import org.eclipse.tracecompass.tmf.core.config.TmfConfigParamDescriptor;
+import org.junit.Test;
+
+/**
+ * JUnit Test class to test {@link TmfConfigParamDescriptor}
+ */
+public class TmfConfigParamDescriptorTest {
+
+    // ------------------------------------------------------------------------
+    // Test data
+    // ------------------------------------------------------------------------
+    private static final String PATH = "path";
+    private static final String DESC = "descriptor";
+    private static final String DATA_TYPE = "NUMBER";
+    private static final String EXPECTED_TO_STRING = "TmfConfigParamDescriptor[fKeyName=path, fDataType=NUMBER, fIsRequired=true, fDescription=descriptor]";
+    private static final String EXPECTED_DEFAULT_DATA_TYPE = "STRING";
+
+    // ------------------------------------------------------------------------
+    // Tests
+    // ------------------------------------------------------------------------
+    /**
+     * Test builder, constructor and getter/setters.
+     */
+    @Test
+    public void testBuilder() {
+        TmfConfigParamDescriptor.Builder builder = new TmfConfigParamDescriptor.Builder()
+                .setKeyName(PATH)
+                .setDescription(DESC)
+                .setDataType(DATA_TYPE)
+                .setIsRequired(false);
+        ITmfConfigParamDescriptor config = builder.build();
+            assertEquals(PATH, config.getKeyName());
+            assertEquals(DESC, config.getDescription());
+            assertEquals(DATA_TYPE, config.getDataType());
+            assertFalse(config.isRequired());
+    }
+
+    /**
+     * Test builder with missing params.
+     */
+    @Test
+    public void testBuilderMissingParams() {
+        TmfConfigParamDescriptor.Builder builder = new TmfConfigParamDescriptor.Builder()
+                .setDescription(DESC)
+                .setDataType(DATA_TYPE)
+                .setIsRequired(false);
+        // Test missing name
+        try {
+            builder.build();
+            fail("No exception created");
+        } catch (IllegalStateException e) {
+            // success
+        }
+
+        // Test successful builder
+        builder = new TmfConfigParamDescriptor.Builder()
+                .setKeyName(PATH);
+        ITmfConfigParamDescriptor config = builder.build();
+        assertEquals(PATH, config.getKeyName());
+        assertTrue(config.getDescription().isEmpty());
+        assertEquals(EXPECTED_DEFAULT_DATA_TYPE, config.getDataType());
+        assertTrue(config.isRequired());
+    }
+
+    /**
+     * Test {@Link TmfConfiguration#equals()}
+     */
+    @Test
+    public void testEquality() {
+        TmfConfigParamDescriptor.Builder builder = new TmfConfigParamDescriptor.Builder()
+                .setKeyName(PATH)
+                .setDescription(DESC)
+                .setDataType(DATA_TYPE)
+                .setIsRequired(false);
+        ITmfConfigParamDescriptor baseConfiguration = builder.build();
+
+        // Make sure it is equal to itself
+        ITmfConfigParamDescriptor testConfig = builder.build();
+        assertEquals(baseConfiguration, testConfig);
+        assertEquals(testConfig, baseConfiguration);
+
+        // Change each of the variable and make sure result is not equal
+        builder.setKeyName("Other path");
+        testConfig = builder.build();
+        assertNotEquals(baseConfiguration, testConfig);
+        assertNotEquals(testConfig, baseConfiguration);
+
+        builder.setKeyName(PATH);
+        builder.setDescription("Other desc");
+        testConfig = builder.build();
+        assertNotEquals(baseConfiguration, testConfig);
+        assertNotEquals(testConfig, baseConfiguration);
+
+        builder.setDescription(DESC);
+        builder.setDataType(EXPECTED_DEFAULT_DATA_TYPE);
+        testConfig = builder.build();
+        assertNotEquals(baseConfiguration, testConfig);
+        assertNotEquals(testConfig, baseConfiguration);
+
+        builder.setDataType(DATA_TYPE);
+        builder.setIsRequired(true);
+        testConfig = builder.build();
+        assertNotEquals(baseConfiguration, testConfig);
+        assertNotEquals(testConfig, baseConfiguration);
+    }
+
+    /**
+     * Test {@Link TmfConfiguration#toString()}
+     **/
+    @Test
+    public void testToString() {
+        TmfConfigParamDescriptor.Builder builder = new TmfConfigParamDescriptor.Builder()
+                .setKeyName(PATH)
+                .setDescription(DESC)
+                .setDataType(DATA_TYPE);
+        assertEquals(EXPECTED_TO_STRING, builder.build().toString());
+    }
+
+    /**
+     * Test {@Link TmfConfiguration#hashCode()}
+     */
+    @Test
+    public void testHashCode() {
+        TmfConfigParamDescriptor.Builder builder = new TmfConfigParamDescriptor.Builder()
+                .setKeyName(PATH)
+                .setDescription(DESC)
+                .setDataType(DATA_TYPE);
+
+        ITmfConfigParamDescriptor config1 = builder.build();
+
+        builder = new TmfConfigParamDescriptor.Builder()
+                .setKeyName(PATH + "1")
+                .setDescription(DESC + "1")
+                .setDataType(DATA_TYPE + "1")
+                .setIsRequired(false);
+
+        ITmfConfigParamDescriptor config2 = builder.build();
+
+        assertEquals(config1.hashCode(), config1.hashCode());
+        assertEquals(config2.hashCode(), config2.hashCode());
+        assertNotEquals(config1.hashCode(), config2.hashCode());
+    }
+}
diff --git a/tmf/org.eclipse.tracecompass.tmf.core.tests/src/org/eclipse/tracecompass/tmf/core/tests/model/config/TmfConfigurationSourceManagerTest.java b/tmf/org.eclipse.tracecompass.tmf.core.tests/src/org/eclipse/tracecompass/tmf/core/tests/model/config/TmfConfigurationSourceManagerTest.java
new file mode 100644
index 0000000..e0a11cf
--- /dev/null
+++ b/tmf/org.eclipse.tracecompass.tmf.core.tests/src/org/eclipse/tracecompass/tmf/core/tests/model/config/TmfConfigurationSourceManagerTest.java
@@ -0,0 +1,76 @@
+/**********************************************************************
+ * Copyright (c) 2023 Ericsson
+ *
+ * All rights reserved. This program and the accompanying materials are
+ * made available under the terms of the Eclipse Public License 2.0 which
+ * accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ **********************************************************************/
+package org.eclipse.tracecompass.tmf.core.tests.model.config;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+
+import java.util.List;
+
+import org.eclipse.jdt.annotation.NonNull;
+import org.eclipse.tracecompass.tmf.core.config.ITmfConfigurationSource;
+import org.eclipse.tracecompass.tmf.core.config.ITmfConfigurationSourceType;
+import org.eclipse.tracecompass.tmf.core.config.TmfConfigurationSourceManager;
+import org.eclipse.tracecompass.tmf.tests.stubs.model.config.TestConfigurationSource;
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * JUnit Test class to test {@link TmfConfigurationSourceManager}
+ */
+public class TmfConfigurationSourceManagerTest {
+
+    // ------------------------------------------------------------------------
+    // Test data
+    // ------------------------------------------------------------------------
+    private static final String UNKNOWN_TYPE = "test-test-test";
+
+    private static TmfConfigurationSourceManager sfInstance;
+
+    // ------------------------------------------------------------------------
+    // Test setup
+    // ------------------------------------------------------------------------
+    /**
+     * Test initialization.
+     */
+    @Before
+    public void setUp() {
+        sfInstance = TmfConfigurationSourceManager.getInstance();
+    }
+
+    // ------------------------------------------------------------------------
+    // Tests
+    // ------------------------------------------------------------------------
+    /**
+     * Test {@link TmfConfigurationSourceManager#getConfigurationSourceTypes()}
+     */
+    @Test
+    public void testConfigurationSourceTypes() {
+        List<@NonNull ITmfConfigurationSourceType> sources = sfInstance.getConfigurationSourceTypes();
+        assertFalse(sources.isEmpty());
+        assertFalse(sources.stream().anyMatch(config -> config.getId().equals(UNKNOWN_TYPE)));
+        assertTrue(sources.stream().anyMatch(config -> config.getId().equals(TestConfigurationSource.STUB_ANALYSIS_TYPE_ID)));
+    }
+
+    /**
+     * Test {@link TmfConfigurationSourceManager#getConfigurationSource(String)}
+     */
+    @Test
+    public void testConfigurationSource() {
+        ITmfConfigurationSource source = sfInstance.getConfigurationSource(UNKNOWN_TYPE);
+        assertNull(source);
+        source = sfInstance.getConfigurationSource(TestConfigurationSource.STUB_ANALYSIS_TYPE_ID);
+        assertNotNull(source);
+        assertTrue(source instanceof TestConfigurationSource);
+    }
+}
diff --git a/tmf/org.eclipse.tracecompass.tmf.core.tests/src/org/eclipse/tracecompass/tmf/core/tests/model/config/TmfConfigurationSourceTypeTest.java b/tmf/org.eclipse.tracecompass.tmf.core.tests/src/org/eclipse/tracecompass/tmf/core/tests/model/config/TmfConfigurationSourceTypeTest.java
new file mode 100644
index 0000000..75c69d0
--- /dev/null
+++ b/tmf/org.eclipse.tracecompass.tmf.core.tests/src/org/eclipse/tracecompass/tmf/core/tests/model/config/TmfConfigurationSourceTypeTest.java
@@ -0,0 +1,206 @@
+/**********************************************************************
+ * Copyright (c) 2023 Ericsson
+ *
+ * All rights reserved. This program and the accompanying materials are
+ * made available under the terms of the Eclipse Public License 2.0 which
+ * accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ **********************************************************************/
+package org.eclipse.tracecompass.tmf.core.tests.model.config;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotEquals;
+import static org.junit.Assert.fail;
+
+import java.util.List;
+
+import org.eclipse.jdt.annotation.NonNull;
+import org.eclipse.tracecompass.tmf.core.config.ITmfConfigParamDescriptor;
+import org.eclipse.tracecompass.tmf.core.config.ITmfConfigurationSourceType;
+import org.eclipse.tracecompass.tmf.core.config.TmfConfigParamDescriptor;
+import org.eclipse.tracecompass.tmf.core.config.TmfConfigurationSourceType;
+import org.junit.Test;
+
+import com.google.common.collect.ImmutableList;
+
+/**
+ * JUnit Test class to test {@link TmfConfigurationSourceType}
+ */
+public class TmfConfigurationSourceTypeTest {
+
+    // ------------------------------------------------------------------------
+    // Test data
+    // ------------------------------------------------------------------------
+    private static final String PATH = "/tmp/my-test.xml";
+    private static final String ID = "my-test.xml";
+    private static final String DESC = "descriptor";
+    private static final @NonNull List<@NonNull ITmfConfigParamDescriptor> PARAM = ImmutableList.of(new TmfConfigParamDescriptor.Builder().setKeyName("path").build());
+    private static final String EXPECTED_TO_STRING = "TmfConfigurationSourceType[fName=/tmp/my-test.xml, fDescription=descriptor, fId=my-test.xml, fKeys=[TmfConfigParamDescriptor[fKeyName=path, fDataType=STRING, fIsRequired=true, fDescription=]]]";
+
+    // ------------------------------------------------------------------------
+    // Tests
+    // ------------------------------------------------------------------------
+
+    /**
+     * Test builder, constructor and getter/setters.
+     */
+    @Test
+    public void testBuilder() {
+        TmfConfigurationSourceType.Builder builder = new TmfConfigurationSourceType.Builder()
+                .setName(PATH)
+                .setId(ID)
+                .setDescription(DESC)
+                .setConfigParamDescriptors(PARAM);
+            ITmfConfigurationSourceType config = builder.build();
+            assertEquals(PATH, config.getName());
+            assertEquals(ID, config.getId());
+            assertEquals(DESC, config.getDescription());
+            assertEquals(PARAM, config.getConfigParamDescriptors());
+    }
+
+    /**
+     * Test builder with missing params.
+     */
+    @Test
+    public void testBuilderMissingParams() {
+
+        // Test missing name
+        TmfConfigurationSourceType.Builder builder = new TmfConfigurationSourceType.Builder()
+                .setId(ID)
+                .setDescription(DESC)
+                .setConfigParamDescriptors(PARAM);
+        try {
+            builder.build();
+            fail("No exception created");
+        } catch (IllegalStateException e) {
+            // success
+        }
+
+       // Test missing blank name
+        builder = new TmfConfigurationSourceType.Builder()
+                .setName("  ") // blank)
+                .setId(ID)
+                .setDescription(DESC)
+                .setConfigParamDescriptors(PARAM);
+        try {
+            builder.build();
+            fail("No exception created");
+        } catch (IllegalStateException e) {
+            // success
+        }
+
+        // Test missing ID
+        builder = new TmfConfigurationSourceType.Builder()
+                .setName(PATH)
+                .setDescription(DESC)
+                .setConfigParamDescriptors(PARAM);
+        try {
+            builder.build();
+            fail("No exception created");
+        } catch (IllegalStateException e) {
+            // success
+        }
+
+        // Test blank ID
+        builder = new TmfConfigurationSourceType.Builder()
+                .setName(PATH)
+                .setId("\n") // blank
+                .setDescription(DESC)
+                .setConfigParamDescriptors(PARAM);
+        try {
+            builder.build();
+            fail("No exception created");
+        } catch (IllegalStateException e) {
+            // success
+        }
+
+        // Test successful builder
+        builder = new TmfConfigurationSourceType.Builder()
+            .setId(ID)
+            .setName(PATH);
+        builder.build();
+        // success - no exception created
+    }
+
+    /**
+     * Test {@Link TmfConfigurationSourceType#equals()}
+     */
+    @Test
+    public void testEquality() {
+        TmfConfigurationSourceType.Builder builder = new TmfConfigurationSourceType.Builder()
+                .setName(PATH)
+                .setId(ID)
+                .setDescription(DESC)
+                .setConfigParamDescriptors(PARAM);
+        ITmfConfigurationSourceType baseConfiguration = builder.build();
+
+        // Make sure it is equal to itself
+        ITmfConfigurationSourceType testConfig = builder.build();
+        assertEquals(baseConfiguration, testConfig);
+        assertEquals(testConfig, baseConfiguration);
+
+        // Change each of the variable and make sure result is not equal
+        builder.setName("Other path");
+        testConfig = builder.build();
+        assertNotEquals(baseConfiguration, testConfig);
+        assertNotEquals(testConfig, baseConfiguration);
+
+        builder.setName(PATH);
+        builder.setId("Other Id");
+        testConfig = builder.build();
+        assertNotEquals(baseConfiguration, testConfig);
+        assertNotEquals(testConfig, baseConfiguration);
+
+        builder.setId(ID);
+        builder.setDescription("Other desc");
+        testConfig = builder.build();
+        assertNotEquals(baseConfiguration, testConfig);
+        assertNotEquals(testConfig, baseConfiguration);
+
+        builder.setDescription(DESC);
+        builder.setConfigParamDescriptors(ImmutableList.of(new TmfConfigParamDescriptor.Builder().setKeyName("path2").build()));
+        testConfig = builder.build();
+        assertNotEquals(baseConfiguration, testConfig);
+        assertNotEquals(testConfig, baseConfiguration);
+    }
+
+    /**
+     * Test {@Link TmfConfigurationSourceType#toString()}
+     **/
+    @Test
+    public void testToString() {
+        TmfConfigurationSourceType.Builder builder = new TmfConfigurationSourceType.Builder()
+                .setName(PATH)
+                .setId(ID)
+                .setDescription(DESC)
+                .setConfigParamDescriptors(PARAM);
+        assertEquals(EXPECTED_TO_STRING, builder.build().toString());
+    }
+
+    /**
+     * Test {@Link TmfConfigurationSourceType#hashCode()}
+     */
+    @Test
+    public void testHashCode() {
+        TmfConfigurationSourceType.Builder builder = new TmfConfigurationSourceType.Builder()
+                .setName(PATH)
+                .setId(ID)
+                .setDescription(DESC)
+                .setConfigParamDescriptors(PARAM);
+        ITmfConfigurationSourceType config1 = builder.build();
+
+        builder = new TmfConfigurationSourceType.Builder()
+                .setName(PATH + "1")
+                .setId(ID + "1")
+                .setDescription(DESC + "1")
+                .setConfigParamDescriptors(ImmutableList.of(new TmfConfigParamDescriptor.Builder().setKeyName("path2").build()));
+
+        ITmfConfigurationSourceType config2 = builder.build();
+
+        assertEquals(config1.hashCode(), config1.hashCode());
+        assertEquals(config2.hashCode(), config2.hashCode());
+        assertNotEquals(config1.hashCode(), config2.hashCode());
+    }
+}
diff --git a/tmf/org.eclipse.tracecompass.tmf.core.tests/src/org/eclipse/tracecompass/tmf/core/tests/model/config/TmfConfigurationTest.java b/tmf/org.eclipse.tracecompass.tmf.core.tests/src/org/eclipse/tracecompass/tmf/core/tests/model/config/TmfConfigurationTest.java
new file mode 100644
index 0000000..07a7bc9
--- /dev/null
+++ b/tmf/org.eclipse.tracecompass.tmf.core.tests/src/org/eclipse/tracecompass/tmf/core/tests/model/config/TmfConfigurationTest.java
@@ -0,0 +1,219 @@
+/**********************************************************************
+ * Copyright (c) 2023 Ericsson
+ *
+ * All rights reserved. This program and the accompanying materials are
+ * made available under the terms of the Eclipse Public License 2.0 which
+ * accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ **********************************************************************/
+package org.eclipse.tracecompass.tmf.core.tests.model.config;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotEquals;
+import static org.junit.Assert.fail;
+
+import java.util.Map;
+
+import org.eclipse.jdt.annotation.NonNull;
+import org.eclipse.tracecompass.tmf.core.config.ITmfConfiguration;
+import org.eclipse.tracecompass.tmf.core.config.TmfConfiguration;
+import org.junit.Test;
+
+import com.google.common.collect.ImmutableMap;
+
+/**
+ * JUnit Test class to test {@link TmfConfiguration}
+ */
+public class TmfConfigurationTest {
+
+    // ------------------------------------------------------------------------
+    // Test data
+    // ------------------------------------------------------------------------
+    private static final String PATH = "/tmp/my-test.xml";
+    private static final String ID = "my-test.xml";
+    private static final String DESC = "descriptor";
+    private static final String SOURCE_ID = "my-source-id";
+    private static final @NonNull Map<@NonNull String, @NonNull Object> PARAM = ImmutableMap.of("path", "/tmp/home/my-test.xml");
+    private static final String EXPECTED_TO_STRING = "TmfConfiguration[fName=/tmp/my-test.xml, fDescription=descriptor, fType=my-source-id, fId=my-test.xml, fParameters={path=/tmp/home/my-test.xml}]";
+
+    // ------------------------------------------------------------------------
+    // Tests
+    // ------------------------------------------------------------------------
+    /**
+     * Test builder, constructor and getter/setters.
+     */
+    @Test
+    public void testBuilder() {
+        TmfConfiguration.Builder builder = new TmfConfiguration.Builder()
+                .setName(PATH)
+                .setId(ID)
+                .setDescription(DESC)
+                .setSourceTypeId(SOURCE_ID)
+                .setParameters(PARAM);
+            ITmfConfiguration config = builder.build();
+            assertEquals(PATH, config.getName());
+            assertEquals(ID, config.getId());
+            assertEquals(DESC, config.getDescription());
+            assertEquals(SOURCE_ID, config.getSourceTypeId());
+            assertEquals(PARAM, config.getParameters());
+    }
+
+    /**
+     * Test builder with missing params.
+     */
+    @Test
+    public void testBuilderMissingParams() {
+        // Test missing source type ID
+        TmfConfiguration.Builder builder = new TmfConfiguration.Builder()
+                .setName(PATH)
+                .setId(ID)
+                .setDescription(DESC)
+                .setParameters(PARAM);
+        try {
+            builder.build();
+            fail("No exception created");
+        } catch (IllegalStateException e) {
+            // success
+        }
+
+        // Test blank source type ID
+        builder = new TmfConfiguration.Builder()
+                .setName(PATH)
+                .setSourceTypeId("  ") // blank
+                .setId(ID)
+                .setDescription(DESC)
+                .setParameters(PARAM);
+        try {
+            builder.build();
+            fail("No exception created");
+        } catch (IllegalStateException e) {
+            // success
+        }
+
+        // Test missing ID
+        builder = new TmfConfiguration.Builder()
+                .setName(PATH)
+                .setDescription(DESC)
+                .setSourceTypeId(SOURCE_ID)
+                .setParameters(PARAM);
+        try {
+            builder.build();
+            fail("No exception created");
+        } catch (IllegalStateException e) {
+            // success
+        }
+
+        // Test blank ID
+        builder = new TmfConfiguration.Builder()
+                .setName(PATH)
+                .setSourceTypeId(SOURCE_ID)
+                .setId("\n") // blank
+                .setDescription(DESC)
+                .setParameters(PARAM);
+        try {
+            builder.build();
+            fail("No exception created");
+        } catch (IllegalStateException e) {
+            // success
+        }
+
+        // Test successful builder
+        builder = new TmfConfiguration.Builder()
+            .setId(ID)
+            .setSourceTypeId(SOURCE_ID);
+        builder.build();
+        // success - no exception created
+    }
+
+    /**
+     * Test {@Link TmfConfiguration#equals()}
+     */
+    @Test
+    public void testEquality() {
+        TmfConfiguration.Builder builder = new TmfConfiguration.Builder()
+                .setName(PATH)
+                .setId(ID)
+                .setDescription(DESC)
+                .setSourceTypeId(SOURCE_ID)
+                .setParameters(PARAM);
+        ITmfConfiguration baseConfiguration = builder.build();
+
+        // Make sure it is equal to itself
+        ITmfConfiguration testConfig = builder.build();
+        assertEquals(baseConfiguration, testConfig);
+        assertEquals(testConfig, baseConfiguration);
+
+        // Change each of the variable and make sure result is not equal
+        builder.setName("Other path");
+        testConfig = builder.build();
+        assertNotEquals(baseConfiguration, testConfig);
+        assertNotEquals(testConfig, baseConfiguration);
+
+        builder.setName(PATH);
+        builder.setId("Other Id");
+        testConfig = builder.build();
+        assertNotEquals(baseConfiguration, testConfig);
+        assertNotEquals(testConfig, baseConfiguration);
+
+        builder.setId(ID);
+        builder.setDescription("Other desc");
+        testConfig = builder.build();
+        assertNotEquals(baseConfiguration, testConfig);
+        assertNotEquals(testConfig, baseConfiguration);
+
+        builder.setDescription(DESC);
+        builder.setSourceTypeId("Other type id");
+        testConfig = builder.build();
+        assertNotEquals(baseConfiguration, testConfig);
+        assertNotEquals(testConfig, baseConfiguration);
+
+        builder.setSourceTypeId(SOURCE_ID);
+        builder.setParameters(ImmutableMap.of("path", "/tmp/home/my-other.xml"));
+        testConfig = builder.build();
+        assertNotEquals(baseConfiguration, testConfig);
+        assertNotEquals(testConfig, baseConfiguration);
+    }
+
+    /**
+     * Test {@Link TmfConfiguration#toString()}
+     **/
+    @Test
+    public void testToString() {
+        TmfConfiguration.Builder builder = new TmfConfiguration.Builder()
+                .setName(PATH)
+                .setId(ID)
+                .setDescription(DESC)
+                .setSourceTypeId(SOURCE_ID)
+                .setParameters(PARAM);
+        assertEquals(EXPECTED_TO_STRING, builder.build().toString());
+    }
+
+    /**
+     * Test {@Link TmfConfiguration#hashCode()}
+     */
+    @Test
+    public void testHashCode() {
+        TmfConfiguration.Builder builder = new TmfConfiguration.Builder()
+                .setName(PATH)
+                .setId(ID)
+                .setDescription(DESC)
+                .setSourceTypeId(SOURCE_ID)
+                .setParameters(PARAM);
+        ITmfConfiguration config1 = builder.build();
+
+        builder = new TmfConfiguration.Builder()
+                .setName(PATH + "1")
+                .setId(ID + "1")
+                .setDescription(DESC + "1")
+                .setSourceTypeId(SOURCE_ID + "1")
+                .setParameters(ImmutableMap.of("path", "/tmp/home/my-other.xml"));
+
+        ITmfConfiguration config2 = builder.build();
+
+        assertEquals(config1.hashCode(), config1.hashCode());
+        assertEquals(config2.hashCode(), config2.hashCode());
+        assertNotEquals(config1.hashCode(), config2.hashCode());
+    }
+}
diff --git a/tmf/org.eclipse.tracecompass.tmf.core.tests/stubs/org/eclipse/tracecompass/tmf/tests/stubs/model/config/TestConfigurationSource.java b/tmf/org.eclipse.tracecompass.tmf.core.tests/stubs/org/eclipse/tracecompass/tmf/tests/stubs/model/config/TestConfigurationSource.java
new file mode 100644
index 0000000..a0b81eb
--- /dev/null
+++ b/tmf/org.eclipse.tracecompass.tmf.core.tests/stubs/org/eclipse/tracecompass/tmf/tests/stubs/model/config/TestConfigurationSource.java
@@ -0,0 +1,111 @@
+/**********************************************************************
+ * Copyright (c) 2023 Ericsson
+ *
+ * All rights reserved. This program and the accompanying materials are
+ * made available under the terms of the Eclipse Public License 2.0 which
+ * accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ **********************************************************************/
+
+package org.eclipse.tracecompass.tmf.tests.stubs.model.config;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.concurrent.ConcurrentHashMap;
+
+import org.eclipse.jdt.annotation.NonNullByDefault;
+import org.eclipse.jdt.annotation.Nullable;
+import org.eclipse.tracecompass.tmf.core.config.ITmfConfiguration;
+import org.eclipse.tracecompass.tmf.core.config.ITmfConfigurationSource;
+import org.eclipse.tracecompass.tmf.core.config.ITmfConfigurationSourceType;
+import org.eclipse.tracecompass.tmf.core.config.TmfConfigParamDescriptor;
+import org.eclipse.tracecompass.tmf.core.config.TmfConfiguration;
+import org.eclipse.tracecompass.tmf.core.config.TmfConfigurationSourceType;
+import org.eclipse.tracecompass.tmf.core.exceptions.TmfConfigurationException;
+
+import com.google.common.collect.ImmutableList;
+
+/**
+ * Configuration Source stub for testing.
+ */
+@NonNullByDefault
+@SuppressWarnings("javadoc")
+public class TestConfigurationSource implements ITmfConfigurationSource {
+
+    private static final ITmfConfigurationSourceType fType;
+    private int fInstanceId = 0;
+
+    public static final String STUB_ANALYSIS_TYPE_ID = "org.eclipse.tracecompass.tmf.tests.stubs.model.config.testsourcetype"; //$NON-NLS-1$
+    public static final String NAME = "Stub Configuration Source"; //$NON-NLS-1$
+    public static final String DESCRIPTION = "Sub Configuration Source description"; //$NON-NLS-1$
+    public static final String DESCRIPTION_PREFIX = "Stub Configuration: "; //$NON-NLS-1$
+    public static final String PATH_KEY = "path"; //$NON-NLS-1$
+    public static final String PATH_DESCRIPTION = "path"; //$NON-NLS-1$
+    private Map<String, ITmfConfiguration> fConfigurations = new ConcurrentHashMap<>();
+
+    static {
+        TmfConfigParamDescriptor.Builder descBuilder = new TmfConfigParamDescriptor.Builder();
+        descBuilder.setKeyName(PATH_KEY)
+                   .setDescription(PATH_DESCRIPTION);
+
+        fType = new TmfConfigurationSourceType.Builder()
+                .setId(STUB_ANALYSIS_TYPE_ID)
+                .setDescription(DESCRIPTION)
+                .setName(NAME)
+                .setConfigParamDescriptors(ImmutableList.of(descBuilder.build())).build();
+    }
+
+    @Override
+    public ITmfConfigurationSourceType getConfigurationSourceType() {
+        return Objects.requireNonNull(fType);
+    }
+
+    @Override
+    public ITmfConfiguration create(Map<String, Object> parameters) throws TmfConfigurationException {
+        String path = (String) parameters.get("path"); //$NON-NLS-1$
+        if (path == null) {
+            throw new TmfConfigurationException("Missing path parameter");
+        }
+        TmfConfiguration.Builder builder = new TmfConfiguration.Builder()
+                .setName(path)
+                .setId(path + fInstanceId++)
+                .setDescription(DESCRIPTION_PREFIX + path)
+                .setSourceTypeId(STUB_ANALYSIS_TYPE_ID);
+        ITmfConfiguration config = builder.build();
+        fConfigurations.put(config.getId(), config);
+        return config;
+    }
+
+    @Override
+    public ITmfConfiguration update(String id, Map<String, Object> parameters) throws TmfConfigurationException {
+        ITmfConfiguration config = fConfigurations.get(id);
+        if (config == null) {
+            throw new TmfConfigurationException("Configuration doesn't exist");
+        }
+        return config;
+    }
+
+    @Override
+    public @Nullable ITmfConfiguration remove(String id) {
+        return fConfigurations.remove(id);
+    }
+
+    @Override
+    public boolean contains(String id) {
+        return fConfigurations.containsKey(id);
+    }
+
+    @Override
+    public List<ITmfConfiguration> getConfigurations() {
+        return Collections.emptyList();
+    }
+
+    @Override
+    public @Nullable ITmfConfiguration get(String id) {
+        return fConfigurations.get(id);
+    }
+}
diff --git a/tmf/org.eclipse.tracecompass.tmf.core/META-INF/MANIFEST.MF b/tmf/org.eclipse.tracecompass.tmf.core/META-INF/MANIFEST.MF
index 421077a..f9e4e5c 100644
--- a/tmf/org.eclipse.tracecompass.tmf.core/META-INF/MANIFEST.MF
+++ b/tmf/org.eclipse.tracecompass.tmf.core/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: %Bundle-Name
 Bundle-Vendor: %Bundle-Vendor
-Bundle-Version: 9.1.0.qualifier
+Bundle-Version: 9.2.0.qualifier
 Bundle-Localization: plugin
 Bundle-SymbolicName: org.eclipse.tracecompass.tmf.core;singleton:=true
 Bundle-Activator: org.eclipse.tracecompass.internal.tmf.core.Activator
@@ -93,6 +93,7 @@
  org.eclipse.tracecompass.tmf.core.analysis.ondemand,
  org.eclipse.tracecompass.tmf.core.analysis.requirements,
  org.eclipse.tracecompass.tmf.core.component,
+ org.eclipse.tracecompass.tmf.core.config,
  org.eclipse.tracecompass.tmf.core.dataprovider,
  org.eclipse.tracecompass.tmf.core.event,
  org.eclipse.tracecompass.tmf.core.event.aspect,
diff --git a/tmf/org.eclipse.tracecompass.tmf.core/plugin.properties b/tmf/org.eclipse.tracecompass.tmf.core/plugin.properties
index 5a71612..89bcdab 100644
--- a/tmf/org.eclipse.tracecompass.tmf.core/plugin.properties
+++ b/tmf/org.eclipse.tracecompass.tmf.core/plugin.properties
@@ -1,5 +1,5 @@
 ###############################################################################
-# Copyright (c) 2013, 2016 Ericsson
+# Copyright (c) 2013, 2023 Ericsson
 #
 # All rights reserved. This program and the accompanying materials
 # are made available under the terms of the Eclipse Public License 2.0
@@ -24,6 +24,7 @@
 extensionpoint.data_provider.name = Data Provider
 extensionpoint.custom_marker.name = Custom Markers
 extensionpoint.callsite.category = Source Code Assistant
+extensionpoint.config.name = Trace Compass Configuration
 
 # Experiment type
 experimenttype.type.generic = Generic Experiment
diff --git a/tmf/org.eclipse.tracecompass.tmf.core/plugin.xml b/tmf/org.eclipse.tracecompass.tmf.core/plugin.xml
index f02ba93..d9c4d1c 100644
--- a/tmf/org.eclipse.tracecompass.tmf.core/plugin.xml
+++ b/tmf/org.eclipse.tracecompass.tmf.core/plugin.xml
@@ -8,6 +8,7 @@
    <extension-point id="org.eclipse.tracecompass.tmf.core.symbolProvider" name="%extensionpoint.symbol_provider.name" schema="schema/org.eclipse.tracecompass.tmf.core.symbolProvider.exsd"/>
    <extension-point id="org.eclipse.tracecompass.tmf.core.dataprovider" name="%extensionpoint.data_provider.name" schema="schema/org.eclipse.tracecompass.tmf.core.dataprovider.exsd"/>
    <extension-point id="org.eclipse.tracecompass.tmf.core.custom.marker" name="%extensionpoint.custom_marker.name" schema="schema/org.eclipse.tracecompass.tmf.core.custom.marker.exsd"/>
+   <extension-point id="org.eclipse.tracecompass.tmf.core.config" name="%extensionpoint.config.name" schema="schema/org.eclipse.tracecompass.tmf.core.config.exsd"/>
 
    <extension
          point="org.eclipse.core.runtime.preferences">
diff --git a/tmf/org.eclipse.tracecompass.tmf.core/schema/org.eclipse.tracecompass.tmf.core.config.exsd b/tmf/org.eclipse.tracecompass.tmf.core/schema/org.eclipse.tracecompass.tmf.core.config.exsd
new file mode 100644
index 0000000..bb45f2b
--- /dev/null
+++ b/tmf/org.eclipse.tracecompass.tmf.core/schema/org.eclipse.tracecompass.tmf.core.config.exsd
@@ -0,0 +1,138 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.tracecompass.tmf.core" xmlns="http://www.w3.org/2001/XMLSchema">
+<annotation>
+      <appinfo>
+         <meta.schema plugin="org.eclipse.tracecompass.tmf.core" id="org.eclipse.tracecompass.tmf.core.config" name="Trace Compass Configuration"/>
+      </appinfo>
+      <documentation>
+         This extension point is used to contribute new configuration sources to the TMF framework.  Configuration sources are meant to provide a common API to manage configurations, e.g. XML analysis, custom parsers etc.
+      </documentation>
+   </annotation>
+
+   <element name="extension">
+      <annotation>
+         <appinfo>
+            <meta.element />
+         </appinfo>
+      </annotation>
+      <complexType>
+         <choice minOccurs="0" maxOccurs="unbounded">
+            <element ref="source"/>
+         </choice>
+         <attribute name="point" type="string" use="required">
+            <annotation>
+               <documentation>
+                  a fully qualified identifier of the target extension point
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="id" type="string">
+            <annotation>
+               <documentation>
+                  an optional identifier of the extension instance
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="name" type="string">
+            <annotation>
+               <documentation>
+                  an optional name of the extension instance
+               </documentation>
+               <appinfo>
+                  <meta.attribute translatable="true"/>
+               </appinfo>
+            </annotation>
+         </attribute>
+      </complexType>
+   </element>
+
+   <element name="source">
+      <complexType>
+         <attribute name="id" type="string" use="required">
+            <annotation>
+               <documentation>
+                  The unique ID that identifies this configuration source type handler
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="class" type="string" use="default">
+            <annotation>
+               <documentation>
+                  The fully qualified name of a class that implements the &lt;samp&gt;IConfigurationSource&lt;/samp&gt; interface.
+               </documentation>
+               <appinfo>
+                  <meta.attribute kind="java" basedOn=":org.eclipse.tracecompass.tmf.core.config.IConfigurationSource"/>
+               </appinfo>
+            </annotation>
+         </attribute>
+      </complexType>
+   </element>
+
+   <annotation>
+      <appinfo>
+         <meta.section type="since"/>
+      </appinfo>
+      <documentation>
+         9.2
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appinfo>
+         <meta.section type="examples"/>
+      </appinfo>
+      <documentation>
+         &lt;p&gt;
+For an example implementation of an configuration source see:
+&lt;pre&gt;
+plug-in: org.eclipse.linuxtools.tmf.core.tests
+package: org.eclipse.linuxtools.tmf.core.tests.stubs.model.config.
+class: TestConfigurationSource
+&lt;/pre&gt;
+&lt;/p&gt;
+&lt;p&gt;
+The following is an example of the extension point:
+&lt;pre&gt;
+&lt;plugin&gt;
+   &lt;/extension&gt;
+      &lt;extension
+         point=&quot;org.eclipse.tracecompass.tmf.core.config&quot;&gt;
+      &lt;source
+            id=&quot;org.eclipse.tracecompass.tmf.tests.stubs.model.config.testsourcetype&quot;
+            class=&quot;org.eclipse.tracecompass.tmf.tests.stubs.model.config.TestConfigurationSource&quot;&gt;
+      &lt;/source&gt;
+   &lt;/extension&gt;
+&lt;/plugin&gt;
+&lt;/pre&gt;
+&lt;/p&gt;
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appinfo>
+         <meta.section type="apiinfo"/>
+      </appinfo>
+      <documentation>
+         &lt;p&gt;
+For this extension point, a class implementing ITmfConfigurationSource must be defined (org.eclipse.tracecompass.tmf.core.config.ITmfConfigurationSource).
+&lt;/p&gt;
+&lt;/p&gt;
+      </documentation>
+   </annotation>
+
+
+   <annotation>
+      <appinfo>
+         <meta.section type="copyright"/>
+      </appinfo>
+      <documentation>
+         Copyright (c) 2023 Ericsson
+
+All rights reserved. This program and the accompanying materials are made available under the terms of the Eclipse Public License 2.0 which accompanies this distribution, and is available at &amp;lt;a href=&amp;quot;https://www.eclipse.org/legal/epl-2.0/&amp;quot;&amp;gt;https://www.eclipse.org/legal/epl-2.0/&amp;lt;/a&amp;gt;
+
+SPDX-License-Identifier: EPL-2.0
+      </documentation>
+   </annotation>
+
+</schema>
diff --git a/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/internal/tmf/core/Activator.java b/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/internal/tmf/core/Activator.java
index 14cd9c0..263ddd0 100644
--- a/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/internal/tmf/core/Activator.java
+++ b/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/internal/tmf/core/Activator.java
@@ -22,6 +22,7 @@
 import org.eclipse.tracecompass.internal.tmf.core.annotations.CustomOutputAnnotationProviderFactory;
 import org.eclipse.tracecompass.internal.tmf.core.annotations.LostEventsOutputAnnotationProviderFactory;
 import org.eclipse.tracecompass.tmf.core.analysis.TmfAnalysisManager;
+import org.eclipse.tracecompass.tmf.core.config.TmfConfigurationSourceManager;
 import org.eclipse.tracecompass.tmf.core.dataprovider.DataProviderManager;
 import org.eclipse.tracecompass.tmf.core.signal.TmfSignalManager;
 import org.eclipse.tracecompass.tmf.core.symbols.SymbolProviderManager;
@@ -104,6 +105,8 @@
         SymbolProviderManager.getInstance();
         /* Initialize the data provider manager */
         DataProviderManager.getInstance();
+        /* Initialize the configuration source manager */
+        TmfConfigurationSourceManager.getInstance();
         TmfTraceAdapterManager.registerFactory(LOST_EVENTS_ANNOTATION_PROVIDER_FACTORY, ITmfTrace.class);
         TmfTraceAdapterManager.registerFactory(CUSTOM_DEFINED_OUTPUT_ANNOTATION_PROVIDER_FACTORY, ITmfTrace.class);
     }
@@ -114,6 +117,7 @@
         TmfTraceAdapterManager.unregisterFactory(CUSTOM_DEFINED_OUTPUT_ANNOTATION_PROVIDER_FACTORY);
         LOST_EVENTS_ANNOTATION_PROVIDER_FACTORY.dispose();
         CUSTOM_DEFINED_OUTPUT_ANNOTATION_PROVIDER_FACTORY.dispose();
+        TmfConfigurationSourceManager.getInstance().dispose();
         TmfCoreTracer.stop();
         TmfTraceManager.getInstance().dispose();
         TmfAnalysisManager.dispose();
diff --git a/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/config/ITmfConfigParamDescriptor.java b/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/config/ITmfConfigParamDescriptor.java
new file mode 100644
index 0000000..0382f25
--- /dev/null
+++ b/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/config/ITmfConfigParamDescriptor.java
@@ -0,0 +1,47 @@
+/**********************************************************************
+ * Copyright (c) 2023 Ericsson
+ *
+ * All rights reserved. This program and the accompanying materials are
+ * made available under the terms of the Eclipse Public License 2.0 which
+ * accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ **********************************************************************/
+package org.eclipse.tracecompass.tmf.core.config;
+
+/**
+ * Interface to implement to describe a configuration parameter.
+ *
+ * @since 9.2
+ * @author Bernd Hufmann
+ */
+public interface ITmfConfigParamDescriptor {
+    /**
+     * The unique name of the key to show to the user
+     *
+     * @return the key name
+     */
+    String getKeyName();
+
+    /**
+     * The data type string, e.g. use NUMBER for numbers, or STRING as strings
+     *
+     * @return the key name
+     */
+    String getDataType();
+
+    /**
+     * If parameter needs to in the query parameters or not
+     *
+     * @return true if required else false
+     */
+    boolean isRequired();
+
+    /**
+     * Optional description that can be shown to the user
+     *
+     * @return description of this parameter
+     */
+    String getDescription();
+}
diff --git a/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/config/ITmfConfiguration.java b/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/config/ITmfConfiguration.java
new file mode 100644
index 0000000..045a3a9
--- /dev/null
+++ b/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/config/ITmfConfiguration.java
@@ -0,0 +1,47 @@
+/*******************************************************************************
+ * Copyright (c) 2023 Ericsson
+ *
+ * All rights reserved. This program and the accompanying materials are
+ * made available under the terms of the Eclipse Public License 2.0 which
+ * accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************/
+package org.eclipse.tracecompass.tmf.core.config;
+
+import java.util.Map;
+
+/**
+ * Interface describing a configuration instance.
+ *
+ * @author Bernd Hufmann
+ * @since 9.2
+ */
+public interface ITmfConfiguration {
+    /**
+     * @return the name of configuration instance
+     */
+    String getName();
+
+    /**
+     * @return the ID for of the configuration instance.
+     */
+    String getId();
+
+    /**
+     * @return a short description of this configuration instance.
+     */
+    String getDescription();
+
+    /**
+     * @return the configuration source type
+     */
+    String getSourceTypeId();
+
+    /**
+     * @return optional informational parameters to return. Can be used to show
+     *         more details to users of the configuration instance.
+     */
+    Map<String, Object> getParameters();
+}
diff --git a/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/config/ITmfConfigurationSource.java b/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/config/ITmfConfigurationSource.java
new file mode 100644
index 0000000..1aa52a4
--- /dev/null
+++ b/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/config/ITmfConfigurationSource.java
@@ -0,0 +1,96 @@
+/*******************************************************************************
+ * Copyright (c) 2023 Ericsson
+ *
+ * All rights reserved. This program and the accompanying materials are
+ * made available under the terms of the Eclipse Public License 2.0 which
+ * accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************/
+
+package org.eclipse.tracecompass.tmf.core.config;
+
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.jdt.annotation.Nullable;
+import org.eclipse.tracecompass.tmf.core.exceptions.TmfConfigurationException;
+
+/**
+ * Interface to implement for providing a configuration source.
+ *
+ * @author Bernd Hufmann
+ * @since 9.2
+ */
+public interface ITmfConfigurationSource {
+    /**
+     * @return {@link ITmfConfigurationSourceType} of this configuration source
+     */
+    ITmfConfigurationSourceType getConfigurationSourceType();
+
+    /**
+     * Creates a new configuration instance.
+     * <p>
+     * The parameters to be provided are described by
+     * {@link ITmfConfigurationSourceType#getConfigParamDescriptors()}.
+     *
+     * @param parameters
+     *            The query parameters used to create a configuration instance.
+     * @return a new {@link ITmfConfiguration} if successful
+     * @throws TmfConfigurationException
+     *             If the creation of the configuration fails
+     */
+    ITmfConfiguration create(Map<String, Object> parameters) throws TmfConfigurationException;
+
+    /**
+     * Updates a configuration instance.
+     * <p>
+     * The parameters to be provided are described by
+     * {@link ITmfConfigurationSourceType#getConfigParamDescriptors()}.
+     *
+     * @param id
+     *            The configuration ID of the configuration to update
+     * @param parameters
+     *            The query parameters used to update a configuration instance
+     * @return a new {@link ITmfConfiguration} if successful
+     * @throws TmfConfigurationException
+     *             If the update of the configuration fails
+     */
+    ITmfConfiguration update(String id, Map<String, Object> parameters) throws TmfConfigurationException;
+
+    /**
+     * Gets a configuration instance.
+     *
+     * @param id
+     *            The configuration ID of the configuration to remove
+     * @return {@link ITmfConfiguration} instance or null if not found
+     */
+    @Nullable ITmfConfiguration get(String id);
+
+    /**
+     * Removes a configuration instance.
+     *
+     * @param id
+     *            The configuration ID of the configuration to remove
+     * @return removed {@link ITmfConfiguration} instance if remove or null if
+     *         not found
+     */
+    @Nullable ITmfConfiguration remove(String id);
+
+    /**
+     * Checks if configuration instance exists.
+     *
+     * @param id
+     *            The configuration ID of the configuration to check
+     * @return true if it exists else false
+     */
+    boolean contains(String id);
+
+    /**
+     * Gets all configuration instances
+     *
+     * @return list of all configuration instances
+     */
+    List<ITmfConfiguration> getConfigurations();
+}
diff --git a/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/config/ITmfConfigurationSourceType.java b/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/config/ITmfConfigurationSourceType.java
new file mode 100644
index 0000000..4537d3f
--- /dev/null
+++ b/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/config/ITmfConfigurationSourceType.java
@@ -0,0 +1,52 @@
+/*******************************************************************************
+ * Copyright (c) 2023 Ericsson
+ *
+ * All rights reserved. This program and the accompanying materials are made
+ * available under the terms of the Eclipse Public License 2.0 which
+ * accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************/
+
+package org.eclipse.tracecompass.tmf.core.config;
+
+import java.util.List;
+
+/**
+ * Interface to implement that describes a configuration source.
+ *
+ * @author Bernd Hufmann
+ * @since 9.2
+ */
+public interface ITmfConfigurationSourceType {
+
+    /**
+     * Gets the name of the configuration source type.
+     *
+     * @return the name of the configuration source type
+     */
+    String getName();
+
+    /**
+     * Gets the ID for of the configuration source type.
+     *
+     * @return the ID for of the configuration source type.
+     */
+    String getId();
+
+    /**
+     * Gets a short description of this configuration source type.
+     *
+     * @return a short description of this configuration source type
+     */
+    String getDescription();
+
+    /**
+     * Gets a list of query parameter keys to be passed when creating
+     * configuration instance of this type.
+     *
+     * @return A list of query parameter descriptors to be passed
+     */
+    List<ITmfConfigParamDescriptor> getConfigParamDescriptors();
+}
diff --git a/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/config/TmfConfigParamDescriptor.java b/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/config/TmfConfigParamDescriptor.java
new file mode 100644
index 0000000..13f8cce
--- /dev/null
+++ b/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/config/TmfConfigParamDescriptor.java
@@ -0,0 +1,171 @@
+/*******************************************************************************
+ * Copyright (c) 2023 Ericsson
+ *
+ * All rights reserved. This program and the accompanying materials are
+ * made available under the terms of the Eclipse Public License 2.0 which
+ * accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************/
+package org.eclipse.tracecompass.tmf.core.config;
+
+import java.util.Objects;
+
+import org.eclipse.jdt.annotation.Nullable;
+
+/**
+ * Implementation of {@link ITmfConfigParamDescriptor} interface. It provides a
+ * builder class to create instances of that interface.
+ *
+ * @author Bernd Hufmann
+ * @since 9.2
+ */
+public class TmfConfigParamDescriptor implements ITmfConfigParamDescriptor {
+
+    private final String fKeyName;
+    private final String fDescription;
+    private final String fDataType;
+    private final boolean fIsRequired;
+
+    /**
+     * Constructor
+     *
+     * @param bulider
+     *            the builder object to create the descriptor
+     */
+    private TmfConfigParamDescriptor(Builder builder) {
+        fKeyName = builder.fKeyName;
+        fDescription = builder.fDescription;
+        fDataType = builder.fDataType;
+        fIsRequired = builder.fIsRequired;
+    }
+
+    @Override
+    public String getKeyName() {
+        return fKeyName;
+    }
+
+    @Override
+    public String getDataType() {
+        return fDataType;
+    }
+
+    @Override
+    public boolean isRequired() {
+        return fIsRequired;
+    }
+
+    @Override
+    public String getDescription() {
+        return fDescription;
+    }
+
+    @Override
+    @SuppressWarnings("nls")
+    public String toString() {
+        return new StringBuilder(getClass().getSimpleName())
+                .append("[")
+                .append("fKeyName=").append(getKeyName())
+                .append(", fDataType=").append(getDataType())
+                .append(", fIsRequired=").append(isRequired())
+                .append(", fDescription=").append(getDescription())
+                .append("]").toString();
+    }
+
+    @Override
+    public boolean equals(@Nullable Object arg0) {
+        if (!(arg0 instanceof TmfConfigParamDescriptor)) {
+            return false;
+        }
+        TmfConfigParamDescriptor other = (TmfConfigParamDescriptor) arg0;
+        return Objects.equals(fKeyName, other.fKeyName)
+                && Objects.equals(fDataType, other.fDataType)
+                && Objects.equals(fDescription, other.fDescription)
+                && Objects.equals(fIsRequired, other.fIsRequired);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(fKeyName, fIsRequired, fDataType, fDescription);
+    }
+
+    /**
+     * A builder class to build instances implementing interface
+     * {@link ITmfConfigParamDescriptor}
+     */
+    public static class Builder {
+        private String fKeyName = ""; //$NON-NLS-1$
+        private String fDescription = ""; //$NON-NLS-1$ ;
+        private String fDataType = "STRING"; //$NON-NLS-1$
+        private boolean fIsRequired = true;
+
+        /**
+         * Constructor
+         */
+        public Builder() {
+            // Empty constructor
+        }
+
+        /**
+         * Sets the data type string of the configuration parameter.
+         *
+         * @param dataType
+         *            the ID to set
+         * @return the builder instance.
+         */
+        public Builder setDataType(String dataType) {
+            fDataType = dataType;
+            return this;
+        }
+
+        /**
+         * Sets the unique key name of the configuration parameter.
+         *
+         * @param keyName
+         *            the name to set
+         * @return the builder instance.
+         */
+        public Builder setKeyName(String keyName) {
+            fKeyName = keyName;
+            return this;
+        }
+
+        /**
+         * Sets the description of the configuration parameter.
+         *
+         * @param description
+         *            the description text to set
+         * @return the builder instance.
+         */
+        public Builder setDescription(String description) {
+            fDescription = description;
+            return this;
+        }
+
+        /**
+         * Sets the isRequired flag of the configuration parameter.
+         *
+         * @param isRequired
+         *            the is required flag.
+         * @return the builder instance.
+         */
+        public Builder setIsRequired(boolean isRequired) {
+            fIsRequired = isRequired;
+            return this;
+        }
+
+        /**
+         * The method to construct an instance of {@link ITmfConfiguration}
+         *
+         * @return a {@link ITmfConfiguration} instance
+         */
+        public ITmfConfigParamDescriptor build() {
+            String keyName = fKeyName;
+            if (keyName.isBlank()) {
+                throw new IllegalStateException("The key name of the configuration parameter is not set"); //$NON-NLS-1$
+            }
+            return new TmfConfigParamDescriptor(this);
+        }
+    }
+}
diff --git a/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/config/TmfConfiguration.java b/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/config/TmfConfiguration.java
new file mode 100644
index 0000000..42dd4c1
--- /dev/null
+++ b/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/config/TmfConfiguration.java
@@ -0,0 +1,198 @@
+/*******************************************************************************
+ * Copyright (c) 2023 Ericsson
+ *
+ * All rights reserved. This program and the accompanying materials are
+ * made available under the terms of the Eclipse Public License 2.0 which
+ * accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************/
+package org.eclipse.tracecompass.tmf.core.config;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Objects;
+
+import org.eclipse.jdt.annotation.Nullable;
+
+/**
+ * Implementation of {@link ITmfConfiguration} interface. It provides a builder
+ * class to create instances of that interface.
+ *
+ * @author Bernd Hufmann
+ * @since 9.2
+ */
+public class TmfConfiguration implements ITmfConfiguration {
+
+    private final String fId;
+    private final String fName;
+    private final String fDescription;
+    private final String fSourceTypeId;
+    private final Map<String, Object> fParameters;
+
+    /**
+     * Constructor
+     *
+     * @param bulider
+     *            the builder object to create the descriptor
+     */
+    private TmfConfiguration(Builder builder) {
+        fId = Objects.requireNonNull(builder.fId);
+        fName = builder.fName;
+        fDescription = builder.fDescription;
+        fSourceTypeId = Objects.requireNonNull(builder.fSourceTypeId);
+        fParameters = builder.fParameters;
+    }
+
+    @Override
+    public String getName() {
+        return fName;
+    }
+
+    @Override
+    public String getId() {
+        return fId;
+    }
+
+    @Override
+    public String getSourceTypeId() {
+        return fSourceTypeId;
+    }
+
+    @Override
+    public String getDescription() {
+        return fDescription;
+    }
+
+    @Override
+    public Map<String, Object> getParameters() {
+        return fParameters;
+    }
+
+    @Override
+    @SuppressWarnings("nls")
+    public String toString() {
+        return new StringBuilder(getClass().getSimpleName())
+            .append("[")
+            .append("fName=").append(getName())
+            .append(", fDescription=").append(getDescription())
+            .append(", fType=").append(getSourceTypeId())
+            .append(", fId=").append(getId())
+            .append(", fParameters=").append(getParameters())
+            .append("]").toString();
+    }
+
+    @Override
+    public boolean equals(@Nullable Object arg0) {
+        if (!(arg0 instanceof TmfConfiguration)) {
+            return false;
+        }
+        TmfConfiguration other = (TmfConfiguration) arg0;
+        return Objects.equals(fName, other.fName) && Objects.equals(fId, other.fId)
+                && Objects.equals(fSourceTypeId, other.fSourceTypeId) && Objects.equals(fDescription, other.fDescription) && Objects.equals(fParameters, other.fParameters);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(fName, fId, fSourceTypeId, fDescription, fParameters);
+    }
+
+    /**
+     * A builder class to build instances implementing interface
+     * {@link ITmfConfiguration}
+     */
+    public static class Builder {
+        private String fId = ""; //$NON-NLS-1$
+        private String fName = ""; //$NON-NLS-1$
+        private String fDescription = ""; //$NON-NLS-1$
+        private String fSourceTypeId = ""; //$NON-NLS-1$
+        private Map<String, Object> fParameters = new HashMap<>();
+
+        /**
+         * Constructor
+         */
+        public Builder() {
+            // Empty constructor
+        }
+
+        /**
+         * Sets the ID of the configuration instance.
+         *
+         * @param id
+         *            the ID to set
+         * @return the builder instance.
+         */
+        public Builder setId(String id) {
+            fId = id;
+            return this;
+        }
+
+        /**
+         * Sets the name of the configuration instance.
+         *
+         * @param name
+         *            the name to set
+         * @return the builder instance.
+         */
+        public Builder setName(String name) {
+            fName = name;
+            return this;
+        }
+
+        /**
+         * Sets the description of the configuration instance.
+         *
+         * @param description
+         *            the description text to set
+         * @return the builder instance.
+         */
+        public Builder setDescription(String description) {
+            fDescription = description;
+            return this;
+        }
+
+        /**
+         * Sets the ID of the configuration source type {@link ITmfConfigurationSourceType}.
+         *
+         * @param sourceTypeId
+         *            the ID of configuration source type.
+         * @return the builder instance.
+         */
+        public Builder setSourceTypeId(String sourceTypeId) {
+            fSourceTypeId = sourceTypeId;
+            return this;
+        }
+
+        /**
+         * Sets the optional parameters of the {@link ITmfConfiguration}
+         * instance
+         *
+         * @param parameters
+         *            the optional parameters of the {@link ITmfConfiguration}
+         *            instance
+         * @return the builder instance
+         */
+        public Builder setParameters(Map<String, Object> parameters) {
+            fParameters = parameters;
+            return this;
+        }
+
+        /**
+         * The method to construct an instance of {@link ITmfConfiguration}
+         *
+         * @return a {@link ITmfConfiguration} instance
+         */
+        public ITmfConfiguration build() {
+            String typeId = fSourceTypeId;
+            if (typeId.isBlank()) {
+                throw new IllegalStateException("Configuration source type ID not set"); //$NON-NLS-1$
+            }
+            String id = fId;
+            if (id.isBlank()) {
+                throw new IllegalStateException("Configuration ID not set"); //$NON-NLS-1$
+            }
+            return new TmfConfiguration(this);
+        }
+    }
+}
diff --git a/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/config/TmfConfigurationSourceManager.java b/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/config/TmfConfigurationSourceManager.java
new file mode 100644
index 0000000..f9329d4
--- /dev/null
+++ b/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/config/TmfConfigurationSourceManager.java
@@ -0,0 +1,126 @@
+/*******************************************************************************
+ * Copyright (c) 2023 Ericsson
+ *
+ * All rights reserved. This program and the accompanying materials are
+ * made available under the terms of the Eclipse Public License 2.0 which
+ * accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************/
+package org.eclipse.tracecompass.tmf.core.config;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.concurrent.ConcurrentHashMap;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.jdt.annotation.Nullable;
+import org.eclipse.tracecompass.internal.tmf.core.Activator;
+
+import com.google.common.collect.ImmutableList;
+
+/**
+ * Manager of the org.eclipse.tracecompass.tmf.core.config extension point.
+ *
+ * @since 9.2
+ * @author Bernd Hufmann
+ */
+public class TmfConfigurationSourceManager {
+
+    /** Extension point ID */
+    public static final String CONFIG_EXTENSION_POINT_ID = "org.eclipse.tracecompass.tmf.core.config"; //$NON-NLS-1$
+
+    /** Extension point element 'source' */
+    public static final String SOURCE_TYPE_ELEM = "source"; //$NON-NLS-1$
+
+    /** Extension point element 'class' */
+    public static final String SOURCE_ATTR = "class"; //$NON-NLS-1$
+
+    private Map<ITmfConfigurationSourceType, ITmfConfigurationSource> fDescriptors = new ConcurrentHashMap<>();
+
+    private @Nullable static TmfConfigurationSourceManager fInstance;
+
+    private TmfConfigurationSourceManager() {
+    }
+
+    /**
+     * Get the configuration type manager singleton instance.
+     *
+     * @return the {@link TmfConfigurationSourceManager} instance
+     */
+    public synchronized static TmfConfigurationSourceManager getInstance() {
+        TmfConfigurationSourceManager instance = fInstance;
+        if (instance == null) {
+            instance = new TmfConfigurationSourceManager();
+            instance.init();
+            fInstance = instance;
+        }
+        return instance;
+    }
+
+    /**
+     * Disposes the instance.
+     */
+    public synchronized void dispose() {
+        fDescriptors.clear();
+    }
+
+    /**
+     * Gets a list of all available configuration source types
+     *
+     * @return a list of all available {@Link ITmfConfigurationSourceType}s
+     */
+    public List<ITmfConfigurationSourceType> getConfigurationSourceTypes() {
+        ImmutableList.Builder<ITmfConfigurationSourceType> builder = new ImmutableList.Builder<>();
+        builder.addAll(fDescriptors.keySet());
+        return builder.build();
+    }
+
+    /**
+     * Gets the {@link ITmfConfigurationSource} for a given
+     * {@Link ITmfConfigurationSourceType}
+     *
+     * @param typeId
+     *            The configuration source type ID
+     * @return Gets the {@link ITmfConfigurationSource} or null if it doesn't
+     *         exist
+     */
+    public @Nullable ITmfConfigurationSource getConfigurationSource(@Nullable String typeId) {
+        ITmfConfigurationSourceType desc = getDescriptor(typeId);
+        return desc == null ? null : fDescriptors.get(desc);
+    }
+
+    private @Nullable ITmfConfigurationSourceType getDescriptor(@Nullable String typeId) {
+        if (typeId == null) {
+            return null;
+        }
+        Optional<ITmfConfigurationSourceType> optional = fDescriptors.keySet().stream().filter(desc -> desc.getId().equals(typeId)).findAny();
+        return optional.isEmpty() ? null : optional.get();
+    }
+
+    private void init() {
+        // Populate the Categories and Trace Types
+        IConfigurationElement[] config = Platform.getExtensionRegistry().getConfigurationElementsFor(CONFIG_EXTENSION_POINT_ID);
+        for (IConfigurationElement ce : config) {
+            String elementName = ce.getName();
+            if (elementName.equals(SOURCE_TYPE_ELEM)) {
+                String source = ce.getAttribute(SOURCE_ATTR);
+                if (source != null) {
+                    ITmfConfigurationSource sourceInstance = null;
+                    try {
+                        sourceInstance = (ITmfConfigurationSource) ce.createExecutableExtension(SOURCE_ATTR);
+                    } catch (CoreException e) {
+                        Activator.logError("ITmfConfigurationSource cannot be instantiated.", e); //$NON-NLS-1$
+                    }
+                    if (sourceInstance != null) {
+                        fDescriptors.put(sourceInstance.getConfigurationSourceType(), sourceInstance);
+                    }
+                }
+            }
+        }
+    }
+}
diff --git a/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/config/TmfConfigurationSourceType.java b/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/config/TmfConfigurationSourceType.java
new file mode 100644
index 0000000..0215a9d
--- /dev/null
+++ b/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/config/TmfConfigurationSourceType.java
@@ -0,0 +1,176 @@
+/*******************************************************************************
+ * Copyright (c) 2023 Ericsson
+ *
+ * All rights reserved. This program and the accompanying materials are
+ * made available under the terms of the Eclipse Public License 2.0 which
+ * accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************/
+package org.eclipse.tracecompass.tmf.core.config;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+
+import org.eclipse.jdt.annotation.Nullable;
+
+/**
+ * Implementation of {@link ITmfConfigurationSourceType} interface. It provides
+ * a builder class to create instances of that interface.
+ *
+ * @author Bernd Hufmann
+ * @since 9.2
+ */
+public class TmfConfigurationSourceType implements ITmfConfigurationSourceType {
+
+    private final String fId;
+    private final String fName;
+    private final String fDescription;
+    private final List<ITmfConfigParamDescriptor> fParamDescriptors;
+
+    /**
+     * Constructor
+     *
+     * @param bulider
+     *            the builder object to create the descriptor
+     */
+    private TmfConfigurationSourceType(Builder builder) {
+        fId = builder.fId;
+        fName = builder.fName;
+        fDescription = builder.fDescription;
+        fParamDescriptors = builder.fDescriptors;
+    }
+
+    @Override
+    public String getName() {
+        return fName;
+    }
+
+    @Override
+    public String getId() {
+        return fId;
+    }
+
+    @Override
+    public String getDescription() {
+        return fDescription;
+    }
+
+    @Override
+    public List<ITmfConfigParamDescriptor> getConfigParamDescriptors() {
+        return fParamDescriptors;
+    }
+
+    @Override
+    @SuppressWarnings("nls")
+    public String toString() {
+        return new StringBuilder(getClass().getSimpleName())
+                .append("[")
+                .append("fName=").append(getName())
+                .append(", fDescription=").append(getDescription())
+                .append(", fId=").append(getId())
+                .append(", fKeys=").append(getConfigParamDescriptors())
+                .append("]").toString();
+    }
+
+    @Override
+    public boolean equals(@Nullable Object arg0) {
+        if (!(arg0 instanceof TmfConfigurationSourceType)) {
+            return false;
+        }
+        TmfConfigurationSourceType other = (TmfConfigurationSourceType) arg0;
+        return Objects.equals(fName, other.fName) && Objects.equals(fId, other.fId) && Objects.equals(fDescription, other.fDescription)
+                && Objects.equals(fParamDescriptors, other.fParamDescriptors);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(fName, fId, fParamDescriptors, fDescription);
+    }
+
+    /**
+     * A builder class to build instances implementing interface
+     * {@link ITmfConfigurationSourceType}
+     */
+    public static class Builder {
+        private String fId = ""; //$NON-NLS-1$
+        private String fName = ""; //$NON-NLS-1$
+        private String fDescription = ""; //$NON-NLS-1$
+        private List<ITmfConfigParamDescriptor> fDescriptors = new ArrayList<>();
+
+        /**
+         * Constructor
+         */
+        public Builder() {
+            // Empty constructor
+        }
+
+        /**
+         * Sets the ID of the configuration source type
+         *
+         * @param id
+         *            the ID of the data provider
+         * @return the builder instance.
+         */
+        public Builder setId(String id) {
+            fId = id;
+            return this;
+        }
+
+        /**
+         * Sets the name of the configuration source type
+         *
+         * @param name
+         *            the name to set
+         * @return the builder instance.
+         */
+        public Builder setName(String name) {
+            fName = name;
+            return this;
+        }
+
+        /**
+         * Sets the description of the configuration source type
+         *
+         * @param description
+         *            the description text to set
+         * @return the builder instance.
+         */
+        public Builder setDescription(String description) {
+            fDescription = description;
+            return this;
+        }
+
+        /**
+         * Sets the configuration parameter descriptors of the configuration
+         * source type
+         *
+         * @param descriptors
+         *            the query parameter keys to set
+         * @return the builder instance.
+         */
+        public Builder setConfigParamDescriptors(List<ITmfConfigParamDescriptor> descriptors) {
+            fDescriptors = descriptors;
+            return this;
+        }
+
+        /**
+         * The method to construct an instance of
+         * {@link ITmfConfigurationSourceType}
+         *
+         * @return a {@link ITmfConfigurationSourceType} instance
+         */
+        public ITmfConfigurationSourceType build() {
+            if (fId.isBlank()) {
+                throw new IllegalStateException("Configuration source type ID not set"); //$NON-NLS-1$
+            }
+
+            if (fName.isBlank()) {
+                throw new IllegalStateException("Configuration source type name not set"); //$NON-NLS-1$
+            }
+            return new TmfConfigurationSourceType(this);
+        }
+    }
+}
diff --git a/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/config/package-info.java b/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/config/package-info.java
new file mode 100644
index 0000000..a9d3e4d
--- /dev/null
+++ b/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/config/package-info.java
@@ -0,0 +1,13 @@
+/*******************************************************************************
+ * Copyright (c) 2023 Ericsson
+ *
+ * All rights reserved. This program and the accompanying materials are made
+ * available under the terms of the Eclipse Public License 2.0 which
+ * accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************/
+
+@org.eclipse.jdt.annotation.NonNullByDefault
+package org.eclipse.tracecompass.tmf.core.config;
diff --git a/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/exceptions/TmfConfigurationException.java b/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/exceptions/TmfConfigurationException.java
new file mode 100644
index 0000000..4ae686e
--- /dev/null
+++ b/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/exceptions/TmfConfigurationException.java
@@ -0,0 +1,53 @@
+/*******************************************************************************
+ * Copyright (c) 2023 Ericsson
+ *
+ * All rights reserved. This program and the accompanying materials are
+ * made available under the terms of the Eclipse Public License 2.0 which
+ * accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************/
+
+package org.eclipse.tracecompass.tmf.core.exceptions;
+
+import org.eclipse.jdt.annotation.NonNullByDefault;
+import org.eclipse.jdt.annotation.Nullable;
+
+/**
+ * TMF configuration related exception
+ *
+ * @author Bernd Hufmann
+ * @since 9.2
+ */
+@NonNullByDefault
+public class TmfConfigurationException extends Exception {
+
+    /**
+     * The exception version ID
+     */
+    private static final long serialVersionUID = -5576008495027333732L;
+
+    /**
+     * Constructor
+     *
+     * @param errMsg
+     *            the error message
+     */
+    public TmfConfigurationException(String errMsg) {
+        super(errMsg);
+    }
+
+    /**
+     * Constructor
+     *
+     * @param errMsg
+     *            the error message
+     * @param cause
+     *            the error cause (<code>null</code> is permitted which means no
+     *            cause is available)
+     */
+    public TmfConfigurationException(String errMsg, @Nullable Throwable cause) {
+        super(errMsg, cause);
+    }
+}