diff --git a/core/api/src/test/java/org/onosproject/net/config/basics/AllowedEntityConfigTest.java b/core/api/src/test/java/org/onosproject/net/config/basics/AllowedEntityConfigTest.java
new file mode 100644
index 0000000..a0bc219
--- /dev/null
+++ b/core/api/src/test/java/org/onosproject/net/config/basics/AllowedEntityConfigTest.java
@@ -0,0 +1,55 @@
+/*
+ * 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.net.config.basics;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.JsonNodeFactory;
+import org.junit.Test;
+import org.onosproject.net.config.ConfigApplyDelegate;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.is;
+
+public class AllowedEntityConfigTest {
+
+    class TestConfig extends AllowedEntityConfig<String> {
+        TestConfig() {
+        }
+    }
+
+    @Test
+    public void basicTest() {
+        ConfigApplyDelegate delegate = configApply -> { };
+        ObjectMapper mapper = new ObjectMapper();
+
+        TestConfig allowed = new TestConfig();
+        TestConfig notAllowed = new TestConfig();
+
+        allowed.init("enabled", "KEY", JsonNodeFactory.instance.objectNode(), mapper, delegate);
+
+        notAllowed.init("disabled", "KEY", JsonNodeFactory.instance.objectNode(), mapper, delegate);
+        notAllowed.isAllowed(false);
+
+        assertThat(allowed.isAllowed(), is(true));
+        assertThat(notAllowed.isAllowed(), is(false));
+
+        notAllowed.isAllowed(true);
+        allowed.isAllowed(false);
+        assertThat(allowed.isAllowed(), is(false));
+        assertThat(notAllowed.isAllowed(), is(true));
+    }
+}
\ No newline at end of file
diff --git a/core/api/src/test/java/org/onosproject/net/config/basics/BandwidthCapacityTest.java b/core/api/src/test/java/org/onosproject/net/config/basics/BandwidthCapacityTest.java
new file mode 100644
index 0000000..146930b
--- /dev/null
+++ b/core/api/src/test/java/org/onosproject/net/config/basics/BandwidthCapacityTest.java
@@ -0,0 +1,49 @@
+/*
+ * 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.net.config.basics;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.JsonNodeFactory;
+import org.junit.Test;
+import org.onlab.util.Bandwidth;
+import org.onosproject.net.ConnectPoint;
+import org.onosproject.net.NetTestTools;
+import org.onosproject.net.config.ConfigApplyDelegate;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.containsString;
+import static org.hamcrest.Matchers.is;
+
+public class BandwidthCapacityTest {
+
+    @Test
+    public void testConstruction() {
+        BandwidthCapacity config = new BandwidthCapacity();
+        ConfigApplyDelegate delegate = configApply -> { };
+        ObjectMapper mapper = new ObjectMapper();
+        ConnectPoint cp = NetTestTools.connectPoint("cp1", 3);
+
+        config.init(cp, "KEY", JsonNodeFactory.instance.objectNode(), mapper, delegate);
+
+        double expectedBw = 1.0;
+        config.capacity(Bandwidth.mbps(expectedBw));
+        assertThat(config.isValid(), is(true));
+        assertThat(config.toString(), containsString("capacity"));
+
+    }
+
+}
\ No newline at end of file
diff --git a/core/api/src/test/java/org/onosproject/net/config/basics/BasicFeatureConfigTest.java b/core/api/src/test/java/org/onosproject/net/config/basics/BasicFeatureConfigTest.java
new file mode 100644
index 0000000..67ffdef
--- /dev/null
+++ b/core/api/src/test/java/org/onosproject/net/config/basics/BasicFeatureConfigTest.java
@@ -0,0 +1,54 @@
+/*
+ * 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.net.config.basics;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.JsonNodeFactory;
+import org.junit.Test;
+import org.onosproject.net.config.ConfigApplyDelegate;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.is;
+
+public class BasicFeatureConfigTest {
+
+    class TestConfig extends BasicFeatureConfig<String> {
+        TestConfig(boolean defaultValue) {
+            super(defaultValue);
+        }
+    }
+
+    @Test
+    public void basicTest() {
+        ConfigApplyDelegate delegate = configApply -> { };
+        ObjectMapper mapper = new ObjectMapper();
+
+        TestConfig enabled = new TestConfig(true);
+        TestConfig disabled = new TestConfig(false);
+
+        enabled.init("enabled", "KEY", JsonNodeFactory.instance.objectNode(), mapper, delegate);
+        disabled.init("disabled", "KEY", JsonNodeFactory.instance.objectNode(), mapper, delegate);
+
+        assertThat(enabled.enabled(), is(true));
+        assertThat(disabled.enabled(), is(false));
+
+        disabled.enabled(true);
+        enabled.enabled(false);
+        assertThat(enabled.enabled(), is(false));
+        assertThat(disabled.enabled(), is(true));
+    }
+}
\ No newline at end of file
diff --git a/core/api/src/test/java/org/onosproject/net/config/basics/BasicHostConfigTest.java b/core/api/src/test/java/org/onosproject/net/config/basics/BasicHostConfigTest.java
new file mode 100644
index 0000000..6721cc7
--- /dev/null
+++ b/core/api/src/test/java/org/onosproject/net/config/basics/BasicHostConfigTest.java
@@ -0,0 +1,70 @@
+/*
+ * 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.net.config.basics;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.JsonNodeFactory;
+import com.google.common.collect.ImmutableSet;
+import org.junit.Test;
+import org.onlab.packet.IpAddress;
+import org.onosproject.net.HostId;
+import org.onosproject.net.HostLocation;
+import org.onosproject.net.NetTestTools;
+import org.onosproject.net.config.ConfigApplyDelegate;
+
+import java.util.Set;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.hasItems;
+import static org.hamcrest.Matchers.hasSize;
+import static org.hamcrest.Matchers.is;
+
+public class BasicHostConfigTest {
+
+    /**
+     * Tests construction, setters and getters of a BasicLinkConfig object.
+     */
+    @Test
+    public void testConstruction() {
+        BasicHostConfig config = new BasicHostConfig();
+        ConfigApplyDelegate delegate = configApply -> { };
+        ObjectMapper mapper = new ObjectMapper();
+        HostId hostId = NetTestTools.hid("12:34:56:78:90:ab/1");
+        IpAddress ip1 = IpAddress.valueOf("1.1.1.1");
+        IpAddress ip2 = IpAddress.valueOf("1.1.1.2");
+        IpAddress ip3 = IpAddress.valueOf("1.1.1.3");
+        Set<IpAddress> ips = ImmutableSet.of(ip1, ip2, ip3);
+        HostLocation loc1 = new HostLocation(
+                NetTestTools.connectPoint("d1", 1), System.currentTimeMillis());
+        HostLocation loc2 = new HostLocation(
+                NetTestTools.connectPoint("d2", 2), System.currentTimeMillis());
+        Set<HostLocation> locs = ImmutableSet.of(loc1, loc2);
+
+        config.init(hostId, "KEY", JsonNodeFactory.instance.objectNode(), mapper, delegate);
+
+        config.setIps(ips)
+              .setLocations(locs);
+
+        assertThat(config.isValid(), is(true));
+        assertThat(config.name(), is("-"));
+        assertThat(config.ipAddresses(), hasSize(3));
+        assertThat(config.ipAddresses(), hasItems(ip1, ip2, ip3));
+        assertThat(config.locations(), hasSize(2));
+        assertThat(config.locations(), hasItems(loc1, loc2));
+    }
+
+}
\ No newline at end of file
diff --git a/core/api/src/test/java/org/onosproject/net/config/basics/BasicRegionConfigTest.java b/core/api/src/test/java/org/onosproject/net/config/basics/BasicRegionConfigTest.java
index 7d9b78c..22058fe 100644
--- a/core/api/src/test/java/org/onosproject/net/config/basics/BasicRegionConfigTest.java
+++ b/core/api/src/test/java/org/onosproject/net/config/basics/BasicRegionConfigTest.java
@@ -24,10 +24,15 @@
 import org.onosproject.net.DeviceId;
 import org.onosproject.net.config.InvalidFieldException;
 import org.onosproject.net.region.Region;
+import org.onosproject.ui.topo.LayoutLocation;
 
 import java.util.List;
 import java.util.Set;
 
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.hasSize;
+import static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.notNullValue;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertNull;
@@ -186,4 +191,37 @@
 
         cfg.isValid();
     }
+
+    @Test
+    public void testPeerLocMapping() {
+        String peer1 = "peer1";
+        String loc1 = LayoutLocation.Type.GRID.toString();
+        double loc1Y = 22.0;
+        double loc1X = 33.0;
+        String peer2 = "peer2";
+        String loc2 = LayoutLocation.Type.GEO.toString();
+        double loc2Y = 222.0;
+        double loc2X = 333.0;
+        loadRegion(R2);
+        cfg.addPeerLocMapping(peer1, loc1, loc1Y, loc1X);
+        cfg.addPeerLocMapping(peer2, loc2, loc2Y, loc2X);
+
+        List<LayoutLocation> locs = cfg.getMappings();
+
+        assertThat(locs, hasSize(2));
+
+        LayoutLocation createdLoc1 = locs.stream().filter(loc -> loc.id().equals(peer1)).findFirst().orElse(null);
+        LayoutLocation createdLoc2 = locs.stream().filter(loc -> loc.id().equals(peer2)).findFirst().orElse(null);
+
+        assertThat(createdLoc1, notNullValue());
+        assertThat(createdLoc2, notNullValue());
+
+        assertThat(createdLoc1.locType().toString(), is(loc1));
+        assertThat(createdLoc1.longOrX(), is(loc1X));
+        assertThat(createdLoc1.latOrY(), is(loc1Y));
+
+        assertThat(createdLoc2.locType().toString(), is(loc2));
+        assertThat(createdLoc2.longOrX(), is(loc2X));
+        assertThat(createdLoc2.latOrY(), is(loc2Y));
+    }
 }
diff --git a/core/api/src/test/java/org/onosproject/net/config/basics/McastConfigTest.java b/core/api/src/test/java/org/onosproject/net/config/basics/McastConfigTest.java
new file mode 100644
index 0000000..03536cd
--- /dev/null
+++ b/core/api/src/test/java/org/onosproject/net/config/basics/McastConfigTest.java
@@ -0,0 +1,147 @@
+/*
+ * Copyright 2016-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.net.config.basics;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.google.common.annotations.Beta;
+import org.junit.Before;
+import org.junit.Test;
+import org.onlab.packet.VlanId;
+import org.onosproject.TestApplicationId;
+import org.onosproject.core.ApplicationId;
+import org.onosproject.core.CoreService;
+import org.onosproject.net.config.Config;
+import org.onosproject.net.config.ConfigApplyDelegate;
+
+import java.io.InputStream;
+
+import static org.hamcrest.Matchers.is;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertThat;
+import static org.junit.Assert.assertTrue;
+
+/**
+ * Tests for class {@link McastConfig}.
+ */
+@Beta
+public class McastConfigTest {
+    private static final TestApplicationId APP_ID =
+            new TestApplicationId(CoreService.CORE_APP_NAME);
+    private McastConfig config;
+    private McastConfig invalidConfig;
+
+    private static final VlanId INGRESS_VLAN_1 = VlanId.NONE;
+    private static final VlanId EGRESS_VLAN_1 = VlanId.NONE;
+    private static final VlanId INGRESS_VLAN_2 = VlanId.vlanId((short) 100);
+    private static final VlanId EGRESS_VLAN_2 = VlanId.vlanId((short) 100);
+
+    /**
+     * Initialize test related variables.
+     *
+     * @throws Exception
+     */
+    @Before
+    public void setUp() throws Exception {
+        InputStream jsonStream = McastConfigTest.class
+                .getResourceAsStream("/mcast-config.json");
+        InputStream invalidJsonStream = McastConfigTest.class
+                .getResourceAsStream("/mcast-config-invalid.json");
+
+        ApplicationId subject = APP_ID;
+        String key = CoreService.CORE_APP_NAME;
+        ObjectMapper mapper = new ObjectMapper();
+        JsonNode jsonNode = mapper.readTree(jsonStream);
+        JsonNode invalidJsonNode = mapper.readTree(invalidJsonStream);
+        ConfigApplyDelegate delegate = new MockDelegate();
+
+        config = new McastConfig();
+        config.init(subject, key, jsonNode, mapper, delegate);
+        invalidConfig = new McastConfig();
+        invalidConfig.init(subject, key, invalidJsonNode, mapper, delegate);
+    }
+
+    /**
+     * Tests config validity.
+     *
+     * @throws Exception
+     */
+    @Test
+    public void isValid() throws Exception {
+        assertTrue(config.isValid());
+        assertFalse(invalidConfig.isValid());
+    }
+
+    /**
+     * Tests ingress VLAN getter.
+     *
+     * @throws Exception
+     */
+    @Test
+    public void ingressVlan() throws Exception {
+        VlanId ingressVlan = config.ingressVlan();
+        assertNotNull("ingressVlan should not be null", ingressVlan);
+        assertThat(ingressVlan, is(INGRESS_VLAN_1));
+    }
+
+    /**
+     * Tests ingress VLAN setter.
+     *
+     * @throws Exception
+     */
+    @Test
+    public void setIngressVlan() throws Exception {
+        config.setIngressVlan(INGRESS_VLAN_2);
+
+        VlanId ingressVlan = config.ingressVlan();
+        assertNotNull("ingressVlan should not be null", ingressVlan);
+        assertThat(ingressVlan, is(INGRESS_VLAN_2));
+    }
+
+    /**
+     * Tests egress VLAN getter.
+     *
+     * @throws Exception
+     */
+    @Test
+    public void egressVlan() throws Exception {
+        VlanId egressVlan = config.egressVlan();
+        assertNotNull("egressVlan should not be null", egressVlan);
+        assertThat(egressVlan, is(EGRESS_VLAN_1));
+    }
+
+    /**
+     * Tests egress VLAN setter.
+     *
+     * @throws Exception
+     */
+    @Test
+    public void setEgressVlan() throws Exception {
+        config.setEgressVlan(EGRESS_VLAN_2);
+
+        VlanId egressVlan = config.egressVlan();
+        assertNotNull("egressVlan should not be null", egressVlan);
+        assertThat(egressVlan, is(EGRESS_VLAN_2));
+    }
+
+    private class MockDelegate implements ConfigApplyDelegate {
+        @Override
+        public void onApply(Config config) {
+        }
+    }
+}
diff --git a/core/api/src/test/java/org/onosproject/net/config/basics/SubjectFactoriesTest.java b/core/api/src/test/java/org/onosproject/net/config/basics/SubjectFactoriesTest.java
new file mode 100644
index 0000000..7a4dc1a
--- /dev/null
+++ b/core/api/src/test/java/org/onosproject/net/config/basics/SubjectFactoriesTest.java
@@ -0,0 +1,156 @@
+/*
+ * 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.net.config.basics;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.onosproject.TestApplicationId;
+import org.onosproject.core.ApplicationId;
+import org.onosproject.core.CoreServiceAdapter;
+import org.onosproject.net.ConnectPoint;
+import org.onosproject.net.DeviceId;
+import org.onosproject.net.HostId;
+import org.onosproject.net.LinkKey;
+import org.onosproject.net.NetTestTools;
+import org.onosproject.net.config.SubjectFactory;
+import org.onosproject.net.region.RegionId;
+import org.onosproject.ui.model.topo.UiTopoLayoutId;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.equalTo;
+import static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.notNullValue;
+
+public class SubjectFactoriesTest {
+
+    class TestCoreService extends CoreServiceAdapter {
+
+        @Override
+        public ApplicationId registerApplication(String key) {
+            return new TestApplicationId(key);
+        }
+
+    }
+
+    @Before
+    public void setUp() {
+        SubjectFactories.setCoreService(new TestCoreService());
+    }
+
+    @Test
+    public void testAppIdFactory() {
+        SubjectFactory<ApplicationId> appIdFactory = SubjectFactories.APP_SUBJECT_FACTORY;
+        assertThat(appIdFactory, notNullValue());
+
+        ApplicationId id = NetTestTools.APP_ID;
+        ApplicationId createdAppId = appIdFactory.createSubject(id.name());
+        assertThat(createdAppId.id(), equalTo(id.id()));
+        assertThat(appIdFactory.subjectKey(id), is(id.name()));
+    }
+
+    @Test
+    public void testDeviceIdFactory() {
+        SubjectFactory<DeviceId> deviceIdFactory = SubjectFactories.DEVICE_SUBJECT_FACTORY;
+        assertThat(deviceIdFactory, notNullValue());
+
+        String deviceName = "d1";
+        String ofDeviceName = "of:" + deviceName;
+        DeviceId id = NetTestTools.did(deviceName);
+
+        DeviceId createdDeviceId = deviceIdFactory.createSubject(ofDeviceName);
+        assertThat(createdDeviceId, equalTo(id));
+        assertThat(deviceIdFactory.subjectKey(id), is(ofDeviceName));
+    }
+
+    @Test
+    public void testConnectPointFactory() {
+        SubjectFactory<ConnectPoint> connectPointFactory = SubjectFactories.CONNECT_POINT_SUBJECT_FACTORY;
+        assertThat(connectPointFactory, notNullValue());
+
+        String deviceName = "d1";
+        String ofDeviceName = "of:" + deviceName;
+        int devicePort = 2;
+        String cpString = ofDeviceName + "/" + Integer.toString(devicePort);
+        ConnectPoint cp = NetTestTools.connectPoint(deviceName, devicePort);
+
+        ConnectPoint createdConnectPoint = connectPointFactory.createSubject(cpString);
+        assertThat(createdConnectPoint, equalTo(cp));
+        assertThat(connectPointFactory.subjectKey(cp), is(cpString));
+    }
+
+    @Test
+    public void testHostFactory() {
+        SubjectFactory<HostId> hostFactory = SubjectFactories.HOST_SUBJECT_FACTORY;
+        assertThat(hostFactory, notNullValue());
+
+        String hostName = "11:11:11:11:11:11/3";
+        HostId hostId = NetTestTools.hid(hostName);
+
+        HostId createdHostId = hostFactory.createSubject(hostName);
+        assertThat(createdHostId, equalTo(hostId));
+        assertThat(hostFactory.subjectKey(hostId), is(hostId.toString()));
+    }
+
+    @Test
+    public void testLinkFactory() {
+        SubjectFactory<LinkKey> linkFactory = SubjectFactories.LINK_SUBJECT_FACTORY;
+        assertThat(linkFactory, notNullValue());
+
+        String deviceName1 = "d1";
+        String deviceName2 = "d2";
+        String ofDeviceName1 = "of:" + deviceName1;
+        String ofDeviceName2 = "of:" + deviceName2;
+        int devicePort1 = 2;
+        int devicePort2 = 3;
+        String cpString1 = ofDeviceName1 + "/" + Integer.toString(devicePort1);
+        String cpString2 = ofDeviceName2 + "/" + Integer.toString(devicePort2);
+        ConnectPoint cp1 = NetTestTools.connectPoint(deviceName1, devicePort1);
+        ConnectPoint cp2 = NetTestTools.connectPoint(deviceName2, devicePort2);
+        String linkString1 = cpString1 + '-' + cpString2;
+        LinkKey key1 = LinkKey.linkKey(cp1, cp2);
+
+        LinkKey createdLink1 = linkFactory.createSubject(linkString1);
+        assertThat(createdLink1.asId(), is(linkString1));
+        assertThat(linkFactory.subjectKey(key1), is(linkString1));
+    }
+
+    @Test
+    public void testRegionIdFactory() {
+        SubjectFactory<RegionId> regionIdFactory = SubjectFactories.REGION_SUBJECT_FACTORY;
+        assertThat(regionIdFactory, notNullValue());
+
+        String region1 = "region1";
+        RegionId id = RegionId.regionId(region1);
+
+        RegionId createdRegionId = regionIdFactory.createSubject(region1);
+        assertThat(createdRegionId.id(), equalTo(region1));
+        assertThat(regionIdFactory.subjectKey(id), is(region1));
+    }
+
+    @Test
+    public void testUITopoLayoutIdFactory() {
+        SubjectFactory<UiTopoLayoutId> uiTopoLayoutIdFactory = SubjectFactories.LAYOUT_SUBJECT_FACTORY;
+        assertThat(uiTopoLayoutIdFactory, notNullValue());
+
+        String layout1 = "layout1";
+        UiTopoLayoutId id = UiTopoLayoutId.layoutId(layout1);
+
+        UiTopoLayoutId createdLayouId = uiTopoLayoutIdFactory.createSubject(layout1);
+        assertThat(createdLayouId.id(), equalTo(layout1));
+        assertThat(uiTopoLayoutIdFactory.subjectKey(id), is(layout1));
+    }
+}
\ No newline at end of file
diff --git a/core/api/src/test/resources/mcast-config-invalid.json b/core/api/src/test/resources/mcast-config-invalid.json
new file mode 100644
index 0000000..3d7c3a0
--- /dev/null
+++ b/core/api/src/test/resources/mcast-config-invalid.json
@@ -0,0 +1,4 @@
+{
+  "ingressVlan" : "None",
+  "egressVlan" : "5000"
+}
\ No newline at end of file
diff --git a/core/api/src/test/resources/mcast-config.json b/core/api/src/test/resources/mcast-config.json
new file mode 100644
index 0000000..ba8eaeb
--- /dev/null
+++ b/core/api/src/test/resources/mcast-config.json
@@ -0,0 +1,4 @@
+{
+  "ingressVlan" : "None",
+  "egressVlan" : "None"
+}
\ No newline at end of file
