diff --git a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/cli/TelemetryConfigListCommand.java b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/cli/TelemetryConfigListCommand.java
new file mode 100644
index 0000000..992c93a
--- /dev/null
+++ b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/cli/TelemetryConfigListCommand.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.openstacktelemetry.cli;
+
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
+import org.onosproject.cli.AbstractShellCommand;
+import org.onosproject.openstacktelemetry.api.TelemetryConfigService;
+import org.onosproject.openstacktelemetry.api.config.TelemetryConfig;
+
+import java.util.Comparator;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * Lists Telemetry configurations.
+ */
+@Service
+@Command(scope = "onos", name = "telemetry-configs",
+        description = "Lists all Telemetry configurations")
+public class TelemetryConfigListCommand extends AbstractShellCommand {
+
+    private static final String FORMAT = "%-30s%-15s%-15s%-30s%-15s";
+    private static final String MASTER = "master";
+
+    @Override
+    protected void doExecute() {
+        TelemetryConfigService service = get(TelemetryConfigService.class);
+        List<TelemetryConfig> configs = service.getConfigs().stream()
+                .filter(c -> !c.swVersion().equals(MASTER))
+                .sorted(Comparator.comparing(TelemetryConfig::type))
+                .collect(Collectors.toList());
+
+        print(FORMAT, "Name", "Type", "Enabled", "Manufacturer", "swVersion");
+        for (TelemetryConfig config : configs) {
+            print(FORMAT, config.name(),
+                    config.type(),
+                    config.enabled() ? "ENABLED" : "DISABLED",
+                    config.manufacturer(),
+                    config.swVersion());
+        }
+    }
+}
diff --git a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/codec/StatsFlowRuleJsonCodec.java b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/codec/StatsFlowRuleJsonCodec.java
index 2e84b79..384987b 100644
--- a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/codec/StatsFlowRuleJsonCodec.java
+++ b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/codec/StatsFlowRuleJsonCodec.java
@@ -30,6 +30,9 @@
 import static org.onosproject.openstacktelemetry.util.OpenstackTelemetryUtil.getProtocolTypeFromString;
 import static org.slf4j.LoggerFactory.getLogger;
 
+/**
+ * JSON codec for StatsFlowRule.
+ */
 public class StatsFlowRuleJsonCodec extends JsonCodec<StatsFlowRule> {
 
     private final Logger log = getLogger(getClass());
diff --git a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/codec/TinaMessageByteBufferCodec.java b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/codec/TinaMessageByteBufferCodec.java
index 2ced23b..2be5f3e 100644
--- a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/codec/TinaMessageByteBufferCodec.java
+++ b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/codec/TinaMessageByteBufferCodec.java
@@ -16,6 +16,7 @@
 package org.onosproject.openstacktelemetry.codec;
 
 import org.onosproject.openstacktelemetry.api.FlowInfo;
+import org.onosproject.openstacktelemetry.api.TelemetryCodec;
 
 import java.nio.ByteBuffer;
 import java.util.Set;
@@ -23,10 +24,7 @@
 /**
  * Tina Message ByteBuffer Codec.
  */
-public class TinaMessageByteBufferCodec {
-
-    public static final String KAFKA_TOPIC = "sona.flow";
-    public static final String KAFKA_KEY = "flowdata";
+public class TinaMessageByteBufferCodec implements TelemetryCodec {
 
     private static final int HEADER_SIZE = 8;
     private static final int ENTRY_SIZE = 88;
@@ -39,6 +37,7 @@
      * @param flowInfos a collection of flow info
      * @return encoded byte buffer
      */
+    @Override
     public ByteBuffer encode(Set<FlowInfo> flowInfos) {
         ByteBuffer byteBuffer =
                 ByteBuffer.allocate(HEADER_SIZE + flowInfos.size() * ENTRY_SIZE);
diff --git a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/config/DefaultGrpcTelemetryConfig.java b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/config/DefaultGrpcTelemetryConfig.java
index 5ece99b..8d2f0fd 100644
--- a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/config/DefaultGrpcTelemetryConfig.java
+++ b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/config/DefaultGrpcTelemetryConfig.java
@@ -19,18 +19,26 @@
 import com.google.common.collect.Maps;
 import org.onosproject.openstacktelemetry.api.config.GrpcTelemetryConfig;
 import org.onosproject.openstacktelemetry.api.config.TelemetryConfig;
+import org.onosproject.openstacktelemetry.api.config.TelemetryConfigProperties;
 
 import java.util.Map;
 import java.util.Objects;
 
 import static com.google.common.base.MoreObjects.toStringHelper;
 import static com.google.common.base.Preconditions.checkNotNull;
+import static org.onosproject.openstacktelemetry.api.config.TelemetryConfig.ConfigType.GRPC;
 
 /**
  * A configuration file contains gRPC telemetry parameters.
  */
 public final class DefaultGrpcTelemetryConfig implements GrpcTelemetryConfig {
 
+    protected static final String ADDRESS = "address";
+    protected static final String PORT = "port";
+    protected static final String USE_PLAINTEXT = "usePlaintext";
+    protected static final String MAX_INBOUND_MSG_SIZE = "maxInboundMsgSize";
+    protected static final String CONFIG_MAP = "configMap";
+
     private final String address;
     private final int port;
     private final boolean usePlaintext;
@@ -101,20 +109,39 @@
     @Override
     public String toString() {
         return toStringHelper(this)
-                .add("address", address)
-                .add("port", port)
-                .add("usePlaintext", usePlaintext)
-                .add("maxInboundMsgSize", maxInboundMsgSize)
-                .add("configMap", configMap)
+                .add(ADDRESS, address)
+                .add(PORT, port)
+                .add(USE_PLAINTEXT, usePlaintext)
+                .add(MAX_INBOUND_MSG_SIZE, maxInboundMsgSize)
+                .add(CONFIG_MAP, configMap)
                 .toString();
     }
 
     @Override
-    public TelemetryConfig.Builder createBuilder() {
+    public TelemetryConfigProperties.Builder createBuilder() {
         return new DefaultBuilder();
     }
 
     /**
+     * Builds a gRPC telemetry config from telemetry config instance.
+     *
+     * @param config telemetry config
+     * @return gRPC telemetry config
+     */
+    public static GrpcTelemetryConfig fromTelemetryConfig(TelemetryConfig config) {
+        if (config.type() != GRPC) {
+            return null;
+        }
+
+        return new DefaultBuilder()
+                .withAddress(config.getProperty(ADDRESS))
+                .withPort(Integer.valueOf(config.getProperty(PORT)))
+                .withUsePlaintext(Boolean.valueOf(config.getProperty(USE_PLAINTEXT)))
+                .withMaxInboundMsgSize(Integer.valueOf(config.getProperty(MAX_INBOUND_MSG_SIZE)))
+                .build();
+    }
+
+    /**
      * Builder class of DefaultKafkaTelemetryConfig.
      */
     public static final class DefaultBuilder implements Builder {
@@ -163,4 +190,4 @@
                     maxInboundMsgSize, configMap);
         }
     }
-}
+}
\ No newline at end of file
diff --git a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/config/DefaultInfluxDbTelemetryConfig.java b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/config/DefaultInfluxDbTelemetryConfig.java
index c63f2bc..db60cb8 100644
--- a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/config/DefaultInfluxDbTelemetryConfig.java
+++ b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/config/DefaultInfluxDbTelemetryConfig.java
@@ -15,10 +15,12 @@
  */
 package org.onosproject.openstacktelemetry.config;
 
+import com.google.common.base.Strings;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Maps;
 import org.onosproject.openstacktelemetry.api.config.InfluxDbTelemetryConfig;
 import org.onosproject.openstacktelemetry.api.config.TelemetryConfig;
+import org.onosproject.openstacktelemetry.api.config.TelemetryConfigProperties;
 
 import java.util.Map;
 import java.util.Objects;
@@ -31,6 +33,15 @@
  */
 public final class DefaultInfluxDbTelemetryConfig implements InfluxDbTelemetryConfig {
 
+    protected static final String ADDRESS = "address";
+    protected static final String PORT = "port";
+    protected static final String USERNAME = "username";
+    protected static final String PASSWORD = "password";
+    protected static final String DATABASE = "database";
+    protected static final String MEASUREMENT = "measurement";
+    protected static final String ENABLE_BATCH = "enableBatch";
+    protected static final String CONFIG_MAP = "configMap";
+
     private final String address;
     private final int port;
     private final String username;
@@ -122,29 +133,54 @@
     @Override
     public int hashCode() {
         return Objects.hash(address, port, username, password, database,
-                            measurement, enableBatch, configMap);
+                measurement, enableBatch, configMap);
     }
 
     @Override
     public String toString() {
         return toStringHelper(this)
-                .add("address", address)
-                .add("port", port)
-                .add("username", username)
-                .add("password", password)
-                .add("database", database)
-                .add("measurement", measurement)
-                .add("enableBatch", enableBatch)
-                .add("configMap", configMap)
+                .add(ADDRESS, address)
+                .add(PORT, port)
+                .add(USERNAME, username)
+                .add(PASSWORD, password)
+                .add(DATABASE, database)
+                .add(MEASUREMENT, measurement)
+                .add(ENABLE_BATCH, enableBatch)
+                .add(CONFIG_MAP, configMap)
                 .toString();
     }
 
     @Override
-    public TelemetryConfig.Builder createBuilder() {
+    public TelemetryConfigProperties.Builder createBuilder() {
         return new DefaultBuilder();
     }
 
     /**
+     * Builds an influxDB telemetry config from telemetry config instance.
+     *
+     * @param config telemetry config
+     * @return influxDB telemetry config
+     */
+    public static InfluxDbTelemetryConfig fromTelemetryConfig(TelemetryConfig config) {
+        if (config.type() != TelemetryConfig.ConfigType.INFLUXDB) {
+            return null;
+        }
+
+        boolean enableBatch = Strings.isNullOrEmpty(config.getProperty(ENABLE_BATCH)) ? false :
+                Boolean.valueOf(config.getProperty(ENABLE_BATCH));
+
+        return new DefaultBuilder()
+                .withAddress(config.getProperty(ADDRESS))
+                .withPort(Integer.valueOf(config.getProperty(PORT)))
+                .withUsername(config.getProperty(USERNAME))
+                .withPassword(config.getProperty(PASSWORD))
+                .withDatabase(config.getProperty(DATABASE))
+                .withMeasurement(config.getProperty(MEASUREMENT))
+                .withEnableBatch(enableBatch)
+                .build();
+    }
+
+    /**
      * Builder class of DefaultInfluxDbTelemetryConfig.
      */
     public static final class DefaultBuilder implements Builder {
@@ -211,11 +247,10 @@
             checkNotNull(address, "InfluxDB server address cannot be null");
             checkNotNull(username, "InfluxDB server username cannot be null");
             checkNotNull(password, "InfluxDB server password cannot be null");
-            checkNotNull(database, "InfluxDB server database cannot be null");
-            checkNotNull(measurement, "InfluxDB server measurement cannot be null");
 
             return new DefaultInfluxDbTelemetryConfig(address, port, username,
                     password, database, measurement, enableBatch, configMap);
         }
+
     }
-}
+}
\ No newline at end of file
diff --git a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/config/DefaultKafkaTelemetryConfig.java b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/config/DefaultKafkaTelemetryConfig.java
index 6fc90fd..1cd52ef 100644
--- a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/config/DefaultKafkaTelemetryConfig.java
+++ b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/config/DefaultKafkaTelemetryConfig.java
@@ -15,22 +15,39 @@
  */
 package org.onosproject.openstacktelemetry.config;
 
+import com.google.common.base.Strings;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Maps;
 import org.onosproject.openstacktelemetry.api.config.KafkaTelemetryConfig;
 import org.onosproject.openstacktelemetry.api.config.TelemetryConfig;
+import org.onosproject.openstacktelemetry.api.config.TelemetryConfigProperties;
 
 import java.util.Map;
 import java.util.Objects;
 
 import static com.google.common.base.MoreObjects.toStringHelper;
 import static com.google.common.base.Preconditions.checkNotNull;
+import static org.onosproject.openstacktelemetry.api.config.TelemetryConfig.ConfigType.KAFKA;
 
 /**
  * A configuration file contains Kafka telemetry parameters.
  */
 public final class DefaultKafkaTelemetryConfig implements KafkaTelemetryConfig {
 
+    protected static final String ADDRESS = "address";
+    protected static final String PORT = "port";
+    protected static final String RETRIES = "retries";
+    protected static final String REQUIRED_ACKS = "requiredAcks";
+    protected static final String BATCH_SIZE = "batchSize";
+    protected static final String LINGER_MS = "lingerMs";
+    protected static final String MEMORY_BUFFER = "memoryBuffer";
+    protected static final String KEY_SERIALIZER = "keySerializer";
+    protected static final String VALUE_SERIALIZER = "valueSerializer";
+    protected static final String KEY = "key";
+    protected static final String TOPIC = "topic";
+    protected static final String CODEC = "codec";
+    protected static final String CONFIG_MAP = "configMap";
+
     private final String address;
     private final int port;
     private final int retries;
@@ -40,6 +57,9 @@
     private final int memoryBuffer;
     private final String keySerializer;
     private final String valueSerializer;
+    private final String key;
+    private final String topic;
+    private final String codec;
     private final Map<String, Object> configMap;
 
     private DefaultKafkaTelemetryConfig(String address, int port, int retries,
@@ -47,6 +67,7 @@
                                         int lingerMs, int memoryBuffer,
                                         String keySerializer,
                                         String valueSerializer,
+                                        String key, String topic, String codec,
                                         Map<String, Object> configMap) {
         this.address = address;
         this.port = port;
@@ -57,6 +78,9 @@
         this.memoryBuffer = memoryBuffer;
         this.keySerializer = keySerializer;
         this.valueSerializer = valueSerializer;
+        this.key = key;
+        this.topic = topic;
+        this.codec = codec;
         this.configMap = configMap;
     }
 
@@ -106,6 +130,21 @@
     }
 
     @Override
+    public String key() {
+        return key;
+    }
+
+    @Override
+    public String topic() {
+        return topic;
+    }
+
+    @Override
+    public String codec() {
+        return codec;
+    }
+
+    @Override
     public Map<String, Object> configMap() {
         if (configMap != null) {
             return ImmutableMap.copyOf(configMap);
@@ -131,6 +170,9 @@
                     Objects.equals(this.memoryBuffer, other.memoryBuffer) &&
                     Objects.equals(this.keySerializer, other.keySerializer) &&
                     Objects.equals(this.valueSerializer, other.valueSerializer) &&
+                    Objects.equals(this.key, other.key) &&
+                    Objects.equals(this.topic, other.topic) &&
+                    Objects.equals(this.codec, other.codec) &&
                     Objects.equals(this.configMap, other.configMap);
         }
         return false;
@@ -139,31 +181,71 @@
     @Override
     public int hashCode() {
         return Objects.hash(address, port, retries, requiredAcks, batchSize,
-                lingerMs, memoryBuffer, keySerializer, valueSerializer, configMap);
+                lingerMs, memoryBuffer, keySerializer, valueSerializer,
+                key, topic, codec, configMap);
     }
 
     @Override
     public String toString() {
         return toStringHelper(this)
-                .add("address", address)
-                .add("port", port)
-                .add("retries", retries)
-                .add("requiredAcks", requiredAcks)
-                .add("batchSize", batchSize)
-                .add("lingerMs", lingerMs)
-                .add("memoryBuffer", memoryBuffer)
-                .add("keySerializer", keySerializer)
-                .add("valueSerializer", valueSerializer)
-                .add("configMap", configMap)
+                .add(ADDRESS, address)
+                .add(PORT, port)
+                .add(RETRIES, retries)
+                .add(REQUIRED_ACKS, requiredAcks)
+                .add(BATCH_SIZE, batchSize)
+                .add(LINGER_MS, lingerMs)
+                .add(MEMORY_BUFFER, memoryBuffer)
+                .add(KEY_SERIALIZER, keySerializer)
+                .add(VALUE_SERIALIZER, valueSerializer)
+                .add(KEY, key)
+                .add(TOPIC, topic)
+                .add(CODEC, codec)
+                .add(CONFIG_MAP, configMap)
                 .toString();
     }
 
     @Override
-    public TelemetryConfig.Builder createBuilder() {
+    public TelemetryConfigProperties.Builder createBuilder() {
         return new DefaultBuilder();
     }
 
     /**
+     * Builds a kafka telemetry config from telemetry config instance.
+     *
+     * @param config telemetry config
+     * @return kafka telemetry config
+     */
+    public static KafkaTelemetryConfig fromTelemetryConfig(TelemetryConfig config) {
+        if (config.type() != KAFKA) {
+            return null;
+        }
+
+        int retries = Strings.isNullOrEmpty(config.getProperty(RETRIES)) ? 0 :
+                Integer.valueOf(config.getProperty(RETRIES));
+        int batchSize = Strings.isNullOrEmpty(config.getProperty(BATCH_SIZE)) ? 0 :
+                Integer.valueOf(config.getProperty(BATCH_SIZE));
+        int lingerMs = Strings.isNullOrEmpty(config.getProperty(LINGER_MS)) ? 0 :
+                Integer.valueOf(config.getProperty(LINGER_MS));
+        int memoryBuffer = Strings.isNullOrEmpty(config.getProperty(MEMORY_BUFFER)) ? 0 :
+                Integer.valueOf(config.getProperty(MEMORY_BUFFER));
+
+        return new DefaultBuilder()
+                .withAddress(config.getProperty(ADDRESS))
+                .withPort(Integer.valueOf(config.getProperty(PORT)))
+                .withRetries(retries)
+                .withRequiredAcks(config.getProperty(REQUIRED_ACKS))
+                .withBatchSize(batchSize)
+                .withLingerMs(lingerMs)
+                .withMemoryBuffer(memoryBuffer)
+                .withKeySerializer(config.getProperty(KEY_SERIALIZER))
+                .withValueSerializer(config.getProperty(VALUE_SERIALIZER))
+                .withKey(config.getProperty(KEY))
+                .withTopic(config.getProperty(TOPIC))
+                .withCodec(config.getProperty(CODEC))
+                .build();
+    }
+
+    /**
      * Builder class of DefaultKafkaTelemetryConfig.
      */
     public static final class DefaultBuilder implements Builder {
@@ -176,6 +258,9 @@
         private int memoryBuffer;
         private String keySerializer;
         private String valueSerializer;
+        private String key;
+        private String topic;
+        private String codec;
         private Map<String, Object> configMap;
 
         @Override
@@ -233,6 +318,24 @@
         }
 
         @Override
+        public Builder withKey(String key) {
+            this.key = key;
+            return this;
+        }
+
+        @Override
+        public Builder withTopic(String topic) {
+            this.topic = topic;
+            return this;
+        }
+
+        @Override
+        public Builder withCodec(String codec) {
+            this.codec = codec;
+            return this;
+        }
+
+        @Override
         public Builder withConfigMap(Map<String, Object> configMap) {
             this.configMap = configMap;
             return this;
@@ -241,12 +344,10 @@
         @Override
         public KafkaTelemetryConfig build() {
             checkNotNull(address, "Kafka server address cannot be null");
-            checkNotNull(keySerializer, "Kafka key serializer cannot be null");
-            checkNotNull(valueSerializer, "Kafka value serializer cannot be null");
 
             return new DefaultKafkaTelemetryConfig(address, port, retries,
-                                requiredAcks, batchSize, lingerMs, memoryBuffer,
-                                keySerializer, valueSerializer, configMap);
+                    requiredAcks, batchSize, lingerMs, memoryBuffer, keySerializer,
+                    valueSerializer, key, topic, codec, configMap);
         }
     }
-}
+}
\ No newline at end of file
diff --git a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/config/DefaultPrometheusTelemetryConfig.java b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/config/DefaultPrometheusTelemetryConfig.java
index 33d1d2e..7dc5a5a 100644
--- a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/config/DefaultPrometheusTelemetryConfig.java
+++ b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/config/DefaultPrometheusTelemetryConfig.java
@@ -19,18 +19,24 @@
 import com.google.common.collect.Maps;
 import org.onosproject.openstacktelemetry.api.config.PrometheusTelemetryConfig;
 import org.onosproject.openstacktelemetry.api.config.TelemetryConfig;
+import org.onosproject.openstacktelemetry.api.config.TelemetryConfigProperties;
 
 import java.util.Map;
 import java.util.Objects;
 
 import static com.google.common.base.MoreObjects.toStringHelper;
 import static com.google.common.base.Preconditions.checkNotNull;
+import static org.onosproject.openstacktelemetry.api.config.TelemetryConfig.ConfigType.PROMETHEUS;
 
 /**
  * A configuration file contains Prometheus telemetry parameters.
  */
 public final class DefaultPrometheusTelemetryConfig implements PrometheusTelemetryConfig {
 
+    protected static final String ADDRESS = "address";
+    protected static final String PORT = "port";
+    protected static final String CONFIG_MAP = "configMap";
+
     private final String address;
     private final int port;
     private final Map<String, Object> configMap;
@@ -85,18 +91,35 @@
     @Override
     public String toString() {
         return toStringHelper(this)
-                .add("address", address)
-                .add("port", port)
-                .add("configMap", configMap)
+                .add(ADDRESS, address)
+                .add(PORT, port)
+                .add(CONFIG_MAP, configMap)
                 .toString();
     }
 
     @Override
-    public TelemetryConfig.Builder createBuilder() {
+    public TelemetryConfigProperties.Builder createBuilder() {
         return new DefaultBuilder();
     }
 
     /**
+     * Builds a prometheus telemetry config from telemetry config instance.
+     *
+     * @param config telemetry config
+     * @return prometheus telemetry config
+     */
+    public static PrometheusTelemetryConfig fromTelemetryConfig(TelemetryConfig config) {
+        if (config.type() != PROMETHEUS) {
+            return null;
+        }
+
+        return new DefaultBuilder()
+                .withAddress(config.getProperty(ADDRESS))
+                .withPort(Integer.valueOf(config.getProperty(PORT)))
+                .build();
+    }
+
+    /**
      * Builder class of DefaultPrometheusTelemetryConfig.
      */
     public static final class DefaultBuilder implements Builder {
@@ -121,10 +144,11 @@
             this.configMap = configMap;
             return this;
         }
+
         @Override
         public PrometheusTelemetryConfig build() {
             checkNotNull(address, "Prometheus exporter binding address cannot be null");
             return new DefaultPrometheusTelemetryConfig(address, port, configMap);
         }
     }
-}
+}
\ No newline at end of file
diff --git a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/config/DefaultRestTelemetryConfig.java b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/config/DefaultRestTelemetryConfig.java
index df9d6ce..a5977a5 100644
--- a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/config/DefaultRestTelemetryConfig.java
+++ b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/config/DefaultRestTelemetryConfig.java
@@ -19,18 +19,28 @@
 import com.google.common.collect.Maps;
 import org.onosproject.openstacktelemetry.api.config.RestTelemetryConfig;
 import org.onosproject.openstacktelemetry.api.config.TelemetryConfig;
+import org.onosproject.openstacktelemetry.api.config.TelemetryConfigProperties;
 
 import java.util.Map;
 import java.util.Objects;
 
 import static com.google.common.base.MoreObjects.toStringHelper;
 import static com.google.common.base.Preconditions.checkNotNull;
+import static org.onosproject.openstacktelemetry.api.config.TelemetryConfig.ConfigType.REST;
 
 /**
  * A configuration file contains REST telemetry parameters.
  */
 public final class DefaultRestTelemetryConfig implements RestTelemetryConfig {
 
+    protected static final String ADDRESS = "address";
+    protected static final String PORT = "port";
+    protected static final String ENDPOINT = "endpoint";
+    protected static final String METHOD = "method";
+    protected static final String REQUEST_MEDIA_TYPE = "requestMediaType";
+    protected static final String RESPONSE_MEDIA_TYPE = "responseMediaType";
+    protected static final String CONFIG_MAP = "configMap";
+
     private final String address;
     private final int port;
     private final String endpoint;
@@ -119,22 +129,43 @@
     @Override
     public String toString() {
         return toStringHelper(this)
-                .add("address", address)
-                .add("port", port)
-                .add("endpoint", endpoint)
-                .add("method", method)
-                .add("requestMediaType", requestMediaType)
-                .add("responseMediaType", responseMediaType)
-                .add("configMap", configMap)
+                .add(ADDRESS, address)
+                .add(PORT, port)
+                .add(ENDPOINT, endpoint)
+                .add(METHOD, method)
+                .add(REQUEST_MEDIA_TYPE, requestMediaType)
+                .add(RESPONSE_MEDIA_TYPE, responseMediaType)
+                .add(CONFIG_MAP, configMap)
                 .toString();
     }
 
     @Override
-    public TelemetryConfig.Builder createBuilder() {
+    public TelemetryConfigProperties.Builder createBuilder() {
         return new DefaultBuilder();
     }
 
     /**
+     * Builds a REST telemetry config from telemetry config instance.
+     *
+     * @param config telemetry config
+     * @return REST telemetry config
+     */
+    public static RestTelemetryConfig fromTelemetryConfig(TelemetryConfig config) {
+        if (config.type() != REST) {
+            return null;
+        }
+
+        return new DefaultBuilder()
+                .withAddress(config.getProperty(ADDRESS))
+                .withPort(Integer.valueOf(config.getProperty(PORT)))
+                .withEndpoint(config.getProperty(ENDPOINT))
+                .withMethod(config.getProperty(METHOD))
+                .withRequestMediaType(config.getProperty(REQUEST_MEDIA_TYPE))
+                .withResponseMediaType(config.getProperty(RESPONSE_MEDIA_TYPE))
+                .build();
+    }
+
+    /**
      * Builder class of DefaultRestTelemetryConfig.
      */
     public static final class DefaultBuilder implements Builder {
@@ -198,4 +229,4 @@
                     method, requestMediaType, responseMediaType, configMap);
         }
     }
-}
+}
\ No newline at end of file
diff --git a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/gui/OpenstackTelemetryUiTopovOverlay.java b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/gui/OpenstackTelemetryUiTopovOverlay.java
index f1575bc..597588b 100644
--- a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/gui/OpenstackTelemetryUiTopovOverlay.java
+++ b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/gui/OpenstackTelemetryUiTopovOverlay.java
@@ -17,6 +17,9 @@
 
 import org.onosproject.ui.UiTopoOverlay;
 
+/**
+ * Openstack telemetry UI topology implementation.
+ */
 public class OpenstackTelemetryUiTopovOverlay extends UiTopoOverlay {
     private static final String OVERLAY_ID = "ostelemetry-overlay";
 
diff --git a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/AbstractTelemetryConfigLoader.java b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/AbstractTelemetryConfigLoader.java
new file mode 100644
index 0000000..486cea5
--- /dev/null
+++ b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/AbstractTelemetryConfigLoader.java
@@ -0,0 +1,67 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.openstacktelemetry.impl;
+
+import org.onosproject.openstacktelemetry.api.TelemetryConfigAdminService;
+import org.onosproject.openstacktelemetry.api.TelemetryConfigProvider;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Deactivate;
+import org.osgi.service.component.annotations.Reference;
+import org.osgi.service.component.annotations.ReferenceCardinality;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Abstract bootstrapper for loading and registering telemetry configurations
+ * that are independent from the default telemetry configurations.
+ */
+public abstract class AbstractTelemetryConfigLoader {
+
+    private final Logger log = LoggerFactory.getLogger(getClass());
+
+    private TelemetryConfigProvider provider;
+    private final String path;
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
+    protected TelemetryConfigAdminService configAdminService;
+
+    /**
+     * Creates a new loader for resource with the specified path.
+     *
+     * @param path configurations definition XML resource path
+     */
+    protected AbstractTelemetryConfigLoader(String path) {
+        this.path = path;
+    }
+
+    @Activate
+    protected void activate() {
+        try {
+            provider = new XmlTelemetryConfigLoader().loadTelemetryConfigs(
+                                            getClass().getResourceAsStream(path));
+            configAdminService.registerProvider(provider);
+        } catch (Exception e) {
+            log.error("Unable to load {} telemetry configuration definitions", path, e);
+        }
+        log.info("Started");
+    }
+
+    @Deactivate
+    protected void deactivate() {
+        configAdminService.unregisterProvider(provider);
+        log.info("Stopped");
+    }
+}
diff --git a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/DefaultStatsFlowRule.java b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/DefaultStatsFlowRule.java
index 2b2d7b6..9ee84f8 100644
--- a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/DefaultStatsFlowRule.java
+++ b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/DefaultStatsFlowRule.java
@@ -24,6 +24,9 @@
 
 import static com.google.common.base.Preconditions.checkArgument;
 
+/**
+ * Implementation of StatsFlowRule.
+ */
 public final class DefaultStatsFlowRule implements StatsFlowRule {
     private final IpPrefix srcIpPrefix;
     private final IpPrefix dstIpPrefix;
diff --git a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/DefaultTelemetryConfig.java b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/DefaultTelemetryConfig.java
new file mode 100644
index 0000000..368b36b
--- /dev/null
+++ b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/DefaultTelemetryConfig.java
@@ -0,0 +1,203 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.openstacktelemetry.impl;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
+import org.onosproject.openstacktelemetry.api.config.TelemetryConfig;
+
+import java.util.ArrayList;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Queue;
+import java.util.Set;
+
+import static com.google.common.base.MoreObjects.toStringHelper;
+import static com.google.common.base.Preconditions.checkNotNull;
+import static com.google.common.collect.ImmutableMap.copyOf;
+
+/**
+ * Implementation of TelemetryConfig.
+ */
+public final class DefaultTelemetryConfig implements TelemetryConfig {
+    private final String name;
+    private final ConfigType type;
+    private final List<TelemetryConfig> parents;
+
+    private final String manufacturer;
+    private final String swVersion;
+    private final boolean enabled;
+
+    private final Map<String, String> properties;
+
+    /**
+     * Creates a configuration with the specified name.
+     *
+     * @param name          configuration name
+     * @param type          configuration type
+     * @param parents       optional parent configurations
+     * @param manufacturer  off-platform application manufacturer
+     * @param swVersion     off-platform application software version
+     * @param enabled       service enable flag
+     * @param properties    properties for telemetry configuration
+     */
+    public DefaultTelemetryConfig(String name, ConfigType type,
+                                  List<TelemetryConfig> parents,
+                                  String manufacturer, String swVersion,
+                                  boolean enabled, Map<String, String> properties) {
+        this.name = checkNotNull(name, "Name cannot be null");
+        this.type = checkNotNull(type, "type cannot be null");
+        this.parents = parents == null ? ImmutableList.of() : ImmutableList.copyOf(parents);
+        this.manufacturer = checkNotNull(manufacturer, "Manufacturer cannot be null");
+        this.swVersion = checkNotNull(swVersion, "SW version cannot be null");
+        this.properties = copyOf(checkNotNull(properties, "Properties cannot be null"));
+        this.enabled = enabled;
+    }
+
+    @Override
+    public String name() {
+        return name;
+    }
+
+    @Override
+    public ConfigType type() {
+        return type;
+    }
+
+    @Override
+    public List<TelemetryConfig> parents() {
+        if (parents == null) {
+            return ImmutableList.of();
+        } else {
+            return ImmutableList.copyOf(parents);
+        }
+    }
+
+    @Override
+    public String manufacturer() {
+        return manufacturer;
+    }
+
+    @Override
+    public String swVersion() {
+        return swVersion;
+    }
+
+    @Override
+    public boolean enabled() {
+        return enabled;
+    }
+
+    @Override
+    public Map<String, String> properties() {
+        if (properties == null) {
+            return ImmutableMap.of();
+        } else {
+            return ImmutableMap.copyOf(properties);
+        }
+    }
+
+    @Override
+    public String getProperty(String name) {
+        Queue<TelemetryConfig> queue = new LinkedList<>();
+        queue.add(this);
+        while (!queue.isEmpty()) {
+            TelemetryConfig config = queue.remove();
+            String property = config.properties().get(name);
+            if (property != null) {
+                return property;
+            } else if (config.parents() != null) {
+                queue.addAll(config.parents());
+            }
+        }
+        return null;
+    }
+
+    @Override
+    public TelemetryConfig merge(TelemetryConfig other) {
+        // merge the properties
+        ImmutableMap.Builder<String, String> properties = ImmutableMap.builder();
+        properties.putAll(other.properties());
+
+        // remove duplicated properties from this configuration and merge
+        this.properties().entrySet().stream()
+                .filter(e -> !other.properties().containsKey(e.getKey()))
+                .forEach(properties::put);
+
+        List<TelemetryConfig> completeParents = new ArrayList<>();
+
+        if (parents != null) {
+            parents.forEach(parent -> other.parents().forEach(otherParent -> {
+                if (otherParent.name().equals(parent.name())) {
+                    completeParents.add(parent.merge(otherParent));
+                } else if (!completeParents.contains(otherParent)) {
+                    completeParents.add(otherParent);
+                } else if (!completeParents.contains(parent)) {
+                    completeParents.add(parent);
+                }
+            }));
+        }
+
+        return new DefaultTelemetryConfig(name, type,
+                !completeParents.isEmpty() ? completeParents : other.parents(),
+                manufacturer, swVersion, enabled, properties.build());
+    }
+
+    @Override
+    public Set<String> keys() {
+        return properties.keySet();
+    }
+
+    @Override
+    public String value(String key) {
+        return properties.get(key);
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(this)
+                .add("name", name)
+                .add("type", type)
+                .add("parents", parents)
+                .add("manufacturer", manufacturer)
+                .add("swVersion", swVersion)
+                .add("enabled", enabled)
+                .add("properties", properties)
+                .toString();
+    }
+
+    @Override
+    public boolean equals(Object configToBeCompared) {
+        if (this == configToBeCompared) {
+            return true;
+        }
+
+        if (configToBeCompared == null || getClass() != configToBeCompared.getClass()) {
+            return false;
+        }
+
+        DefaultTelemetryConfig telemetryConfig =
+                                    (DefaultTelemetryConfig) configToBeCompared;
+        return name.equals(telemetryConfig.name());
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hashCode(name);
+    }
+}
diff --git a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/DefaultTelemetryConfigProvider.java b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/DefaultTelemetryConfigProvider.java
new file mode 100644
index 0000000..5fb1e70
--- /dev/null
+++ b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/DefaultTelemetryConfigProvider.java
@@ -0,0 +1,67 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.openstacktelemetry.impl;
+
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Maps;
+import org.onosproject.openstacktelemetry.api.TelemetryConfigProvider;
+import org.onosproject.openstacktelemetry.api.config.TelemetryConfig;
+
+import java.util.Map;
+import java.util.Set;
+
+import static com.google.common.base.MoreObjects.toStringHelper;
+
+/**
+ * Default telemetry configuration provider implementation.
+ */
+public class DefaultTelemetryConfigProvider implements TelemetryConfigProvider {
+
+    protected final Map<String, TelemetryConfig> configs = Maps.newConcurrentMap();
+
+    @Override
+    public Set<TelemetryConfig> getTelemetryConfigs() {
+        return ImmutableSet.copyOf(configs.values());
+    }
+
+    /**
+     * Adds the specified configuration to the provider. If a configuration with
+     * the name does not exist yet, the specified one will be added. Otherwise,
+     * the existing configuration will be merged with the new one and the result will
+     * be registered.
+     *
+     * @param config telemetry configuration to be provided
+     * @return registered configuration
+     */
+    public TelemetryConfig addConfig(TelemetryConfig config) {
+        return configs.compute(config.name(), (name, oldConfig) ->
+                oldConfig == null ? config : oldConfig.merge(config));
+    }
+
+    /**
+     * Removes the specified configuration from the provider.
+     *
+     * @param config telemetry configuration
+     */
+    public void removeConfig(TelemetryConfig config) {
+        configs.remove(config.name());
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(this).add("configs", configs).toString();
+    }
+}
diff --git a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/DistributedTelemetryConfigStore.java b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/DistributedTelemetryConfigStore.java
new file mode 100644
index 0000000..b1d6133
--- /dev/null
+++ b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/DistributedTelemetryConfigStore.java
@@ -0,0 +1,202 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.openstacktelemetry.impl;
+
+import com.google.common.collect.ImmutableSet;
+import org.onlab.util.KryoNamespace;
+import org.onosproject.core.ApplicationId;
+import org.onosproject.core.CoreService;
+import org.onosproject.openstacktelemetry.api.TelemetryConfigEvent;
+import org.onosproject.openstacktelemetry.api.TelemetryConfigProvider;
+import org.onosproject.openstacktelemetry.api.TelemetryConfigStore;
+import org.onosproject.openstacktelemetry.api.TelemetryConfigStoreDelegate;
+import org.onosproject.openstacktelemetry.api.config.TelemetryConfig;
+import org.onosproject.openstacktelemetry.api.config.TelemetryConfig.ConfigType;
+import org.onosproject.store.AbstractStore;
+import org.onosproject.store.serializers.KryoNamespaces;
+import org.onosproject.store.service.ConsistentMap;
+import org.onosproject.store.service.MapEvent;
+import org.onosproject.store.service.MapEventListener;
+import org.onosproject.store.service.Serializer;
+import org.onosproject.store.service.StorageService;
+import org.onosproject.store.service.Versioned;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Deactivate;
+import org.osgi.service.component.annotations.Reference;
+import org.osgi.service.component.annotations.ReferenceCardinality;
+import org.slf4j.Logger;
+
+import java.util.Set;
+import java.util.concurrent.ExecutorService;
+import java.util.stream.Collectors;
+
+import static com.google.common.base.Preconditions.checkArgument;
+import static java.util.concurrent.Executors.newSingleThreadExecutor;
+import static org.onlab.util.Tools.groupedThreads;
+import static org.onosproject.openstacktelemetry.api.Constants.OPENSTACK_TELEMETRY_APP_ID;
+import static org.onosproject.openstacktelemetry.api.TelemetryConfigEvent.Type.CONFIG_ADDED;
+import static org.onosproject.openstacktelemetry.api.TelemetryConfigEvent.Type.CONFIG_DELETED;
+import static org.onosproject.openstacktelemetry.api.TelemetryConfigEvent.Type.CONFIG_UPDATED;
+import static org.slf4j.LoggerFactory.getLogger;
+
+/**
+ * Manages the inventory of telemetry configurations using a {@code ConsistentMap}.
+ */
+@Component(immediate = true, service = TelemetryConfigStore.class)
+public class DistributedTelemetryConfigStore
+        extends AbstractStore<TelemetryConfigEvent, TelemetryConfigStoreDelegate>
+        implements TelemetryConfigStore {
+
+    protected final Logger log = getLogger(getClass());
+
+    private static final String ERR_NOT_FOUND = " does not exist";
+    private static final String ERR_DUPLICATE = " already exists";
+
+    private static final KryoNamespace SERIALIZER_TELEMETRY_CONFIG =
+            KryoNamespace.newBuilder()
+                    .register(KryoNamespaces.API)
+                    .register(TelemetryConfigProvider.class)
+                    .register(DefaultTelemetryConfigProvider.class)
+                    .register(TelemetryConfig.class)
+                    .register(TelemetryConfig.ConfigType.class)
+                    .register(DefaultTelemetryConfig.class)
+                    .build();
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
+    protected CoreService coreService;
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
+    protected StorageService storageService;
+
+    private final ExecutorService eventExecutor = newSingleThreadExecutor(
+            groupedThreads(this.getClass().getSimpleName(), "event-handler", log));
+
+    private final MapEventListener<String, TelemetryConfig>
+            telemetryConfigMapListener = new TelemetryConfigMapListener();
+
+    private ConsistentMap<String, TelemetryConfig> telemetryConfigStore;
+
+    @Activate
+    protected void activate() {
+        ApplicationId appId = coreService.registerApplication(OPENSTACK_TELEMETRY_APP_ID);
+
+        telemetryConfigStore = storageService.<String, TelemetryConfig>consistentMapBuilder()
+                .withSerializer(Serializer.using(SERIALIZER_TELEMETRY_CONFIG))
+                .withName("telemetry-config-store")
+                .withApplicationId(appId)
+                .build();
+        telemetryConfigStore.addListener(telemetryConfigMapListener);
+
+        log.info("Started");
+    }
+
+    @Deactivate
+    protected void deactivate() {
+        telemetryConfigStore.removeListener(telemetryConfigMapListener);
+        eventExecutor.shutdown();
+
+        log.info("Stopped");
+    }
+
+    @Override
+    public void createTelemetryConfig(TelemetryConfig config) {
+        telemetryConfigStore.compute(config.name(), (name, existing) -> {
+            final String error = config.name() + ERR_DUPLICATE;
+            checkArgument(existing == null, error);
+            return config;
+        });
+    }
+
+    @Override
+    public void updateTelemetryConfig(TelemetryConfig config) {
+        telemetryConfigStore.compute(config.name(), (name, existing) -> {
+            final String error = config.name() + ERR_NOT_FOUND;
+            checkArgument(existing != null, error);
+            return config;
+        });
+    }
+
+    @Override
+    public TelemetryConfig removeTelemetryConfig(String name) {
+        Versioned<TelemetryConfig> config = telemetryConfigStore.remove(name);
+        return config == null ? null : config.value();
+    }
+
+    @Override
+    public TelemetryConfig telemetryConfig(String name) {
+        return telemetryConfigStore.asJavaMap().get(name);
+    }
+
+    @Override
+    public Set<TelemetryConfig> telemetryConfigs() {
+        return ImmutableSet.copyOf(telemetryConfigStore.asJavaMap().values());
+    }
+
+    @Override
+    public Set<TelemetryConfig> telemetryConfigsByType(ConfigType type) {
+        return ImmutableSet.copyOf(telemetryConfigStore.asJavaMap().values()
+                .stream().filter(c -> c.type() == type).collect(Collectors.toSet()));
+    }
+
+    @Override
+    public void clear() {
+        telemetryConfigStore.clear();
+    }
+
+    private class TelemetryConfigMapListener
+                        implements MapEventListener<String, TelemetryConfig> {
+
+        @Override
+        public void event(MapEvent<String, TelemetryConfig> event) {
+            switch (event.type()) {
+                case INSERT:
+                    eventExecutor.execute(() -> processTelemetryConfigMapInsertion(event));
+                    break;
+                case UPDATE:
+                    eventExecutor.execute(() -> processTelemetryConfigMapUpdate(event));
+                    break;
+                case REMOVE:
+                    eventExecutor.execute(() -> processTelemetryConfigMapRemoval(event));
+                    break;
+                default:
+                    log.error("Unsupported telemetry config event type");
+                    break;
+            }
+        }
+
+        private void processTelemetryConfigMapInsertion(MapEvent<String,
+                                                        TelemetryConfig> event) {
+            log.debug("Telemetry config created");
+            notifyDelegate(new TelemetryConfigEvent(
+                    CONFIG_ADDED, event.newValue().value()));
+        }
+
+        private void processTelemetryConfigMapUpdate(MapEvent<String,
+                                                     TelemetryConfig> event) {
+            log.debug("Telemetry config updated");
+            notifyDelegate(new TelemetryConfigEvent(
+                    CONFIG_UPDATED, event.newValue().value()));
+        }
+
+        private void processTelemetryConfigMapRemoval(MapEvent<String,
+                                                      TelemetryConfig> event) {
+            log.debug("Telemetry config removed");
+            notifyDelegate(new TelemetryConfigEvent(
+                    CONFIG_DELETED, event.oldValue().value()));
+        }
+    }
+}
diff --git a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/GrpcConfigsLoader.java b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/GrpcConfigsLoader.java
new file mode 100644
index 0000000..f7e4693
--- /dev/null
+++ b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/GrpcConfigsLoader.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.openstacktelemetry.impl;
+
+import org.osgi.service.component.annotations.Component;
+
+/**
+ * Loader for gRPC telemetry configurations.
+ */
+@Component(immediate = true)
+public class GrpcConfigsLoader extends AbstractTelemetryConfigLoader {
+    public GrpcConfigsLoader() {
+        super("grpc-configs.xml");
+    }
+}
diff --git a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/GrpcTelemetryConfigManager.java b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/GrpcTelemetryConfigManager.java
deleted file mode 100644
index 70b1d70..0000000
--- a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/GrpcTelemetryConfigManager.java
+++ /dev/null
@@ -1,182 +0,0 @@
-/*
- * Copyright 2018-present Open Networking Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.onosproject.openstacktelemetry.impl;
-
-import org.onlab.util.Tools;
-import org.onosproject.cfg.ComponentConfigService;
-import org.onosproject.openstacktelemetry.api.GrpcTelemetryAdminService;
-import org.onosproject.openstacktelemetry.api.GrpcTelemetryConfigService;
-import org.onosproject.openstacktelemetry.api.config.TelemetryConfig;
-import org.onosproject.openstacktelemetry.config.DefaultGrpcTelemetryConfig;
-import org.osgi.service.component.ComponentContext;
-import org.osgi.service.component.annotations.Activate;
-import org.osgi.service.component.annotations.Component;
-import org.osgi.service.component.annotations.Deactivate;
-import org.osgi.service.component.annotations.Modified;
-import org.osgi.service.component.annotations.Reference;
-import org.osgi.service.component.annotations.ReferenceCardinality;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.Dictionary;
-
-import static org.onlab.util.Tools.get;
-import static org.onlab.util.Tools.getIntegerProperty;
-import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.GRPC_ENABLE_SERVICE_DEFAULT;
-import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.GRPC_MAX_INBOUND_MSG_SIZE_DEFAULT;
-import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.GRPC_SERVER_ADDRESS_DEFAULT;
-import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.GRPC_SERVER_PORT_DEFAULT;
-import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.GRPC_USE_PLAINTEXT_DEFAULT;
-import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROP_GRPC_ENABLE_SERVICE;
-import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROP_GRPC_MAX_INBOUND_MSG_SIZE;
-import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROP_GRPC_SERVER_ADDRESS;
-import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROP_GRPC_SERVER_PORT;
-import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROP_GRPC_USE_PLAINTEXT;
-import static org.onosproject.openstacktelemetry.util.OpenstackTelemetryUtil.getBooleanProperty;
-import static org.onosproject.openstacktelemetry.util.OpenstackTelemetryUtil.initTelemetryService;
-
-/**
- * gRPC server configuration manager for publishing openstack telemetry.
- */
-@Component(
-    immediate = true,
-    service = GrpcTelemetryConfigService.class,
-    property = {
-        PROP_GRPC_ENABLE_SERVICE + ":Boolean=" + GRPC_ENABLE_SERVICE_DEFAULT,
-        PROP_GRPC_SERVER_ADDRESS  + "=" + GRPC_SERVER_ADDRESS_DEFAULT,
-        PROP_GRPC_SERVER_PORT + ":Integer=" + GRPC_SERVER_PORT_DEFAULT,
-        PROP_GRPC_USE_PLAINTEXT + ":Boolean=" + GRPC_USE_PLAINTEXT_DEFAULT,
-        PROP_GRPC_MAX_INBOUND_MSG_SIZE + ":Integer=" + GRPC_MAX_INBOUND_MSG_SIZE_DEFAULT
-    }
-)
-public class GrpcTelemetryConfigManager implements GrpcTelemetryConfigService {
-
-    private final Logger log = LoggerFactory.getLogger(getClass());
-
-    @Reference(cardinality = ReferenceCardinality.MANDATORY)
-    protected ComponentConfigService componentConfigService;
-
-    @Reference(cardinality = ReferenceCardinality.MANDATORY)
-    protected GrpcTelemetryAdminService grpcTelemetryAdminService;
-
-    /** Default IP address to establish initial connection to gRPC server. */
-    protected String address = GRPC_SERVER_ADDRESS_DEFAULT;
-
-    /** Default port number to establish initial connection to gRPC server. */
-    protected Integer port = GRPC_SERVER_PORT_DEFAULT;
-
-    /** UsePlaintext flag value used for connecting to gRPC server. */
-    protected Boolean usePlaintext = GRPC_USE_PLAINTEXT_DEFAULT;
-
-    /** Maximum inbound message size used for communicating with gRPC server. */
-    protected Integer maxInboundMsgSize = GRPC_MAX_INBOUND_MSG_SIZE_DEFAULT;
-
-    /** Specify the default behavior of telemetry service. */
-    protected Boolean enableService = GRPC_ENABLE_SERVICE_DEFAULT;
-
-    @Activate
-    protected void activate(ComponentContext context) {
-        componentConfigService.registerProperties(getClass());
-
-        if (enableService) {
-            grpcTelemetryAdminService.start(getConfig());
-        }
-        log.info("Started");
-    }
-
-    @Deactivate
-    protected void deactivate() {
-        componentConfigService.unregisterProperties(getClass(), false);
-
-        if (enableService) {
-            grpcTelemetryAdminService.stop();
-        }
-        log.info("Stopped");
-    }
-
-    @Modified
-    private void modified(ComponentContext context) {
-        readComponentConfiguration(context);
-        initTelemetryService(grpcTelemetryAdminService, getConfig(), enableService);
-        log.info("Modified");
-    }
-
-    @Override
-    public TelemetryConfig getConfig() {
-        return new DefaultGrpcTelemetryConfig.DefaultBuilder()
-                .withAddress(address)
-                .withPort(port)
-                .withUsePlaintext(usePlaintext)
-                .withMaxInboundMsgSize(maxInboundMsgSize)
-                .build();
-    }
-
-    /**
-     * Extracts properties from the component configuration context.
-     *
-     * @param context the component context
-     */
-    private void readComponentConfiguration(ComponentContext context) {
-        Dictionary<?, ?> properties = context.getProperties();
-
-        String addressStr = get(properties, PROP_GRPC_SERVER_ADDRESS);
-        address = addressStr != null ? addressStr : GRPC_SERVER_ADDRESS_DEFAULT;
-        log.info("Configured. gRPC server address is {}", address);
-
-        Integer portConfigured = Tools.getIntegerProperty(properties, PROP_GRPC_SERVER_PORT);
-        if (portConfigured == null) {
-            port = GRPC_SERVER_PORT_DEFAULT;
-            log.info("gRPC server port is NOT configured, default value is {}", port);
-        } else {
-            port = portConfigured;
-            log.info("Configured. gRPC server port is {}", port);
-        }
-
-        Boolean usePlaintextConfigured =
-                getBooleanProperty(properties, PROP_GRPC_USE_PLAINTEXT);
-        if (usePlaintextConfigured == null) {
-            usePlaintext = GRPC_USE_PLAINTEXT_DEFAULT;
-            log.info("gRPC server use plaintext flag is NOT " +
-                    "configured, default value is {}", usePlaintext);
-        } else {
-            usePlaintext = usePlaintextConfigured;
-            log.info("Configured. gRPC server use plaintext flag is {}", usePlaintext);
-        }
-
-        Integer maxInboundMsgSizeConfigured =
-                getIntegerProperty(properties, PROP_GRPC_MAX_INBOUND_MSG_SIZE);
-        if (maxInboundMsgSizeConfigured == null) {
-            maxInboundMsgSize = GRPC_MAX_INBOUND_MSG_SIZE_DEFAULT;
-            log.info("gRPC server max inbound message size is NOT " +
-                    "configured, default value is {}", maxInboundMsgSize);
-        } else {
-            maxInboundMsgSize = maxInboundMsgSizeConfigured;
-            log.info("Configured. gRPC server max inbound message size is {}", maxInboundMsgSize);
-        }
-
-        Boolean enableServiceConfigured =
-                getBooleanProperty(properties, PROP_GRPC_ENABLE_SERVICE);
-        if (enableServiceConfigured == null) {
-            enableService = GRPC_ENABLE_SERVICE_DEFAULT;
-            log.info("gRPC service enable flag is NOT " +
-                    "configured, default value is {}", enableService);
-        } else {
-            enableService = enableServiceConfigured;
-            log.info("Configured. gRPC service enable flag is {}", enableService);
-        }
-    }
-
-}
diff --git a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/GrpcTelemetryManager.java b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/GrpcTelemetryManager.java
index 391b1d8..f487504 100644
--- a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/GrpcTelemetryManager.java
+++ b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/GrpcTelemetryManager.java
@@ -15,12 +15,13 @@
  */
 package org.onosproject.openstacktelemetry.impl;
 
+import com.google.common.collect.Sets;
 import io.grpc.ManagedChannel;
 import io.grpc.ManagedChannelBuilder;
 import org.onosproject.openstacktelemetry.api.GrpcTelemetryAdminService;
 import org.onosproject.openstacktelemetry.api.OpenstackTelemetryService;
+import org.onosproject.openstacktelemetry.api.TelemetryConfigService;
 import org.onosproject.openstacktelemetry.api.config.GrpcTelemetryConfig;
-import org.onosproject.openstacktelemetry.api.config.TelemetryConfig;
 import org.osgi.service.component.annotations.Activate;
 import org.osgi.service.component.annotations.Component;
 import org.osgi.service.component.annotations.Deactivate;
@@ -29,6 +30,12 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import java.util.Set;
+
+import static org.onosproject.openstacktelemetry.api.Constants.GRPC_SCHEME;
+import static org.onosproject.openstacktelemetry.api.config.TelemetryConfig.ConfigType.GRPC;
+import static org.onosproject.openstacktelemetry.config.DefaultGrpcTelemetryConfig.fromTelemetryConfig;
+
 /**
  * gRPC telemetry manager.
  */
@@ -40,7 +47,10 @@
     @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected OpenstackTelemetryService openstackTelemetryService;
 
-    private ManagedChannel channel = null;
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
+    protected TelemetryConfigService telemetryConfigService;
+
+    private Set<ManagedChannel> channels = Sets.newConcurrentHashSet();
 
     @Activate
     protected void activate() {
@@ -60,43 +70,41 @@
     }
 
     @Override
-    public void start(TelemetryConfig config) {
-        if (channel != null) {
-            log.info("gRPC producer has already been started");
-            return;
-        }
+    public void start() {
+        telemetryConfigService.getConfigsByType(GRPC).forEach(c -> {
+            GrpcTelemetryConfig grpcConfig = fromTelemetryConfig(c);
 
-        GrpcTelemetryConfig grpcConfig = (GrpcTelemetryConfig) config;
-        channel = ManagedChannelBuilder
-                .forAddress(grpcConfig.address(), grpcConfig.port())
-                .maxInboundMessageSize(grpcConfig.maxInboundMsgSize())
-                .usePlaintext(grpcConfig.usePlaintext())
-                .build();
+            if (grpcConfig != null && !c.name().equals(GRPC_SCHEME) && c.enabled()) {
+                ManagedChannel channel = ManagedChannelBuilder
+                        .forAddress(grpcConfig.address(), grpcConfig.port())
+                        .maxInboundMessageSize(grpcConfig.maxInboundMsgSize())
+                        .usePlaintext(grpcConfig.usePlaintext())
+                        .build();
+
+                channels.add(channel);
+            }
+        });
 
         log.info("gRPC producer has Started");
     }
 
     @Override
     public void stop() {
-        if (channel != null) {
-            channel.shutdown();
-            channel = null;
-        }
-
+        channels.forEach(ManagedChannel::shutdown);
         log.info("gRPC producer has Stopped");
     }
 
     @Override
-    public void restart(TelemetryConfig config) {
+    public void restart() {
         stop();
-        start(config);
+        start();
     }
 
     @Override
     public Object publish(Object record) {
         // TODO: need to find a way to invoke gRPC endpoint using channel
 
-        if (channel == null) {
+        if (channels.isEmpty()) {
             log.debug("gRPC telemetry service has not been enabled!");
         }
 
@@ -105,6 +113,6 @@
 
     @Override
     public boolean isRunning() {
-        return channel != null;
+        return !channels.isEmpty();
     }
 }
diff --git a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/InfluxDbConfigsLoader.java b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/InfluxDbConfigsLoader.java
new file mode 100644
index 0000000..215e1f6
--- /dev/null
+++ b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/InfluxDbConfigsLoader.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.openstacktelemetry.impl;
+
+import org.osgi.service.component.annotations.Component;
+
+/**
+ * Loader for InfluxDB telemetry configurations.
+ */
+@Component(immediate = true)
+public class InfluxDbConfigsLoader extends AbstractTelemetryConfigLoader {
+    public InfluxDbConfigsLoader() {
+        super("influxdb-configs.xml");
+    }
+}
diff --git a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/InfluxDbTelemetryConfigManager.java b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/InfluxDbTelemetryConfigManager.java
deleted file mode 100644
index d9107ca..0000000
--- a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/InfluxDbTelemetryConfigManager.java
+++ /dev/null
@@ -1,204 +0,0 @@
-/*
- * Copyright 2018-present Open Networking Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.onosproject.openstacktelemetry.impl;
-
-import org.onlab.util.Tools;
-import org.onosproject.cfg.ComponentConfigService;
-import org.onosproject.openstacktelemetry.api.InfluxDbTelemetryAdminService;
-import org.onosproject.openstacktelemetry.api.InfluxDbTelemetryConfigService;
-import org.onosproject.openstacktelemetry.api.config.TelemetryConfig;
-import org.onosproject.openstacktelemetry.config.DefaultInfluxDbTelemetryConfig;
-import org.osgi.service.component.ComponentContext;
-import org.osgi.service.component.annotations.Activate;
-import org.osgi.service.component.annotations.Component;
-import org.osgi.service.component.annotations.Deactivate;
-import org.osgi.service.component.annotations.Modified;
-import org.osgi.service.component.annotations.Reference;
-import org.osgi.service.component.annotations.ReferenceCardinality;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.Dictionary;
-
-import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROP_INFLUXDB_DATABASE;
-import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROP_INFLUXDB_DATABASE_DEFAULT;
-import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROP_INFLUXDB_ENABLE_BATCH;
-import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROP_INFLUXDB_ENABLE_BATCH_DEFAULT;
-import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROP_INFLUXDB_ENABLE_SERVICE;
-import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROP_INFLUXDB_ENABLE_SERVICE_DEFAULT;
-import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROP_INFLUXDB_MEASUREMENT;
-import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROP_INFLUXDB_MEASUREMENT_DEFAULT;
-import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROP_INFLUXDB_PASSWORD;
-import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROP_INFLUXDB_PASSWORD_DEFAULT;
-import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROP_INFLUXDB_SERVER_ADDRESS;
-import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROP_INFLUXDB_SERVER_ADDRESS_DEFAULT;
-import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROP_INFLUXDB_SERVER_PORT;
-import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROP_INFLUXDB_SERVER_PORT_DEFAULT;
-import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROP_INFLUXDB_USERNAME;
-import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROP_INFLUXDB_USERNAME_DEFAULT;
-import static org.onosproject.openstacktelemetry.util.OpenstackTelemetryUtil.getBooleanProperty;
-import static org.onosproject.openstacktelemetry.util.OpenstackTelemetryUtil.initTelemetryService;
-
-/**
- * InfluxDB server configuration manager for publishing openstack telemetry.
- */
-@Component(
-    immediate = true,
-    service = InfluxDbTelemetryConfigService.class,
-    property = {
-        PROP_INFLUXDB_ENABLE_SERVICE + ":Boolean=" + PROP_INFLUXDB_ENABLE_SERVICE_DEFAULT,
-        PROP_INFLUXDB_SERVER_ADDRESS + "=" + PROP_INFLUXDB_SERVER_ADDRESS_DEFAULT,
-        PROP_INFLUXDB_SERVER_PORT + ":Integer=" + PROP_INFLUXDB_SERVER_PORT_DEFAULT,
-        PROP_INFLUXDB_USERNAME + "=" + PROP_INFLUXDB_USERNAME_DEFAULT,
-        PROP_INFLUXDB_PASSWORD + "=" + PROP_INFLUXDB_PASSWORD_DEFAULT,
-        PROP_INFLUXDB_DATABASE + "=" + PROP_INFLUXDB_DATABASE_DEFAULT,
-        PROP_INFLUXDB_MEASUREMENT + "=" + PROP_INFLUXDB_MEASUREMENT_DEFAULT,
-        PROP_INFLUXDB_ENABLE_BATCH + ":Boolean=" + PROP_INFLUXDB_ENABLE_BATCH_DEFAULT
-    }
-)
-public class InfluxDbTelemetryConfigManager implements InfluxDbTelemetryConfigService {
-
-    private final Logger log = LoggerFactory.getLogger(getClass());
-
-    @Reference(cardinality = ReferenceCardinality.MANDATORY)
-    protected ComponentConfigService componentConfigService;
-
-    @Reference(cardinality = ReferenceCardinality.MANDATORY)
-    protected InfluxDbTelemetryAdminService influxDbTelemetryAdminService;
-
-    /** Default IP address to establish initial connection to InfluxDB server. */
-    protected String address = PROP_INFLUXDB_SERVER_ADDRESS_DEFAULT;
-
-    /** Default port number to establish initial connection to InfluxDB server. */
-    protected Integer port = PROP_INFLUXDB_SERVER_PORT_DEFAULT;
-
-    /** Username used for authenticating against InfluxDB server. */
-    protected String username = PROP_INFLUXDB_USERNAME_DEFAULT;
-
-    /** Password used for authenticating against InfluxDB server. */
-    protected String password = PROP_INFLUXDB_PASSWORD_DEFAULT;
-
-    /** Database of InfluxDB server. */
-    protected String database = PROP_INFLUXDB_DATABASE_DEFAULT;
-
-    /** Measurement of InfluxDB server. */
-    protected String measurement = PROP_INFLUXDB_MEASUREMENT_DEFAULT;
-
-    /** Flag value of enabling batch mode of InfluxDB server. */
-    protected Boolean enableBatch = PROP_INFLUXDB_ENABLE_SERVICE_DEFAULT;
-
-    /** Specify the default behavior of telemetry service. */
-    protected Boolean enableService = PROP_INFLUXDB_ENABLE_SERVICE_DEFAULT;
-
-    @Activate
-    protected void activate(ComponentContext context) {
-        componentConfigService.registerProperties(getClass());
-
-        if (enableService) {
-            influxDbTelemetryAdminService.start(getConfig());
-        }
-        log.info("Started");
-    }
-
-    @Deactivate
-    protected void deactivate() {
-        componentConfigService.unregisterProperties(getClass(), false);
-
-        if (enableService) {
-            influxDbTelemetryAdminService.stop();
-        }
-        log.info("Stopped");
-    }
-
-    @Modified
-    private void modified(ComponentContext context) {
-        readComponentConfiguration(context);
-        initTelemetryService(influxDbTelemetryAdminService, getConfig(), enableService);
-        log.info("Modified");
-    }
-
-    @Override
-    public TelemetryConfig getConfig() {
-        return new DefaultInfluxDbTelemetryConfig.DefaultBuilder()
-                .withAddress(address)
-                .withPort(port)
-                .withUsername(username)
-                .withPassword(password)
-                .withDatabase(database)
-                .withMeasurement(measurement)
-                .withEnableBatch(enableBatch)
-                .build();
-    }
-
-    /**
-     * Extracts properties from the component configuration context.
-     *
-     * @param context the component context
-     */
-    private void readComponentConfiguration(ComponentContext context) {
-        Dictionary<?, ?> properties = context.getProperties();
-
-        String addressStr = Tools.get(properties, PROP_INFLUXDB_SERVER_ADDRESS);
-        address = addressStr != null ? addressStr : PROP_INFLUXDB_SERVER_ADDRESS_DEFAULT;
-        log.info("Configured. InfluxDB server address is {}", address);
-
-        Integer portConfigured = Tools.getIntegerProperty(properties, PROP_INFLUXDB_SERVER_PORT);
-        if (portConfigured == null) {
-            port = PROP_INFLUXDB_SERVER_PORT_DEFAULT;
-            log.info("InfluxDB server port is NOT configured, default value is {}", port);
-        } else {
-            port = portConfigured;
-            log.info("Configured. InfluxDB server port is {}", port);
-        }
-
-        String usernameStr = Tools.get(properties, PROP_INFLUXDB_USERNAME);
-        username = usernameStr != null ? usernameStr : PROP_INFLUXDB_USERNAME_DEFAULT;
-        log.info("Configured. InfluxDB server username is {}", username);
-
-        String passwordStr = Tools.get(properties, PROP_INFLUXDB_PASSWORD);
-        password = passwordStr != null ? passwordStr : PROP_INFLUXDB_PASSWORD_DEFAULT;
-        log.info("Configured. InfluxDB server password is {}", password);
-
-        String databaseStr = Tools.get(properties, PROP_INFLUXDB_DATABASE);
-        database = databaseStr != null ? databaseStr : PROP_INFLUXDB_DATABASE_DEFAULT;
-        log.info("Configured. InfluxDB server database is {}", database);
-
-        String measurementStr = Tools.get(properties, PROP_INFLUXDB_MEASUREMENT);
-        measurement = measurementStr != null ? measurementStr : PROP_INFLUXDB_MEASUREMENT_DEFAULT;
-        log.info("Configured. InfluxDB server measurement is {}", measurement);
-
-        Boolean enableBatchConfigured = getBooleanProperty(properties, PROP_INFLUXDB_ENABLE_BATCH);
-        if (enableBatchConfigured == null) {
-            enableBatch = PROP_INFLUXDB_ENABLE_BATCH_DEFAULT;
-            log.info("InfluxDB server enable batch flag is " +
-                    "NOT configured, default value is {}", enableBatch);
-        } else {
-            enableBatch = enableBatchConfigured;
-            log.info("Configured. InfluxDB server enable batch is {}", enableBatch);
-        }
-
-        Boolean enableServiceConfigured =
-                getBooleanProperty(properties, PROP_INFLUXDB_ENABLE_SERVICE);
-        if (enableServiceConfigured == null) {
-            enableService = PROP_INFLUXDB_ENABLE_SERVICE_DEFAULT;
-            log.info("InfluxDB service enable flag is NOT " +
-                    "configured, default value is {}", enableService);
-        } else {
-            enableService = enableServiceConfigured;
-            log.info("Configured. InfluxDB service enable flag is {}", enableService);
-        }
-    }
-}
diff --git a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/InfluxDbTelemetryManager.java b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/InfluxDbTelemetryManager.java
index 40528d4..796da19 100644
--- a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/InfluxDbTelemetryManager.java
+++ b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/InfluxDbTelemetryManager.java
@@ -24,6 +24,7 @@
 import org.onosproject.openstacktelemetry.api.InfluxDbTelemetryAdminService;
 import org.onosproject.openstacktelemetry.api.InfluxRecord;
 import org.onosproject.openstacktelemetry.api.OpenstackTelemetryService;
+import org.onosproject.openstacktelemetry.api.TelemetryConfigService;
 import org.onosproject.openstacktelemetry.api.config.InfluxDbTelemetryConfig;
 import org.onosproject.openstacktelemetry.api.config.TelemetryConfig;
 import org.osgi.service.component.annotations.Activate;
@@ -34,8 +35,13 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import java.util.Map;
 import java.util.Set;
 
+import static org.onosproject.openstacktelemetry.api.Constants.INFLUXDB_SCHEME;
+import static org.onosproject.openstacktelemetry.api.config.TelemetryConfig.ConfigType.INFLUXDB;
+import static org.onosproject.openstacktelemetry.config.DefaultInfluxDbTelemetryConfig.fromTelemetryConfig;
+
 /**
  * InfluxDB telemetry manager.
  */
@@ -70,10 +76,11 @@
     @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected OpenstackTelemetryService openstackTelemetryService;
 
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
+    protected TelemetryConfigService telemetryConfigService;
+
     private static final String INFLUX_PROTOCOL = "http";
-    private InfluxDB producer = null;
-    private String database = null;
-    private String measurement = null;
+    private Map<String, InfluxDB> producers = null;
 
     @Activate
     protected void activate() {
@@ -93,51 +100,49 @@
     }
 
     @Override
-    public void start(TelemetryConfig config) {
-        if (producer != null) {
-            log.info("InfluxDB producer has already been started");
-            return;
-        }
+    public void start() {
 
-        InfluxDbTelemetryConfig influxDbConfig = (InfluxDbTelemetryConfig) config;
+        telemetryConfigService.getConfigsByType(INFLUXDB).forEach(c -> {
+            InfluxDbTelemetryConfig influxDbConfig = fromTelemetryConfig(c);
 
-        StringBuilder influxDbServerBuilder = new StringBuilder();
-        influxDbServerBuilder.append(INFLUX_PROTOCOL);
-        influxDbServerBuilder.append(":");
-        influxDbServerBuilder.append("//");
-        influxDbServerBuilder.append(influxDbConfig.address());
-        influxDbServerBuilder.append(":");
-        influxDbServerBuilder.append(influxDbConfig.port());
+            if (influxDbConfig != null && !c.name().equals(INFLUXDB_SCHEME) && c.enabled()) {
+                StringBuilder influxDbServerBuilder = new StringBuilder();
+                influxDbServerBuilder.append(INFLUX_PROTOCOL);
+                influxDbServerBuilder.append(":");
+                influxDbServerBuilder.append("//");
+                influxDbServerBuilder.append(influxDbConfig.address());
+                influxDbServerBuilder.append(":");
+                influxDbServerBuilder.append(influxDbConfig.port());
 
-        producer = InfluxDBFactory.connect(influxDbServerBuilder.toString(),
-                influxDbConfig.username(), influxDbConfig.password());
-        database = influxDbConfig.database();
-        measurement = influxDbConfig.measurement();
+                InfluxDB producer = InfluxDBFactory.connect(influxDbServerBuilder.toString(),
+                        influxDbConfig.username(), influxDbConfig.password());
+                producers.put(c.name(), producer);
+
+                createDB(producer, influxDbConfig.database());
+            }
+        });
 
         log.info("InfluxDB producer has Started");
-
-        createDB();
     }
 
     @Override
     public void stop() {
-        if (producer != null) {
-            producer.close();
-            producer = null;
+        if (producers != null) {
+            producers.values().forEach(InfluxDB::close);
         }
 
         log.info("InfluxDB producer has stopped");
     }
 
     @Override
-    public void restart(TelemetryConfig config) {
+    public void restart() {
         stop();
-        start(config);
+        start();
     }
 
     @Override
     public void publish(InfluxRecord<String, Set<FlowInfo>> record) {
-        if (producer == null) {
+        if (producers == null || producers.isEmpty()) {
             log.debug("InfluxDB telemetry service has not been enabled!");
             return;
         }
@@ -149,53 +154,61 @@
 
         log.debug("Publish {} stats records to InfluxDB", record.flowInfos().size());
 
-        BatchPoints batchPoints = BatchPoints.database(database).build();
+        producers.forEach((k, v) -> {
+            TelemetryConfig config = telemetryConfigService.getConfig(k);
+            InfluxDbTelemetryConfig influxDbConfig = fromTelemetryConfig(config);
 
-        for (FlowInfo flowInfo: record.flowInfos()) {
-            Point.Builder pointBuilder = Point
-                    .measurement((measurement == null) ? record.measurement() : measurement)
-                    .tag(FLOW_TYPE, String.valueOf(flowInfo.flowType()))
-                    .tag(DEVICE_ID, flowInfo.deviceId().toString())
-                    .tag(INPUT_INTERFACE_ID, String.valueOf(flowInfo.inputInterfaceId()))
-                    .tag(OUTPUT_INTERFACE_ID, String.valueOf(flowInfo.outputInterfaceId()))
-                    .tag(VXLAN_ID, String.valueOf(flowInfo.vxlanId()))
-                    .tag(SRC_IP, flowInfo.srcIp().toString())
-                    .tag(DST_IP, flowInfo.dstIp().toString())
-                    .tag(DST_PORT, getTpPort(flowInfo.dstPort()))
-                    .tag(PROTOCOL, String.valueOf(flowInfo.protocol()))
-                    .addField(STARTUP_TIME, flowInfo.statsInfo().startupTime())
-                    .addField(FST_PKT_ARR_TIME, flowInfo.statsInfo().fstPktArrTime())
-                    .addField(LST_PKT_OFFSET, flowInfo.statsInfo().lstPktOffset())
-                    .addField(PREV_ACC_BYTES, flowInfo.statsInfo().prevAccBytes())
-                    .addField(PREV_ACC_PKTS, flowInfo.statsInfo().prevAccPkts())
-                    .addField(CURR_ACC_BYTES, flowInfo.statsInfo().currAccBytes())
-                    .addField(CURR_ACC_PKTS, flowInfo.statsInfo().currAccPkts())
-                    .addField(ERROR_PKTS, flowInfo.statsInfo().errorPkts())
-                    .addField(DROP_PKTS, flowInfo.statsInfo().dropPkts());
+            String database = influxDbConfig.database();
+            String measurement = influxDbConfig.measurement();
 
-            if (flowInfo.vlanId() != null) {
-                pointBuilder.tag(VLAN_ID, flowInfo.vlanId().toString());
+            BatchPoints batchPoints = BatchPoints.database(database).build();
+
+            for (FlowInfo flowInfo: record.flowInfos()) {
+                Point.Builder pointBuilder = Point
+                        .measurement((measurement == null) ? record.measurement() : measurement)
+                        .tag(FLOW_TYPE, String.valueOf(flowInfo.flowType()))
+                        .tag(DEVICE_ID, flowInfo.deviceId().toString())
+                        .tag(INPUT_INTERFACE_ID, String.valueOf(flowInfo.inputInterfaceId()))
+                        .tag(OUTPUT_INTERFACE_ID, String.valueOf(flowInfo.outputInterfaceId()))
+                        .tag(VXLAN_ID, String.valueOf(flowInfo.vxlanId()))
+                        .tag(SRC_IP, flowInfo.srcIp().toString())
+                        .tag(DST_IP, flowInfo.dstIp().toString())
+                        .tag(DST_PORT, getTpPort(flowInfo.dstPort()))
+                        .tag(PROTOCOL, String.valueOf(flowInfo.protocol()))
+                        .addField(STARTUP_TIME, flowInfo.statsInfo().startupTime())
+                        .addField(FST_PKT_ARR_TIME, flowInfo.statsInfo().fstPktArrTime())
+                        .addField(LST_PKT_OFFSET, flowInfo.statsInfo().lstPktOffset())
+                        .addField(PREV_ACC_BYTES, flowInfo.statsInfo().prevAccBytes())
+                        .addField(PREV_ACC_PKTS, flowInfo.statsInfo().prevAccPkts())
+                        .addField(CURR_ACC_BYTES, flowInfo.statsInfo().currAccBytes())
+                        .addField(CURR_ACC_PKTS, flowInfo.statsInfo().currAccPkts())
+                        .addField(ERROR_PKTS, flowInfo.statsInfo().errorPkts())
+                        .addField(DROP_PKTS, flowInfo.statsInfo().dropPkts());
+
+                if (flowInfo.vlanId() != null) {
+                    pointBuilder.tag(VLAN_ID, flowInfo.vlanId().toString());
+                }
+
+                if (flowInfo.srcPort() != null) {
+                    pointBuilder.tag(SRC_PORT, getTpPort(flowInfo.srcPort()));
+                }
+
+                if (flowInfo.dstPort() != null) {
+                    pointBuilder.tag(DST_PORT, getTpPort(flowInfo.dstPort()));
+                }
+
+                batchPoints.point(pointBuilder.build());
             }
-
-            if (flowInfo.srcPort() != null) {
-                pointBuilder.tag(SRC_PORT, getTpPort(flowInfo.srcPort()));
-            }
-
-            if (flowInfo.dstPort() != null) {
-                pointBuilder.tag(DST_PORT, getTpPort(flowInfo.dstPort()));
-            }
-
-            batchPoints.point(pointBuilder.build());
-        }
-        producer.write(batchPoints);
+            v.write(batchPoints);
+        });
     }
 
     @Override
     public boolean isRunning() {
-        return producer != null;
+        return !producers.isEmpty();
     }
 
-    private void createDB() {
+    private void createDB(InfluxDB producer, String database) {
         if (producer.databaseExists(database)) {
             log.debug("Database {} is already created", database);
         } else {
diff --git a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/KafkaConfigsLoader.java b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/KafkaConfigsLoader.java
new file mode 100644
index 0000000..1eca176
--- /dev/null
+++ b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/KafkaConfigsLoader.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.openstacktelemetry.impl;
+
+import org.osgi.service.component.annotations.Component;
+
+/**
+ * Loader for kafka telemetry configurations.
+ */
+@Component(immediate = true)
+public class KafkaConfigsLoader extends AbstractTelemetryConfigLoader {
+    public KafkaConfigsLoader() {
+        super("kafka-configs.xml");
+    }
+}
diff --git a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/KafkaTelemetryConfigManager.java b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/KafkaTelemetryConfigManager.java
deleted file mode 100644
index 6621e0b..0000000
--- a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/KafkaTelemetryConfigManager.java
+++ /dev/null
@@ -1,240 +0,0 @@
-/*
- * Copyright 2018-present Open Networking Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.onosproject.openstacktelemetry.impl;
-
-import org.onlab.util.Tools;
-import org.onosproject.cfg.ComponentConfigService;
-import org.onosproject.openstacktelemetry.api.KafkaTelemetryAdminService;
-import org.onosproject.openstacktelemetry.api.KafkaTelemetryConfigService;
-import org.onosproject.openstacktelemetry.api.config.TelemetryConfig;
-import org.onosproject.openstacktelemetry.config.DefaultKafkaTelemetryConfig;
-import org.osgi.service.component.ComponentContext;
-import org.osgi.service.component.annotations.Activate;
-import org.osgi.service.component.annotations.Component;
-import org.osgi.service.component.annotations.Deactivate;
-import org.osgi.service.component.annotations.Modified;
-import org.osgi.service.component.annotations.Reference;
-import org.osgi.service.component.annotations.ReferenceCardinality;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.Dictionary;
-
-import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROP_KAFKA_ADDRESS;
-import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROP_KAFKA_ADDRESS_DEFAULT;
-import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROP_KAFKA_BATCH_SIZE;
-import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROP_KAFKA_BATCH_SIZE_DEFAULT;
-import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROP_KAFKA_ENABLE_SERVICE;
-import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROP_KAFKA_ENABLE_SERVICE_DEFAULT;
-import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROP_KAFKA_KEY_SERIALIZER;
-import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROP_KAFKA_KEY_SERIALIZER_DEFAULT;
-import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROP_KAFKA_LINGER_MS;
-import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROP_KAFKA_LINGER_MS_DEFAULT;
-import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROP_KAFKA_MEMORY_BUFFER;
-import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROP_KAFKA_MEMORY_BUFFER_DEFAULT;
-import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROP_KAFKA_PORT;
-import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROP_KAFKA_PORT_DEFAULT;
-import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROP_KAFKA_REQUIRED_ACKS;
-import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROP_KAFKA_REQUIRED_ACKS_DEFAULT;
-import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROP_KAFKA_RETRIES;
-import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROP_KAFKA_RETRIES_DEFAULT;
-import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROP_KAFKA_VALUE_SERIALIZER;
-import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROP_KAFKA_VALUE_SERIALIZER_DEFAULT;
-import static org.onosproject.openstacktelemetry.util.OpenstackTelemetryUtil.getBooleanProperty;
-import static org.onosproject.openstacktelemetry.util.OpenstackTelemetryUtil.initTelemetryService;
-
-/**
- * Kafka server configuration manager for publishing openstack telemetry.
- */
-@Component(
-    immediate = true,
-    service = KafkaTelemetryConfigService.class,
-    property = {
-        PROP_KAFKA_ADDRESS + "=" + PROP_KAFKA_ADDRESS_DEFAULT,
-        PROP_KAFKA_PORT + ":Integer=" + PROP_KAFKA_PORT_DEFAULT,
-        PROP_KAFKA_RETRIES + ":Integer=" + PROP_KAFKA_RETRIES_DEFAULT,
-        PROP_KAFKA_REQUIRED_ACKS + "=" + PROP_KAFKA_REQUIRED_ACKS_DEFAULT,
-        PROP_KAFKA_BATCH_SIZE + ":Integer=" + PROP_KAFKA_BATCH_SIZE_DEFAULT,
-        PROP_KAFKA_LINGER_MS + ":Integer=" + PROP_KAFKA_LINGER_MS_DEFAULT,
-        PROP_KAFKA_MEMORY_BUFFER + ":Integer=" + PROP_KAFKA_MEMORY_BUFFER_DEFAULT,
-        PROP_KAFKA_KEY_SERIALIZER + "=" + PROP_KAFKA_KEY_SERIALIZER_DEFAULT,
-        PROP_KAFKA_VALUE_SERIALIZER + "=" + PROP_KAFKA_VALUE_SERIALIZER_DEFAULT,
-        PROP_KAFKA_ENABLE_SERVICE + ":Boolean=" + PROP_KAFKA_ENABLE_SERVICE_DEFAULT
-    }
-)
-public class KafkaTelemetryConfigManager implements KafkaTelemetryConfigService {
-
-    private final Logger log = LoggerFactory.getLogger(getClass());
-
-    @Reference(cardinality = ReferenceCardinality.MANDATORY)
-    protected ComponentConfigService componentConfigService;
-
-    @Reference(cardinality = ReferenceCardinality.MANDATORY)
-    protected KafkaTelemetryAdminService kafkaTelemetryAdminService;
-
-    /** Default IP address to establish initial connection to Kafka server. */
-    protected String address = PROP_KAFKA_ADDRESS_DEFAULT;
-
-    /** Default port number to establish initial connection to Kafka server. */
-    protected Integer port = PROP_KAFKA_PORT_DEFAULT;
-
-    /** Number of times the producer can retry to send after first failure. */
-    protected int retries = PROP_KAFKA_RETRIES_DEFAULT;
-
-    /** Producer will get an acknowledgement after the leader has replicated the data. */
-    protected String requiredAcks = PROP_KAFKA_REQUIRED_ACKS_DEFAULT;
-
-    /** The largest record batch size allowed by Kafka. */
-    protected Integer batchSize = PROP_KAFKA_BATCH_SIZE_DEFAULT;
-
-    /** The producer groups together any records that arrive between request transmissions into a single batch. */
-    protected Integer lingerMs = PROP_KAFKA_LINGER_MS_DEFAULT;
-
-    /** The total memory used for log cleaner I/O buffers across all cleaner threads. */
-    protected Integer memoryBuffer = PROP_KAFKA_MEMORY_BUFFER_DEFAULT;
-
-    /** Serializer class for key that implements the Serializer interface. */
-    protected String keySerializer = PROP_KAFKA_KEY_SERIALIZER_DEFAULT;
-
-    /** Serializer class for value that implements the Serializer interface. */
-    protected String valueSerializer = PROP_KAFKA_VALUE_SERIALIZER_DEFAULT;
-
-    /** Specify the default behavior of telemetry service. */
-    protected Boolean enableService = PROP_KAFKA_ENABLE_SERVICE_DEFAULT;
-
-    @Activate
-    protected void activate(ComponentContext context) {
-        componentConfigService.registerProperties(getClass());
-
-        if (enableService) {
-            kafkaTelemetryAdminService.start(getConfig());
-        }
-        log.info("Started");
-    }
-
-    @Deactivate
-    protected void deactivate() {
-        componentConfigService.unregisterProperties(getClass(), false);
-
-        if (enableService) {
-            kafkaTelemetryAdminService.stop();
-        }
-        log.info("Stopped");
-    }
-
-    @Modified
-    private void modified(ComponentContext context) {
-        readComponentConfiguration(context);
-        initTelemetryService(kafkaTelemetryAdminService, getConfig(), enableService);
-        log.info("Modified");
-    }
-
-    @Override
-    public TelemetryConfig getConfig() {
-        return new DefaultKafkaTelemetryConfig.DefaultBuilder()
-                .withAddress(address)
-                .withPort(port)
-                .withRetries(retries)
-                .withRequiredAcks(requiredAcks)
-                .withBatchSize(batchSize)
-                .withLingerMs(lingerMs)
-                .withMemoryBuffer(memoryBuffer)
-                .withKeySerializer(keySerializer)
-                .withValueSerializer(valueSerializer)
-                .build();
-    }
-
-    /**
-     * Extracts properties from the component configuration context.
-     *
-     * @param context the component context
-     */
-    private void readComponentConfiguration(ComponentContext context) {
-        Dictionary<?, ?> properties = context.getProperties();
-
-        String addressStr = Tools.get(properties, PROP_KAFKA_ADDRESS);
-        address = addressStr != null ? addressStr : PROP_KAFKA_ADDRESS_DEFAULT;
-        log.info("Configured. Kafka server address is {}", address);
-
-        Integer portConfigured = Tools.getIntegerProperty(properties, PROP_KAFKA_PORT);
-        if (portConfigured == null) {
-            port = PROP_KAFKA_PORT_DEFAULT;
-            log.info("Kafka server port is NOT configured, default value is {}", port);
-        } else {
-            port = portConfigured;
-            log.info("Configured. Kafka server port is {}", port);
-        }
-
-        Integer retriesConfigured = Tools.getIntegerProperty(properties, PROP_KAFKA_RETRIES);
-        if (retriesConfigured == null) {
-            retries = PROP_KAFKA_RETRIES_DEFAULT;
-            log.info("Kafka number of retries property is NOT configured, default value is {}", retries);
-        } else {
-            retries = retriesConfigured;
-            log.info("Configured. Kafka number of retries is {}", retries);
-        }
-
-        String requiredAcksStr = Tools.get(properties, PROP_KAFKA_REQUIRED_ACKS);
-        requiredAcks = requiredAcksStr != null ? requiredAcksStr : PROP_KAFKA_REQUIRED_ACKS_DEFAULT;
-        log.info("Configured, Kafka required acknowledgement is {}", requiredAcks);
-
-        Integer batchSizeConfigured = Tools.getIntegerProperty(properties, PROP_KAFKA_BATCH_SIZE);
-        if (batchSizeConfigured == null) {
-            batchSize = PROP_KAFKA_BATCH_SIZE_DEFAULT;
-            log.info("Kafka batch size property is NOT configured, default value is {}", batchSize);
-        } else {
-            batchSize = batchSizeConfigured;
-            log.info("Configured. Kafka batch size is {}", batchSize);
-        }
-
-        Integer lingerMsConfigured = Tools.getIntegerProperty(properties, PROP_KAFKA_LINGER_MS);
-        if (lingerMsConfigured == null) {
-            lingerMs = PROP_KAFKA_LINGER_MS_DEFAULT;
-            log.info("Kafka lingerMs property is NOT configured, default value is {}", lingerMs);
-        } else {
-            lingerMs = lingerMsConfigured;
-            log.info("Configured. Kafka lingerMs is {}", lingerMs);
-        }
-
-        Integer memoryBufferConfigured = Tools.getIntegerProperty(properties, PROP_KAFKA_MEMORY_BUFFER);
-        if (memoryBufferConfigured == null) {
-            memoryBuffer = PROP_KAFKA_MEMORY_BUFFER_DEFAULT;
-            log.info("Kafka memory buffer property is NOT configured, default value is {}", memoryBuffer);
-        } else {
-            memoryBuffer = memoryBufferConfigured;
-            log.info("Configured. Kafka memory buffer is {}", memoryBuffer);
-        }
-
-        String keySerializerStr = Tools.get(properties, PROP_KAFKA_KEY_SERIALIZER);
-        keySerializer = keySerializerStr != null ? keySerializerStr : PROP_KAFKA_KEY_SERIALIZER_DEFAULT;
-        log.info("Configured, Kafka key serializer is {}", keySerializer);
-
-        String valueSerializerStr = Tools.get(properties, PROP_KAFKA_VALUE_SERIALIZER);
-        valueSerializer = valueSerializerStr != null ? valueSerializerStr : PROP_KAFKA_VALUE_SERIALIZER_DEFAULT;
-        log.info("Configured, Kafka value serializer is {}", valueSerializer);
-
-        Boolean enableServiceConfigured =
-                getBooleanProperty(properties, PROP_KAFKA_ENABLE_SERVICE);
-        if (enableServiceConfigured == null) {
-            enableService = PROP_KAFKA_ENABLE_SERVICE_DEFAULT;
-            log.info("Kafka service enable flag is NOT " +
-                    "configured, default value is {}", enableService);
-        } else {
-            enableService = enableServiceConfigured;
-            log.info("Configured. Kafka service enable flag is {}", enableService);
-        }
-    }
-}
diff --git a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/KafkaTelemetryManager.java b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/KafkaTelemetryManager.java
index e895e46..85f36e3 100644
--- a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/KafkaTelemetryManager.java
+++ b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/KafkaTelemetryManager.java
@@ -15,12 +15,17 @@
  */
 package org.onosproject.openstacktelemetry.impl;
 
+import com.google.common.collect.Maps;
+import com.google.common.collect.Sets;
 import org.apache.kafka.clients.producer.KafkaProducer;
 import org.apache.kafka.clients.producer.Producer;
 import org.apache.kafka.clients.producer.ProducerRecord;
 import org.apache.kafka.clients.producer.RecordMetadata;
+import org.onosproject.openstacktelemetry.api.FlowInfo;
 import org.onosproject.openstacktelemetry.api.KafkaTelemetryAdminService;
 import org.onosproject.openstacktelemetry.api.OpenstackTelemetryService;
+import org.onosproject.openstacktelemetry.api.TelemetryCodec;
+import org.onosproject.openstacktelemetry.api.TelemetryConfigService;
 import org.onosproject.openstacktelemetry.api.config.KafkaTelemetryConfig;
 import org.onosproject.openstacktelemetry.api.config.TelemetryConfig;
 import org.osgi.service.component.annotations.Activate;
@@ -31,9 +36,16 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import java.nio.ByteBuffer;
+import java.util.Map;
 import java.util.Properties;
+import java.util.Set;
 import java.util.concurrent.Future;
 
+import static org.onosproject.openstacktelemetry.api.Constants.KAFKA_SCHEME;
+import static org.onosproject.openstacktelemetry.api.config.TelemetryConfig.ConfigType.KAFKA;
+import static org.onosproject.openstacktelemetry.config.DefaultKafkaTelemetryConfig.fromTelemetryConfig;
+
 /**
  * Kafka telemetry manager.
  */
@@ -42,6 +54,8 @@
 
     private final Logger log = LoggerFactory.getLogger(getClass());
 
+    private static final String CODEC_PREFIX = "org.onosproject.openstacktelemetry.codec.";
+
     private static final String BOOTSTRAP_SERVERS = "bootstrap.servers";
     private static final String RETRIES = "retries";
     private static final String ACKS = "acks";
@@ -54,7 +68,10 @@
     @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected OpenstackTelemetryService openstackTelemetryService;
 
-    private Producer<String, byte[]> producer = null;
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
+    protected TelemetryConfigService telemetryConfigService;
+
+    private Map<String, Producer<String, byte[]>> producers = Maps.newConcurrentMap();
 
     @Activate
     protected void activate() {
@@ -74,64 +91,83 @@
     }
 
     @Override
-    public void start(TelemetryConfig config) {
-        if (producer != null) {
-            log.info("Kafka producer has already been started");
-            return;
-        }
+    public void start() {
+        telemetryConfigService.getConfigsByType(KAFKA).forEach(c -> {
+            KafkaTelemetryConfig kafkaConfig = fromTelemetryConfig(c);
 
-        KafkaTelemetryConfig kafkaConfig = (KafkaTelemetryConfig) config;
+            if (kafkaConfig != null && !c.name().equals(KAFKA_SCHEME) && c.enabled()) {
+                StringBuilder kafkaServerBuilder = new StringBuilder();
+                kafkaServerBuilder.append(kafkaConfig.address());
+                kafkaServerBuilder.append(":");
+                kafkaServerBuilder.append(kafkaConfig.port());
 
-        StringBuilder kafkaServerBuilder = new StringBuilder();
-        kafkaServerBuilder.append(kafkaConfig.address());
-        kafkaServerBuilder.append(":");
-        kafkaServerBuilder.append(kafkaConfig.port());
+                // Configure Kafka server properties
+                Properties prop = new Properties();
+                prop.put(BOOTSTRAP_SERVERS, kafkaServerBuilder.toString());
+                prop.put(RETRIES, kafkaConfig.retries());
+                prop.put(ACKS, kafkaConfig.requiredAcks());
+                prop.put(BATCH_SIZE, kafkaConfig.batchSize());
+                prop.put(LINGER_MS, kafkaConfig.lingerMs());
+                prop.put(MEMORY_BUFFER, kafkaConfig.memoryBuffer());
+                prop.put(KEY_SERIALIZER, kafkaConfig.keySerializer());
+                prop.put(VALUE_SERIALIZER, kafkaConfig.valueSerializer());
 
-        // Configure Kafka server properties
-        Properties prop = new Properties();
-        prop.put(BOOTSTRAP_SERVERS, kafkaServerBuilder.toString());
-        prop.put(RETRIES, kafkaConfig.retries());
-        prop.put(ACKS, kafkaConfig.requiredAcks());
-        prop.put(BATCH_SIZE, kafkaConfig.batchSize());
-        prop.put(LINGER_MS, kafkaConfig.lingerMs());
-        prop.put(MEMORY_BUFFER, kafkaConfig.memoryBuffer());
-        prop.put(KEY_SERIALIZER, kafkaConfig.keySerializer());
-        prop.put(VALUE_SERIALIZER, kafkaConfig.valueSerializer());
+                producers.put(c.name(), new KafkaProducer<>(prop));
+            }
+        });
 
-        producer = new KafkaProducer<>(prop);
         log.info("Kafka producer has Started");
     }
 
     @Override
     public void stop() {
-        if (producer != null) {
-            producer.close();
-            producer = null;
+        if (!producers.isEmpty()) {
+            producers.values().forEach(Producer::close);
         }
 
+        producers.clear();
+
         log.info("Kafka producer has Stopped");
     }
 
     @Override
-    public void restart(TelemetryConfig config) {
+    public void restart() {
         stop();
-        start(config);
+        start();
     }
 
     @Override
-    public Future<RecordMetadata> publish(ProducerRecord<String, byte[]> record) {
+    public Set<Future<RecordMetadata>> publish(Set<FlowInfo> flowInfos) {
 
-        if (producer == null) {
+        if (producers == null || producers.isEmpty()) {
             log.debug("Kafka telemetry service has not been enabled!");
             return null;
         }
 
         log.debug("Send telemetry record to kafka server...");
-        return producer.send(record);
+        Set<Future<RecordMetadata>> futureSet = Sets.newHashSet();
+        producers.forEach((k, v) -> {
+            TelemetryConfig config = telemetryConfigService.getConfig(k);
+            KafkaTelemetryConfig kafkaConfig =
+                    fromTelemetryConfig(config);
+
+            try {
+                Class codecClazz = Class.forName(CODEC_PREFIX + kafkaConfig.codec());
+                TelemetryCodec codec = (TelemetryCodec) codecClazz.newInstance();
+
+                ByteBuffer buffer = codec.encode(flowInfos);
+                ProducerRecord record = new ProducerRecord<>(
+                        kafkaConfig.topic(), kafkaConfig.key(), buffer.array());
+                futureSet.add(v.send(record));
+            } catch (ClassNotFoundException | IllegalAccessException | InstantiationException e) {
+                log.warn("Failed to send telemetry record due to {}", e);
+            }
+        });
+        return futureSet;
     }
 
     @Override
     public boolean isRunning() {
-        return producer != null;
+        return !producers.isEmpty();
     }
 }
diff --git a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/OpenstackTelemetryManager.java b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/OpenstackTelemetryManager.java
index 783dbd6..ce325cd 100644
--- a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/OpenstackTelemetryManager.java
+++ b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/OpenstackTelemetryManager.java
@@ -17,8 +17,6 @@
 
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Lists;
-import org.apache.kafka.clients.producer.ProducerRecord;
-import org.onosproject.cfg.ComponentConfigService;
 import org.onosproject.openstacktelemetry.api.FlowInfo;
 import org.onosproject.openstacktelemetry.api.GrpcTelemetryService;
 import org.onosproject.openstacktelemetry.api.InfluxDbTelemetryService;
@@ -26,8 +24,10 @@
 import org.onosproject.openstacktelemetry.api.OpenstackTelemetryService;
 import org.onosproject.openstacktelemetry.api.PrometheusTelemetryService;
 import org.onosproject.openstacktelemetry.api.RestTelemetryService;
-import org.onosproject.openstacktelemetry.api.TelemetryService;
-import org.onosproject.openstacktelemetry.codec.TinaMessageByteBufferCodec;
+import org.onosproject.openstacktelemetry.api.TelemetryAdminService;
+import org.onosproject.openstacktelemetry.api.TelemetryConfigEvent;
+import org.onosproject.openstacktelemetry.api.TelemetryConfigListener;
+import org.onosproject.openstacktelemetry.api.TelemetryConfigService;
 import org.osgi.service.component.annotations.Activate;
 import org.osgi.service.component.annotations.Component;
 import org.osgi.service.component.annotations.Deactivate;
@@ -36,14 +36,10 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import java.nio.ByteBuffer;
 import java.util.List;
 import java.util.Set;
 
 import static org.onosproject.openstacktelemetry.api.Constants.DEFAULT_INFLUXDB_MEASUREMENT;
-import static org.onosproject.openstacktelemetry.codec.TinaMessageByteBufferCodec.KAFKA_KEY;
-import static org.onosproject.openstacktelemetry.codec.TinaMessageByteBufferCodec.KAFKA_TOPIC;
-import static org.onosproject.openstacktelemetry.util.OpenstackTelemetryUtil.getPropertyValueAsBoolean;
 
 /**
  * Openstack telemetry manager.
@@ -53,63 +49,57 @@
 
     private final Logger log = LoggerFactory.getLogger(getClass());
 
-    private static final String ENABLE_SERVICE = "enableService";
-
     @Reference(cardinality = ReferenceCardinality.MANDATORY)
-    protected ComponentConfigService componentConfigService;
+    protected TelemetryConfigService telemetryConfigService;
 
-    private List<TelemetryService> telemetryServices = Lists.newArrayList();
+    private List<TelemetryAdminService> telemetryServices = Lists.newArrayList();
+    private InternalTelemetryConfigListener
+                        configListener = new InternalTelemetryConfigListener();
 
     @Activate
     protected void activate() {
+        telemetryConfigService.addListener(configListener);
+
         log.info("Started");
     }
 
     @Deactivate
     protected void deactivate() {
+        telemetryConfigService.removeListener(configListener);
+
         log.info("Stopped");
     }
 
     @Override
-    public void addTelemetryService(TelemetryService telemetryService) {
+    public void addTelemetryService(TelemetryAdminService telemetryService) {
         telemetryServices.add(telemetryService);
     }
 
     @Override
-    public void removeTelemetryService(TelemetryService telemetryService) {
+    public void removeTelemetryService(TelemetryAdminService telemetryService) {
         telemetryServices.remove(telemetryService);
     }
 
     @Override
     public void publish(Set<FlowInfo> flowInfos) {
         telemetryServices.forEach(service -> {
-            if (service instanceof GrpcTelemetryManager &&
-                    getPropertyValueAsBoolean(componentConfigService.getProperties(
-                            GrpcTelemetryConfigManager.class.getName()), ENABLE_SERVICE)) {
+            if (service instanceof GrpcTelemetryManager) {
                 invokeGrpcPublisher((GrpcTelemetryService) service, flowInfos);
             }
 
-            if (service instanceof InfluxDbTelemetryManager &&
-                    getPropertyValueAsBoolean(componentConfigService.getProperties(
-                            InfluxDbTelemetryConfigManager.class.getName()), ENABLE_SERVICE)) {
+            if (service instanceof InfluxDbTelemetryManager) {
                 invokeInfluxDbPublisher((InfluxDbTelemetryService) service, flowInfos);
             }
 
-            if (service instanceof PrometheusTelemetryManager &&
-                    getPropertyValueAsBoolean(componentConfigService.getProperties(
-                            PrometheusTelemetryConfigManager.class.getName()), ENABLE_SERVICE)) {
+            if (service instanceof PrometheusTelemetryManager) {
                 invokePrometheusPublisher((PrometheusTelemetryService) service, flowInfos);
             }
 
-            if (service instanceof KafkaTelemetryManager &&
-                    getPropertyValueAsBoolean(componentConfigService.getProperties(
-                            KafkaTelemetryConfigManager.class.getName()), ENABLE_SERVICE)) {
+            if (service instanceof KafkaTelemetryManager) {
                 invokeKafkaPublisher((KafkaTelemetryService) service, flowInfos);
             }
 
-            if (service instanceof RestTelemetryManager &&
-                    getPropertyValueAsBoolean(componentConfigService.getProperties(
-                            RestTelemetryConfigManager.class.getName()), ENABLE_SERVICE)) {
+            if (service instanceof RestTelemetryManager) {
                 invokeRestPublisher((RestTelemetryService) service, flowInfos);
             }
 
@@ -118,31 +108,55 @@
     }
 
     @Override
-    public Set<TelemetryService> telemetryServices() {
+    public Set<TelemetryAdminService> telemetryServices() {
         return ImmutableSet.copyOf(telemetryServices);
     }
 
-    private void invokeGrpcPublisher(GrpcTelemetryService service, Set<FlowInfo> flowInfos) {
+    @Override
+    public TelemetryAdminService telemetryService(String type) {
+        return telemetryServices.stream()
+                .filter(s -> s.type().name().equalsIgnoreCase(type))
+                .findFirst()
+                .orElse(null);
+    }
+
+    private void invokeGrpcPublisher(GrpcTelemetryService service,
+                                     Set<FlowInfo> flowInfos) {
         // TODO: need provide implementation
     }
 
-    private void invokeInfluxDbPublisher(InfluxDbTelemetryService service, Set<FlowInfo> flowInfos) {
+    private void invokeInfluxDbPublisher(InfluxDbTelemetryService service,
+                                         Set<FlowInfo> flowInfos) {
         DefaultInfluxRecord<String, Set<FlowInfo>> influxRecord
                 = new DefaultInfluxRecord<>(DEFAULT_INFLUXDB_MEASUREMENT, flowInfos);
         service.publish(influxRecord);
     }
 
-    private void invokePrometheusPublisher(PrometheusTelemetryService service, Set<FlowInfo> flowInfos) {
+    private void invokePrometheusPublisher(PrometheusTelemetryService service,
+                                           Set<FlowInfo> flowInfos) {
         service.publish(flowInfos);
     }
 
-    private void invokeKafkaPublisher(KafkaTelemetryService service, Set<FlowInfo> flowInfos) {
-        TinaMessageByteBufferCodec codec = new TinaMessageByteBufferCodec();
-        ByteBuffer buffer = codec.encode(flowInfos);
-        service.publish(new ProducerRecord<>(KAFKA_TOPIC, KAFKA_KEY, buffer.array()));
+    private void invokeKafkaPublisher(KafkaTelemetryService service,
+                                      Set<FlowInfo> flowInfos) {
+        service.publish(flowInfos);
     }
 
-    private void invokeRestPublisher(RestTelemetryService service, Set<FlowInfo> flowInfos) {
+    private void invokeRestPublisher(RestTelemetryService service,
+                                     Set<FlowInfo> flowInfos) {
         // TODO: need provide implementation
     }
+
+    private class InternalTelemetryConfigListener implements TelemetryConfigListener {
+
+        @Override
+        public void event(TelemetryConfigEvent event) {
+            TelemetryAdminService service =
+                    telemetryService(event.subject().type().name());
+
+            if (service != null) {
+                service.restart();
+            }
+        }
+    }
 }
diff --git a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/OsgiPropertyConstants.java b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/OsgiPropertyConstants.java
index 325bce2..cc754f5 100644
--- a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/OsgiPropertyConstants.java
+++ b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/OsgiPropertyConstants.java
@@ -23,65 +23,7 @@
     private OsgiPropertyConstants() {
     }
 
-    // REST telemetry
-
-    static final String PROP_REST_ENABLE_SERVICE = "enableService";
-    static final boolean PROP_REST_ENABLE_SERVICE_DEFAULT = false;
-
-    static final String PROP_REST_SERVER_ADDRESS = "address";
-    static final String PROP_REST_SERVER_ADDRESS_DEFAULT = "localhost";
-
-    static final String PROP_REST_SERVER_PORT = "port";
-    static final int PROP_REST_SERVER_PORT_DEFAULT = 80;
-
-    static final String PROP_REST_ENDPOINT = "endpoint";
-    static final String PROP_REST_ENDPOINT_DEFAULT = "telemetry";
-
-    static final String PROP_REST_METHOD = "method";
-    static final String PROP_REST_METHOD_DEFAULT = "POST";
-
-    static final String PROP_REST_REQUEST_MEDIA_TYPE = "requestMediaType";
-    static final String PROP_REST_REQUEST_MEDIA_TYPE_DEFAULT = "application/json";
-
-    static final String PROP_REST_RESPONSE_MEDIA_TYPE = "responseMediaType";
-    static final String PROP_REST_RESPONSE_MEDIA_TYPE_DEFAULT = "application/json";
-
-    // Kafka telemetry
-
-    static final String PROP_KAFKA_ENABLE_SERVICE = "enableService";
-    static final boolean PROP_KAFKA_ENABLE_SERVICE_DEFAULT = false;
-
-    static final String PROP_KAFKA_ADDRESS = "address";
-    static final String PROP_KAFKA_ADDRESS_DEFAULT = "localhost";
-
-    static final String PROP_KAFKA_PORT = "port";
-    static final int PROP_KAFKA_PORT_DEFAULT = 9092;
-
-    static final String PROP_KAFKA_RETRIES = "retries";
-    static final int PROP_KAFKA_RETRIES_DEFAULT = 0;
-
-    static final String PROP_KAFKA_REQUIRED_ACKS = "requiredAcks";
-    static final String PROP_KAFKA_REQUIRED_ACKS_DEFAULT = "all";
-
-    static final String PROP_KAFKA_BATCH_SIZE = "batchSize";
-    static final int PROP_KAFKA_BATCH_SIZE_DEFAULT = 16384;
-
-    static final String PROP_KAFKA_LINGER_MS = "lingerMs";
-    static final int PROP_KAFKA_LINGER_MS_DEFAULT = 1;
-
-    static final String PROP_KAFKA_MEMORY_BUFFER = "memoryBuffer";
-    static final int PROP_KAFKA_MEMORY_BUFFER_DEFAULT = 33554432;
-
-    static final String PROP_KAFKA_KEY_SERIALIZER = "keySerializer";
-    static final String PROP_KAFKA_KEY_SERIALIZER_DEFAULT =
-        "org.apache.kafka.common.serialization.StringSerializer";
-
-    static final String PROP_KAFKA_VALUE_SERIALIZER = "valueSerializer";
-    static final String PROP_KAFKA_VALUE_SERIALIZER_DEFAULT =
-        "org.apache.kafka.common.serialization.ByteArraySerializer";
-
     // Stats flow rule manager
-
     static final String PROP_REVERSE_PATH_STATS = "reversePathStats";
     static final boolean PROP_REVERSE_PATH_STATS_DEFAULT = false;
 
@@ -96,56 +38,4 @@
 
     static final String PROP_MONITOR_UNDERLAY = "monitorUnderlay";
     static final boolean PROP_MONITOR_UNDERLAY_DEFAULT = true;
-
-    // Influx DB Telemetry config manager
-
-    static final String PROP_INFLUXDB_ENABLE_SERVICE = "enableService";
-    static final boolean PROP_INFLUXDB_ENABLE_SERVICE_DEFAULT = false;
-
-    static final String PROP_INFLUXDB_SERVER_ADDRESS = "address";
-    static final String PROP_INFLUXDB_SERVER_ADDRESS_DEFAULT = "localhost";
-
-    static final String PROP_INFLUXDB_SERVER_PORT = "port";
-    static final int PROP_INFLUXDB_SERVER_PORT_DEFAULT = 8086;
-
-    static final String PROP_INFLUXDB_USERNAME = "username";
-    static final String PROP_INFLUXDB_USERNAME_DEFAULT = "onos";
-
-    static final String PROP_INFLUXDB_PASSWORD = "password";
-    static final String PROP_INFLUXDB_PASSWORD_DEFAULT = "onos";
-
-    static final String PROP_INFLUXDB_DATABASE = "database";
-    static final String PROP_INFLUXDB_DATABASE_DEFAULT = "onos";
-
-    static final String PROP_INFLUXDB_MEASUREMENT = "measurement";
-    static final String PROP_INFLUXDB_MEASUREMENT_DEFAULT = "sonaflow";
-
-    static final String PROP_INFLUXDB_ENABLE_BATCH = "enableBatch";
-    static final boolean PROP_INFLUXDB_ENABLE_BATCH_DEFAULT = true;
-
-    // GRPC Telemetry config manager
-    static final String PROP_GRPC_ENABLE_SERVICE = "enableService";
-    static final boolean GRPC_ENABLE_SERVICE_DEFAULT = false;
-
-    static final String PROP_GRPC_SERVER_ADDRESS = "address";
-    static final String GRPC_SERVER_ADDRESS_DEFAULT = "localhost";
-
-    static final String PROP_GRPC_SERVER_PORT = "port";
-    static final int GRPC_SERVER_PORT_DEFAULT = 50051;
-
-    static final String PROP_GRPC_USE_PLAINTEXT = "usePlaintext";
-    static final boolean GRPC_USE_PLAINTEXT_DEFAULT = true;
-
-    static final String PROP_GRPC_MAX_INBOUND_MSG_SIZE = "maxInboundMsgSize";
-    static final int GRPC_MAX_INBOUND_MSG_SIZE_DEFAULT = 4194304; //4 * 1024 * 1024;
-
-    // Prometheus Telemetry config manager
-    static final String PROP_PROMETHEUS_ENABLE_SERVICE = "enableService";
-    static final boolean PROP_PROMETHEUS_ENABLE_SERVICE_DEFAULT = true;
-
-    static final String PROP_PROMETHEUS_EXPORTER_ADDRESS = "address";
-    public static final String PROP_PROMETHEUS_EXPORTER_ADDRESS_DEFAULT = "localhost";
-
-    static final String PROP_PROMETHEUS_EXPORTER_PORT = "port";
-    public static final int PROP_PROMETHEUS_EXPORTER_PORT_DEFAULT = 9555;
 }
diff --git a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/PrometheusConfigsLoader.java b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/PrometheusConfigsLoader.java
new file mode 100644
index 0000000..a7b740d
--- /dev/null
+++ b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/PrometheusConfigsLoader.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.openstacktelemetry.impl;
+
+import org.osgi.service.component.annotations.Component;
+
+/**
+ * Loader for prometheus telemetry configurations.
+ */
+@Component(immediate = true)
+public class PrometheusConfigsLoader extends AbstractTelemetryConfigLoader {
+    public PrometheusConfigsLoader() {
+        super("prometheus-configs.xml");
+    }
+}
diff --git a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/PrometheusTelemetryConfigManager.java b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/PrometheusTelemetryConfigManager.java
deleted file mode 100644
index dcc7023..0000000
--- a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/PrometheusTelemetryConfigManager.java
+++ /dev/null
@@ -1,140 +0,0 @@
-/*
- * Copyright 2018-present Open Networking Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.onosproject.openstacktelemetry.impl;
-
-import org.onlab.util.Tools;
-import org.onosproject.cfg.ComponentConfigService;
-import org.onosproject.openstacktelemetry.api.PrometheusTelemetryAdminService;
-import org.onosproject.openstacktelemetry.api.PrometheusTelemetryConfigService;
-import org.onosproject.openstacktelemetry.api.config.TelemetryConfig;
-import org.onosproject.openstacktelemetry.config.DefaultPrometheusTelemetryConfig;
-import org.osgi.service.component.ComponentContext;
-import org.osgi.service.component.annotations.Activate;
-import org.osgi.service.component.annotations.Component;
-import org.osgi.service.component.annotations.Deactivate;
-import org.osgi.service.component.annotations.Modified;
-import org.osgi.service.component.annotations.Reference;
-import org.osgi.service.component.annotations.ReferenceCardinality;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.Dictionary;
-
-import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROP_PROMETHEUS_ENABLE_SERVICE_DEFAULT;
-import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROP_PROMETHEUS_EXPORTER_ADDRESS_DEFAULT;
-import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROP_PROMETHEUS_EXPORTER_PORT_DEFAULT;
-import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROP_PROMETHEUS_ENABLE_SERVICE;
-import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROP_PROMETHEUS_EXPORTER_ADDRESS;
-import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROP_PROMETHEUS_EXPORTER_PORT;
-import static org.onosproject.openstacktelemetry.util.OpenstackTelemetryUtil.getBooleanProperty;
-import static org.onosproject.openstacktelemetry.util.OpenstackTelemetryUtil.initTelemetryService;
-
-/**
- * Prometheus exporter configuration manager for publishing openstack telemetry.
- */
-@Component(
-    immediate = true,
-    service = PrometheusTelemetryConfigService.class,
-    property = {
-        PROP_PROMETHEUS_ENABLE_SERVICE + ":Boolean=" + PROP_PROMETHEUS_ENABLE_SERVICE_DEFAULT,
-        PROP_PROMETHEUS_EXPORTER_ADDRESS + "=" + PROP_PROMETHEUS_EXPORTER_ADDRESS_DEFAULT,
-        PROP_PROMETHEUS_EXPORTER_PORT + ":Integer=" + PROP_PROMETHEUS_EXPORTER_PORT_DEFAULT
-    }
-)
-public class PrometheusTelemetryConfigManager implements PrometheusTelemetryConfigService {
-
-    private final Logger log = LoggerFactory.getLogger(getClass());
-
-    @Reference(cardinality = ReferenceCardinality.MANDATORY)
-    protected ComponentConfigService componentConfigService;
-
-    @Reference(cardinality = ReferenceCardinality.MANDATORY)
-    protected PrometheusTelemetryAdminService prometheusTelemetryAdminService;
-
-    /** Default IP address of prometheus exporter. */
-    protected String address = PROP_PROMETHEUS_EXPORTER_ADDRESS_DEFAULT;
-
-    /** Default port number of prometheus exporter. */
-    protected Integer port = PROP_PROMETHEUS_EXPORTER_PORT_DEFAULT;
-
-    /** Specify the default behavior of telemetry service. */
-    protected Boolean enableService = PROP_PROMETHEUS_ENABLE_SERVICE_DEFAULT;
-
-    @Activate
-    protected void activate(ComponentContext context) {
-        componentConfigService.registerProperties(getClass());
-        if (enableService) {
-            prometheusTelemetryAdminService.start(getConfig());
-        }
-        log.info("Started");
-    }
-
-    @Deactivate
-    protected void deactivate() {
-        componentConfigService.unregisterProperties(getClass(), false);
-        if (enableService) {
-            prometheusTelemetryAdminService.stop();
-        }
-        log.info("Stopped");
-    }
-
-    @Modified
-    private void modified(ComponentContext context) {
-        readComponentConfiguration(context);
-        initTelemetryService(prometheusTelemetryAdminService, getConfig(), enableService);
-        log.info("Modified");
-    }
-
-    @Override
-    public TelemetryConfig getConfig() {
-        return new DefaultPrometheusTelemetryConfig.DefaultBuilder()
-                .withAddress(address)
-                .withPort(port)
-                .build();
-    }
-
-    /**
-     * Extracts properties from the component configuration context.
-     *
-     * @param context the component context
-     */
-    private void readComponentConfiguration(ComponentContext context) {
-        Dictionary<?, ?> properties = context.getProperties();
-
-        String addressStr = Tools.get(properties, PROP_PROMETHEUS_EXPORTER_ADDRESS);
-        address = addressStr != null ? addressStr : PROP_PROMETHEUS_EXPORTER_ADDRESS_DEFAULT;
-        log.info("Configured. Prometheus exporter address is {}", address);
-
-        Integer portConfigured = Tools.getIntegerProperty(properties, PROP_PROMETHEUS_EXPORTER_PORT);
-        if (portConfigured == null) {
-            port = PROP_PROMETHEUS_EXPORTER_PORT_DEFAULT;
-            log.info("Prometheus exporter port is NOT configured, default value is {}", port);
-        } else {
-            port = portConfigured;
-            log.info("Configured. Prometheus exporter port is {}", port);
-        }
-
-        Boolean enableServiceConfigured = getBooleanProperty(properties, PROP_PROMETHEUS_ENABLE_SERVICE);
-        if (enableServiceConfigured == null) {
-            enableService = PROP_PROMETHEUS_ENABLE_SERVICE_DEFAULT;
-            log.info("Prometheus service enable flag is NOT " +
-                             "configured, default value is {}", enableService);
-        } else {
-            enableService = enableServiceConfigured;
-            log.info("Configured. Prometheus service enable flag is {}", enableService);
-        }
-    }
-}
diff --git a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/PrometheusTelemetryManager.java b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/PrometheusTelemetryManager.java
index 69423ca..7111fc0 100644
--- a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/PrometheusTelemetryManager.java
+++ b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/PrometheusTelemetryManager.java
@@ -15,13 +15,19 @@
  */
 package org.onosproject.openstacktelemetry.impl;
 
+import com.google.common.collect.Sets;
+import io.prometheus.client.Counter;
 import io.prometheus.client.Gauge;
+import io.prometheus.client.exporter.MetricsServlet;
+import org.eclipse.jetty.server.Server;
+import org.eclipse.jetty.servlet.ServletContextHandler;
+import org.eclipse.jetty.servlet.ServletHolder;
 import org.onlab.packet.TpPort;
 import org.onosproject.openstacktelemetry.api.FlowInfo;
 import org.onosproject.openstacktelemetry.api.OpenstackTelemetryService;
 import org.onosproject.openstacktelemetry.api.PrometheusTelemetryAdminService;
+import org.onosproject.openstacktelemetry.api.TelemetryConfigService;
 import org.onosproject.openstacktelemetry.api.config.PrometheusTelemetryConfig;
-import org.onosproject.openstacktelemetry.api.config.TelemetryConfig;
 import org.osgi.service.component.annotations.Activate;
 import org.osgi.service.component.annotations.Component;
 import org.osgi.service.component.annotations.Deactivate;
@@ -30,15 +36,13 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import io.prometheus.client.Counter;
-import io.prometheus.client.exporter.MetricsServlet;
-import org.eclipse.jetty.server.Server;
-import org.eclipse.jetty.servlet.ServletContextHandler;
-import org.eclipse.jetty.servlet.ServletHolder;
-
 import java.util.Arrays;
 import java.util.Set;
 
+import static org.onosproject.openstacktelemetry.api.Constants.PROMETHEUS_SCHEME;
+import static org.onosproject.openstacktelemetry.api.config.TelemetryConfig.ConfigType.PROMETHEUS;
+import static org.onosproject.openstacktelemetry.config.DefaultPrometheusTelemetryConfig.fromTelemetryConfig;
+
 /**
  * Prometheus telemetry manager.
  */
@@ -47,7 +51,7 @@
 
     private final Logger log = LoggerFactory.getLogger(getClass());
 
-    private Server prometheusExporter;
+    private Set<Server> prometheusExporters = Sets.newConcurrentHashSet();
 
     private static final String FLOW_TYPE = "flowType";
     private static final String DEVICE_ID = "deviceId";
@@ -134,6 +138,9 @@
     @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected OpenstackTelemetryService openstackTelemetryService;
 
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
+    protected TelemetryConfigService telemetryConfigService;
+
     @Activate
     protected void activate() {
         openstackTelemetryService.addTelemetryService(this);
@@ -148,38 +155,51 @@
     }
 
     @Override
-    public void start(TelemetryConfig config) {
+    public void start() {
         log.info("Prometheus exporter starts.");
 
-        PrometheusTelemetryConfig prometheusConfig = (PrometheusTelemetryConfig) config;
+        telemetryConfigService.getConfigsByType(PROMETHEUS).forEach(c -> {
+            PrometheusTelemetryConfig prometheusConfig = fromTelemetryConfig(c);
 
-        try {
-            prometheusExporter = new Server(prometheusConfig.port());
-            ServletContextHandler context = new ServletContextHandler();
-            context.setContextPath("/");
-            prometheusExporter.setHandler(context);
-            context.addServlet(new ServletHolder(new MetricsServlet()), "/metrics");
-            log.info("Prometeus server start (Server port:{})", prometheusConfig.port());
-            prometheusExporter.start();
-        } catch (Exception ex) {
-            log.warn("Exception: {}", ex.toString());
-        }
+            if (prometheusConfig != null &&
+                    !c.name().equals(PROMETHEUS_SCHEME) && c.enabled()) {
+                try {
+                    // TODO  Offer a 'Authentication'
+                    Server prometheusExporter = new Server(prometheusConfig.port());
+                    ServletContextHandler context = new ServletContextHandler();
+                    context.setContextPath("/");
+                    prometheusExporter.setHandler(context);
+                    context.addServlet(new ServletHolder(new MetricsServlet()), "/metrics");
+
+                    log.info("Prometheus server start");
+
+                    prometheusExporter.start();
+
+                    prometheusExporters.add(prometheusExporter);
+
+                } catch (Exception ex) {
+                    log.warn("Exception: {}", ex);
+                }
+            }
+        });
     }
 
     @Override
     public void stop() {
-        try {
-            prometheusExporter.stop();
-        } catch (Exception ex) {
-            log.warn("Exception: {}", ex.toString());
-        }
+        prometheusExporters.forEach(pe -> {
+            try {
+                pe.stop();
+            } catch (Exception e) {
+                log.warn("Failed to stop prometheus server due to {}", e);
+            }
+        });
         log.info("Prometheus exporter has stopped");
     }
 
     @Override
-    public void restart(TelemetryConfig config) {
+    public void restart() {
         stop();
-        start(config);
+        start();
     }
 
     @Override
@@ -247,6 +267,6 @@
 
     @Override
     public boolean isRunning() {
-        return prometheusExporter.isRunning();
+        return !prometheusExporters.isEmpty();
     }
 }
diff --git a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/RestConfigsLoader.java b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/RestConfigsLoader.java
new file mode 100644
index 0000000..ffe6cbc
--- /dev/null
+++ b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/RestConfigsLoader.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.openstacktelemetry.impl;
+
+import org.osgi.service.component.annotations.Component;
+
+/**
+ * Loader for REST telemetry configurations.
+ */
+@Component(immediate = true)
+public class RestConfigsLoader extends AbstractTelemetryConfigLoader {
+    public RestConfigsLoader() {
+        super("rest-configs.xml");
+    }
+}
diff --git a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/RestTelemetryConfigManager.java b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/RestTelemetryConfigManager.java
deleted file mode 100644
index 16b62cb..0000000
--- a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/RestTelemetryConfigManager.java
+++ /dev/null
@@ -1,189 +0,0 @@
-/*
- * Copyright 2018-present Open Networking Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.onosproject.openstacktelemetry.impl;
-
-import org.onlab.util.Tools;
-import org.onosproject.cfg.ComponentConfigService;
-import org.onosproject.openstacktelemetry.api.RestTelemetryAdminService;
-import org.onosproject.openstacktelemetry.api.RestTelemetryConfigService;
-import org.onosproject.openstacktelemetry.api.config.TelemetryConfig;
-import org.onosproject.openstacktelemetry.config.DefaultRestTelemetryConfig;
-import org.osgi.service.component.ComponentContext;
-import org.osgi.service.component.annotations.Activate;
-import org.osgi.service.component.annotations.Component;
-import org.osgi.service.component.annotations.Deactivate;
-import org.osgi.service.component.annotations.Modified;
-import org.osgi.service.component.annotations.Reference;
-import org.osgi.service.component.annotations.ReferenceCardinality;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.Dictionary;
-
-import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROP_REST_SERVER_ADDRESS;
-import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROP_REST_ENABLE_SERVICE;
-import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROP_REST_ENABLE_SERVICE_DEFAULT;
-import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROP_REST_ENDPOINT;
-import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROP_REST_METHOD;
-import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROP_REST_SERVER_PORT;
-import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROP_REST_REQUEST_MEDIA_TYPE;
-import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROP_REST_RESPONSE_MEDIA_TYPE;
-import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROP_REST_ENDPOINT_DEFAULT;
-import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROP_REST_METHOD_DEFAULT;
-import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROP_REST_REQUEST_MEDIA_TYPE_DEFAULT;
-import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROP_REST_RESPONSE_MEDIA_TYPE_DEFAULT;
-import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROP_REST_SERVER_ADDRESS_DEFAULT;
-import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROP_REST_SERVER_PORT_DEFAULT;
-import static org.onosproject.openstacktelemetry.util.OpenstackTelemetryUtil.getBooleanProperty;
-import static org.onosproject.openstacktelemetry.util.OpenstackTelemetryUtil.initTelemetryService;
-
-/**
- * REST server configuration manager for publishing openstack telemetry.
- */
-@Component(
-    immediate = true,
-    service = RestTelemetryConfigService.class,
-    property = {
-        PROP_REST_ENABLE_SERVICE + ":Boolean=" + PROP_REST_ENABLE_SERVICE_DEFAULT,
-        PROP_REST_SERVER_ADDRESS + "=" + PROP_REST_SERVER_ADDRESS_DEFAULT,
-        PROP_REST_SERVER_PORT + ":Integer=" + PROP_REST_SERVER_PORT_DEFAULT,
-        PROP_REST_ENDPOINT + "=" + PROP_REST_ENDPOINT_DEFAULT,
-        PROP_REST_METHOD + "=" + PROP_REST_METHOD_DEFAULT,
-        PROP_REST_REQUEST_MEDIA_TYPE + "=" + PROP_REST_REQUEST_MEDIA_TYPE_DEFAULT,
-        PROP_REST_RESPONSE_MEDIA_TYPE + "=" + PROP_REST_RESPONSE_MEDIA_TYPE_DEFAULT
-    }
-)
-public class RestTelemetryConfigManager implements RestTelemetryConfigService {
-
-    private final Logger log = LoggerFactory.getLogger(getClass());
-
-    @Reference(cardinality = ReferenceCardinality.MANDATORY)
-    protected ComponentConfigService componentConfigService;
-
-    @Reference(cardinality = ReferenceCardinality.MANDATORY)
-    protected RestTelemetryAdminService restTelemetryAdminService;
-
-    /** Default IP address to establish initial connection to REST server. */
-    protected String address = PROP_REST_SERVER_ADDRESS_DEFAULT;
-
-    /** Default port number to establish initial connection to REST server. */
-    protected Integer port = PROP_REST_SERVER_PORT_DEFAULT;
-
-    /** Endpoint of REST server. */
-    protected String endpoint = PROP_REST_ENDPOINT_DEFAULT;
-
-    /** HTTP method of REST server. */
-    protected String method = PROP_REST_METHOD_DEFAULT;
-
-    /** Request media type of REST server. */
-    protected String requestMediaType = PROP_REST_REQUEST_MEDIA_TYPE_DEFAULT;
-
-    /** Response media type of REST server. */
-    protected String responseMediaType = PROP_REST_RESPONSE_MEDIA_TYPE_DEFAULT;
-
-    /** Specify the default behavior of telemetry service. */
-    protected Boolean enableService = PROP_REST_ENABLE_SERVICE_DEFAULT;
-
-    @Activate
-    protected void activate(ComponentContext context) {
-        componentConfigService.registerProperties(getClass());
-
-        if (enableService) {
-            restTelemetryAdminService.start(getConfig());
-        }
-        log.info("Started");
-    }
-
-    @Deactivate
-    protected void deactivate() {
-        componentConfigService.unregisterProperties(getClass(), false);
-
-        if (enableService) {
-            restTelemetryAdminService.stop();
-        }
-        log.info("Stopped");
-    }
-
-    @Modified
-    private void modified(ComponentContext context) {
-        readComponentConfiguration(context);
-        initTelemetryService(restTelemetryAdminService, getConfig(), enableService);
-        log.info("Modified");
-    }
-
-    @Override
-    public TelemetryConfig getConfig() {
-        return new DefaultRestTelemetryConfig.DefaultBuilder()
-                .withAddress(address)
-                .withPort(port)
-                .withEndpoint(endpoint)
-                .withMethod(method)
-                .withRequestMediaType(requestMediaType)
-                .withResponseMediaType(responseMediaType)
-                .build();
-    }
-
-    /**
-     * Extracts properties from the component configuration context.
-     *
-     * @param context the component context
-     */
-    private void readComponentConfiguration(ComponentContext context) {
-        Dictionary<?, ?> properties = context.getProperties();
-
-        String addressStr = Tools.get(properties, PROP_REST_SERVER_ADDRESS);
-        address = addressStr != null ? addressStr : PROP_REST_SERVER_ADDRESS_DEFAULT;
-        log.info("Configured. REST server address is {}", address);
-
-        Integer portConfigured = Tools.getIntegerProperty(properties, PROP_REST_SERVER_PORT);
-        if (portConfigured == null) {
-            port = PROP_REST_SERVER_PORT_DEFAULT;
-            log.info("REST server port is NOT configured, default value is {}", port);
-        } else {
-            port = portConfigured;
-            log.info("Configured. REST server port is {}", port);
-        }
-
-        String endpointStr = Tools.get(properties, PROP_REST_ENDPOINT);
-        endpoint = endpointStr != null ? endpointStr : PROP_REST_ENDPOINT_DEFAULT;
-        log.info("Configured. REST server endpoint is {}", endpoint);
-
-        String methodStr = Tools.get(properties, PROP_REST_METHOD);
-        method = methodStr != null ? methodStr : PROP_REST_METHOD_DEFAULT;
-        log.info("Configured. REST server default HTTP method is {}", method);
-
-        String requestMediaTypeStr = Tools.get(properties, PROP_REST_REQUEST_MEDIA_TYPE);
-        requestMediaType = requestMediaTypeStr != null ?
-                requestMediaTypeStr : PROP_REST_REQUEST_MEDIA_TYPE_DEFAULT;
-        log.info("Configured. REST server request media type is {}", requestMediaType);
-
-        String responseMediaTypeStr = Tools.get(properties, PROP_REST_RESPONSE_MEDIA_TYPE);
-        responseMediaType = responseMediaTypeStr != null ?
-                responseMediaTypeStr : PROP_REST_RESPONSE_MEDIA_TYPE_DEFAULT;
-        log.info("Configured. REST server response media type is {}", responseMediaType);
-
-        Boolean enableServiceConfigured =
-                getBooleanProperty(properties, PROP_REST_ENABLE_SERVICE);
-        if (enableServiceConfigured == null) {
-            enableService = PROP_REST_ENABLE_SERVICE_DEFAULT;
-            log.info("REST service enable flag is NOT " +
-                    "configured, default value is {}", enableService);
-        } else {
-            enableService = enableServiceConfigured;
-            log.info("Configured. REST service enable flag is {}", enableService);
-        }
-    }
-}
diff --git a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/RestTelemetryManager.java b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/RestTelemetryManager.java
index 9b4aaf9..48cef34 100644
--- a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/RestTelemetryManager.java
+++ b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/RestTelemetryManager.java
@@ -15,8 +15,11 @@
  */
 package org.onosproject.openstacktelemetry.impl;
 
+import com.google.common.collect.Maps;
+import com.google.common.collect.Sets;
 import org.onosproject.openstacktelemetry.api.OpenstackTelemetryService;
 import org.onosproject.openstacktelemetry.api.RestTelemetryAdminService;
+import org.onosproject.openstacktelemetry.api.TelemetryConfigService;
 import org.onosproject.openstacktelemetry.api.config.RestTelemetryConfig;
 import org.onosproject.openstacktelemetry.api.config.TelemetryConfig;
 import org.osgi.service.component.annotations.Activate;
@@ -32,6 +35,12 @@
 import javax.ws.rs.client.Entity;
 import javax.ws.rs.client.WebTarget;
 import javax.ws.rs.core.Response;
+import java.util.Map;
+import java.util.Set;
+
+import static org.onosproject.openstacktelemetry.api.Constants.REST_SCHEME;
+import static org.onosproject.openstacktelemetry.api.config.TelemetryConfig.ConfigType.REST;
+import static org.onosproject.openstacktelemetry.config.DefaultRestTelemetryConfig.fromTelemetryConfig;
 
 /**
  * REST telemetry manager.
@@ -48,8 +57,10 @@
     @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected OpenstackTelemetryService openstackTelemetryService;
 
-    private WebTarget target = null;
-    private RestTelemetryConfig restConfig = null;
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
+    protected TelemetryConfigService telemetryConfigService;
+
+    private Map<String, WebTarget> targets = Maps.newConcurrentMap();
 
     @Activate
     protected void activate() {
@@ -69,85 +80,71 @@
     }
 
     @Override
-    public void start(TelemetryConfig config) {
-        if (target != null) {
-            log.info("REST producer has already been started");
-            return;
-        }
+    public void start() {
 
-        restConfig = (RestTelemetryConfig) config;
+        telemetryConfigService.getConfigsByType(REST).forEach(c -> {
+            RestTelemetryConfig restConfig = fromTelemetryConfig(c);
 
-        StringBuilder restServerBuilder = new StringBuilder();
-        restServerBuilder.append(PROTOCOL);
-        restServerBuilder.append(":");
-        restServerBuilder.append("//");
-        restServerBuilder.append(restConfig.address());
-        restServerBuilder.append(":");
-        restServerBuilder.append(restConfig.port());
-        restServerBuilder.append("/");
+            if (restConfig != null && !c.name().equals(REST_SCHEME) && c.enabled()) {
+                StringBuilder restServerBuilder = new StringBuilder();
+                restServerBuilder.append(PROTOCOL);
+                restServerBuilder.append(":");
+                restServerBuilder.append("//");
+                restServerBuilder.append(restConfig.address());
+                restServerBuilder.append(":");
+                restServerBuilder.append(restConfig.port());
+                restServerBuilder.append("/");
 
-        Client client = ClientBuilder.newBuilder().build();
+                Client client = ClientBuilder.newBuilder().build();
 
-        target = client.target(restServerBuilder.toString()).path(restConfig.endpoint());
+                WebTarget target = client.target(restServerBuilder.toString()).path(restConfig.endpoint());
+
+                targets.put(c.name(), target);
+            }
+        });
 
         log.info("REST producer has Started");
     }
 
     @Override
     public void stop() {
-        if (target != null) {
-            target = null;
-        }
-
+        targets.values().forEach(t -> t = null);
         log.info("REST producer has Stopped");
     }
 
     @Override
-    public void restart(TelemetryConfig config) {
+    public void restart() {
         stop();
-        start(config);
+        start();
     }
 
     @Override
-    public Response publish(String endpoint, String method, String record) {
-        // TODO: need to find a way to invoke REST endpoint using target
-        return null;
-    }
+    public Set<Response> publish(String record) {
 
-    @Override
-    public Response publish(String method, String record) {
-        switch (method) {
-            case POST_METHOD:
-                return target.request(restConfig.requestMediaType())
-                        .post(Entity.json(record));
-            case GET_METHOD:
-                return target.request(restConfig.requestMediaType()).get();
-            default:
-                return null;
-        }
-    }
+        Set<Response> responses = Sets.newConcurrentHashSet();
 
-    @Override
-    public Response publish(String record) {
+        targets.forEach((k, v) -> {
+            TelemetryConfig config = telemetryConfigService.getConfig(k);
+            RestTelemetryConfig restConfig = fromTelemetryConfig(config);
 
-        if (target == null) {
-            log.debug("REST telemetry service has not been enabled!");
-            return null;
-        }
+            switch (restConfig.method()) {
+                case POST_METHOD:
+                    responses.add(v.request(restConfig.requestMediaType())
+                            .post(Entity.json(record)));
+                    break;
+                case GET_METHOD:
+                    responses.add(v.request(restConfig.requestMediaType()).get());
+                    break;
+                default:
+                    break;
+            }
+        });
 
-        switch (restConfig.method()) {
-            case POST_METHOD:
-                return target.request(restConfig.requestMediaType())
-                        .post(Entity.json(record));
-            case GET_METHOD:
-                return target.request(restConfig.requestMediaType()).get();
-            default:
-                return null;
-        }
+        return responses;
     }
 
     @Override
     public boolean isRunning() {
-        return target != null;
+        return !targets.isEmpty();
     }
 }
diff --git a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/TelemetryConfigManager.java b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/TelemetryConfigManager.java
new file mode 100644
index 0000000..3ae2504
--- /dev/null
+++ b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/TelemetryConfigManager.java
@@ -0,0 +1,206 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.openstacktelemetry.impl;
+
+import com.google.common.collect.ImmutableSet;
+import org.onlab.util.KryoNamespace;
+import org.onosproject.cluster.ClusterService;
+import org.onosproject.cluster.LeadershipService;
+import org.onosproject.cluster.NodeId;
+import org.onosproject.core.ApplicationId;
+import org.onosproject.core.CoreService;
+import org.onosproject.event.ListenerRegistry;
+import org.onosproject.openstacktelemetry.api.TelemetryConfigAdminService;
+import org.onosproject.openstacktelemetry.api.TelemetryConfigEvent;
+import org.onosproject.openstacktelemetry.api.TelemetryConfigListener;
+import org.onosproject.openstacktelemetry.api.TelemetryConfigProvider;
+import org.onosproject.openstacktelemetry.api.TelemetryConfigService;
+import org.onosproject.openstacktelemetry.api.TelemetryConfigStore;
+import org.onosproject.openstacktelemetry.api.TelemetryConfigStoreDelegate;
+import org.onosproject.openstacktelemetry.api.config.TelemetryConfig;
+import org.onosproject.openstacktelemetry.api.config.TelemetryConfig.ConfigType;
+import org.onosproject.store.serializers.KryoNamespaces;
+import org.onosproject.store.service.ConsistentMap;
+import org.onosproject.store.service.Serializer;
+import org.onosproject.store.service.StorageService;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Deactivate;
+import org.osgi.service.component.annotations.Reference;
+import org.osgi.service.component.annotations.ReferenceCardinality;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.Objects;
+import java.util.Set;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+import static org.onlab.util.Tools.nullIsNotFound;
+import static org.onosproject.openstacktelemetry.api.Constants.OPENSTACK_TELEMETRY_APP_ID;
+
+/**
+ * Provides implementation of administering and interfacing telemetry configs.
+ * It also provides telemetry config events for the various exporters or connectors.
+ */
+@Component(
+    immediate = true,
+    service = {
+            TelemetryConfigService.class, TelemetryConfigAdminService.class
+    }
+)
+public class TelemetryConfigManager
+        extends ListenerRegistry<TelemetryConfigEvent, TelemetryConfigListener>
+        implements TelemetryConfigService, TelemetryConfigAdminService {
+
+    private final Logger log = LoggerFactory.getLogger(getClass());
+
+    private static final String MSG_TELEMETRY_CONFIG = "Telemetry config %s %s";
+    private static final String MSG_CREATED = "created";
+    private static final String MSG_UPDATED = "updated";
+    private static final String MSG_REMOVED = "removed";
+
+    private static final String ERR_NULL_CONFIG = "Telemetry config cannot be null";
+    private static final String NO_CONFIG = "Telemetry config not found";
+
+    private static final KryoNamespace SERIALIZER_TELEMETRY_CONFIG =
+            KryoNamespace.newBuilder()
+                    .register(KryoNamespaces.API)
+                    .register(TelemetryConfigProvider.class)
+                    .register(DefaultTelemetryConfigProvider.class)
+                    .register(TelemetryConfig.class)
+                    .register(TelemetryConfig.ConfigType.class)
+                    .register(DefaultTelemetryConfig.class)
+                    .build();
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
+    protected CoreService coreService;
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
+    protected StorageService storageService;
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
+    protected ClusterService clusterService;
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
+    protected LeadershipService leadershipService;
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
+    protected TelemetryConfigStore telemetryConfigStore;
+
+    private final TelemetryConfigStoreDelegate
+                        delegate = new InternalTelemetryConfigStoreDelegate();
+
+    private ConsistentMap<String, TelemetryConfigProvider> providerMap;
+
+    private ApplicationId appId;
+    private NodeId localNodeId;
+
+    @Activate
+    protected void activate() {
+        appId = coreService.registerApplication(OPENSTACK_TELEMETRY_APP_ID);
+        localNodeId = clusterService.getLocalNode().id();
+        telemetryConfigStore.setDelegate(delegate);
+        leadershipService.runForLeadership(appId.name());
+
+        providerMap = storageService.<String, TelemetryConfigProvider>consistentMapBuilder()
+                .withSerializer(Serializer.using(SERIALIZER_TELEMETRY_CONFIG))
+                .withName("openstack-telemetry-config-provider")
+                .withApplicationId(appId)
+                .build();
+
+        log.info("Started");
+    }
+
+    @Deactivate
+    protected void deactivate() {
+        telemetryConfigStore.unsetDelegate(delegate);
+        leadershipService.withdraw(appId.name());
+        providerMap.clear();
+
+        log.info("Stopped");
+    }
+
+    @Override
+    public Set<TelemetryConfigProvider> getProviders() {
+        ImmutableSet.Builder<TelemetryConfigProvider> builder = ImmutableSet.builder();
+        providerMap.asJavaMap().values().forEach(builder::add);
+        return builder.build();
+    }
+
+    @Override
+    public void registerProvider(TelemetryConfigProvider provider) {
+        if (isLeader()) {
+            StringBuilder nameBuilder = new StringBuilder();
+            provider.getTelemetryConfigs().forEach(config -> {
+                nameBuilder.append(config.name());
+                telemetryConfigStore.createTelemetryConfig(config);
+                log.info(String.format(MSG_TELEMETRY_CONFIG, config.name(), MSG_CREATED));
+            });
+            providerMap.put(nameBuilder.toString(), provider);
+        }
+    }
+
+    @Override
+    public void unregisterProvider(TelemetryConfigProvider provider) {
+        if (isLeader()) {
+            StringBuilder nameBuilder = new StringBuilder();
+            provider.getTelemetryConfigs().forEach(config -> {
+                nameBuilder.append(config.name());
+                telemetryConfigStore.removeTelemetryConfig(config.name());
+                log.info(String.format(MSG_TELEMETRY_CONFIG, config.name(), MSG_REMOVED));
+            });
+            providerMap.remove(nameBuilder.toString());
+        }
+    }
+
+    @Override
+    public void updateTelemetryConfig(TelemetryConfig config) {
+        checkNotNull(config, ERR_NULL_CONFIG);
+
+        telemetryConfigStore.updateTelemetryConfig(config);
+        log.info(String.format(MSG_TELEMETRY_CONFIG, config.name(), MSG_UPDATED));
+    }
+
+    @Override
+    public TelemetryConfig getConfig(String name) {
+        return nullIsNotFound(telemetryConfigStore.telemetryConfig(name), NO_CONFIG);
+    }
+
+    @Override
+    public Set<TelemetryConfig> getConfigsByType(ConfigType type) {
+        return ImmutableSet.copyOf(telemetryConfigStore.telemetryConfigsByType(type));
+    }
+
+    @Override
+    public Set<TelemetryConfig> getConfigs() {
+        return ImmutableSet.copyOf(telemetryConfigStore.telemetryConfigs());
+    }
+
+    private boolean isLeader() {
+        return Objects.equals(localNodeId, leadershipService.getLeader(appId.name()));
+    }
+
+    private class InternalTelemetryConfigStoreDelegate implements TelemetryConfigStoreDelegate {
+
+        @Override
+        public void notify(TelemetryConfigEvent event) {
+            if (event != null) {
+                log.trace("send telemetry config event {}", event);
+                process(event);
+            }
+        }
+    }
+}
diff --git a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/XmlTelemetryConfigLoader.java b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/XmlTelemetryConfigLoader.java
new file mode 100644
index 0000000..39a5df0
--- /dev/null
+++ b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/XmlTelemetryConfigLoader.java
@@ -0,0 +1,219 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.openstacktelemetry.impl;
+
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import org.apache.commons.configuration.ConfigurationException;
+import org.apache.commons.configuration.HierarchicalConfiguration;
+import org.apache.commons.configuration.XMLConfiguration;
+import org.onosproject.openstacktelemetry.api.config.TelemetryConfig;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+import static org.onosproject.openstacktelemetry.api.config.TelemetryConfig.ConfigType.GRPC;
+import static org.onosproject.openstacktelemetry.api.config.TelemetryConfig.ConfigType.INFLUXDB;
+import static org.onosproject.openstacktelemetry.api.config.TelemetryConfig.ConfigType.KAFKA;
+import static org.onosproject.openstacktelemetry.api.config.TelemetryConfig.ConfigType.PROMETHEUS;
+import static org.onosproject.openstacktelemetry.api.config.TelemetryConfig.ConfigType.REST;
+import static org.onosproject.openstacktelemetry.api.config.TelemetryConfig.ConfigType.UNKNOWN;
+
+/**
+ * Utility capable of reading telemetry configuration XML resources and producing
+ * a telemetry config as a result.
+ * <p>
+ * The telemetry configurations stream structure is as follows:
+ * </p>
+ * <pre>
+ *     &lt;configs&gt;
+ *         &lt;config name=“...” [manufacturer="..." swVersion="..."]&gt;
+ *            [&lt;property name=“key”&gt;value&lt;/key&gt;]
+ *            ...
+ *        &lt;/config&gt;
+ *        ...
+ *     &lt;/configs&gt;
+ * </pre>
+ */
+public class XmlTelemetryConfigLoader {
+
+    private static final String CONFIGS = "configs";
+    private static final String CONFIG = "config";
+
+    private static final String PROPERTY = "property";
+
+    private static final String TRUE = "true";
+
+    private static final String NAME = "[@name]";
+    private static final String TYPE = "[@type]";
+    private static final String EXTENDS = "[@extends]";
+    private static final String MFG = "[@manufacturer]";
+    private static final String SW = "[@swVersion]";
+    private static final String ENABLED = "[@enabled]";
+
+    private Map<String, TelemetryConfig> configs = Maps.newHashMap();
+
+    /**
+     * Creates a new config loader capable of loading configs from the supplied
+     * class loader.
+     */
+    public XmlTelemetryConfigLoader() {
+    }
+
+    /**
+     * Loads the specified telemetry configs resource as an XML stream and parses
+     * it to produce a ready-to-register config provider.
+     *
+     * @param configsStream stream containing the telemetry configs definition
+     * @return telemetry configuration provider
+     * @throws IOException if issues are encountered reading the stream
+     *                     or parsing the telemetry config definition within
+     */
+    public DefaultTelemetryConfigProvider
+            loadTelemetryConfigs(InputStream configsStream) throws IOException {
+        try {
+            XMLConfiguration cfg = new XMLConfiguration();
+            cfg.setRootElementName(CONFIGS);
+            cfg.setAttributeSplittingDisabled(true);
+
+            cfg.load(configsStream);
+            return loadTelemetryConfigs(cfg);
+        } catch (ConfigurationException e) {
+            throw new IOException("Unable to load telemetry configs", e);
+        }
+    }
+
+    /**
+     * Loads a telemetry config provider from the supplied hierarchical configuration.
+     *
+     * @param telemetryConfig hierarchical configuration containing the configs definition
+     * @return telemetry configuration provider
+     */
+    public DefaultTelemetryConfigProvider
+                loadTelemetryConfigs(HierarchicalConfiguration telemetryConfig) {
+        DefaultTelemetryConfigProvider provider = new DefaultTelemetryConfigProvider();
+        for (HierarchicalConfiguration cfg : telemetryConfig.configurationsAt(CONFIG)) {
+            DefaultTelemetryConfig config = loadTelemetryConfig(cfg);
+            configs.put(config.name(), config);
+            provider.addConfig(config);
+        }
+        configs.clear();
+        return provider;
+    }
+
+    /**
+     * Loads a telemetry configuration from the supplied hierarchical configuration.
+     *
+     * @param telemetryCfg hierarchical configuration containing the telemetry config definition
+     * @return telemetry configuration
+     */
+    public DefaultTelemetryConfig loadTelemetryConfig(HierarchicalConfiguration telemetryCfg) {
+        String name = telemetryCfg.getString(NAME);
+        String parentsString = telemetryCfg.getString(EXTENDS, "");
+        List<TelemetryConfig> parents = Lists.newArrayList();
+
+        if (!"".equals(parentsString)) {
+            List<String> parentsNames;
+            if (parentsString.contains(",")) {
+                parentsNames = Arrays.asList(
+                        parentsString.replace(" ", "").split(","));
+            } else {
+                parentsNames = Lists.newArrayList(parentsString);
+            }
+            parents = parentsNames.stream().map(parent -> (parent != null) ?
+                    configs.get(parent) : null).collect(Collectors.toList());
+        }
+
+        String typeStr = telemetryCfg.getString(TYPE, getParentAttribute(parents, TYPE));
+        String manufacturer = telemetryCfg.getString(MFG, getParentAttribute(parents, MFG));
+        String swVersion = telemetryCfg.getString(SW, getParentAttribute(parents, SW));
+
+        // note that we do not inherits enabled property from parent
+        String enabledStr = telemetryCfg.getString(ENABLED);
+
+        boolean enabled = enabledStr != null && enabledStr.equalsIgnoreCase(TRUE);
+
+        TelemetryConfig.ConfigType type = type(typeStr);
+
+        if (type == null) {
+            return null;
+        }
+
+        return new DefaultTelemetryConfig(name, type, parents, manufacturer,
+                swVersion, enabled, parseProperties(parents, telemetryCfg));
+    }
+
+    private TelemetryConfig.ConfigType type(String typeStr) {
+        switch (typeStr.toUpperCase()) {
+            case "GRPC" :
+                return GRPC;
+            case "KAFKA":
+                return KAFKA;
+            case "REST":
+                return REST;
+            case "INFLUXDB":
+                return INFLUXDB;
+            case "PROMETHEUS":
+                return PROMETHEUS;
+            case "UNKNOWN":
+            default:
+                return UNKNOWN;
+        }
+    }
+
+    // Returns the specified property from the highest priority parent
+    private String getParentAttribute(List<TelemetryConfig> parents, String attribute) {
+        if (!parents.isEmpty()) {
+            TelemetryConfig parent = parents.get(0);
+            switch (attribute) {
+                case TYPE:
+                    return parent.type().name().toLowerCase();
+                case MFG:
+                    return parent.manufacturer();
+                case SW:
+                    return parent.swVersion();
+                default:
+                    throw new IllegalArgumentException("Unsupported attribute");
+            }
+        }
+        return "";
+    }
+
+    // Parses the properties section.
+    private Map<String, String> parseProperties(List<TelemetryConfig> parents,
+                                                HierarchicalConfiguration config) {
+        ImmutableMap.Builder<String, String> properties = ImmutableMap.builder();
+
+        // note that, we only allow the inheritance from single source
+        Map<String, String> parentConfigs = Maps.newHashMap();
+        if (!parents.isEmpty()) {
+            TelemetryConfig parent = parents.get(0);
+            parentConfigs = parent.properties();
+        }
+
+        properties.putAll(parentConfigs);
+
+        for (HierarchicalConfiguration b : config.configurationsAt(PROPERTY)) {
+            properties.put(b.getString(NAME), (String) b.getRootNode().getValue());
+        }
+        return properties.build();
+    }
+}
diff --git a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/util/OpenstackTelemetryUtil.java b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/util/OpenstackTelemetryUtil.java
index 860da11..39b1fdb 100644
--- a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/util/OpenstackTelemetryUtil.java
+++ b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/util/OpenstackTelemetryUtil.java
@@ -18,8 +18,6 @@
 import com.google.common.base.Strings;
 import org.onlab.packet.IPv4;
 import org.onosproject.cfg.ConfigProperty;
-import org.onosproject.openstacktelemetry.api.TelemetryAdminService;
-import org.onosproject.openstacktelemetry.api.config.TelemetryConfig;
 
 import java.util.Dictionary;
 import java.util.Optional;
@@ -112,27 +110,4 @@
                 return PROTOCOL_NAME_ANY;
         }
     }
-
-    /**
-     * Initializes the telemetry service due tue configuration changes.
-     *
-     *
-     * @param adminService  telemetry admin service
-     * @param config        telemetry configuration
-     * @param enable        service enable flag
-     */
-    public static void initTelemetryService(TelemetryAdminService adminService,
-                                            TelemetryConfig config, boolean enable) {
-        if (enable) {
-            if (adminService.isRunning()) {
-                adminService.restart(config);
-            } else {
-                adminService.start(config);
-            }
-        } else {
-            if (adminService.isRunning()) {
-                adminService.stop();
-            }
-        }
-    }
 }
diff --git a/apps/openstacktelemetry/app/src/main/resources/org/onosproject/openstacktelemetry/impl/grpc-configs.xml b/apps/openstacktelemetry/app/src/main/resources/org/onosproject/openstacktelemetry/impl/grpc-configs.xml
new file mode 100644
index 0000000..681dfc7
--- /dev/null
+++ b/apps/openstacktelemetry/app/src/main/resources/org/onosproject/openstacktelemetry/impl/grpc-configs.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ Copyright 2018-present Open Networking Foundation
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~     http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+  -->
+<configs>
+    <config name="grpc" type="grpc" manufacturer="grpc.io" swVersion="master">
+        <property name="address">127.0.0.1</property>
+        <property name="port">50051</property>
+        <property name="usePlaintext">true</property>
+        <property name="maxInboundMsgSize">4194304</property>
+    </config>
+</configs>
\ No newline at end of file
diff --git a/apps/openstacktelemetry/app/src/main/resources/org/onosproject/openstacktelemetry/impl/influxdb-configs.xml b/apps/openstacktelemetry/app/src/main/resources/org/onosproject/openstacktelemetry/impl/influxdb-configs.xml
new file mode 100644
index 0000000..d702a44
--- /dev/null
+++ b/apps/openstacktelemetry/app/src/main/resources/org/onosproject/openstacktelemetry/impl/influxdb-configs.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ Copyright 2018-present Open Networking Foundation
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~     http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+  -->
+<configs>
+    <config name="influxdb" type="influxdb" manufacturer="influxdata.com" swVersion="master">
+        <property name="address">127.0.0.1</property>
+        <property name="port">8086</property>
+        <property name="username">onos</property>
+        <property name="password">onos</property>
+    </config>
+    <config name="sona-influxdb-connector" manufacturer="SK Telecom"
+            swVersion="1.0" extends="influxdb" enabled="false">
+        <property name="database">ost</property>
+        <property name="measurement">sonaflow</property>
+        <property name="enableBatch">true</property>
+    </config>
+</configs>
\ No newline at end of file
diff --git a/apps/openstacktelemetry/app/src/main/resources/org/onosproject/openstacktelemetry/impl/kafka-configs.xml b/apps/openstacktelemetry/app/src/main/resources/org/onosproject/openstacktelemetry/impl/kafka-configs.xml
new file mode 100644
index 0000000..7429ac2
--- /dev/null
+++ b/apps/openstacktelemetry/app/src/main/resources/org/onosproject/openstacktelemetry/impl/kafka-configs.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ Copyright 2018-present Open Networking Foundation
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~     http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+  -->
+<configs>
+    <config name="kafka" type="kafka" manufacturer="kafka.apache.org" swVersion="master">
+        <property name="address">127.0.0.1</property>
+        <property name="port">9092</property>
+        <property name="retries">0</property>
+    </config>
+    <config name="tina-kafka-exporter" manufacturer="SK Telecom"
+            swVersion="1.0" extends="kafka" enabled="false">
+        <property name="batchSize">16384</property>
+        <property name="lingerMs">1</property>
+        <property name="memoryBuffer">33554432</property>
+        <property name="requiredAcks">all</property>
+        <property name="keySerializer">
+            org.apache.kafka.common.serialization.StringSerializer
+        </property>
+        <property name="valueSerializer">
+            org.apache.kafka.common.serialization.ByteArraySerializer
+        </property>
+        <property name="topic">sona.flow</property>
+        <property name="key">flowdata</property>
+        <property name="codec">TinaMessageByteBufferCodec</property>
+    </config>
+</configs>
\ No newline at end of file
diff --git a/apps/openstacktelemetry/app/src/main/resources/org/onosproject/openstacktelemetry/impl/prometheus-configs.xml b/apps/openstacktelemetry/app/src/main/resources/org/onosproject/openstacktelemetry/impl/prometheus-configs.xml
new file mode 100644
index 0000000..0459f6a
--- /dev/null
+++ b/apps/openstacktelemetry/app/src/main/resources/org/onosproject/openstacktelemetry/impl/prometheus-configs.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ Copyright 2018-present Open Networking Foundation
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~     http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+  -->
+<configs>
+    <config name="prometheus" type="prometheus" manufacturer="prometheus.io" swVersion="master">
+        <property name="address">127.0.0.1</property>
+        <property name="port">50051</property>
+    </config>
+
+    <config name="sona-prometheus-exporter" manufacturer="SK Telecom"
+            swVersion="1.0" extends="prometheus" enabled="false">
+    </config>
+</configs>
\ No newline at end of file
diff --git a/apps/openstacktelemetry/app/src/main/resources/org/onosproject/openstacktelemetry/impl/rest-configs.xml b/apps/openstacktelemetry/app/src/main/resources/org/onosproject/openstacktelemetry/impl/rest-configs.xml
new file mode 100644
index 0000000..ca1dc57
--- /dev/null
+++ b/apps/openstacktelemetry/app/src/main/resources/org/onosproject/openstacktelemetry/impl/rest-configs.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ Copyright 2018-present Open Networking Foundation
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~     http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+  -->
+<configs>
+    <config name="rest" type="rest" manufacturer="N/A" swVersion="master">
+        <property name="address">127.0.0.1</property>
+        <property name="port">80</property>
+        <property name="requestMediaType">application/json</property>
+        <property name="responseMediaType">application/json</property>
+    </config>
+    <config name="rest-connector" swVersion="1.0" extends="rest" enabled="false">
+        <property name="endpoint">telemetry</property>
+        <property name="method">POST</property>
+    </config>
+</configs>
\ No newline at end of file
