diff --git a/apps/tetunnel/api/src/test/java/org/onosproject/tetunnel/api/tunnel/DefaultTeTunnelTest.java b/apps/tetunnel/api/src/test/java/org/onosproject/tetunnel/api/tunnel/DefaultTeTunnelTest.java
new file mode 100644
index 0000000..5105baf
--- /dev/null
+++ b/apps/tetunnel/api/src/test/java/org/onosproject/tetunnel/api/tunnel/DefaultTeTunnelTest.java
@@ -0,0 +1,156 @@
+/*
+ * Copyright 2016-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.tetunnel.api.tunnel;
+
+import com.google.common.collect.Lists;
+import org.junit.Assert;
+import org.junit.Test;
+import org.onosproject.tetopology.management.api.TeTopologyKey;
+import org.onosproject.tetopology.management.api.node.TeNodeKey;
+import org.onosproject.tetopology.management.api.node.TtpKey;
+import org.onosproject.tetunnel.api.lsp.TeLspKey;
+import org.onosproject.tetunnel.api.tunnel.path.DefaultTePath;
+import org.onosproject.tetunnel.api.tunnel.path.TePath;
+
+import java.util.List;
+
+/**
+ * Unit tests for default TE tunnel implementation.
+ */
+public class DefaultTeTunnelTest {
+
+    /**
+     * Tests constructor of TeTunnelKey.
+     */
+    @Test
+    public void testConstructorOfTeTunnelKey() {
+        final int providerId = 1;
+        final int clientId = 2;
+        final int topologyId = 3;
+        final int teTunnelId = 4;
+
+        TeTunnelKey key = new TeTunnelKey(providerId, clientId, topologyId,
+                                          teTunnelId);
+
+        Assert.assertEquals(key.teTunnelId(), teTunnelId);
+        Assert.assertEquals(key.teTopologyKey(),
+                            new TeTopologyKey(providerId, clientId,
+                                              topologyId));
+        Assert.assertTrue(key.equals(
+                          new TeTunnelKey(providerId, clientId, topologyId,
+                                          teTunnelId)));
+    }
+
+    /**
+     * Tests constructor of TeLspKey.
+     */
+    @Test
+    public void testConstructorOfTeLspKey() {
+        final int providerId = 1;
+        final int clientId = 2;
+        final int topologyId = 3;
+        final int teLspId = 4;
+
+        TeLspKey key = new TeLspKey(providerId, clientId, topologyId,
+                                       teLspId);
+
+        Assert.assertEquals(key.teLspId(), teLspId);
+        Assert.assertEquals(key.teTopologyKey(),
+                            new TeTopologyKey(providerId, clientId,
+                                              topologyId));
+        Assert.assertTrue(key.equals(
+                new TeLspKey(providerId, clientId, topologyId,
+                                teLspId)));
+    }
+
+    /**
+     * Tests builder of the DefaultTeTunnel.
+     */
+    @Test
+    public void testDefaultTeTunnelBuilder() {
+        final int providerId = 1;
+        final int clientId = 2;
+        final int topologyId = 3;
+        final int srcNodeId = 4;
+        final int srcTtpId = 5;
+        final int dstNodeId = 6;
+        final int dstTtpId = 7;
+        final int teTunnelId = 8;
+        final String teTunnelName = "Test TE tunnel";
+        final List<TePath> paths = Lists.newArrayList(
+                new DefaultTePath(TePath.Type.DYNAMIC, null, null, null));
+        final int segTunnelId1 = 1001;
+        final int segTunnelId2 = 1002;
+        final int segTunnelId3 = 1003;
+
+        TeTunnel teTunnel = DefaultTeTunnel.builder()
+                .teTunnelKey(
+                        new TeTunnelKey(providerId, clientId, topologyId,
+                                        teTunnelId))
+                .srcNode(new TeNodeKey(providerId, clientId, topologyId,
+                                       srcNodeId))
+                .srcTp(new TtpKey(providerId, clientId, topologyId, srcNodeId,
+                                  srcTtpId))
+                .dstNode(new TeNodeKey(providerId, clientId, topologyId,
+                                       dstNodeId))
+                .dstTp(new TtpKey(providerId, clientId, topologyId, dstNodeId,
+                                  dstTtpId))
+                .name(teTunnelName)
+                .adminState(TeTunnel.State.UP)
+                .lspProtectionType(TeTunnel.LspProtectionType.LSP_PROT_REROUTE)
+                .type(TeTunnel.Type.P2P)
+                .primaryPaths(paths)
+                .build();
+
+        Assert.assertEquals(teTunnel.teTunnelKey().teTopologyKey(),
+                            new TeTopologyKey(providerId, clientId,
+                                              topologyId));
+        Assert.assertEquals(teTunnel.teTunnelKey().teTunnelId(), teTunnelId);
+        Assert.assertEquals(teTunnel.srcNode(),
+                            new TeNodeKey(providerId, clientId, topologyId,
+                                                              srcNodeId));
+        Assert.assertEquals(teTunnel.dstNode(),
+                            new TeNodeKey(providerId, clientId, topologyId,
+                                          dstNodeId));
+        Assert.assertEquals(teTunnel.srcTp(),
+                            new TtpKey(providerId, clientId, topologyId,
+                                       srcNodeId, srcTtpId));
+        Assert.assertEquals(teTunnel.dstTp(),
+                            new TtpKey(providerId, clientId, topologyId,
+                                       dstNodeId, dstTtpId));
+        Assert.assertEquals(teTunnel.name(), teTunnelName);
+        Assert.assertEquals(teTunnel.adminStatus(), TeTunnel.State.UP);
+        Assert.assertEquals(teTunnel.lspProtectionType(),
+                            TeTunnel.LspProtectionType.LSP_PROT_REROUTE);
+        Assert.assertEquals(teTunnel.type(), TeTunnel.Type.P2P);
+        Assert.assertEquals(teTunnel.primaryPaths().get(0).type(),
+                            TePath.Type.DYNAMIC);
+        Assert.assertEquals(teTunnel.primaryPaths(), paths);
+
+        TeTunnelKey segTunnel1 = new TeTunnelKey(providerId, clientId,
+                                                 topologyId, segTunnelId1);
+        TeTunnelKey segTunnel2 = new TeTunnelKey(providerId, clientId,
+                                                 topologyId, segTunnelId2);
+        TeTunnelKey segTunnel3 = new TeTunnelKey(providerId, clientId,
+                                                 topologyId, segTunnelId3);
+        List<TeTunnelKey> segTunnels = Lists.newArrayList(segTunnel1,
+                                                          segTunnel2,
+                                                          segTunnel3);
+        teTunnel.segmentTunnels(segTunnels);
+        Assert.assertEquals(teTunnel.segmentTunnels(), segTunnels);
+    }
+}
diff --git a/apps/tetunnel/api/src/test/java/org/onosproject/tetunnel/api/tunnel/path/DefaultTePathTest.java b/apps/tetunnel/api/src/test/java/org/onosproject/tetunnel/api/tunnel/path/DefaultTePathTest.java
new file mode 100644
index 0000000..f712811
--- /dev/null
+++ b/apps/tetunnel/api/src/test/java/org/onosproject/tetunnel/api/tunnel/path/DefaultTePathTest.java
@@ -0,0 +1,118 @@
+/*
+ * Copyright 2016-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.tetunnel.api.tunnel.path;
+
+import com.google.common.collect.Lists;
+import org.junit.Assert;
+import org.junit.Test;
+import org.onosproject.tetopology.management.api.TeTopologyKey;
+import org.onosproject.tetopology.management.api.node.TeNodeKey;
+import org.onosproject.tetopology.management.api.node.TtpKey;
+import org.onosproject.tetunnel.api.lsp.TeLspKey;
+
+import java.util.List;
+
+/**
+ * Unit tests for default TE path implementation.
+ */
+public class DefaultTePathTest {
+
+    /**
+     * Tests constructor of DefaultTePathSelection.
+     */
+    @Test
+    public void testConstructorOfDefaultTePathSelection() {
+        final int providerId = 1;
+        final int clientId = 2;
+        final int topologyId = 3;
+        final long costLimit = 4;
+        final short hopLimit = 5;
+
+        TePathSelection tePathSelection = new DefaultTePathSelection(
+                new TeTopologyKey(providerId, clientId, topologyId),
+                costLimit, hopLimit);
+        Assert.assertEquals(tePathSelection.teTopologyKey(),
+                            new TeTopologyKey(providerId, clientId, topologyId));
+        Assert.assertEquals(tePathSelection.costLimit(), costLimit);
+        Assert.assertEquals(tePathSelection.hopLimit(), hopLimit);
+    }
+
+    /**
+     * Tests constructor of DefaultTeRouteUnnumberedLink.
+     */
+    @Test
+    public void testConstructorOfDefaultTeRouteUnnumberedLink() {
+        final int providerId = 1;
+        final int clientId = 2;
+        final int topologyId = 3;
+        final int teNodeId = 4;
+        final int teTtpId = 5;
+
+        TeRouteUnnumberedLink teRouteUnnumberedLink =
+                new DefaultTeRouteUnnumberedLink(
+                        new TeNodeKey(providerId, clientId,
+                                      topologyId, teNodeId),
+                        new TtpKey(providerId, clientId,
+                                   topologyId, teNodeId, teTtpId));
+
+        Assert.assertEquals(teRouteUnnumberedLink.type(),
+                            TeRouteSubobject.Type.UNNUMBERED_LINK);
+        Assert.assertEquals(teRouteUnnumberedLink.node(),
+                            new TeNodeKey(providerId, clientId,
+                                          topologyId, teNodeId));
+        Assert.assertEquals(teRouteUnnumberedLink.ttp(),
+                            new TtpKey(providerId, clientId,
+                                       topologyId, teNodeId, teTtpId));
+    }
+
+    /**
+     * Tests constructor of DefaultTePath.
+     */
+    @Test
+    public void testConstructorOfDefaultTePath() {
+        final int providerId = 1;
+        final int clientId = 2;
+        final int topologyId = 3;
+        final int teNodeId = 4;
+        final int teTtpId = 5;
+        final int teLspId = 6;
+
+        List<TeLspKey> lspKeys = Lists.newArrayList(
+                new TeLspKey(providerId, clientId, topologyId, teLspId));
+
+        TeRouteUnnumberedLink teRouteUnnumberedLink =
+                new DefaultTeRouteUnnumberedLink(
+                        new TeNodeKey(providerId, clientId,
+                                      topologyId, teNodeId),
+                        new TtpKey(providerId, clientId,
+                                   topologyId, teNodeId, teTtpId));
+        List<TeRouteSubobject> explicitRoute = Lists.newArrayList(
+                teRouteUnnumberedLink);
+
+        List<TePath> secondaryPaths = Lists.newArrayList(
+                new DefaultTePath(TePath.Type.DYNAMIC, null, null, null)
+        );
+
+        TePath tePath = new DefaultTePath(TePath.Type.EXPLICIT, lspKeys,
+                                          explicitRoute, secondaryPaths);
+
+        Assert.assertEquals(tePath.type(), TePath.Type.EXPLICIT);
+        Assert.assertEquals(tePath.explicitRoute(), explicitRoute);
+        Assert.assertEquals(tePath.lsps(), lspKeys);
+        Assert.assertEquals(tePath.secondaryPaths(), secondaryPaths);
+    }
+}
diff --git a/apps/tetunnel/pom.xml b/apps/tetunnel/pom.xml
index 897000d..02b06f5 100644
--- a/apps/tetunnel/pom.xml
+++ b/apps/tetunnel/pom.xml
@@ -39,5 +39,11 @@
             <groupId>org.onosproject</groupId>
             <artifactId>onos-incubator-api</artifactId>
         </dependency>
+
+        <dependency>
+            <groupId>org.onosproject</groupId>
+            <artifactId>onlab-junit</artifactId>
+            <scope>test</scope>
+        </dependency>
     </dependencies>
 </project>
\ No newline at end of file
