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
index 66add3c..832c60b 100644
--- 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
@@ -15,16 +15,145 @@
  */
 package org.onosproject.openstacktelemetry.impl;
 
+import org.apache.felix.scr.annotations.Activate;
+import org.apache.felix.scr.annotations.Deactivate;
+import org.apache.felix.scr.annotations.Modified;
+import org.apache.felix.scr.annotations.Property;
+import org.apache.felix.scr.annotations.Reference;
+import org.apache.felix.scr.annotations.ReferenceCardinality;
+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.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.Dictionary;
+
+import static org.onosproject.openstacktelemetry.api.Constants.DEFAULT_REST_ENDPOINT;
+import static org.onosproject.openstacktelemetry.api.Constants.DEFAULT_REST_METHOD;
+import static org.onosproject.openstacktelemetry.api.Constants.DEFAULT_REST_REQUEST_MEDIA_TYPE;
+import static org.onosproject.openstacktelemetry.api.Constants.DEFAULT_REST_RESPONSE_MEDIA_TYPE;
+import static org.onosproject.openstacktelemetry.api.Constants.DEFAULT_REST_SERVER_IP;
+import static org.onosproject.openstacktelemetry.api.Constants.DEFAULT_REST_SERVER_PORT;
 
 /**
  * REST server configuration manager for publishing openstack telemetry.
  */
 public class RestTelemetryConfigManager implements RestTelemetryConfigService {
 
+    private final Logger log = LoggerFactory.getLogger(getClass());
+
+    private static final String ADDRESS = "address";
+    private static final String PORT = "port";
+    private static final String ENDPOINT = "endpoint";
+    private static final String METHOD = "method";
+    private static final String REQUEST_MEDIA_TYPE = "requestMediaType";
+    private static final String RESPONSE_MEDIA_TYPE = "responseMediaType";
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected ComponentConfigService componentConfigService;
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected RestTelemetryAdminService restTelemetryAdminService;
+
+    @Property(name = ADDRESS, value = DEFAULT_REST_SERVER_IP,
+            label = "Default IP address to establish initial connection to REST server")
+    protected String address = DEFAULT_REST_SERVER_IP;
+
+    @Property(name = PORT, intValue = DEFAULT_REST_SERVER_PORT,
+            label = "Default port number to establish initial connection to REST server")
+    protected Integer port = DEFAULT_REST_SERVER_PORT;
+
+    @Property(name = ENDPOINT, value = DEFAULT_REST_ENDPOINT,
+            label = "Endpoint of REST server")
+    protected String endpoint = DEFAULT_REST_ENDPOINT;
+
+    @Property(name = METHOD, value = DEFAULT_REST_METHOD,
+            label = "HTTP method of REST server")
+    protected String method = DEFAULT_REST_METHOD;
+
+    @Property(name = REQUEST_MEDIA_TYPE, value = DEFAULT_REST_REQUEST_MEDIA_TYPE,
+            label = "Request media type of REST server")
+    protected String requestMediaType = DEFAULT_REST_REQUEST_MEDIA_TYPE;
+
+    @Property(name = RESPONSE_MEDIA_TYPE, value = DEFAULT_REST_RESPONSE_MEDIA_TYPE,
+            label = "Response media type of REST server")
+    protected String responseMediaType = DEFAULT_REST_RESPONSE_MEDIA_TYPE;
+
+    @Activate
+    protected void activate(ComponentContext context) {
+        componentConfigService.registerProperties(getClass());
+        restTelemetryAdminService.start(getConfig());
+        log.info("Started");
+    }
+
+    @Deactivate
+    protected void deactivate() {
+        componentConfigService.unregisterProperties(getClass(), false);
+        restTelemetryAdminService.stop();
+        log.info("Stopped");
+    }
+
+    @Modified
+    private void modified(ComponentContext context) {
+        readComponentConfiguration(context);
+        restTelemetryAdminService.restart(getConfig());
+        log.info("Modified");
+    }
+
     @Override
     public TelemetryConfig getConfig() {
-        return null;
+        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, ADDRESS);
+        address = addressStr != null ? addressStr : DEFAULT_REST_SERVER_IP;
+        log.info("Configured. REST server address is {}", address);
+
+        Integer portConfigured = Tools.getIntegerProperty(properties, PORT);
+        if (portConfigured == null) {
+            port = DEFAULT_REST_SERVER_PORT;
+            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, ENDPOINT);
+        endpoint = endpointStr != null ? endpointStr : DEFAULT_REST_ENDPOINT;
+        log.info("Configured. REST server endpoint is {}", endpoint);
+
+        String methodStr = Tools.get(properties, METHOD);
+        method = methodStr != null ? methodStr : DEFAULT_REST_METHOD;
+        log.info("Configured. REST server default HTTP method is {}", method);
+
+        String requestMediaTypeStr = Tools.get(properties, REQUEST_MEDIA_TYPE);
+        requestMediaType = requestMediaTypeStr != null ?
+                requestMediaTypeStr : DEFAULT_REST_REQUEST_MEDIA_TYPE;
+        log.info("Configured. REST server request media type is {}", requestMediaType);
+
+        String responseMediaTypeStr = Tools.get(properties, RESPONSE_MEDIA_TYPE);
+        responseMediaType = responseMediaTypeStr != null ?
+                responseMediaTypeStr : DEFAULT_REST_RESPONSE_MEDIA_TYPE;
+        log.info("Configured. REST server response media type is {}", responseMediaType);
     }
 }
