diff --git a/apps/tenbi/utils/src/test/java/org/onosproject/teyang/utils/topology/DefaultBuilder.java b/apps/tenbi/utils/src/test/java/org/onosproject/teyang/utils/topology/DefaultBuilder.java
index faefdd8..49339fd 100644
--- a/apps/tenbi/utils/src/test/java/org/onosproject/teyang/utils/topology/DefaultBuilder.java
+++ b/apps/tenbi/utils/src/test/java/org/onosproject/teyang/utils/topology/DefaultBuilder.java
@@ -13,33 +13,10 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
 package org.onosproject.teyang.utils.topology;
 
-import com.google.common.collect.Lists;
-import org.onosproject.tetopology.management.api.DefaultNetwork;
-import org.onosproject.tetopology.management.api.DefaultNetworks;
-import org.onosproject.tetopology.management.api.KeyId;
 import org.onosproject.tetopology.management.api.Network;
 import org.onosproject.tetopology.management.api.Networks;
-import org.onosproject.tetopology.management.api.TeTopologyId;
-import org.onosproject.tetopology.management.api.link.DefaultNetworkLink;
-import org.onosproject.tetopology.management.api.link.LinkProtectionType;
-import org.onosproject.tetopology.management.api.link.NetworkLink;
-import org.onosproject.tetopology.management.api.link.TeLink;
-import org.onosproject.tetopology.management.api.link.TeLinkAccessType;
-import org.onosproject.tetopology.management.api.node.ConnectivityMatrix;
-import org.onosproject.tetopology.management.api.node.DefaultNetworkNode;
-import org.onosproject.tetopology.management.api.node.DefaultTerminationPoint;
-import org.onosproject.tetopology.management.api.node.NetworkNode;
-import org.onosproject.tetopology.management.api.node.TeNetworkTopologyId;
-import org.onosproject.tetopology.management.api.node.TeNode;
-import org.onosproject.tetopology.management.api.node.TeStatus;
-import org.onosproject.tetopology.management.api.node.TerminationPoint;
-import org.onosproject.tetopology.management.api.node.TerminationPointKey;
-
-import java.math.BigInteger;
-import java.util.List;
 
 /**
  * Builds a sample Topology, which consists of two Nodes, one link,
@@ -69,11 +46,8 @@
      * @return the Networks object
      */
     public static Networks sampleTeSubsystemNetworksBuilder() {
-        DefaultNetworks defaultNetworks = new DefaultNetworks();
-        List<Network> networks = Lists.newArrayList();
-        networks.add(sampleTeSubsystemNetworkBuilder());
-        defaultNetworks.setNetworks(networks);
-        return defaultNetworks;
+        //TODO: implementation will be submitted as a separate review.
+        return null;
     }
 
     /**
@@ -82,91 +56,7 @@
      * @return the Network object
      */
     public static Network sampleTeSubsystemNetworkBuilder() {
-        DefaultNetwork huaweiNetworkNew = new DefaultNetwork(KeyId.keyId(HUAWEI_NETWORK_NEW));
-        huaweiNetworkNew.setServerProvided(true);
-        List<NetworkNode> nodes = Lists.newArrayList();
-
-
-        DefaultNetworkNode node1 = new DefaultNetworkNode(KeyId.keyId(HUAWEI_ROADM_1));
-
-        DefaultTerminationPoint tp11 = new DefaultTerminationPoint(KeyId.keyId(CLIENT1_NODE1));
-        DefaultTerminationPoint tp12 = new DefaultTerminationPoint(KeyId.keyId(LINE1_NODE1));
-
-        List<TerminationPoint> tps1 = Lists.newArrayList();
-        tps1.add(tp11);
-        tps1.add(tp12);
-        node1.setTerminationPoints(tps1);
-
-        TeNode teNode1 = new TeNode(NODE1_IP);
-        teNode1.setAdminStatus(TeStatus.UP);
-        teNode1.setAbstract(false);
-        ConnectivityMatrix cMatrix1 =
-                new ConnectivityMatrix(1,
-                                       new TerminationPointKey(huaweiNetworkNew.networkId(),
-                                                               node1.nodeId(), tp11.id()),
-                                       new TerminationPointKey(huaweiNetworkNew.networkId(),
-                                                               node1.nodeId(), tp12.id()),
-                                       true);
-        List<ConnectivityMatrix> connMatrices = Lists.newArrayList();
-        connMatrices.add(cMatrix1);
-        teNode1.setConnectivityMatrices(connMatrices);
-        node1.setTe(teNode1);
-
-        DefaultNetworkNode node2 = new DefaultNetworkNode(KeyId.keyId(HUAWEI_ROADM_2));
-
-        DefaultTerminationPoint tp21 = new DefaultTerminationPoint(KeyId.keyId(CLIENT1_NODE2));
-        DefaultTerminationPoint tp22 = new DefaultTerminationPoint(KeyId.keyId(LINE1_NODE2));
-
-        List<TerminationPoint> tps2 = Lists.newArrayList();
-        tps2.add(tp21);
-        tps2.add(tp22);
-        node2.setTerminationPoints(tps2);
-
-        TeNode teNode2 = new TeNode(NODE2_IP);
-        teNode2.setAdminStatus(TeStatus.UP);
-        teNode2.setAbstract(false);
-        ConnectivityMatrix cMatrix2 =
-                new ConnectivityMatrix(1,
-                                       new TerminationPointKey(huaweiNetworkNew.networkId(),
-                                                               node2.nodeId(), tp21.id()),
-                                       new TerminationPointKey(huaweiNetworkNew.networkId(),
-                                                               node2.nodeId(), tp22.id()),
-                                       true);
-        List<ConnectivityMatrix> connMatrices2 = Lists.newArrayList();
-        connMatrices2.add(cMatrix2);
-        teNode2.setConnectivityMatrices(connMatrices2);
-        node2.setTe(teNode2);
-
-        nodes.add(node1);
-        nodes.add(node2);
-        huaweiNetworkNew.setNodes(nodes);
-
-        List<NetworkLink> links = Lists.newArrayList();
-
-        DefaultNetworkLink link1 = new DefaultNetworkLink(KeyId.keyId(LINK1FORNETWORK1));
-        link1.setSource(new TerminationPointKey(huaweiNetworkNew.networkId(),
-                                                node1.nodeId(),
-                                                tp12.id()));
-        link1.setDestination(new TerminationPointKey(huaweiNetworkNew.networkId(),
-                                                     node2.nodeId(),
-                                                     tp22.id()));
-        TeLink teLink1 = new TeLink(BigInteger.valueOf(1));
-        teLink1.setIsAbstract(false);
-        teLink1.setAdminStatus(TeStatus.UP);
-        teLink1.setAccessType(TeLinkAccessType.POINT_TO_POINT);
-        teLink1.setLinkProtectionType(LinkProtectionType.UNPROTECTED);
-        List<Long> teSrlgs = Lists.newArrayList();
-        teSrlgs.add(1000L);
-        teSrlgs.add(2000L);
-        teLink1.setTeSrlgs(teSrlgs);
-        link1.setTe(teLink1);
-        links.add(link1);
-        huaweiNetworkNew.setLinks(links);
-
-        TeNetworkTopologyId teNetwork =
-                new TeNetworkTopologyId(new TeTopologyId(22222L, 44444L, HUAWEI_TE_TOPOLOGY_NEW));
-        huaweiNetworkNew.setTeTopologyId(teNetwork.getTopologyId());
-
-        return huaweiNetworkNew;
+        //TODO: implementation will be submitted as a separate review.
+        return null;
     }
 }
