diff --git a/apps/tenbi/tunnel/app.xml b/apps/tenbi/tunnel/app.xml
new file mode 100755
index 0000000..78997d3
--- /dev/null
+++ b/apps/tenbi/tunnel/app.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ /*
+  ~  * 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.
+  ~  */
+  -->
+<app name="org.onosproject.tenbi.tunnel" origin="HUAWEI" version="${project.version}"
+     featuresRepo="mvn:${project.groupId}/${project.artifactId}/${project.version}/xml/features"
+     features="${project.artifactId}">
+    <description>${project.description}</description>
+    <artifact>mvn:${project.groupId}/${project.artifactId}/${project.version}</artifact>
+    <artifact>mvn:${project.groupId}/onos-app-tenbi-yangmodel/${project.version}</artifact>
+</app>
+
diff --git a/apps/tenbi/tunnel/features.xml b/apps/tenbi/tunnel/features.xml
new file mode 100755
index 0000000..9610045
--- /dev/null
+++ b/apps/tenbi/tunnel/features.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<!--
+  ~ /*
+  ~  * 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.
+  ~  */
+  -->
+<features xmlns="http://karaf.apache.org/xmlns/features/v1.2.0" name="${project.artifactId}-${project.version}">
+    <repository>mvn:${project.groupId}/onos-app-tenbi-yangmodel/${project.version}/xml/features</repository>
+    <feature name="${project.artifactId}" version="${project.version}" description="${project.description}">
+        <feature>onos-api</feature>
+        <feature>onos-app-tenbi-yangmodel</feature>
+        <bundle>mvn:${project.groupId}/onos-app-tetopology-api/${project.version}</bundle>
+        <bundle>mvn:${project.groupId}/onos-app-yms-api/${project.version}</bundle>
+        <bundle>mvn:${project.groupId}/onos-app-tetunnel-api/${project.version}</bundle>
+        <bundle>mvn:${project.groupId}/onos-app-tenbi-utils/${project.version}</bundle>
+        <bundle>mvn:${project.groupId}/${project.artifactId}/${project.version}</bundle>
+    </feature>
+</features>
diff --git a/apps/tenbi/tunnel/pom.xml b/apps/tenbi/tunnel/pom.xml
new file mode 100755
index 0000000..23f761f
--- /dev/null
+++ b/apps/tenbi/tunnel/pom.xml
@@ -0,0 +1,96 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ /*
+  ~  * 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.
+  ~  */
+  -->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>onos-app-tenbi</artifactId>
+        <groupId>org.onosproject</groupId>
+        <version>1.8.0-SNAPSHOT</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>onos-app-tenbi-tunnel</artifactId>
+    <packaging>bundle</packaging>
+    <description>IETF TE Tunnel NBI</description>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.onosproject</groupId>
+            <artifactId>onos-app-tenbi-yangmodel</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.onosproject</groupId>
+            <artifactId>onos-app-tenbi-utils</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.onosproject</groupId>
+            <artifactId>onos-app-yms-api</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.onosproject</groupId>
+            <artifactId>onos-incubator-api</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.onosproject</groupId>
+            <artifactId>onos-app-tetunnel-api</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.onosproject</groupId>
+            <artifactId>onos-app-tetopology-api</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.easymock</groupId>
+            <artifactId>easymock</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.onosproject</groupId>
+            <artifactId>onlab-junit</artifactId>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>maven-bundle-plugin</artifactId>
+                <version>3.2.0</version>
+                <extensions>true</extensions>
+                <configuration>
+                    <instructions>
+                        <Private-Package>
+                            org.onosproject.yang.gen.*,
+                            org.onosproject.teyang.*,
+                            <!--org.onosproject.tetopology.management.api.*,-->
+                        </Private-Package>
+                    </instructions>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>
\ No newline at end of file
diff --git a/apps/tenbi/tunnel/src/main/java/org/onosproject/tenbi/tunnel/TeTunnelNbiManager.java b/apps/tenbi/tunnel/src/main/java/org/onosproject/tenbi/tunnel/TeTunnelNbiManager.java
new file mode 100755
index 0000000..38bd667
--- /dev/null
+++ b/apps/tenbi/tunnel/src/main/java/org/onosproject/tenbi/tunnel/TeTunnelNbiManager.java
@@ -0,0 +1,152 @@
+/*
+ * 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.tenbi.tunnel;
+
+import org.apache.felix.scr.annotations.Activate;
+import org.apache.felix.scr.annotations.Component;
+import org.apache.felix.scr.annotations.Deactivate;
+import org.apache.felix.scr.annotations.Reference;
+import org.apache.felix.scr.annotations.ReferenceCardinality;
+import org.apache.felix.scr.annotations.Service;
+import org.onosproject.event.AbstractListenerManager;
+import org.onosproject.tetopology.management.api.TeTopology;
+import org.onosproject.tetopology.management.api.TeTopologyKey;
+import org.onosproject.tetopology.management.api.TeTopologyService;
+import org.onosproject.tetunnel.api.TeTunnelAdminService;
+import org.onosproject.tetunnel.api.TeTunnelService;
+import org.onosproject.tetunnel.api.tunnel.DefaultTeTunnel;
+import org.onosproject.tetunnel.api.tunnel.TeTunnel;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.rev20160705.IetfTe;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.rev20160705.IetfTeOpParam;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.rev20160705.IetfTeService;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.rev20160705.ietfte.IetfTeEvent;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.rev20160705.ietfte.IetfTeEventListener;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.rev20160705.ietfte.tunnelsgrouping.tunnels.Tunnel;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.IetfTeTypes;
+import org.onosproject.yms.ymsm.YmsService;
+import org.slf4j.Logger;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.Optional;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+import static org.onosproject.tetopology.management.api.TeTopology.BIT_MERGED;
+import static org.onosproject.teyang.utils.tunnel.TunnelConverter.buildIetfTeWithTunnels;
+import static org.onosproject.teyang.utils.tunnel.TunnelConverter.te2YangTunnelConverter;
+import static org.onosproject.teyang.utils.tunnel.TunnelConverter.yang2TeTunnel;
+import static org.slf4j.LoggerFactory.getLogger;
+
+/**
+ * The IETF TE Tunnel NBI Manager implementation.
+ */
+@Component(immediate = true)
+@Service
+public class TeTunnelNbiManager
+        extends AbstractListenerManager<IetfTeEvent, IetfTeEventListener>
+        implements IetfTeService {
+    private final Logger log = getLogger(getClass());
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected YmsService ymsService;
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected TeTunnelService tunnelService;
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected TeTopologyService toplogyService;
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected TeTunnelAdminService tunnelAdminService;
+
+    @Activate
+    protected void activate() {
+        ymsService.registerService(this, IetfTeService.class, null);
+        ymsService.registerService(this, IetfTeTypes.class, null);
+        log.info("started");
+    }
+
+    @Deactivate
+    protected void deactivate() {
+        ymsService.unRegisterService(this, IetfTeService.class);
+        ymsService.unRegisterService(this, IetfTeTypes.class);
+        log.info("stopped");
+    }
+
+    @Override
+    public IetfTe getIetfTe(IetfTeOpParam ietfTe) {
+        List<Tunnel> tunnels = new ArrayList<>();
+        Collection<TeTunnel> teTunnels = tunnelService.getTeTunnels();
+        teTunnels.forEach(teTunnel -> {
+            Tunnel tunnel = te2YangTunnelConverter(teTunnel);
+            tunnels.add(tunnel);
+        });
+        IetfTe newIetfTe = buildIetfTeWithTunnels(tunnels);
+        return ietfTe.processSubtreeFiltering(newIetfTe, false);
+    }
+
+    @Override
+    public void setIetfTe(IetfTeOpParam ietfTe) {
+        checkNotNull(ietfTe, "Ietf te params should not be null");
+        //FIXME use topology id configured by user
+        // for there is no topology id param in the definition of te tunnel
+        // we use the merged topology id as the default topology where we create
+        // the tunnel, need to talk with the ietf-te draft writer.
+        TeTopologyKey topologyKey = getTopologyKey();
+        if (topologyKey == null) {
+            log.error("No usable topology now!");
+            return;
+        }
+
+        ietfTe.te().tunnels().tunnel().forEach(tunnel -> {
+            DefaultTeTunnel teTunnel = yang2TeTunnel(tunnel, topologyKey);
+            tunnelAdminService.createTeTunnel(teTunnel);
+        });
+    }
+
+    @Override
+    public void globalsRpc() {
+
+    }
+
+    @Override
+    public void interfacesRpc() {
+
+    }
+
+    @Override
+    public void tunnelsRpc() {
+        //TODO add implement for the te tunnel rpc
+    }
+
+    private TeTopologyKey getTopologyKey() {
+        TeTopologyKey key = null;
+        Optional<TeTopology> teTopology = toplogyService
+                .teTopologies()
+                .teTopologies()
+                .values()
+                .stream()
+                .filter(topology -> topology.flags().get(BIT_MERGED))
+                .findFirst();
+        if (teTopology.isPresent()) {
+            TeTopology topology = teTopology.get();
+            key = topology.teTopologyId();
+        }
+        return key;
+    }
+}
diff --git a/apps/tenbi/tunnel/src/main/java/org/onosproject/tenbi/tunnel/package-info.java b/apps/tenbi/tunnel/src/main/java/org/onosproject/tenbi/tunnel/package-info.java
new file mode 100755
index 0000000..e9a797c
--- /dev/null
+++ b/apps/tenbi/tunnel/src/main/java/org/onosproject/tenbi/tunnel/package-info.java
@@ -0,0 +1,20 @@
+/*
+ * 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.
+ */
+
+/**
+ * The implementations of IETF TE Tunnel YANG NBI.
+ */
+package org.onosproject.tenbi.tunnel;
\ No newline at end of file
diff --git a/apps/tenbi/tunnel/src/test/org/onosproject/tenbi/tunnel/TeTunnelNbiManagerTest.java b/apps/tenbi/tunnel/src/test/org/onosproject/tenbi/tunnel/TeTunnelNbiManagerTest.java
new file mode 100644
index 0000000..944fd03
--- /dev/null
+++ b/apps/tenbi/tunnel/src/test/org/onosproject/tenbi/tunnel/TeTunnelNbiManagerTest.java
@@ -0,0 +1,380 @@
+/*
+ * 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.tenbi.tunnel;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Lists;
+import org.junit.Before;
+import org.junit.Test;
+import org.onosproject.incubator.net.tunnel.TunnelId;
+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.TeTunnelAdminService;
+import org.onosproject.tetunnel.api.TeTunnelService;
+import org.onosproject.tetunnel.api.lsp.TeLsp;
+import org.onosproject.tetunnel.api.lsp.TeLspKey;
+import org.onosproject.tetunnel.api.tunnel.DefaultTeTunnel;
+import org.onosproject.tetunnel.api.tunnel.TeTunnel;
+import org.onosproject.tetunnel.api.tunnel.TeTunnelKey;
+import org.onosproject.tetunnel.api.tunnel.path.DefaultTePath;
+import org.onosproject.tetunnel.api.tunnel.path.DefaultTeRouteUnnumberedLink;
+import org.onosproject.tetunnel.api.tunnel.path.TePath;
+import org.onosproject.tetunnel.api.tunnel.path.TeRouteSubobject;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev20130715.ietfinettypes.IpAddress;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.rev20160705.IetfTe;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.rev20160705.IetfTeOpParam;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.rev20160705.ietfte.DefaultTe;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.rev20160705.ietfte.Te;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.rev20160705.ietfte.pathparamsconfig.Type;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.rev20160705.ietfte.pathparamsconfig.type.DefaultExplicit;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.rev20160705.ietfte.pathparamsconfig.type.explicit.DefaultExplicitRouteObjects;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.rev20160705.ietfte.pathparamsconfig.type.explicit.ExplicitRouteObjects;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.rev20160705.ietfte.tunnelproperties.Config;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.rev20160705.ietfte.tunnelproperties.DefaultConfig;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.rev20160705.ietfte.tunnelproperties.DefaultPrimaryPaths;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.rev20160705.ietfte.tunnelproperties.PrimaryPaths;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.rev20160705.ietfte.tunnelproperties.State;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.rev20160705.ietfte.tunnelsgrouping.DefaultTunnels;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.rev20160705.ietfte.tunnelsgrouping.Tunnels;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.rev20160705.ietfte.tunnelsgrouping.tunnels.DefaultTunnel;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.rev20160705.ietfte.tunnelsgrouping.tunnels.Tunnel;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.LspProtUnprotected;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.RouteIncludeEro;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.StateUp;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.TunnelP2p;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.explicitroutesubobject.type.DefaultUnnumberedLink;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.replay;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.onosproject.tetunnel.api.tunnel.TeTunnel.LspProtectionType.LSP_PROT_REROUTE;
+import static org.onosproject.tetunnel.api.tunnel.TeTunnel.Type.P2P;
+import static org.onosproject.tetunnel.api.tunnel.path.TeRouteSubobject.Type.UNNUMBERED_LINK;
+
+/**
+ * Unit tests for TeTunnelNbiManager.
+ */
+public class TeTunnelNbiManagerTest {
+    private static final String TE_REQ_FAILED = "IETF TE reqeust failed: ";
+    private static final String NAME = "testTunnel";
+    private IpAddress srcIp = IpAddress.fromString("1.1.1.1");
+    private IpAddress dstIp = IpAddress.fromString("2.2.2.2");
+    private byte[] bytes1 = new byte[]{1, 1, 1, 1, 0, 0, 0, 0};
+    private byte[] bytes2 = new byte[]{2, 2, 2, 2, 0, 0, 0, 0};
+    private long id1 = 16843009;
+    private long id2 = 33686018;
+
+
+    private TeTunnelNbiManager manager;
+    private TeTunnel testTeTunnel;
+
+
+    @Before
+    public void setUp() throws Exception {
+        manager = new TeTunnelNbiManager();
+    }
+
+    @Test
+    public void getIetfTe() throws Exception {
+        TeTunnelService tunnelService = createMock(TeTunnelService.class);
+        expect(tunnelService.getTeTunnels())
+                .andReturn(ImmutableList.of(buildTunnel()))
+                .once();
+        replay(tunnelService);
+
+        manager.tunnelService = tunnelService;
+
+        IetfTe ietfTe = manager.getIetfTe((IetfTeOpParam) buildGetIetfTeParams());
+
+        assertNotNull(TE_REQ_FAILED + "te null", ietfTe.te());
+        assertNotNull(TE_REQ_FAILED + "tunnel null", ietfTe.te().tunnels());
+
+        List<Tunnel> tunnelList = ietfTe.te().tunnels().tunnel();
+        assertEquals(TE_REQ_FAILED + "wrong tunnel size", 1, tunnelList.size());
+
+        Tunnel tunnel = tunnelList.get(0);
+        List<PrimaryPaths> pathsList = tunnel.primaryPaths();
+        assertNotNull(TE_REQ_FAILED + "path null", pathsList);
+        assertEquals(TE_REQ_FAILED + "wrong path size", 1, pathsList.size());
+
+        Type type = pathsList.get(0).state().type();
+        assertTrue(TE_REQ_FAILED + "wrong path type",
+                   type instanceof DefaultExplicit);
+        DefaultExplicit explicitPath = (DefaultExplicit) type;
+        List<ExplicitRouteObjects> routeObjectses =
+                explicitPath.explicitRouteObjects();
+        assertEquals(TE_REQ_FAILED + "wrong route size", 2, routeObjectses.size());
+
+        ExplicitRouteObjects routeObjects = routeObjectses.get(1);
+        assertTrue(TE_REQ_FAILED + "wrong route object type",
+                   routeObjects.type() instanceof DefaultUnnumberedLink);
+
+        DefaultUnnumberedLink link = (DefaultUnnumberedLink) routeObjects.type();
+        assertEquals(TE_REQ_FAILED + "wrong route id",
+                     IpAddress.fromString("0.0.0.2"), link.routerId());
+        assertEquals(TE_REQ_FAILED + "wrong interface id", 2, link.interfaceId());
+
+        State state = tunnel.state();
+        assertEquals(TE_REQ_FAILED + "wrong state",
+                     StateUp.class, state.adminStatus());
+        assertEquals(TE_REQ_FAILED + "wrong source",
+                     IpAddress.fromString("0.0.0.1"), state.source());
+    }
+
+    @Test
+    public void setIetfTe() throws Exception {
+        manager.tunnelAdminService = new TestTunnelAdmin();
+        manager.setIetfTe((IetfTeOpParam) buildPostIetfTeParams());
+        assertEquals(NAME, testTeTunnel.name());
+        List<TePath> tePaths = testTeTunnel.primaryPaths();
+        assertEquals(1, tePaths.size());
+        TePath tePath = tePaths.get(0);
+        List<TeRouteSubobject> teRouteSubobjects = tePath.explicitRoute();
+        assertEquals(2, teRouteSubobjects.size());
+        TeRouteSubobject routeSubobject = teRouteSubobjects.get(1);
+        assertEquals(UNNUMBERED_LINK, routeSubobject.type());
+        DefaultTeRouteUnnumberedLink link =
+                (DefaultTeRouteUnnumberedLink) routeSubobject;
+        assertEquals(id2, link.node().teNodeId());
+        assertEquals(id2, link.ttp().ttpId());
+
+    }
+
+    private IetfTe buildGetIetfTeParams() {
+        Te te = new DefaultTe
+                .TeBuilder()
+                .yangTeOpType(IetfTe.OnosYangOpType.NONE)
+                .build();
+        return new IetfTeOpParam
+                .IetfTeBuilder()
+                .te(te)
+                .yangIetfTeOpType(IetfTe.OnosYangOpType.NONE)
+                .build();
+    }
+
+    private IetfTe buildPostIetfTeParams() {
+        Tunnel tunnel = buildYangTunnel();
+        Tunnels teTunnels = new DefaultTunnels
+                .TunnelsBuilder()
+                .tunnel(Lists.newArrayList(tunnel))
+                .build();
+        Te te = new DefaultTe
+                .TeBuilder()
+                .tunnels(teTunnels)
+                .yangTeOpType(IetfTe.OnosYangOpType.NONE)
+                .build();
+        return new IetfTeOpParam
+                .IetfTeBuilder()
+                .te(te)
+                .yangIetfTeOpType(IetfTe.OnosYangOpType.NONE)
+                .build();
+    }
+
+    private Tunnel buildYangTunnel() {
+        TeTunnel teTunnel = buildTunnel();
+        checkNotNull(teTunnel);
+        Config config = new DefaultConfig.ConfigBuilder()
+                .name(NAME)
+                .adminStatus(StateUp.class)
+                .source(srcIp)
+                .destination(dstIp)
+                .srcTpId(bytes1)
+                .dstTpId(bytes2)
+                .type(TunnelP2p.class)
+                .lspProtectionType(LspProtUnprotected.class)
+                .build();
+
+        org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.
+                rev20160705.ietftetypes.explicitroutesubobject.type.
+                UnnumberedLink yangLink1 = DefaultUnnumberedLink.builder()
+                .routerId(srcIp)
+                .interfaceId(id1)
+                .build();
+
+        org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.
+                rev20160705.ietftetypes.explicitroutesubobject.type.
+                UnnumberedLink yangLink2 = DefaultUnnumberedLink.builder()
+                .routerId(dstIp)
+                .interfaceId(id2)
+                .build();
+
+        ExplicitRouteObjects routeObject1 = DefaultExplicitRouteObjects.builder()
+                .type(yangLink1)
+                .explicitRouteUsage(RouteIncludeEro.class)
+                .build();
+
+        ExplicitRouteObjects routeObject2 = DefaultExplicitRouteObjects.builder()
+                .type(yangLink2)
+                .explicitRouteUsage(RouteIncludeEro.class)
+                .build();
+
+
+        org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.
+                rev20160705.ietfte.pathparamsconfig.type.Explicit explicit
+                = DefaultExplicit.builder()
+                .explicitRouteObjects(ImmutableList.of(routeObject1, routeObject2))
+                .build();
+        org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.
+                rev20160705.ietfte.p2pprimarypathparams.Config pathConfig
+                = org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.
+                te.rev20160705.ietfte.p2pprimarypathparams.DefaultConfig.builder()
+                .pathNamedConstraint("onlyPath")
+                .lockdown(true)
+                .noCspf(true)
+                .type(explicit)
+                .build();
+
+        PrimaryPaths primaryPaths = DefaultPrimaryPaths.builder()
+                .config(pathConfig).build();
+
+        return DefaultTunnel.builder()
+                .name(config.name())
+                .type(config.type())
+                .config(config)
+                .primaryPaths(Lists.newArrayList(primaryPaths))
+                .build();
+    }
+
+    private TeTunnel buildTunnel() {
+        TeTopologyKey topologyKey = new TeTopologyKey(1, 2, 3);
+        TeTunnelKey teTunnelKey = new TeTunnelKey(topologyKey, 1);
+
+        TeNodeKey srcNodeKey = new TeNodeKey(topologyKey, 1);
+        TeNodeKey dstNodeKey = new TeNodeKey(topologyKey, 2);
+
+        TtpKey srcTtpKey = new TtpKey(srcNodeKey, 1);
+        TtpKey dstTtpKey = new TtpKey(srcNodeKey, 2);
+
+        TeLspKey lspKey = new TeLspKey(teTunnelKey, 1);
+
+        DefaultTeRouteUnnumberedLink unnumberedLink1 =
+                new DefaultTeRouteUnnumberedLink(srcNodeKey, srcTtpKey);
+        DefaultTeRouteUnnumberedLink unnumberedLink2 =
+                new DefaultTeRouteUnnumberedLink(dstNodeKey, dstTtpKey);
+        List<TeRouteSubobject> explicitRouteList = new ArrayList<>();
+
+        explicitRouteList.add(unnumberedLink1);
+        explicitRouteList.add(unnumberedLink2);
+        TePath tePath = new DefaultTePath(TePath.Type.EXPLICIT,
+                                          Lists.newArrayList(lspKey),
+                                          explicitRouteList,
+                                          Lists.newArrayList());
+
+        return DefaultTeTunnel.builder()
+                .teTunnelKey(teTunnelKey)
+                .name(NAME)
+                .type(P2P)
+                .adminState(TeTunnel.State.UP)
+                .srcNode(srcNodeKey)
+                .dstNode(dstNodeKey)
+                .srcTp(srcTtpKey)
+                .dstTp(dstTtpKey)
+                .lspProtectionType(LSP_PROT_REROUTE)
+                .primaryPaths(Lists.newArrayList(tePath))
+                .build();
+    }
+
+    private class TestTunnelAdmin implements TeTunnelAdminService {
+
+        @Override
+        public TunnelId createTeTunnel(TeTunnel teTunnel) {
+            TunnelId tunnelId = TunnelId.valueOf(teTunnel.teTunnelKey().toString());
+            testTeTunnel = teTunnel;
+            return tunnelId;
+        }
+
+        @Override
+        public void setTunnelId(TeTunnelKey teTunnelKey, TunnelId tunnelId) {
+
+        }
+
+        @Override
+        public void updateTeTunnel(TeTunnel teTunnel) {
+
+        }
+
+        @Override
+        public void updateTunnelState(TeTunnelKey key, org.onosproject.incubator.net.tunnel.Tunnel.State state) {
+
+        }
+
+        @Override
+        public void removeTeTunnel(TeTunnelKey teTunnelKey) {
+
+        }
+
+        @Override
+        public void removeTeTunnels() {
+
+        }
+
+        @Override
+        public void setSegmentTunnel(TeTunnelKey e2eTunnelKey, List<TeTunnelKey> segmentTunnels) {
+
+        }
+
+        @Override
+        public TeTunnel getTeTunnel(TeTunnelKey teTunnelKey) {
+            return null;
+        }
+
+        @Override
+        public TeTunnel getTeTunnel(TunnelId tunnelId) {
+            return null;
+        }
+
+        @Override
+        public TunnelId getTunnelId(TeTunnelKey teTunnelKey) {
+            return null;
+        }
+
+        @Override
+        public Collection<TeTunnel> getTeTunnels() {
+            return null;
+        }
+
+        @Override
+        public Collection<TeTunnel> getTeTunnels(TeTunnel.Type type) {
+            return null;
+        }
+
+        @Override
+        public Collection<TeTunnel> getTeTunnels(TeTopologyKey teTopologyKey) {
+            return null;
+        }
+
+        @Override
+        public TeLsp getTeLsp(TeLspKey key) {
+            return null;
+        }
+
+        @Override
+        public Collection<TeLsp> getTeLsps() {
+            return null;
+        }
+    }
+
+}
\ No newline at end of file
