diff --git a/apps/openstacknetworking/app/src/test/java/org/onosproject/openstacknetworking/impl/DefaultInstancePortTest.java b/apps/openstacknetworking/app/src/test/java/org/onosproject/openstacknetworking/impl/DefaultInstancePortTest.java
index 50e8f01..ae0e4b4 100644
--- a/apps/openstacknetworking/app/src/test/java/org/onosproject/openstacknetworking/impl/DefaultInstancePortTest.java
+++ b/apps/openstacknetworking/app/src/test/java/org/onosproject/openstacknetworking/impl/DefaultInstancePortTest.java
@@ -75,7 +75,7 @@
     private InstancePort instancePort2;
 
     /**
-     * Checks that the DefaultInstancePort class is immutable.
+     * Tests class immutability.
      */
     @Test
     public void testImmutability() {
diff --git a/apps/openstacknode/app/src/test/java/org/onosproject/openstacknode/impl/DefaultOpenstackAuthTest.java b/apps/openstacknode/app/src/test/java/org/onosproject/openstacknode/impl/DefaultOpenstackAuthTest.java
index 6442aa0..723ea27 100644
--- a/apps/openstacknode/app/src/test/java/org/onosproject/openstacknode/impl/DefaultOpenstackAuthTest.java
+++ b/apps/openstacknode/app/src/test/java/org/onosproject/openstacknode/impl/DefaultOpenstackAuthTest.java
@@ -58,6 +58,9 @@
                 .build();
     }
 
+    /**
+     * Tests object equality.
+     */
     @Test
     public void testEquality() {
         new EqualsTester().addEqualityGroup(OS_AUTH_1, OS_AUTH_3)
@@ -65,6 +68,9 @@
                 .testEquals();
     }
 
+    /**
+     * Test object construction.
+     */
     @Test
     public void testConstruction() {
         OpenstackAuth auth = OS_AUTH_1;
diff --git a/apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/OpenstackTelemetryService.java b/apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/OpenstackTelemetryService.java
index 52ff745..8d5df0b 100644
--- a/apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/OpenstackTelemetryService.java
+++ b/apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/OpenstackTelemetryService.java
@@ -43,4 +43,11 @@
      * @param flowInfos virtual flow information
      */
     void publish(Set<FlowInfo> flowInfos);
+
+    /**
+     * Obtains a collection of openstack telemetry services.
+     *
+     * @return telemetry services
+     */
+    Set<TelemetryService> telemetryServices();
 }
diff --git a/apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/TelemetryConfigService.java b/apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/TelemetryConfigService.java
index 156e8ff..51e4cea 100644
--- a/apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/TelemetryConfigService.java
+++ b/apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/TelemetryConfigService.java
@@ -17,6 +17,9 @@
 
 import org.onosproject.openstacktelemetry.api.config.TelemetryConfig;
 
+/**
+ * Telemetry configuration service interface.
+ */
 public interface TelemetryConfigService {
 
     /**
diff --git a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/DefaultFlowInfo.java b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/DefaultFlowInfo.java
index a631abc..6033483 100644
--- a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/DefaultFlowInfo.java
+++ b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/DefaultFlowInfo.java
@@ -205,6 +205,15 @@
     }
 
     /**
+     * Obtains a default flow info builder object.
+     *
+     * @return flow info builder object
+     */
+    public static Builder builder() {
+        return new DefaultBuilder();
+    }
+
+    /**
      * Builder class of DefaultFlowInfo.
      */
     public static final class DefaultBuilder implements FlowInfo.Builder {
diff --git a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/DefaultInfluxRecord.java b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/DefaultInfluxRecord.java
index 8c45a60..d7ec2e1 100644
--- a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/DefaultInfluxRecord.java
+++ b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/DefaultInfluxRecord.java
@@ -15,6 +15,7 @@
  */
 package org.onosproject.openstacktelemetry.impl;
 
+import com.google.common.base.Strings;
 import org.onosproject.openstacktelemetry.api.InfluxRecord;
 
 import java.util.Objects;
@@ -22,14 +23,19 @@
 import static com.google.common.base.MoreObjects.toStringHelper;
 import static org.onosproject.openstacktelemetry.api.Constants.DEFAULT_INFLUXDB_MEASUREMENT;
 
-
+/**
+ * A default implementation of influx record.
+ *
+ * @param <K> key of influx record
+ * @param <V> value of influx record
+ */
 public final class DefaultInfluxRecord<K, V> implements InfluxRecord<K, V> {
     public static final String MEASUREMENT_NAME = DEFAULT_INFLUXDB_MEASUREMENT;
     private final K measurement;
     private final V flowInfos;
 
     protected DefaultInfluxRecord(K measurement, V flowInfos) {
-        if ((measurement == null) || (measurement.equals(""))) {
+        if (Strings.isNullOrEmpty((String) measurement)) {
             this.measurement = (K) MEASUREMENT_NAME;
         } else {
             this.measurement = measurement;
@@ -66,6 +72,7 @@
         return Objects.hash(measurement, flowInfos);
     }
 
+    @Override
     public String toString() {
         return toStringHelper(this)
                 .add("measurement", measurement)
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 83c7519..2b2d7b6 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
@@ -20,6 +20,8 @@
 import org.onlab.packet.TpPort;
 import org.onosproject.openstacktelemetry.api.StatsFlowRule;
 
+import java.util.Objects;
+
 import static com.google.common.base.Preconditions.checkArgument;
 
 public final class DefaultStatsFlowRule implements StatsFlowRule {
@@ -79,10 +81,43 @@
                 .toString();
     }
 
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+
+        if (obj instanceof DefaultStatsFlowRule) {
+            final DefaultStatsFlowRule other = (DefaultStatsFlowRule) obj;
+            return Objects.equals(this.srcIpPrefix, other.srcIpPrefix) &&
+                    Objects.equals(this.dstIpPrefix, other.dstIpPrefix) &&
+                    Objects.equals(this.srcTpPort, other.srcTpPort) &&
+                    Objects.equals(this.dstTpPort, other.dstTpPort) &&
+                    Objects.equals(this.ipProtocol, other.ipProtocol);
+        }
+        return false;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(srcIpPrefix, dstIpPrefix, srcTpPort, dstTpPort, ipProtocol);
+    }
+
+    /**
+     * Obtains a default stats flow rule builder object.
+     *
+     * @return flow rule builder object
+     */
     public static Builder builder() {
         return new Builder();
     }
 
+    /**
+     * Obtains the builder object existing flow rule.
+     *
+     * @param flowRule flow rule
+     * @return builder object
+     */
     public static Builder from(StatsFlowRule flowRule) {
         return new Builder()
                 .srcIpPrefix(flowRule.srcIpPrefix())
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 8812cca..0ea76dc 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
@@ -16,6 +16,7 @@
 package org.onosproject.openstacktelemetry.impl;
 
 import io.grpc.ManagedChannel;
+import io.grpc.ManagedChannelBuilder;
 import org.apache.felix.scr.annotations.Activate;
 import org.apache.felix.scr.annotations.Component;
 import org.apache.felix.scr.annotations.Deactivate;
@@ -24,6 +25,7 @@
 import org.apache.felix.scr.annotations.Service;
 import org.onosproject.openstacktelemetry.api.GrpcTelemetryAdminService;
 import org.onosproject.openstacktelemetry.api.OpenstackTelemetryService;
+import org.onosproject.openstacktelemetry.api.config.GrpcTelemetryConfig;
 import org.onosproject.openstacktelemetry.api.config.TelemetryConfig;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -66,24 +68,22 @@
             return;
         }
 
-        // FIXME do not activate grpc service for now due to deps conflict
-//        GrpcTelemetryConfig grpcConfig = (GrpcTelemetryConfig) config;
-//        channel = ManagedChannelBuilder
-//                .forAddress(grpcConfig.address(), grpcConfig.port())
-//                .maxInboundMessageSize(grpcConfig.maxInboundMsgSize())
-//                .usePlaintext(grpcConfig.usePlaintext())
-//                .build();
+        GrpcTelemetryConfig grpcConfig = (GrpcTelemetryConfig) config;
+        channel = ManagedChannelBuilder
+                .forAddress(grpcConfig.address(), grpcConfig.port())
+                .maxInboundMessageSize(grpcConfig.maxInboundMsgSize())
+                .usePlaintext(grpcConfig.usePlaintext())
+                .build();
 
         log.info("gRPC producer has Started");
     }
 
     @Override
     public void stop() {
-        // FIXME do not activate grpc service for now due to deps conflict
-//        if (channel != null) {
-//            channel.shutdown();
-//            channel = null;
-//        }
+        if (channel != null) {
+            channel.shutdown();
+            channel = null;
+        }
 
         log.info("gRPC producer has Stopped");
     }
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 e19a579..7d8a233 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
@@ -15,6 +15,7 @@
  */
 package org.onosproject.openstacktelemetry.impl;
 
+import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Lists;
 import org.apache.felix.scr.annotations.Activate;
 import org.apache.felix.scr.annotations.Component;
@@ -94,6 +95,11 @@
         });
     }
 
+    @Override
+    public Set<TelemetryService> telemetryServices() {
+        return ImmutableSet.copyOf(telemetryServices);
+    }
+
     private void invokeGrpcPublisher(GrpcTelemetryService service, Set<FlowInfo> flowInfos) {
         // TODO: need provide implementation
     }
diff --git a/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/codec/FlowInfoJsonCodecTest.java b/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/codec/FlowInfoJsonCodecTest.java
index 24fe947..ca97f8d 100644
--- a/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/codec/FlowInfoJsonCodecTest.java
+++ b/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/codec/FlowInfoJsonCodecTest.java
@@ -76,7 +76,9 @@
     private static final int INTEGER_VALUE = 1;
     private static final short SHORT_VALUE = (short) 1;
 
-
+    /**
+     * Initial setup for this unit test.
+     */
     @Before
     public void setUp() {
         context = new MockCodecContext();
diff --git a/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/codec/TinaFlowInfoByteBufferCodecTest.java b/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/codec/TinaFlowInfoByteBufferCodecTest.java
index 9e3294d..8f4af77 100644
--- a/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/codec/TinaFlowInfoByteBufferCodecTest.java
+++ b/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/codec/TinaFlowInfoByteBufferCodecTest.java
@@ -55,6 +55,9 @@
     private final TinaFlowInfoByteBufferCodec codec =
             new TinaFlowInfoByteBufferCodec();
 
+    /**
+     * Initial setup for this unit test.
+     */
     @Before
     public void setup() {
         StatsInfo statsInfo = new DefaultStatsInfo.DefaultBuilder().build();
diff --git a/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/codec/TinaStatsInfoByteBufferCodecTest.java b/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/codec/TinaStatsInfoByteBufferCodecTest.java
index f23f728..f32e5bb 100644
--- a/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/codec/TinaStatsInfoByteBufferCodecTest.java
+++ b/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/codec/TinaStatsInfoByteBufferCodecTest.java
@@ -42,6 +42,9 @@
     private final TinaStatsInfoByteBufferCodec codec =
                                             new TinaStatsInfoByteBufferCodec();
 
+    /**
+     * Initial setup for this unit test.
+     */
     @Before
     public void setup() {
         StatsInfo.Builder builder = new DefaultStatsInfo.DefaultBuilder();
@@ -59,6 +62,9 @@
                 .build();
     }
 
+    /**
+     * Tests codec encode and decode.
+     */
     @Test
     public void testEncodeDecode() {
         ByteBuffer buffer = codec.encode(info);
diff --git a/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/config/DefaultGrpcTelemetryConfigTest.java b/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/config/DefaultGrpcTelemetryConfigTest.java
index 6dcf229..1a7f752 100644
--- a/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/config/DefaultGrpcTelemetryConfigTest.java
+++ b/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/config/DefaultGrpcTelemetryConfigTest.java
@@ -25,6 +25,7 @@
 
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.is;
+import static org.onlab.junit.ImmutableClassChecker.assertThatClassIsImmutable;
 
 /**
  * Unit tests for DefaultGrpcTelemetryConfig class.
@@ -52,6 +53,9 @@
     private GrpcTelemetryConfig sameAsConfig1;
     private GrpcTelemetryConfig config2;
 
+    /**
+     * Initial setup for this unit test.
+     */
     @Before
     public void setup() {
 
@@ -87,6 +91,17 @@
                 .build();
     }
 
+    /**
+     * Tests class immutability.
+     */
+    @Test
+    public void testImmutability() {
+        assertThatClassIsImmutable(DefaultGrpcTelemetryConfig.class);
+    }
+
+    /**
+     * Tests object equality.
+     */
     @Test
     public void testEquality() {
         new EqualsTester()
@@ -94,6 +109,9 @@
                 .addEqualityGroup(config2).testEquals();
     }
 
+    /**
+     * Tests object construction.
+     */
     @Test
     public void testConstruction() {
         GrpcTelemetryConfig config = config1;
diff --git a/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/config/DefaultInfluxDbTelemetryConfigTest.java b/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/config/DefaultInfluxDbTelemetryConfigTest.java
index 4af5b4a..2357fec 100644
--- a/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/config/DefaultInfluxDbTelemetryConfigTest.java
+++ b/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/config/DefaultInfluxDbTelemetryConfigTest.java
@@ -25,6 +25,7 @@
 
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.is;
+import static org.onlab.junit.ImmutableClassChecker.assertThatClassIsImmutable;
 
 /**
  * Unit tests for DefaultInfluxDbTelemetryConfig class.
@@ -61,6 +62,9 @@
     private InfluxDbTelemetryConfig sameAsConfig1;
     private InfluxDbTelemetryConfig config2;
 
+    /**
+     * Initial setup for this unit test.
+     */
     @Before
     public void setup() {
 
@@ -105,6 +109,17 @@
                 .build();
     }
 
+    /**
+     * Tests class immutability.
+     */
+    @Test
+    public void testImmutability() {
+        assertThatClassIsImmutable(DefaultInfluxDbTelemetryConfig.class);
+    }
+
+    /**
+     * Tests object equality.
+     */
     @Test
     public void testEquality() {
         new EqualsTester()
@@ -112,6 +127,9 @@
                 .addEqualityGroup(config2).testEquals();
     }
 
+    /**
+     * Tests object construction.
+     */
     @Test
     public void testConstruction() {
         InfluxDbTelemetryConfig config = config1;
diff --git a/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/config/DefaultKafkaTelemetryConfigTest.java b/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/config/DefaultKafkaTelemetryConfigTest.java
index 6608d7a..d3958fe 100644
--- a/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/config/DefaultKafkaTelemetryConfigTest.java
+++ b/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/config/DefaultKafkaTelemetryConfigTest.java
@@ -25,6 +25,7 @@
 
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.is;
+import static org.onlab.junit.ImmutableClassChecker.assertThatClassIsImmutable;
 
 public final class DefaultKafkaTelemetryConfigTest {
 
@@ -63,6 +64,9 @@
     private KafkaTelemetryConfig sameAsConfig1;
     private KafkaTelemetryConfig config2;
 
+    /**
+     * Initial setup for this unit test.
+     */
     @Before
     public void setup() {
 
@@ -113,6 +117,17 @@
                 .build();
     }
 
+    /**
+     * Tests class immutability.
+     */
+    @Test
+    public void testImmutability() {
+        assertThatClassIsImmutable(DefaultKafkaTelemetryConfig.class);
+    }
+
+    /**
+     * Tests object equality.
+     */
     @Test
     public void testEquality() {
         new EqualsTester()
@@ -120,6 +135,9 @@
                 .addEqualityGroup(config2).testEquals();
     }
 
+    /**
+     * Tests object construction.
+     */
     @Test
     public void testConstruction() {
         KafkaTelemetryConfig config = config1;
diff --git a/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/config/DefaultRestTelemetryConfigTest.java b/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/config/DefaultRestTelemetryConfigTest.java
index 2a6277b..3e8bac06 100644
--- a/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/config/DefaultRestTelemetryConfigTest.java
+++ b/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/config/DefaultRestTelemetryConfigTest.java
@@ -25,6 +25,7 @@
 
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.is;
+import static org.onlab.junit.ImmutableClassChecker.assertThatClassIsImmutable;
 
 public final class DefaultRestTelemetryConfigTest {
 
@@ -55,6 +56,9 @@
     private RestTelemetryConfig sameAsConfig1;
     private RestTelemetryConfig config2;
 
+    /**
+     * Initial setup for this unit test.
+     */
     @Before
     public void setup() {
 
@@ -96,6 +100,17 @@
                 .build();
     }
 
+    /**
+     * Tests class immutability.
+     */
+    @Test
+    public void testImmutability() {
+        assertThatClassIsImmutable(DefaultRestTelemetryConfig.class);
+    }
+
+    /**
+     * Tests object equality.
+     */
     @Test
     public void testEquality() {
         new EqualsTester()
@@ -103,6 +118,9 @@
                 .addEqualityGroup(config2).testEquals();
     }
 
+    /**
+     * Tests object construction.
+     */
     @Test
     public void testConstruction() {
         RestTelemetryConfig config = config1;
diff --git a/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/impl/DefaultFlowInfoTest.java b/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/impl/DefaultFlowInfoTest.java
index 53d18c3..1d03415 100644
--- a/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/impl/DefaultFlowInfoTest.java
+++ b/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/impl/DefaultFlowInfoTest.java
@@ -29,6 +29,7 @@
 
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.is;
+import static org.onlab.junit.ImmutableClassChecker.assertThatClassIsImmutable;
 
 /**
  * Unit tests for DefaultFlowInfo class.
@@ -58,8 +59,11 @@
     private FlowInfo sameAsInfo1;
     private FlowInfo info2;
 
+    /**
+     * Initial setup for this unit test.
+     */
     @Before
-    public void setup() {
+    public void setUp() {
 
         FlowInfo.Builder builder1 = new DefaultFlowInfo.DefaultBuilder();
         FlowInfo.Builder builder2 = new DefaultFlowInfo.DefaultBuilder();
@@ -122,6 +126,17 @@
                 .build();
     }
 
+    /**
+     * Tests class immutability.
+     */
+    @Test
+    public void testImmutability() {
+        assertThatClassIsImmutable(DefaultFlowInfo.class);
+    }
+
+    /**
+     * Tests object equality.
+     */
     @Test
     public void testEquality() {
         new EqualsTester()
@@ -129,6 +144,9 @@
                 .addEqualityGroup(info2).testEquals();
     }
 
+    /**
+     * Tests object construction.
+     */
     @Test
     public void testConstruction() {
         FlowInfo info = info1;
diff --git a/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/impl/DefaultInfluxRecordTest.java b/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/impl/DefaultInfluxRecordTest.java
new file mode 100644
index 0000000..866e34d
--- /dev/null
+++ b/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/impl/DefaultInfluxRecordTest.java
@@ -0,0 +1,153 @@
+/*
+ * 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.testing.EqualsTester;
+import org.junit.Before;
+import org.junit.Test;
+import org.onlab.packet.IpAddress;
+import org.onlab.packet.IpPrefix;
+import org.onlab.packet.MacAddress;
+import org.onlab.packet.TpPort;
+import org.onlab.packet.VlanId;
+import org.onosproject.net.DeviceId;
+import org.onosproject.openstacktelemetry.api.FlowInfo;
+import org.onosproject.openstacktelemetry.api.InfluxRecord;
+import org.onosproject.openstacktelemetry.api.StatsInfo;
+
+import java.util.Set;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.is;
+import static org.onlab.junit.ImmutableClassChecker.assertThatClassIsImmutable;
+
+/**
+ * Unit tests for DefaultInfluxRecord class.
+ */
+public final class DefaultInfluxRecordTest {
+
+    private static final String MEASUREMENT_1 = "sonaflow-1";
+    private static final String MEASUREMENT_2 = "sonaflow-2";
+
+    private static final String IP_ADDRESS_1 = "10.10.10.1";
+    private static final String IP_ADDRESS_2 = "20.20.20.1";
+
+    private static final String MAC_ADDRESS_1 = "AA:BB:CC:DD:EE:FF";
+    private static final String MAC_ADDRESS_2 = "FF:EE:DD:CC:BB:AA";
+
+    private static final int IP_PREFIX_LENGTH_1 = 10;
+    private static final int IP_PREFIX_LENGTH_2 = 20;
+
+    private static final int PORT_1 = 1000;
+    private static final int PORT_2 = 2000;
+
+    private static final int STATIC_INTEGER_1 = 1;
+    private static final int STATIC_INTEGER_2 = 2;
+
+    private static final String STATIC_STRING_1 = "1";
+    private static final String STATIC_STRING_2 = "2";
+
+    private InfluxRecord record1;
+    private InfluxRecord sameAsRecord1;
+    private InfluxRecord record2;
+
+    private Set<FlowInfo> flowInfos1;
+    private Set<FlowInfo> flowInfos2;
+
+    /**
+     * Initial setup for this unit test.
+     */
+    @Before
+    public void setUp() {
+
+        FlowInfo.Builder builder1 = new DefaultFlowInfo.DefaultBuilder();
+        FlowInfo.Builder builder2 = new DefaultFlowInfo.DefaultBuilder();
+
+        StatsInfo statsInfo = new DefaultStatsInfo.DefaultBuilder().build();
+
+        FlowInfo info1 = builder1
+                .withFlowType((byte) STATIC_INTEGER_1)
+                .withInputInterfaceId(STATIC_INTEGER_1)
+                .withOutputInterfaceId(STATIC_INTEGER_1)
+                .withDeviceId(DeviceId.deviceId(STATIC_STRING_1))
+                .withSrcIp(IpPrefix.valueOf(
+                        IpAddress.valueOf(IP_ADDRESS_1), IP_PREFIX_LENGTH_1))
+                .withDstIp(IpPrefix.valueOf(
+                        IpAddress.valueOf(IP_ADDRESS_1), IP_PREFIX_LENGTH_1))
+                .withSrcPort(TpPort.tpPort(PORT_1))
+                .withDstPort(TpPort.tpPort(PORT_1))
+                .withProtocol((byte) STATIC_INTEGER_1)
+                .withVlanId(VlanId.vlanId(STATIC_STRING_1))
+                .withSrcMac(MacAddress.valueOf(MAC_ADDRESS_1))
+                .withDstMac(MacAddress.valueOf(MAC_ADDRESS_1))
+                .withStatsInfo(statsInfo)
+                .build();
+
+        FlowInfo info2 = builder2
+                .withFlowType((byte) STATIC_INTEGER_2)
+                .withInputInterfaceId(STATIC_INTEGER_2)
+                .withOutputInterfaceId(STATIC_INTEGER_2)
+                .withDeviceId(DeviceId.deviceId(STATIC_STRING_2))
+                .withSrcIp(IpPrefix.valueOf(
+                        IpAddress.valueOf(IP_ADDRESS_2), IP_PREFIX_LENGTH_2))
+                .withDstIp(IpPrefix.valueOf(
+                        IpAddress.valueOf(IP_ADDRESS_2), IP_PREFIX_LENGTH_2))
+                .withSrcPort(TpPort.tpPort(PORT_2))
+                .withDstPort(TpPort.tpPort(PORT_2))
+                .withProtocol((byte) STATIC_INTEGER_2)
+                .withVlanId(VlanId.vlanId(STATIC_STRING_2))
+                .withSrcMac(MacAddress.valueOf(MAC_ADDRESS_2))
+                .withDstMac(MacAddress.valueOf(MAC_ADDRESS_2))
+                .withStatsInfo(statsInfo)
+                .build();
+        flowInfos1 = ImmutableSet.of(info1);
+        flowInfos2 = ImmutableSet.of(info2);
+
+        record1 = new DefaultInfluxRecord(MEASUREMENT_1, flowInfos1);
+        sameAsRecord1 = new DefaultInfluxRecord(MEASUREMENT_1, flowInfos1);
+        record2 = new DefaultInfluxRecord(MEASUREMENT_2, flowInfos2);
+    }
+
+    /**
+     * Tests class immutability.
+     */
+    @Test
+    public void testImmutability() {
+        assertThatClassIsImmutable(DefaultInfluxRecord.class);
+    }
+
+    /**
+     * Tests object equality.
+     */
+    @Test
+    public void testEquality() {
+        new EqualsTester()
+                .addEqualityGroup(record1, sameAsRecord1)
+                .addEqualityGroup(record2).testEquals();
+    }
+
+    /**
+     * Tests object construction.
+     */
+    @Test
+    public void testConstruction() {
+        InfluxRecord record = record1;
+
+        assertThat(record.measurement(), is(MEASUREMENT_1));
+        assertThat(record.flowInfos(), is(flowInfos1));
+    }
+}
diff --git a/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/impl/DefaultStatsFlowRuleTest.java b/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/impl/DefaultStatsFlowRuleTest.java
new file mode 100644
index 0000000..54140dc
--- /dev/null
+++ b/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/impl/DefaultStatsFlowRuleTest.java
@@ -0,0 +1,112 @@
+/*
+ * 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.testing.EqualsTester;
+import org.junit.Before;
+import org.junit.Test;
+import org.onlab.packet.IpAddress;
+import org.onlab.packet.IpPrefix;
+import org.onlab.packet.TpPort;
+import org.onosproject.openstacktelemetry.api.StatsFlowRule;
+
+import static org.junit.Assert.assertEquals;
+import static org.onlab.junit.ImmutableClassChecker.assertThatClassIsImmutable;
+
+/**
+ * Unit tests for DefaultStatsFlowRule class.
+ */
+public final class DefaultStatsFlowRuleTest {
+
+    private static final IpAddress IP_ADDRESS_1 = IpAddress.valueOf("10.10.10.1");
+    private static final IpAddress IP_ADDRESS_2 = IpAddress.valueOf("20.20.20.1");
+
+    private static final int IP_PREFIX_LENGTH_1 = 10;
+    private static final int IP_PREFIX_LENGTH_2 = 20;
+
+    private static final int PORT_1 = 1000;
+    private static final int PORT_2 = 2000;
+
+    private static final byte PROTOCOL_1 = 1;
+    private static final byte PROTOCOL_2 = 2;
+
+    private StatsFlowRule rule1;
+    private StatsFlowRule sameAsRule1;
+    private StatsFlowRule rule2;
+
+    /**
+     * Initial setup for this unit test.
+     */
+    @Before
+    public void setUp() {
+
+        rule1 = DefaultStatsFlowRule.builder()
+                .srcIpPrefix(IpPrefix.valueOf(IP_ADDRESS_1, IP_PREFIX_LENGTH_1))
+                .dstIpPrefix(IpPrefix.valueOf(IP_ADDRESS_2, IP_PREFIX_LENGTH_2))
+                .srcTpPort(TpPort.tpPort(PORT_1))
+                .dstTpPort(TpPort.tpPort(PORT_2))
+                .ipProtocol(PROTOCOL_1)
+                .build();
+
+        sameAsRule1 = DefaultStatsFlowRule.builder()
+                .srcIpPrefix(IpPrefix.valueOf(IP_ADDRESS_1, IP_PREFIX_LENGTH_1))
+                .dstIpPrefix(IpPrefix.valueOf(IP_ADDRESS_2, IP_PREFIX_LENGTH_2))
+                .srcTpPort(TpPort.tpPort(PORT_1))
+                .dstTpPort(TpPort.tpPort(PORT_2))
+                .ipProtocol(PROTOCOL_1)
+                .build();
+
+        rule2 = DefaultStatsFlowRule.builder()
+                .srcIpPrefix(IpPrefix.valueOf(IP_ADDRESS_2, IP_PREFIX_LENGTH_2))
+                .dstIpPrefix(IpPrefix.valueOf(IP_ADDRESS_1, IP_PREFIX_LENGTH_1))
+                .srcTpPort(TpPort.tpPort(PORT_2))
+                .dstTpPort(TpPort.tpPort(PORT_1))
+                .ipProtocol(PROTOCOL_2)
+                .build();
+    }
+
+    /**
+     * Tests class immutability.
+     */
+    @Test
+    public void testImmutability() {
+        assertThatClassIsImmutable(DefaultStatsFlowRule.class);
+    }
+
+    /**
+     * Tests object equality.
+     */
+    @Test
+    public void testEquality() {
+        new EqualsTester()
+                .addEqualityGroup(rule1, sameAsRule1)
+                .addEqualityGroup(rule2).testEquals();
+    }
+
+    /**
+     * Tests object construction.
+     */
+    @Test
+    public void testConstruction() {
+        StatsFlowRule rule = rule1;
+
+        assertEquals(IpPrefix.valueOf(IP_ADDRESS_1, IP_PREFIX_LENGTH_1), rule.srcIpPrefix());
+        assertEquals(IpPrefix.valueOf(IP_ADDRESS_2, IP_PREFIX_LENGTH_2), rule.dstIpPrefix());
+        assertEquals(TpPort.tpPort(PORT_1), rule.srcTpPort());
+        assertEquals(TpPort.tpPort(PORT_2), rule.dstTpPort());
+        assertEquals(PROTOCOL_1, rule.ipProtocol());
+    }
+}
diff --git a/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/impl/DefaultStatsInfoTest.java b/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/impl/DefaultStatsInfoTest.java
index d1e0b7e..bfe3745 100644
--- a/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/impl/DefaultStatsInfoTest.java
+++ b/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/impl/DefaultStatsInfoTest.java
@@ -22,6 +22,7 @@
 
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.is;
+import static org.onlab.junit.ImmutableClassChecker.assertThatClassIsImmutable;
 
 /**
  * Unit tests for DefaultStatsInfo class.
@@ -35,6 +36,9 @@
     private StatsInfo sameAsInfo1;
     private StatsInfo info2;
 
+    /**
+     * Initial setup for this unit test.
+     */
     @Before
     public void setup() {
         StatsInfo.Builder builder1 = new DefaultStatsInfo.DefaultBuilder();
@@ -78,6 +82,17 @@
                 .build();
     }
 
+    /**
+     * Tests class immutability.
+     */
+    @Test
+    public void testImmutability() {
+        assertThatClassIsImmutable(DefaultStatsInfo.class);
+    }
+
+    /**
+     * Tests object equality.
+     */
     @Test
     public void testEquality() {
         new EqualsTester()
@@ -85,6 +100,9 @@
                 .addEqualityGroup(info2).testEquals();
     }
 
+    /**
+     * Tests object construction.
+     */
     @Test
     public void testConstruction() {
         StatsInfo info = info1;
diff --git a/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/impl/GrpcTelemetryManagerTest.java b/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/impl/GrpcTelemetryManagerTest.java
new file mode 100644
index 0000000..48474fe
--- /dev/null
+++ b/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/impl/GrpcTelemetryManagerTest.java
@@ -0,0 +1,50 @@
+/*
+ * 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.junit.Test;
+import org.onlab.junit.TestUtils;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+/**
+ * Unit tests for gRPC telemetry manager.
+ */
+public final class GrpcTelemetryManagerTest {
+
+    private GrpcTelemetryManager manager;
+    private OpenstackTelemetryServiceAdapter telemetryService =
+                                            new OpenstackTelemetryServiceAdapter();
+
+    /**
+     * Tests codec register activation and deactivation.
+     */
+    @Test
+    public void testActivateDeactivate() {
+        manager = new GrpcTelemetryManager();
+
+        TestUtils.setField(manager, "openstackTelemetryService", telemetryService);
+
+        manager.activate();
+
+        assertTrue(telemetryService.services.contains(manager));
+
+        manager.deactivate();
+
+        assertFalse(telemetryService.services.contains(manager));
+    }
+}
\ No newline at end of file
diff --git a/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/impl/InfluxDbTelemetryManagerTest.java b/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/impl/InfluxDbTelemetryManagerTest.java
new file mode 100644
index 0000000..dfd4671
--- /dev/null
+++ b/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/impl/InfluxDbTelemetryManagerTest.java
@@ -0,0 +1,50 @@
+/*
+ * 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.junit.Test;
+import org.onlab.junit.TestUtils;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+/**
+ * Unit tests for influxDB telemetry manager.
+ */
+public final class InfluxDbTelemetryManagerTest {
+
+    private InfluxDbTelemetryManager manager;
+    private OpenstackTelemetryServiceAdapter telemetryService =
+                                            new OpenstackTelemetryServiceAdapter();
+
+    /**
+     * Tests codec register activation and deactivation.
+     */
+    @Test
+    public void testActivateDeactivate() {
+        manager = new InfluxDbTelemetryManager();
+
+        TestUtils.setField(manager, "openstackTelemetryService", telemetryService);
+
+        manager.activate();
+
+        assertTrue(telemetryService.services.contains(manager));
+
+        manager.deactivate();
+
+        assertFalse(telemetryService.services.contains(manager));
+    }
+}
diff --git a/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/impl/KafkaTelemetryManagerTest.java b/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/impl/KafkaTelemetryManagerTest.java
new file mode 100644
index 0000000..16076da
--- /dev/null
+++ b/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/impl/KafkaTelemetryManagerTest.java
@@ -0,0 +1,50 @@
+/*
+ * 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.junit.Test;
+import org.onlab.junit.TestUtils;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+/**
+ * Unit tests for kafka telemetry manager.
+ */
+public final class KafkaTelemetryManagerTest {
+
+    private KafkaTelemetryManager manager;
+    private OpenstackTelemetryServiceAdapter telemetryService =
+            new OpenstackTelemetryServiceAdapter();
+
+    /**
+     * Tests codec register activation and deactivation.
+     */
+    @Test
+    public void testActivateDeactivate() {
+        manager = new KafkaTelemetryManager();
+
+        TestUtils.setField(manager, "openstackTelemetryService", telemetryService);
+
+        manager.activate();
+
+        assertTrue(telemetryService.services.contains(manager));
+
+        manager.deactivate();
+
+        assertFalse(telemetryService.services.contains(manager));
+    }
+}
diff --git a/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/impl/OpenstackTelemetryManagerTest.java b/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/impl/OpenstackTelemetryManagerTest.java
new file mode 100644
index 0000000..3a4aaed
--- /dev/null
+++ b/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/impl/OpenstackTelemetryManagerTest.java
@@ -0,0 +1,87 @@
+/*
+ * 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.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.onosproject.openstacktelemetry.api.TelemetryService;
+
+import static org.junit.Assert.assertEquals;
+
+/**
+ * Unit tests for OpenstackTelemetryService class.
+ */
+public final class OpenstackTelemetryManagerTest {
+
+    private static final TelemetryService GRPC_SERVICE = new GrpcTelemetryManager();
+    private static final TelemetryService INFLUXDB_SERVICE = new InfluxDbTelemetryManager();
+
+    private OpenstackTelemetryManager manager;
+
+    /**
+     * Initializes the unit test.
+     */
+    @Before
+    public void setUp() {
+        manager = new OpenstackTelemetryManager();
+
+        manager.activate();
+    }
+
+    /**
+     * Tests addTelemetryService method.
+     */
+    @Test
+    public void testAddTelemetryService() {
+        addDefaultServices();
+
+        TelemetryService kafkaService = new KafkaTelemetryManager();
+
+        assertEquals(2, manager.telemetryServices().size());
+
+        manager.addTelemetryService(kafkaService);
+
+        assertEquals(3, manager.telemetryServices().size());
+    }
+
+    /**
+     * Tests removeTelemetryService method.
+     */
+    @Test
+    public void testRemoveTelemetryService() {
+        addDefaultServices();
+
+        assertEquals(2, manager.telemetryServices().size());
+
+        manager.removeTelemetryService(GRPC_SERVICE);
+
+        assertEquals(1, manager.telemetryServices().size());
+    }
+
+    /**
+     * Tears down the unit test.
+     */
+    @After
+    public void tearDown() {
+        manager.deactivate();
+    }
+
+    private void addDefaultServices() {
+        manager.addTelemetryService(GRPC_SERVICE);
+        manager.addTelemetryService(INFLUXDB_SERVICE);
+    }
+}
diff --git a/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/impl/OpenstackTelemetryServiceAdapter.java b/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/impl/OpenstackTelemetryServiceAdapter.java
new file mode 100644
index 0000000..129fec5
--- /dev/null
+++ b/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/impl/OpenstackTelemetryServiceAdapter.java
@@ -0,0 +1,52 @@
+/*
+ * 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.Sets;
+import org.onosproject.openstacktelemetry.api.FlowInfo;
+import org.onosproject.openstacktelemetry.api.OpenstackTelemetryService;
+import org.onosproject.openstacktelemetry.api.TelemetryService;
+
+import java.util.Set;
+
+/**
+ * A mock up test class of openstack telemetry service.
+ */
+public class OpenstackTelemetryServiceAdapter implements OpenstackTelemetryService {
+
+    Set<TelemetryService> services = Sets.newConcurrentHashSet();
+
+    @Override
+    public void addTelemetryService(TelemetryService telemetryService) {
+        services.add(telemetryService);
+    }
+
+    @Override
+    public void removeTelemetryService(TelemetryService telemetryService) {
+        services.remove(telemetryService);
+    }
+
+    @Override
+    public void publish(Set<FlowInfo> flowInfos) {
+
+    }
+
+    @Override
+    public Set<TelemetryService> telemetryServices() {
+        return ImmutableSet.copyOf(services);
+    }
+}
diff --git a/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/impl/RestTelemetryManagerTest.java b/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/impl/RestTelemetryManagerTest.java
new file mode 100644
index 0000000..3946f24
--- /dev/null
+++ b/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/impl/RestTelemetryManagerTest.java
@@ -0,0 +1,51 @@
+/*
+ * 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.junit.Test;
+import org.onlab.junit.TestUtils;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+/**
+ * Unit tests for REST telemetry manager.
+ */
+public final class RestTelemetryManagerTest {
+
+    private RestTelemetryManager manager;
+
+    private OpenstackTelemetryServiceAdapter telemetryService =
+            new OpenstackTelemetryServiceAdapter();
+
+    /**
+     * Tests codec register activation and deactivation.
+     */
+    @Test
+    public void testActivateDeactivate() {
+        manager = new RestTelemetryManager();
+
+        TestUtils.setField(manager, "openstackTelemetryService", telemetryService);
+
+        manager.activate();
+
+        assertTrue(telemetryService.services.contains(manager));
+
+        manager.deactivate();
+
+        assertFalse(telemetryService.services.contains(manager));
+    }
+}
