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 7b0433e..6cee737 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
@@ -18,6 +18,7 @@
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Maps;
 import org.onosproject.openstacktelemetry.api.config.GrpcTelemetryConfig;
+import org.onosproject.openstacktelemetry.api.config.TelemetryConfig;
 
 import java.util.Map;
 import java.util.Objects;
@@ -96,10 +97,15 @@
         return Objects.hash(address, port, usePlaintext, maxInboundMsgSize, configMap);
     }
 
+    @Override
+    public TelemetryConfig.Builder createBuilder() {
+        return new DefaultBuilder();
+    }
+
     /**
      * Builder class of DefaultKafkaTelemetryConfig.
      */
-    public final class DefaultBuilder implements Builder {
+    public static final class DefaultBuilder implements Builder {
 
         private String address;
         private int port;
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 a95517b..68b28c1 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
@@ -18,6 +18,7 @@
 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 java.util.Map;
 import java.util.Objects;
@@ -113,10 +114,15 @@
         return Objects.hash(address, port, username, password, database, enableBatch, configMap);
     }
 
+    @Override
+    public TelemetryConfig.Builder createBuilder() {
+        return new DefaultBuilder();
+    }
+
     /**
      * Builder class of DefaultInfluxDbTelemetryConfig.
      */
-    public final class DefaultBuilder implements Builder {
+    public static final class DefaultBuilder implements Builder {
 
         private String address;
         private int port;
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 9dc460a..efde9f5 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
@@ -18,6 +18,7 @@
 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 java.util.Map;
 import java.util.Objects;
@@ -140,10 +141,15 @@
                 lingerMs, memoryBuffer, keySerializer, valueSerializer, configMap);
     }
 
+    @Override
+    public TelemetryConfig.Builder createBuilder() {
+        return new DefaultBuilder();
+    }
+
     /**
      * Builder class of DefaultKafkaTelemetryConfig.
      */
-    public final class DefaultBuilder implements Builder {
+    public static final class DefaultBuilder implements Builder {
         private String address;
         private int port;
         private int retries;
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 b11b14e..29e9a2a 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
@@ -18,6 +18,7 @@
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Maps;
 import org.onosproject.openstacktelemetry.api.config.RestTelemetryConfig;
+import org.onosproject.openstacktelemetry.api.config.TelemetryConfig;
 
 import java.util.Map;
 import java.util.Objects;
@@ -114,10 +115,15 @@
                 responseMediaType, configMap);
     }
 
+    @Override
+    public TelemetryConfig.Builder createBuilder() {
+        return new DefaultBuilder();
+    }
+
     /**
      * Builder class of DefaultRestTelemetryConfig.
      */
-    public final class DefaultBuilder implements Builder {
+    public static final class DefaultBuilder implements Builder {
 
         private String address;
         private int port;
diff --git a/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/config/TestDefaultGrpcTelemetryConfig.java b/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/config/TestDefaultGrpcTelemetryConfig.java
new file mode 100644
index 0000000..ba66f36
--- /dev/null
+++ b/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/config/TestDefaultGrpcTelemetryConfig.java
@@ -0,0 +1,107 @@
+/*
+ * 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.config;
+
+import com.google.common.collect.ImmutableMap;
+import com.google.common.testing.EqualsTester;
+import org.junit.Before;
+import org.junit.Test;
+import org.onosproject.openstacktelemetry.api.config.GrpcTelemetryConfig;
+
+import java.util.Map;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.is;
+
+/**
+ * Unit tests for DefaultGrpcTelemetryConfig class.
+ */
+public final class TestDefaultGrpcTelemetryConfig {
+
+    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 int PORT_1 = 80;
+    private static final int PORT_2 = 8080;
+
+    private static final int MSG_SIZE_1 = 1000;
+    private static final int MSG_SIZE_2 = 2000;
+
+    private static final boolean USE_PLAIN_TEXT_1 = true;
+    private static final boolean USE_PLAIN_TEXT_2 = true;
+
+    private static final Map<String, Object> CONFIG_MAP_1 =
+                                    ImmutableMap.of("key1", "value1");
+    private static final Map<String, Object> CONFIG_MAP_2 =
+                                    ImmutableMap.of("key2", "value2");
+
+    private GrpcTelemetryConfig config1;
+    private GrpcTelemetryConfig sameAsConfig1;
+    private GrpcTelemetryConfig config2;
+
+    @Before
+    public void setup() {
+
+        GrpcTelemetryConfig.Builder builder1 =
+                new DefaultGrpcTelemetryConfig.DefaultBuilder();
+        GrpcTelemetryConfig.Builder builder2 =
+                new DefaultGrpcTelemetryConfig.DefaultBuilder();
+        GrpcTelemetryConfig.Builder builder3 =
+                new DefaultGrpcTelemetryConfig.DefaultBuilder();
+
+        config1 = builder1
+                .withAddress(IP_ADDRESS_1)
+                .withPort(PORT_1)
+                .withMaxInboundMsgSize(MSG_SIZE_1)
+                .withUsePlaintext(USE_PLAIN_TEXT_1)
+                .withConfigMap(CONFIG_MAP_1)
+                .build();
+
+        sameAsConfig1 = builder2
+                .withAddress(IP_ADDRESS_1)
+                .withPort(PORT_1)
+                .withMaxInboundMsgSize(MSG_SIZE_1)
+                .withUsePlaintext(USE_PLAIN_TEXT_1)
+                .withConfigMap(CONFIG_MAP_1)
+                .build();
+
+        config2 = builder3
+                .withAddress(IP_ADDRESS_2)
+                .withPort(PORT_2)
+                .withMaxInboundMsgSize(MSG_SIZE_2)
+                .withUsePlaintext(USE_PLAIN_TEXT_2)
+                .withConfigMap(CONFIG_MAP_2)
+                .build();
+    }
+
+    @Test
+    public void testEquality() {
+        new EqualsTester()
+                .addEqualityGroup(config1, sameAsConfig1)
+                .addEqualityGroup(config2).testEquals();
+    }
+
+    @Test
+    public void testConstruction() {
+        GrpcTelemetryConfig config = config1;
+
+        assertThat(config.address(), is(IP_ADDRESS_1));
+        assertThat(config.port(), is(PORT_1));
+        assertThat(config.maxInboundMsgSize(), is(MSG_SIZE_1));
+        assertThat(config.usePlaintext(), is(USE_PLAIN_TEXT_1));
+        assertThat(config.configMap(), is(CONFIG_MAP_1));
+    }
+}
diff --git a/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/config/TestDefaultInfluxDbTelemetryConfig.java b/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/config/TestDefaultInfluxDbTelemetryConfig.java
new file mode 100644
index 0000000..62c1a13
--- /dev/null
+++ b/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/config/TestDefaultInfluxDbTelemetryConfig.java
@@ -0,0 +1,121 @@
+/*
+ * 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.config;
+
+import com.google.common.collect.ImmutableMap;
+import com.google.common.testing.EqualsTester;
+import org.junit.Before;
+import org.junit.Test;
+import org.onosproject.openstacktelemetry.api.config.InfluxDbTelemetryConfig;
+
+import java.util.Map;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.is;
+
+/**
+ * Unit tests for DefaultInfluxDbTelemetryConfig class.
+ */
+public final class TestDefaultInfluxDbTelemetryConfig {
+
+    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 int PORT_1 = 80;
+    private static final int PORT_2 = 8080;
+
+    private static final String DATABASE_1 = "database1";
+    private static final String DATABASE_2 = "database2";
+
+    private static final String USERNAME_1 = "username1";
+    private static final String USERNAME_2 = "username2";
+
+    private static final String PASSWORD_1 = "password1";
+    private static final String PASSWORD_2 = "password2";
+
+    private static final boolean ENABLE_BATCH_1 = true;
+    private static final boolean ENABLE_BATCH_2 = false;
+
+    private static final Map<String, Object> CONFIG_MAP_1 =
+            ImmutableMap.of("key1", "value1");
+    private static final Map<String, Object> CONFIG_MAP_2 =
+            ImmutableMap.of("key2", "value2");
+
+    private InfluxDbTelemetryConfig config1;
+    private InfluxDbTelemetryConfig sameAsConfig1;
+    private InfluxDbTelemetryConfig config2;
+
+    @Before
+    public void setup() {
+
+        InfluxDbTelemetryConfig.Builder builder1 =
+                new DefaultInfluxDbTelemetryConfig.DefaultBuilder();
+        InfluxDbTelemetryConfig.Builder builder2 =
+                new DefaultInfluxDbTelemetryConfig.DefaultBuilder();
+        InfluxDbTelemetryConfig.Builder builder3 =
+                new DefaultInfluxDbTelemetryConfig.DefaultBuilder();
+
+        config1 = builder1
+                .withAddress(IP_ADDRESS_1)
+                .withPort(PORT_1)
+                .withDatabase(DATABASE_1)
+                .withUsername(USERNAME_1)
+                .withPassword(PASSWORD_1)
+                .withEnableBatch(ENABLE_BATCH_1)
+                .withConfigMap(CONFIG_MAP_1)
+                .build();
+
+        sameAsConfig1 = builder2
+                .withAddress(IP_ADDRESS_1)
+                .withPort(PORT_1)
+                .withDatabase(DATABASE_1)
+                .withUsername(USERNAME_1)
+                .withPassword(PASSWORD_1)
+                .withEnableBatch(ENABLE_BATCH_1)
+                .withConfigMap(CONFIG_MAP_1)
+                .build();
+
+        config2 = builder3
+                .withAddress(IP_ADDRESS_2)
+                .withPort(PORT_2)
+                .withDatabase(DATABASE_2)
+                .withUsername(USERNAME_2)
+                .withPassword(PASSWORD_2)
+                .withEnableBatch(ENABLE_BATCH_2)
+                .withConfigMap(CONFIG_MAP_2)
+                .build();
+    }
+
+    @Test
+    public void testEquality() {
+        new EqualsTester()
+                .addEqualityGroup(config1, sameAsConfig1)
+                .addEqualityGroup(config2).testEquals();
+    }
+
+    @Test
+    public void testConstruction() {
+        InfluxDbTelemetryConfig config = config1;
+
+        assertThat(config.address(), is(IP_ADDRESS_1));
+        assertThat(config.port(), is(PORT_1));
+        assertThat(config.database(), is(DATABASE_1));
+        assertThat(config.username(), is(USERNAME_1));
+        assertThat(config.password(), is(PASSWORD_1));
+        assertThat(config.enableBatch(), is(ENABLE_BATCH_1));
+        assertThat(config.configMap(), is(CONFIG_MAP_1));
+    }
+}
diff --git a/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/config/TestDefaultKafkaTelemetryConfig.java b/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/config/TestDefaultKafkaTelemetryConfig.java
new file mode 100644
index 0000000..6faa0ab
--- /dev/null
+++ b/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/config/TestDefaultKafkaTelemetryConfig.java
@@ -0,0 +1,138 @@
+/*
+ * 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.config;
+
+import com.google.common.collect.ImmutableMap;
+import com.google.common.testing.EqualsTester;
+import org.junit.Before;
+import org.junit.Test;
+import org.onosproject.openstacktelemetry.api.config.KafkaTelemetryConfig;
+
+import java.util.Map;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.is;
+
+public final class TestDefaultKafkaTelemetryConfig {
+
+    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 int PORT_1 = 80;
+    private static final int PORT_2 = 8080;
+
+    private static final int RETRIES_1 = 1;
+    private static final int RETRIES_2 = 2;
+
+    private static final int BATCH_SIZE_1 = 100;
+    private static final int BATCH_SIZE_2 = 200;
+
+    private static final int MEMORY_BUFFER_1 = 1000;
+    private static final int MEMORY_BUFFER_2 = 2000;
+
+    private static final String REQUIRED_ACKS_1 = "all";
+    private static final String REQUIRED_ACKS_2 = "none";
+
+    private static final int LINGER_MS_1 = 1;
+    private static final int LINGER_MS_2 = 2;
+
+    private static final String KEY_SERIALIZER_1 = "keyserializer1";
+    private static final String KEY_SERIALIZER_2 = "keyserializer2";
+    private static final String VALUE_SERIALIZER_1 = "valueserializer1";
+    private static final String VALUE_SERIALIZER_2 = "valueserializer2";
+
+    private static final Map<String, Object> CONFIG_MAP_1 =
+            ImmutableMap.of("key1", "value1");
+    private static final Map<String, Object> CONFIG_MAP_2 =
+            ImmutableMap.of("key2", "value2");
+
+    private KafkaTelemetryConfig config1;
+    private KafkaTelemetryConfig sameAsConfig1;
+    private KafkaTelemetryConfig config2;
+
+    @Before
+    public void setup() {
+
+        KafkaTelemetryConfig.Builder builder1 =
+                new DefaultKafkaTelemetryConfig.DefaultBuilder();
+        KafkaTelemetryConfig.Builder builder2 =
+                new DefaultKafkaTelemetryConfig.DefaultBuilder();
+        KafkaTelemetryConfig.Builder builder3 =
+                new DefaultKafkaTelemetryConfig.DefaultBuilder();
+
+        config1 = builder1
+                .withAddress(IP_ADDRESS_1)
+                .withPort(PORT_1)
+                .withRetries(RETRIES_1)
+                .withBatchSize(BATCH_SIZE_1)
+                .withMemoryBuffer(MEMORY_BUFFER_1)
+                .withRequiredAcks(REQUIRED_ACKS_1)
+                .withLingerMs(LINGER_MS_1)
+                .withKeySerializer(KEY_SERIALIZER_1)
+                .withValueSerializer(VALUE_SERIALIZER_1)
+                .withConfigMap(CONFIG_MAP_1)
+                .build();
+
+        sameAsConfig1 = builder2
+                .withAddress(IP_ADDRESS_1)
+                .withPort(PORT_1)
+                .withRetries(RETRIES_1)
+                .withBatchSize(BATCH_SIZE_1)
+                .withMemoryBuffer(MEMORY_BUFFER_1)
+                .withRequiredAcks(REQUIRED_ACKS_1)
+                .withLingerMs(LINGER_MS_1)
+                .withKeySerializer(KEY_SERIALIZER_1)
+                .withValueSerializer(VALUE_SERIALIZER_1)
+                .withConfigMap(CONFIG_MAP_1)
+                .build();
+
+        config2 = builder3
+                .withAddress(IP_ADDRESS_2)
+                .withPort(PORT_2)
+                .withRetries(RETRIES_2)
+                .withBatchSize(BATCH_SIZE_2)
+                .withMemoryBuffer(MEMORY_BUFFER_2)
+                .withRequiredAcks(REQUIRED_ACKS_2)
+                .withLingerMs(LINGER_MS_2)
+                .withKeySerializer(KEY_SERIALIZER_2)
+                .withValueSerializer(VALUE_SERIALIZER_2)
+                .withConfigMap(CONFIG_MAP_2)
+                .build();
+    }
+
+    @Test
+    public void testEquality() {
+        new EqualsTester()
+                .addEqualityGroup(config1, sameAsConfig1)
+                .addEqualityGroup(config2).testEquals();
+    }
+
+    @Test
+    public void testConstruction() {
+        KafkaTelemetryConfig config = config1;
+
+        assertThat(config.address(), is(IP_ADDRESS_1));
+        assertThat(config.port(), is(PORT_1));
+        assertThat(config.retries(), is(RETRIES_1));
+        assertThat(config.batchSize(), is(BATCH_SIZE_1));
+        assertThat(config.memoryBuffer(), is(MEMORY_BUFFER_1));
+        assertThat(config.requiredAcks(), is(REQUIRED_ACKS_1));
+        assertThat(config.lingerMs(), is(LINGER_MS_1));
+        assertThat(config.keySerializer(), is(KEY_SERIALIZER_1));
+        assertThat(config.valueSerializer(), is(VALUE_SERIALIZER_1));
+        assertThat(config.configMap(), is(CONFIG_MAP_1));
+    }
+}
diff --git a/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/config/TestDefaultRestTelemetryConfig.java b/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/config/TestDefaultRestTelemetryConfig.java
new file mode 100644
index 0000000..b4b18f6
--- /dev/null
+++ b/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/config/TestDefaultRestTelemetryConfig.java
@@ -0,0 +1,118 @@
+/*
+ * 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.config;
+
+import com.google.common.collect.ImmutableMap;
+import com.google.common.testing.EqualsTester;
+import org.junit.Before;
+import org.junit.Test;
+import org.onosproject.openstacktelemetry.api.config.RestTelemetryConfig;
+
+import java.util.Map;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.is;
+
+public final class TestDefaultRestTelemetryConfig {
+
+    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 int PORT_1 = 80;
+    private static final int PORT_2 = 8080;
+
+    private static final String ENDPOINT_1 = "telemetry";
+    private static final String ENDPOINT_2 = "configuration";
+
+    private static final String METHOD_1 = "POST";
+    private static final String METHOD_2 = "GET";
+
+    private static final String REQUEST_MEDIA_TYPE_1 = "JSON";
+    private static final String REQUEST_MEDIA_TYPE_2 = "XML";
+
+    private static final String RESPONSE_MEDIA_TYPE_1 = "JSON";
+    private static final String RESPONSE_MEDIA_TYPE_2 = "XML";
+
+    private static final Map<String, Object> CONFIG_MAP_1 =
+            ImmutableMap.of("key1", "value1");
+    private static final Map<String, Object> CONFIG_MAP_2 =
+            ImmutableMap.of("key2", "value2");
+
+    private RestTelemetryConfig config1;
+    private RestTelemetryConfig sameAsConfig1;
+    private RestTelemetryConfig config2;
+
+    @Before
+    public void setup() {
+
+        RestTelemetryConfig.Builder builder1 =
+                new DefaultRestTelemetryConfig.DefaultBuilder();
+        RestTelemetryConfig.Builder builder2 =
+                new DefaultRestTelemetryConfig.DefaultBuilder();
+        RestTelemetryConfig.Builder builder3 =
+                new DefaultRestTelemetryConfig.DefaultBuilder();
+
+        config1 = builder1
+                .withAddress(IP_ADDRESS_1)
+                .withPort(PORT_1)
+                .withEndpoint(ENDPOINT_1)
+                .withMethod(METHOD_1)
+                .withRequestMediaType(REQUEST_MEDIA_TYPE_1)
+                .withResponseMediaType(RESPONSE_MEDIA_TYPE_1)
+                .withConfigMap(CONFIG_MAP_1)
+                .build();
+
+        sameAsConfig1 = builder2
+                .withAddress(IP_ADDRESS_1)
+                .withPort(PORT_1)
+                .withEndpoint(ENDPOINT_1)
+                .withMethod(METHOD_1)
+                .withRequestMediaType(REQUEST_MEDIA_TYPE_1)
+                .withResponseMediaType(RESPONSE_MEDIA_TYPE_1)
+                .withConfigMap(CONFIG_MAP_1)
+                .build();
+
+        config2 = builder3
+                .withAddress(IP_ADDRESS_2)
+                .withPort(PORT_2)
+                .withEndpoint(ENDPOINT_2)
+                .withMethod(METHOD_2)
+                .withRequestMediaType(REQUEST_MEDIA_TYPE_2)
+                .withResponseMediaType(RESPONSE_MEDIA_TYPE_2)
+                .withConfigMap(CONFIG_MAP_2)
+                .build();
+    }
+
+    @Test
+    public void testEquality() {
+        new EqualsTester()
+                .addEqualityGroup(config1, sameAsConfig1)
+                .addEqualityGroup(config2).testEquals();
+    }
+
+    @Test
+    public void testConstruction() {
+        RestTelemetryConfig config = config1;
+
+        assertThat(config.address(), is(IP_ADDRESS_1));
+        assertThat(config.port(), is(PORT_1));
+        assertThat(config.endpoint(), is(ENDPOINT_1));
+        assertThat(config.method(), is(METHOD_1));
+        assertThat(config.requestMediaType(), is(REQUEST_MEDIA_TYPE_1));
+        assertThat(config.responseMediaType(), is(RESPONSE_MEDIA_TYPE_1));
+        assertThat(config.configMap(), is(CONFIG_MAP_1));
+    }
+}
