diff --git a/apps/tetopology/api/src/test/java/org/onosproject/tetopology/manager/api/TeNodeApiTest.java b/apps/tetopology/api/src/test/java/org/onosproject/tetopology/manager/api/TeNodeApiTest.java
new file mode 100644
index 0000000..e2a4b3f
--- /dev/null
+++ b/apps/tetopology/api/src/test/java/org/onosproject/tetopology/manager/api/TeNodeApiTest.java
@@ -0,0 +1,349 @@
+/*
+ * 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.tetopology.manager.api;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.onosproject.tetopology.management.api.link.ConnectivityMatrixId;
+import org.onosproject.tetopology.management.api.link.ElementType;
+import org.onosproject.tetopology.management.api.link.Label;
+import org.onosproject.tetopology.management.api.link.PathElement;
+import org.onosproject.tetopology.management.api.link.TePathAttributes;
+import org.onosproject.tetopology.management.api.link.UnderlayAbstractPath;
+import org.onosproject.tetopology.management.api.link.UnderlayBackupPath;
+import org.onosproject.tetopology.management.api.node.ConnectivityMatrix;
+import org.onosproject.tetopology.management.api.node.ConnectivityMatrixKey;
+import org.onosproject.tetopology.management.api.node.TeNodeKey;
+import org.onosproject.tetopology.management.api.node.TtpKey;
+
+import java.util.ArrayList;
+import java.util.BitSet;
+import java.util.List;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+
+/**
+ * Unit tests for TE node APIs.
+ */
+public class TeNodeApiTest {
+    private static final long DEFAULT_PROVIDER_ID = 123;
+    private static final long DEFAULT_CLIENT_ID = 456;
+    private static final long DEFAULT_TOPOLOGY_ID = 789;
+    private static final long DEFAULT_TE_NODE_ID = 1234;
+    private static final long DEFAULT_CONNECTIVITY_ENTRY_ID = 5678;
+    private static final long DEFAULT_TTP_ID = 897;
+    private static final String DEFAULT_TOPOLOGY_ID_STRING =
+            "default-topology-123";
+    private static final long DEFAULT_PATH_ELEMENT_ID = 234;
+    private static final long DEFAULT_UNDERLAY_BACKUP_PATH_IDX = 10;
+
+    private long providerId;
+    private long clientId;
+    private long topologyId;
+    private long teNodeId;
+    private long connectivityMatrixEntryId;
+    private long pathElementId;
+    private long underlayBackupPathIndex;
+    private long ttpId;
+
+    private String topologyIdString;
+
+    @Before
+    public void setUp() {
+        providerId = DEFAULT_PROVIDER_ID;
+        clientId = DEFAULT_CLIENT_ID;
+        topologyId = DEFAULT_TOPOLOGY_ID;
+        teNodeId = DEFAULT_TE_NODE_ID;
+        connectivityMatrixEntryId = DEFAULT_CONNECTIVITY_ENTRY_ID;
+        topologyIdString = DEFAULT_TOPOLOGY_ID_STRING;
+        pathElementId = DEFAULT_PATH_ELEMENT_ID;
+        underlayBackupPathIndex = DEFAULT_UNDERLAY_BACKUP_PATH_IDX;
+        ttpId = DEFAULT_TTP_ID;
+    }
+
+    @Test
+    public void connectivityMatrixKeyEqualOperatorTest() {
+        ConnectivityMatrixKey key1 = new ConnectivityMatrixKey(providerId,
+                                                               clientId,
+                                                               topologyId,
+                                                               teNodeId,
+                                                               connectivityMatrixEntryId);
+        ConnectivityMatrixKey key2 = new ConnectivityMatrixKey(providerId,
+                                                               clientId,
+                                                               topologyId,
+                                                               teNodeId,
+                                                               connectivityMatrixEntryId);
+        ConnectivityMatrixKey key3 = new ConnectivityMatrixKey(providerId + 1,
+                                                               clientId,
+                                                               topologyId,
+                                                               teNodeId,
+                                                               connectivityMatrixEntryId);
+        ConnectivityMatrixKey key4 = new ConnectivityMatrixKey(providerId,
+                                                               clientId + 1,
+                                                               topologyId,
+                                                               teNodeId,
+                                                               connectivityMatrixEntryId);
+        ConnectivityMatrixKey key5 = new ConnectivityMatrixKey(providerId,
+                                                               clientId,
+                                                               topologyId + 1,
+                                                               teNodeId,
+                                                               connectivityMatrixEntryId);
+        ConnectivityMatrixKey key6 = new ConnectivityMatrixKey(providerId,
+                                                               clientId,
+                                                               topologyId,
+                                                               teNodeId + 1,
+                                                               connectivityMatrixEntryId);
+        ConnectivityMatrixKey key7 = new ConnectivityMatrixKey(providerId,
+                                                               clientId,
+                                                               topologyId,
+                                                               teNodeId,
+                                                               connectivityMatrixEntryId + 1);
+
+        assertTrue("Two matrix keys must be equal", key1.equals(key2));
+
+        assertFalse("Two matrix keys must be unequal", key1.equals(key3));
+        assertFalse("Two matrix keys must be unequal", key3.equals(key1));
+
+        assertFalse("Two matrix keys must be unequal", key1.equals(key4));
+        assertFalse("Two matrix keys must be unequal", key4.equals(key1));
+
+        assertFalse("Two matrix keys must be unequal", key1.equals(key5));
+        assertFalse("Two matrix keys must be unequal", key5.equals(key1));
+
+        assertFalse("Two matrix keys must be unequal", key1.equals(key6));
+        assertFalse("Two matrix keys must be unequal", key6.equals(key1));
+
+        assertFalse("Two matrix keys must be unequal", key1.equals(key7));
+        assertFalse("Two matrix keys must be unequal", key7.equals(key1));
+    }
+
+    @Test
+    public void underlayBackupPathEqualOperatorTest() {
+        ElementType pathElementType1 = new Label(pathElementId + 1);
+        ElementType pathElementType2 = new Label(pathElementId + 2);
+        ElementType pathElementType3 = new Label(pathElementId + 3);
+        ElementType pathElementType4 = new Label(pathElementId + 4);
+
+        PathElement pathElement1 = new PathElement(pathElementId, teNodeId,
+                                                   pathElementType1, true);
+        PathElement pathElement2 = new PathElement(pathElementId + 1,
+                                                   teNodeId + 1,
+                                                   pathElementType2, true);
+        PathElement pathElement3 = new PathElement(pathElementId + 2,
+                                                   teNodeId + 2,
+                                                   pathElementType3, true);
+        PathElement pathElement4 = new PathElement(pathElementId + 3,
+                                                   teNodeId + 3,
+                                                   pathElementType4, true);
+
+        List<PathElement> pathElementList1 = new ArrayList<>();
+        pathElementList1.add(pathElement1);
+        pathElementList1.add(pathElement2);
+        pathElementList1.add(pathElement3);
+
+        List<PathElement> pathElementList2 = new ArrayList<>();
+        pathElementList2.add(pathElement1);
+        pathElementList2.add(pathElement2);
+        pathElementList2.add(pathElement4);
+
+        // bp1 and bp2 are the same. bp3, bp4, and bp5 differ by one
+        // attribute comparing to bp1.
+        UnderlayBackupPath bp1 = new UnderlayBackupPath(
+                underlayBackupPathIndex, pathElementList1, true);
+        UnderlayBackupPath bp2 = new UnderlayBackupPath(
+                underlayBackupPathIndex, pathElementList1, true);
+
+        UnderlayBackupPath bp3 = new UnderlayBackupPath(
+                underlayBackupPathIndex + 1, pathElementList1, true);
+        UnderlayBackupPath bp4 = new UnderlayBackupPath(
+                underlayBackupPathIndex, pathElementList2, true);
+        UnderlayBackupPath bp5 = new UnderlayBackupPath(
+                underlayBackupPathIndex, pathElementList1, false);
+
+
+        assertTrue("Two backup paths must be equal", bp1.equals(bp2));
+
+        assertFalse("Two backup paths must be unequal", bp1.equals(bp3));
+        assertFalse("Two backup paths must be unequal", bp3.equals(bp1));
+
+        assertFalse("Two backup paths must be unequal", bp1.equals(bp4));
+        assertFalse("Two backup paths must be unequal", bp4.equals(bp1));
+
+        assertFalse("Two backup paths must be unequal", bp1.equals(bp5));
+        assertFalse("Two backup paths must be unequal", bp5.equals(bp1));
+    }
+
+
+    @Test
+    public void connectivityMatrixEqualOperatorTest() {
+        long key1 = connectivityMatrixEntryId;
+        long key2 = connectivityMatrixEntryId + 1;
+
+        ElementType pathElementType1 = new Label(pathElementId + 1);
+        ElementType pathElementType2 = new Label(pathElementId + 2);
+        ElementType pathElementType3 = new Label(pathElementId + 3);
+        ElementType pathElementType4 = new Label(pathElementId + 4);
+
+        PathElement pathElement1 = new PathElement(pathElementId, teNodeId,
+                                                   pathElementType1, true);
+        PathElement pathElement2 = new PathElement(pathElementId + 1,
+                                                   teNodeId + 1,
+                                                   pathElementType2, true);
+        PathElement pathElement3 = new PathElement(pathElementId + 2,
+                                                   teNodeId + 2,
+                                                   pathElementType3, true);
+        PathElement pathElement4 = new PathElement(pathElementId + 3,
+                                                   teNodeId + 3,
+                                                   pathElementType4, true);
+
+        List<PathElement> pathElementList1 = new ArrayList<>();
+        pathElementList1.add(pathElement1);
+        pathElementList1.add(pathElement2);
+        pathElementList1.add(pathElement3);
+
+        List<PathElement> pathElementList2 = new ArrayList<>();
+        pathElementList2.add(pathElement1);
+        pathElementList2.add(pathElement2);
+        pathElementList2.add(pathElement4);
+
+        UnderlayAbstractPath abstractPath1 = new UnderlayAbstractPath(
+                pathElementList1, true);
+        UnderlayAbstractPath abstractPath2 = new UnderlayAbstractPath(
+                pathElementList2, true);
+
+        ElementType from = new ConnectivityMatrixId(connectivityMatrixEntryId);
+        List<ElementType> mergingList = new ArrayList<>();
+        mergingList.add(new ConnectivityMatrixId(connectivityMatrixEntryId + 1));
+        mergingList.add(new ConnectivityMatrixId(connectivityMatrixEntryId + 2));
+
+        List<ElementType> constrainList = new ArrayList<>();
+        constrainList.add(new ConnectivityMatrixId(connectivityMatrixEntryId + 3));
+        constrainList.add(new ConnectivityMatrixId(connectivityMatrixEntryId + 4));
+
+        BitSet flags = new BitSet(1);
+
+        List<Long> srlgs = new ArrayList<>();
+        srlgs.add(new Long(10));
+        TePathAttributes tePathAttributes = new TePathAttributes(new Long(10),
+                                                                 new Long(10),
+                                                                 srlgs);
+
+        ConnectivityMatrix matrix1 = new ConnectivityMatrix(key1,
+                                                            from,
+                                                            mergingList,
+                                                            constrainList,
+                                                            flags,
+                                                            tePathAttributes,
+                                                            abstractPath1);
+        ConnectivityMatrix matrix2 = new ConnectivityMatrix(key1,
+                                                            from,
+                                                            mergingList,
+                                                            constrainList,
+                                                            flags,
+                                                            tePathAttributes,
+                                                            abstractPath1);
+        ConnectivityMatrix matrix3 = new ConnectivityMatrix(key1,
+                                                            from,
+                                                            mergingList,
+                                                            constrainList,
+                                                            flags,
+                                                            tePathAttributes,
+                                                            abstractPath2);
+        ConnectivityMatrix matrix4 = new ConnectivityMatrix(key2,
+                                                            from,
+                                                            mergingList,
+                                                            constrainList,
+                                                            flags,
+                                                            tePathAttributes,
+                                                            abstractPath1);
+
+        assertTrue("Two conn matrices must be equal", matrix1.equals(matrix2));
+
+        assertFalse("Two conn matrices must be unequal", matrix1.equals(matrix3));
+        assertFalse("Two conn matrices must be unequal", matrix3.equals(matrix1));
+
+        assertFalse("Two conn matrices must be unequal", matrix1.equals(matrix4));
+        assertFalse("Two conn matrices must be unequal", matrix4.equals(matrix1));
+    }
+
+    @Test
+    public void teNodeKeyEqualOperatorTest() {
+        TeNodeKey key1 = new TeNodeKey(providerId, clientId,
+                                       topologyId, teNodeId);
+        TeNodeKey key2 = new TeNodeKey(providerId, clientId,
+                                       topologyId, teNodeId);
+        TeNodeKey key3 = new TeNodeKey(providerId + 1, clientId,
+                                       topologyId, teNodeId);
+        TeNodeKey key4 = new TeNodeKey(providerId, clientId + 1,
+                                       topologyId, teNodeId);
+        TeNodeKey key5 = new TeNodeKey(providerId, clientId,
+                                       topologyId + 1, teNodeId);
+        TeNodeKey key6 = new TeNodeKey(providerId, clientId,
+                                       topologyId, teNodeId + 1);
+
+        assertTrue("Two matrix keys must be equal", key1.equals(key2));
+
+        assertFalse("Two matrix keys must be unequal", key1.equals(key3));
+        assertFalse("Two matrix keys must be unequal", key3.equals(key1));
+
+        assertFalse("Two matrix keys must be unequal", key1.equals(key4));
+        assertFalse("Two matrix keys must be unequal", key4.equals(key1));
+
+        assertFalse("Two matrix keys must be unequal", key1.equals(key5));
+        assertFalse("Two matrix keys must be unequal", key5.equals(key1));
+
+        assertFalse("Two matrix keys must be unequal", key1.equals(key6));
+        assertFalse("Two matrix keys must be unequal", key6.equals(key1));
+    }
+
+    @Test
+    public void ttpMatrixKeyEqualOperatorTest() {
+        TtpKey key1 = new TtpKey(providerId, clientId, topologyId,
+                                 teNodeId, ttpId);
+        TtpKey key2 = new TtpKey(providerId, clientId, topologyId,
+                                 teNodeId, ttpId);
+        TtpKey key3 = new TtpKey(providerId + 1, clientId, topologyId,
+                                 teNodeId, ttpId);
+        TtpKey key4 = new TtpKey(providerId, clientId + 1, topologyId,
+                                 teNodeId, ttpId);
+        TtpKey key5 = new TtpKey(providerId, clientId, topologyId + 1,
+                                 teNodeId, ttpId);
+        TtpKey key6 = new TtpKey(providerId, clientId, topologyId,
+                                 teNodeId + 1, ttpId);
+        TtpKey key7 = new TtpKey(providerId, clientId, topologyId,
+                                 teNodeId, ttpId + 1);
+
+        assertTrue("Two TTP keys must be equal", key1.equals(key2));
+
+        assertFalse("Two TTP keys must be unequal", key1.equals(key3));
+        assertFalse("Two TTP keys must be unequal", key3.equals(key1));
+
+        assertFalse("Two TTP keys must be unequal", key1.equals(key4));
+        assertFalse("Two TTP keys must be unequal", key4.equals(key1));
+
+        assertFalse("Two TTP keys must be unequal", key1.equals(key5));
+        assertFalse("Two TTP keys must be unequal", key5.equals(key1));
+
+        assertFalse("Two TTP keys must be unequal", key1.equals(key6));
+        assertFalse("Two TTP keys must be unequal", key6.equals(key1));
+
+        assertFalse("Two TTP keys must be unequal", key1.equals(key7));
+        assertFalse("Two TTP keys must be unequal", key7.equals(key1));
+    }
+
+}
