diff --git a/core/api/src/test/java/org/onosproject/net/key/CommunityNameTest.java b/core/api/src/test/java/org/onosproject/net/key/CommunityNameTest.java
new file mode 100644
index 0000000..5e2d4a9
--- /dev/null
+++ b/core/api/src/test/java/org/onosproject/net/key/CommunityNameTest.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright 2016 Open Networking Laboratory
+ *
+ * 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.key;
+
+import org.junit.Test;
+
+import static org.junit.Assert.*;
+import static org.onlab.junit.ImmutableClassChecker.assertThatClassIsImmutable;
+
+/**
+ * Test class for CommunityName.
+ */
+public class CommunityNameTest {
+
+    final String cName = "CommunityName";
+
+    /**
+     * Checks that the CommunityName class is immutable.
+     */
+    @Test
+    public void testImmutability() {
+        assertThatClassIsImmutable(CommunityName.class);
+    }
+
+    /**
+     * Checks the construction of a community name object with a null
+     * value passed into it.
+     */
+    @Test
+    public void testCommunityNameNull() {
+        CommunityName communityName = CommunityName.communityName(null);
+
+        assertNotNull("The CommunityName should not be null.", communityName);
+        assertNull("The name should be null.", communityName.name());
+    }
+
+    /**
+     * Checks the construction of a community name object with a non-null
+     * value passed into it.
+     */
+    @Test
+    public void testCommunityName() {
+        CommunityName communityName = CommunityName.communityName(cName);
+
+        assertNotNull("The CommunityName should not be null.", communityName);
+        assertEquals("The name should match the expected value.", cName, communityName.name());
+    }
+}
diff --git a/core/api/src/test/java/org/onosproject/net/key/DeviceKeyIdTest.java b/core/api/src/test/java/org/onosproject/net/key/DeviceKeyIdTest.java
new file mode 100644
index 0000000..6744460
--- /dev/null
+++ b/core/api/src/test/java/org/onosproject/net/key/DeviceKeyIdTest.java
@@ -0,0 +1,75 @@
+/*
+ * Copyright 2016 Open Networking Laboratory
+ *
+ * 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.key;
+
+import com.google.common.testing.EqualsTester;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.onlab.junit.ImmutableClassChecker.assertThatClassIsImmutable;
+
+/**
+ * Test class for DeviceDeyId.
+ */
+public class DeviceKeyIdTest {
+
+    final String deviceKeyIdValue1 = "DeviceKeyId1";
+    final String deviceKeyIdValue2 = "DeviceKeyId2";
+
+    /**
+     * Checks that the DeviceKeyId class is immutable.
+     */
+    @Test
+    public void testImmutability() {
+        assertThatClassIsImmutable(DeviceKeyId.class);
+    }
+
+    /**
+     * Checks the construction of a DeviceKeyId object throws an
+     * IllegalArgumentException when the input identifier is null.
+     */
+    @Test(expected = NullPointerException.class)
+    public void testConstructionUsingNullId() {
+        DeviceKeyId.deviceKeyId(null);
+    }
+
+    /**
+     * Checks the construction of a DeviceKeyId object.
+     */
+    @Test
+    public void testConstruction() {
+        DeviceKeyId deviceKeyId = DeviceKeyId.deviceKeyId(deviceKeyIdValue1);
+        assertNotNull("The deviceKeyId should not be null.", deviceKeyId);
+        assertEquals("The id should match the expected value.",
+                     deviceKeyIdValue1, deviceKeyId.id());
+    }
+
+    /**
+     * Tests the equality of device key identifiers.
+     */
+    @Test
+    public void testEquality() {
+        DeviceKeyId deviceKeyId1 = DeviceKeyId.deviceKeyId(deviceKeyIdValue1);
+        DeviceKeyId deviceKeyId2 = DeviceKeyId.deviceKeyId(deviceKeyIdValue1);
+        DeviceKeyId deviceKeyId3 = DeviceKeyId.deviceKeyId(deviceKeyIdValue2);
+
+        new EqualsTester().addEqualityGroup(deviceKeyId1, deviceKeyId2)
+                .addEqualityGroup(deviceKeyId3)
+                .testEquals();
+    }
+}
diff --git a/core/api/src/test/java/org/onosproject/net/key/DeviceKeyTest.java b/core/api/src/test/java/org/onosproject/net/key/DeviceKeyTest.java
new file mode 100644
index 0000000..344a425
--- /dev/null
+++ b/core/api/src/test/java/org/onosproject/net/key/DeviceKeyTest.java
@@ -0,0 +1,122 @@
+/*
+ * Copyright 2016 Open Networking Laboratory
+ *
+ * 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.key;
+
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+/**
+ * Test class for DeviceKey.
+ */
+public class DeviceKeyTest {
+
+    final String deviceKeyIdValue = "DeviceKeyId1";
+    final String deviceKeyLabel = "DeviceKeyLabel";
+    final String deviceKeySnmpName = "DeviceKeySnmpName";
+    final String deviceKeyUsername = "DeviceKeyUsername";
+    final String deviceKeyPassword = "DeviceKeyPassword";
+
+    /**
+     * Checks the construction of a community name device key with a null
+     * value passed into it. This will throw a NullPointerException.
+     */
+    @Test(expected = NullPointerException.class)
+    public void testCreateDeviceKeyUsingCommunityNameWithNull() {
+        DeviceKey deviceKey = DeviceKey.createDeviceKeyUsingCommunityName(null, null, null);
+    }
+
+    /**
+     * Checks the construction of a community name device key name with non-null
+     * values passed into it.
+     */
+    @Test
+    public void testCreateDeviceKeyUsingCommunityName() {
+        DeviceKeyId deviceKeyId = DeviceKeyId.deviceKeyId(deviceKeyIdValue);
+
+        DeviceKey deviceKey = DeviceKey.createDeviceKeyUsingCommunityName(deviceKeyId,
+                                                                          deviceKeyLabel, deviceKeySnmpName);
+        assertNotNull("The deviceKey should not be null.", deviceKey);
+        assertEquals("The deviceKeyId should match as expected", deviceKeyId, deviceKey.deviceKeyId());
+        assertEquals("The label should match as expected", deviceKeyLabel, deviceKey.label());
+        assertEquals("The type should match as expected", DeviceKey.Type.COMMUNITY_NAME, deviceKey.type());
+
+        CommunityName communityName = deviceKey.asCommunityName();
+        assertNotNull("The communityName should not be null.", communityName);
+        assertEquals("The name should match as expected", deviceKeySnmpName, communityName.name());
+    }
+
+    /**
+     * Checks the invalid conversion a device key of type COMMUNITY_NAME to
+     * a username / password object.
+     */
+    @Test(expected = IllegalStateException.class)
+    public void testInvalidConversionToAsUsernamePassword() {
+        DeviceKeyId deviceKeyId = DeviceKeyId.deviceKeyId(deviceKeyIdValue);
+
+        DeviceKey deviceKey = DeviceKey.createDeviceKeyUsingCommunityName(deviceKeyId,
+                                                                          deviceKeyLabel, deviceKeySnmpName);
+        // Attempting to convert this device key to a username / password object
+        // should throw and IllegalStateException.
+        UsernamePassword usernamePassword = deviceKey.asUsernamePassword();
+    }
+
+    /**
+     * Checks the construction of a username / password device key with a null
+     * value passed into it. This will throw a NullPointerException.
+     */
+    @Test(expected = NullPointerException.class)
+    public void testCreateDeviceKeyUsingUsernamePasswordWithNull() {
+        DeviceKey deviceKey = DeviceKey.createDeviceKeyUsingUsernamePassword(null, null, null, null);
+    }
+
+    /**
+     * Checks the construction of a username and password device key name with non-null
+     * values passed into it.
+     */
+    @Test
+    public void testCreateDeviceKeyUsingUsernamePassword() {
+        DeviceKeyId deviceKeyId = DeviceKeyId.deviceKeyId(deviceKeyIdValue);
+
+        DeviceKey deviceKey = DeviceKey.createDeviceKeyUsingUsernamePassword(deviceKeyId, deviceKeyLabel,
+                                                                             deviceKeyUsername, deviceKeyPassword);
+        assertNotNull("The deviceKey should not be null.", deviceKey);
+        assertEquals("The deviceKeyId should match as expected", deviceKeyId, deviceKey.deviceKeyId());
+        assertEquals("The label should match as expected", deviceKeyLabel, deviceKey.label());
+        assertEquals("The type should match as expected", DeviceKey.Type.USERNAME_PASSWORD, deviceKey.type());
+
+        UsernamePassword usernamePassword = deviceKey.asUsernamePassword();
+        assertNotNull("The usernamePassword should not be null.", usernamePassword);
+        assertEquals("The username should match as expected", deviceKeyUsername, usernamePassword.username());
+        assertEquals("The password should match as expected", deviceKeyPassword, usernamePassword.password());
+    }
+
+    /**
+     * Checks the invalid conversion a device key of type USERNAME_PASSWORD to
+     * a community name object.
+     */
+    @Test(expected = IllegalStateException.class)
+    public void testInvalidConversionToAsCommunityName() {
+        DeviceKeyId deviceKeyId = DeviceKeyId.deviceKeyId(deviceKeyIdValue);
+
+        DeviceKey deviceKey = DeviceKey.createDeviceKeyUsingUsernamePassword(deviceKeyId, deviceKeyLabel,
+                                                                             deviceKeyUsername, deviceKeyPassword);
+        // Attempting to convert this device key to a community name should throw and IllegalStateException.
+        CommunityName communityName = deviceKey.asCommunityName();
+    }
+}
diff --git a/core/api/src/test/java/org/onosproject/net/key/UsernamePasswordTest.java b/core/api/src/test/java/org/onosproject/net/key/UsernamePasswordTest.java
new file mode 100644
index 0000000..d8acafb
--- /dev/null
+++ b/core/api/src/test/java/org/onosproject/net/key/UsernamePasswordTest.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright 2016 Open Networking Laboratory
+ *
+ * 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.key;
+
+import org.junit.Test;
+
+import static org.junit.Assert.*;
+import static org.onlab.junit.ImmutableClassChecker.assertThatClassIsImmutable;
+
+/**
+ * Test class for UsernamePassword.
+ */
+public class UsernamePasswordTest {
+    final String username = "username";
+    final String password = "password";
+
+    /**
+     * Checks that the UsernamePassword class is immutable.
+     */
+    @Test
+    public void testImmutability() {
+        assertThatClassIsImmutable(UsernamePassword.class);
+    }
+
+    /**
+     * Checks the construction of a username / password object with null
+     * values passed into it.
+     */
+    @Test
+    public void testUsernamePasswordNull() {
+        UsernamePassword usernamePassword = UsernamePassword.usernamePassword(null, null);
+
+        assertNotNull("The UsernamePassword should not be null.", usernamePassword);
+        assertNull("The username should be null.", usernamePassword.username());
+        assertNull("The password should be null.", usernamePassword.password());
+    }
+
+    /**
+     * Checks the construction of a username / password object with non-null
+     * values passed into it.
+     */
+    @Test
+    public void testUsernamePassword() {
+        UsernamePassword usernamePassword = UsernamePassword.usernamePassword(username, password);
+
+        assertNotNull("The usernamePassword should not be null.", usernamePassword);
+        assertEquals("The username should match the expected value.", username, usernamePassword.username());
+        assertEquals("The password should match the expected value.", password, usernamePassword.password());
+    }
+}
