diff --git a/core/api/src/test/java/org/onosproject/net/behaviour/protection/ProtectedTransportEndpointDescriptionTest.java b/core/api/src/test/java/org/onosproject/net/behaviour/protection/ProtectedTransportEndpointDescriptionTest.java
new file mode 100644
index 0000000..d4e82a1
--- /dev/null
+++ b/core/api/src/test/java/org/onosproject/net/behaviour/protection/ProtectedTransportEndpointDescriptionTest.java
@@ -0,0 +1,70 @@
+/*
+ * Copyright 2017-present 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.behaviour.protection;
+
+import java.util.List;
+
+import org.junit.Test;
+import org.onosproject.net.DeviceId;
+import org.onosproject.net.NetTestTools;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.testing.EqualsTester;
+
+import static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.notNullValue;
+import static org.junit.Assert.assertThat;
+
+/**
+ * Unit tests for protected transport endpoint description.
+ */
+public class ProtectedTransportEndpointDescriptionTest {
+
+    @Test
+    public void testConstruction() {
+        List<TransportEndpointDescription> paths = ImmutableList.of();
+        DeviceId peer = NetTestTools.did("d1");
+        String fingerprint = "aaa";
+
+        ProtectedTransportEndpointDescription pted =
+            ProtectedTransportEndpointDescription.buildDescription(paths, peer,
+                                                                   fingerprint);
+        assertThat(pted, notNullValue());
+        assertThat(pted.paths(), is(paths));
+        assertThat(pted.peer(), is(peer));
+        assertThat(pted.fingerprint(), is(fingerprint));
+    }
+
+    @Test
+    public void testEquals() {
+        List<TransportEndpointDescription> paths = ImmutableList.of();
+        DeviceId peer = NetTestTools.did("d1");
+        String fingerprint = "aaa";
+
+        ProtectedTransportEndpointDescription a =
+                ProtectedTransportEndpointDescription.of(paths, peer,
+                                                         fingerprint);
+        ProtectedTransportEndpointDescription b =
+                ProtectedTransportEndpointDescription.of(paths, peer,
+                                                         fingerprint);
+        new EqualsTester()
+                .addEqualityGroup(a)
+                .addEqualityGroup(b)
+                .testEquals();
+    }
+
+}
diff --git a/core/api/src/test/java/org/onosproject/net/behaviour/protection/ProtectedTransportEndpointStateTest.java b/core/api/src/test/java/org/onosproject/net/behaviour/protection/ProtectedTransportEndpointStateTest.java
new file mode 100644
index 0000000..3cbb66c
--- /dev/null
+++ b/core/api/src/test/java/org/onosproject/net/behaviour/protection/ProtectedTransportEndpointStateTest.java
@@ -0,0 +1,95 @@
+/*
+ * Copyright 2017-present 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.behaviour.protection;
+
+import java.util.List;
+
+import org.junit.Test;
+import org.onosproject.net.DeviceId;
+import org.onosproject.net.FilteredConnectPoint;
+import org.onosproject.net.NetTestTools;
+
+import com.google.common.collect.ImmutableList;
+
+import static org.hamcrest.Matchers.contains;
+import static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.notNullValue;
+import static org.junit.Assert.assertThat;
+
+/**
+ * Unit tests for protected transport endpoint state.
+ */
+public class ProtectedTransportEndpointStateTest {
+
+    private List<TransportEndpointDescription> paths = ImmutableList.of();
+    private DeviceId peer = NetTestTools.did("d1");
+    private String fingerprint = "aaa";
+
+    private TransportEndpointDescription description =
+        TransportEndpointDescription
+            .builder()
+            .withEnabled(true)
+            .withOutput(new FilteredConnectPoint(NetTestTools.connectPoint("xxx", 1)))
+            .build();
+
+    private ProtectedTransportEndpointDescription protectedDescription =
+            ProtectedTransportEndpointDescription.buildDescription(paths, peer,
+                                                                   fingerprint);
+    private TransportEndpointState state1 =
+        TransportEndpointState
+            .builder()
+            .withId(TransportEndpointId.of("1"))
+            .withDescription(description)
+            .withLive(true)
+            .build();
+    private List<TransportEndpointState> pathStates = ImmutableList.of(state1);
+
+
+    @Test
+    public void testConstruction() {
+
+        ProtectedTransportEndpointState state =
+            ProtectedTransportEndpointState
+                .builder()
+                .withActivePathIndex(0)
+                .withDescription(protectedDescription)
+                .withPathStates(pathStates)
+                .build();
+
+        assertThat(state, notNullValue());
+        assertThat(state.description(), is(protectedDescription));
+        assertThat(state.pathStates(), contains(state1));
+        assertThat(state.workingPathIndex(), is(0));
+    }
+
+    @Test
+    public void testToString() {
+        ProtectedTransportEndpointState state1 =
+                ProtectedTransportEndpointState
+                        .builder()
+                        .withActivePathIndex(0)
+                        .withDescription(protectedDescription)
+                        .withPathStates(pathStates)
+                        .build();
+        ProtectedTransportEndpointState state2 =
+                ProtectedTransportEndpointState
+                        .builder()
+                        .copyFrom(state1)
+                        .build();
+        assertThat(state1.toString(), is(state2.toString()));
+    }
+}
diff --git a/core/api/src/test/java/org/onosproject/net/behaviour/protection/TransportEndpointDescriptionTest.java b/core/api/src/test/java/org/onosproject/net/behaviour/protection/TransportEndpointDescriptionTest.java
new file mode 100644
index 0000000..c98216b
--- /dev/null
+++ b/core/api/src/test/java/org/onosproject/net/behaviour/protection/TransportEndpointDescriptionTest.java
@@ -0,0 +1,95 @@
+/*
+ * Copyright 2017-present 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.behaviour.protection;
+
+import org.junit.Test;
+import org.onosproject.net.FilteredConnectPoint;
+import org.onosproject.net.NetTestTools;
+
+import com.google.common.testing.EqualsTester;
+
+import static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.notNullValue;
+import static org.junit.Assert.assertThat;
+
+/**
+ * Unit tests for the transport endpoint description.
+ */
+public class TransportEndpointDescriptionTest {
+
+    @Test
+    public void testConstruction() {
+        FilteredConnectPoint output =
+                new FilteredConnectPoint(NetTestTools.connectPoint("xxx", 1));
+        TransportEndpointDescription ted =
+            TransportEndpointDescription
+                .builder()
+                .withEnabled(true)
+                .withOutput(output)
+                .build();
+
+        assertThat(ted, notNullValue());
+        assertThat(ted.isEnabled(), is(true));
+        assertThat(ted.output(), is(output));
+    }
+
+    @Test
+    public void testCopyConstruction() {
+        FilteredConnectPoint output =
+                new FilteredConnectPoint(NetTestTools.connectPoint("xxx", 1));
+        TransportEndpointDescription originalTed =
+                TransportEndpointDescription
+                        .builder()
+                        .withEnabled(true)
+                        .withOutput(output)
+                        .build();
+        TransportEndpointDescription ted =
+                TransportEndpointDescription
+                        .builder()
+                        .copyFrom(originalTed)
+                        .build();
+
+        assertThat(ted, notNullValue());
+        assertThat(ted.isEnabled(), is(true));
+        assertThat(ted.output(), is(output));
+    }
+
+    @Test
+    public void testEquals() {
+        FilteredConnectPoint cp =
+                new FilteredConnectPoint(NetTestTools.connectPoint("d", 1));
+
+        TransportEndpointDescription ted1 =
+                TransportEndpointDescription
+                        .builder()
+                        .withEnabled(true)
+                        .withOutput(cp)
+                        .build();
+
+        TransportEndpointDescription ted2 =
+                TransportEndpointDescription
+                        .builder()
+                        .withEnabled(true)
+                        .withOutput(cp)
+                        .build();
+
+        new EqualsTester()
+                .addEqualityGroup(ted1)
+                .addEqualityGroup(ted2)
+                .testEquals();
+    }
+}
