diff --git a/apps/t3/web/BUCK b/apps/t3/web/BUCK
new file mode 100644
index 0000000..fb837c4
--- /dev/null
+++ b/apps/t3/web/BUCK
@@ -0,0 +1,19 @@
+COMPILE_DEPS = [
+   '//lib:CORE_DEPS',
+   '//lib:KRYO',
+   '//core/api:onos-api',
+   '//lib:org.apache.karaf.shell.console',
+   '//utils/rest:onlab-rest',
+   '//lib:JACKSON',
+   '//lib:javax.ws.rs-api',
+   '//lib:jersey-server',
+   '//apps/t3/app:onos-apps-t3-app',
+]
+osgi_jar (
+   deps = COMPILE_DEPS,
+   web_context = '/onos/v1/t3',
+   api_title = 'T3 REST API',
+   api_version = '1.0',
+   api_description = 'REST API for T3',
+   api_package = 'org.onosproject.t3.rest',
+)
diff --git a/apps/t3/web/pom.xml b/apps/t3/web/pom.xml
new file mode 100644
index 0000000..e0c5414
--- /dev/null
+++ b/apps/t3/web/pom.xml
@@ -0,0 +1,221 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ Copyright 2017 Open Networking Foundation
+  ~
+  ~ 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">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <artifactId>onos-apps</artifactId>
+        <groupId>org.onosproject</groupId>
+        <version>1.14.0-SNAPSHOT</version>
+    </parent>
+
+    <groupId>org.onosproject</groupId>
+    <artifactId>onos-apps-t3-web</artifactId>
+    <version>1.14.0-SNAPSHOT</version>
+    <packaging>bundle</packaging>
+
+    <description>T3 REST API</description>
+    <url>http://onosproject.org</url>
+
+    <properties>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+        <onos.version>1.14.0-SNAPSHOT</onos.version>
+        <web.context>/onos/v1/t3</web.context>
+        <api.version>1.0.0</api.version>
+        <api.title>ONOS T3 REST API</api.title>
+        <api.description>
+            APIs for interacting with the T3 application.
+        </api.description>
+        <api.package>org.onosproject.t3.rest</api.package>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.onosproject</groupId>
+            <artifactId>onos-api</artifactId>
+            <version>${onos.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.onosproject</groupId>
+            <artifactId>onos-apps-t3-app</artifactId>
+            <version>${onos.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.onosproject</groupId>
+            <artifactId>onlab-osgi</artifactId>
+            <version>${onos.version}</version>
+        </dependency>
+
+
+        <dependency>
+            <groupId>org.onosproject</groupId>
+            <artifactId>onlab-misc</artifactId>
+            <version>${onos.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <version>4.12</version>
+            <scope>test</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.onosproject</groupId>
+            <artifactId>onos-api</artifactId>
+            <version>${onos.version}</version>
+            <scope>test</scope>
+            <classifier>tests</classifier>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.felix</groupId>
+            <artifactId>org.apache.felix.scr.annotations</artifactId>
+            <version>1.9.12</version>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>javax.ws.rs</groupId>
+            <artifactId>javax.ws.rs-api</artifactId>
+            <version>2.1</version>
+            <scope>provided</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.onosproject</groupId>
+            <artifactId>onos-api</artifactId>
+            <version>${onos.version}</version>
+            <classifier>tests</classifier>
+            <scope>test</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.onosproject</groupId>
+            <artifactId>onos-rest</artifactId>
+            <version>${onos.version}</version>
+            <scope>provided</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.glassfish.jersey.containers</groupId>
+            <artifactId>jersey-container-servlet</artifactId>
+            <version>2.25.1</version>
+            <scope>provided</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.onosproject</groupId>
+            <artifactId>onlab-rest</artifactId>
+            <version>${onos.version}</version>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.onosproject</groupId>
+            <artifactId>onos-cli</artifactId>
+            <version>${onos.version}</version>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.karaf.shell</groupId>
+            <artifactId>org.apache.karaf.shell.console</artifactId>
+            <version>3.0.8</version>
+            <scope>provided</scope>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>maven-bundle-plugin</artifactId>
+                <version>3.0.1</version>
+                <extensions>true</extensions>
+                <configuration>
+                    <instructions>
+                        <_wab>src/main/webapp/</_wab>
+                        <Include-Resource>WEB-INF/classes/apidoc/swagger.json=target/swagger.json,
+                            {maven-resources}
+                        </Include-Resource>
+                        <Bundle-SymbolicName>${project.groupId}.${project.artifactId}</Bundle-SymbolicName>
+                        <Import-Package>*,org.glassfish.jersey.servlet</Import-Package>
+                        <Web-ContextPath>${web.context}</Web-ContextPath>
+                    </instructions>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <version>2.5.1</version>
+                <configuration>
+                    <source>1.8</source>
+                    <target>1.8</target>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>maven-scr-plugin</artifactId>
+                <version>1.21.0</version>
+                <executions>
+                    <execution>
+                        <id>generate-scr-srcdescriptor</id>
+                        <goals>
+                            <goal>scr</goal>
+                        </goals>
+                    </execution>
+                </executions>
+                <configuration>
+                    <supportedProjectTypes>
+                        <supportedProjectType>bundle</supportedProjectType>
+                        <supportedProjectType>war</supportedProjectType>
+                    </supportedProjectTypes>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.onosproject</groupId>
+                <artifactId>onos-maven-plugin</artifactId>
+                <version>1.10</version>
+                <executions>
+                    <execution>
+                        <id>cfg</id>
+                        <phase>generate-resources</phase>
+                        <goals>
+                            <goal>cfg</goal>
+                        </goals>
+                    </execution>
+                    <execution>
+                        <id>swagger</id>
+                        <phase>generate-sources</phase>
+                        <goals>
+                            <goal>swagger</goal>
+                        </goals>
+                    </execution>
+                    <execution>
+                        <id>app</id>
+                        <phase>package</phase>
+                        <goals>
+                            <goal>app</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>
diff --git a/apps/t3/web/src/main/java/org/onosproject/t3/rest/T3WebApplication.java b/apps/t3/web/src/main/java/org/onosproject/t3/rest/T3WebApplication.java
new file mode 100644
index 0000000..5f6a548
--- /dev/null
+++ b/apps/t3/web/src/main/java/org/onosproject/t3/rest/T3WebApplication.java
@@ -0,0 +1,30 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * 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.t3.rest;
+
+
+import org.onlab.rest.AbstractWebApplication;
+
+import java.util.Set;
+
+public class T3WebApplication extends AbstractWebApplication {
+    @Override
+    public Set<Class<?>> getClasses() {
+        return getClasses(T3WebResource.class);
+    }
+
+}
diff --git a/apps/t3/web/src/main/java/org/onosproject/t3/rest/T3WebResource.java b/apps/t3/web/src/main/java/org/onosproject/t3/rest/T3WebResource.java
new file mode 100644
index 0000000..0fe7674
--- /dev/null
+++ b/apps/t3/web/src/main/java/org/onosproject/t3/rest/T3WebResource.java
@@ -0,0 +1,271 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * 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.t3.rest;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.ArrayNode;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+
+import org.onlab.packet.EthType;
+import org.onosproject.net.ConnectPoint;
+import org.onosproject.net.HostId;
+import org.onosproject.net.flow.FlowEntry;
+import org.onosproject.net.flow.criteria.Criterion;
+import org.onosproject.net.group.Group;
+import org.onosproject.rest.AbstractWebResource;
+import org.onosproject.t3.api.GroupsInDevice;
+import org.onosproject.t3.api.StaticPacketTrace;
+import org.onosproject.t3.api.TroubleshootService;
+import org.slf4j.Logger;
+
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+
+import java.util.List;
+import java.util.Set;
+
+import static org.slf4j.LoggerFactory.getLogger;
+
+/**
+ * Trellis Troubleshooting Tool REST API.
+ */
+@Path("t3")
+public class T3WebResource extends AbstractWebResource {
+    private final ObjectMapper mapper = new ObjectMapper();
+    private static final Logger LOG = getLogger(T3WebResource.class);
+
+    /**
+     * Returns the trace non verbose result for the given source and destination ips.
+     *
+     * @param srcHost source ip identifier
+     * @param dstHost destination ip identifier
+     * @param ethType ethernet type identifier
+     * @return 200 OK with component properties of given component and variable
+     */
+    @GET
+    @Produces(MediaType.APPLICATION_JSON)
+    @Path("simple/{srcHost}/{dstHost}/{ethType}")
+    public Response getT3Simple(@PathParam("srcHost") String srcHost, @PathParam("dstHost") String dstHost,
+                                @PathParam("ethType") String ethType) {
+
+        ObjectNode node;
+        try {
+            node = getT3JsonOutput(srcHost, dstHost, ethType, false);
+        } catch (IllegalArgumentException e) {
+            throw new IllegalArgumentException(e);
+        }
+        return Response.status(200).entity(node).build();
+
+    }
+
+    /**
+     * Returns the trace verbose result for the given source and destination ips.
+     *
+     * @param srcHost source ip identifier
+     * @param dstHost destination ip identifier
+     * @param ethType ethernet type identifier
+     * @return 200 OK with component properties of given component and variable
+     */
+    @GET
+    @Produces(MediaType.APPLICATION_JSON)
+    @Path("simple/{srcHost}/{dstHost}/{ethType}/verbose")
+    public Response getT3SimpleVerbose(@PathParam("srcHost") String srcHost, @PathParam("dstHost") String dstHost,
+                                       @PathParam("ethType") String ethType) {
+
+        ObjectNode node;
+        try {
+            node = getT3JsonOutput(srcHost, dstHost, ethType, true);
+        } catch (IllegalArgumentException e) {
+            throw new IllegalArgumentException(e);
+        }
+        return Response.status(200).entity(node).build();
+    }
+
+    /**
+     * Returns trace verbose or non verbose json output for the given trace.
+     *
+     * @param srcHost source ip identifier
+     * @param dstHost destination ip identifier
+     * @param ethType the ethernet Type
+     * @param verbose based on verbosity level
+     * @return a json representing the trace.
+     */
+    private ObjectNode getT3JsonOutput(String srcHost, String dstHost, String ethType, Boolean verbose) {
+        TroubleshootService troubleshootService = get(TroubleshootService.class);
+        final ObjectNode nodeOutput = mapper.createObjectNode();
+        //Tracing between host ips
+        ArrayNode ipList = mapper.createArrayNode();
+        ipList.add(srcHost);
+        ipList.add(dstHost);
+        nodeOutput.set("hostIps ", ipList);
+        EthType.EtherType type = EthType.EtherType.valueOf(ethType.toUpperCase());
+
+        //Build the traces
+        Set<StaticPacketTrace> traces = troubleshootService.trace(HostId.hostId(srcHost), HostId.hostId(dstHost), type);
+        traces.forEach(trace -> {
+
+            if (trace.getInitialPacket() != null) {
+                ArrayNode node = mapper.createArrayNode();
+                for (Criterion packet : trace.getInitialPacket().criteria()) {
+                    node.add(packet.toString());
+                }
+                nodeOutput.set("input packet", node);
+                nodeOutput.set("trace", getTraceJson(trace, verbose));
+            } else {
+                LOG.debug("cannot obtain trace between: ", srcHost, dstHost);
+                nodeOutput.set("failed trace", ipList);
+                nodeOutput.put("reason", trace.resultMessage());
+            }
+        });
+        return nodeOutput;
+    }
+
+    /**
+     * Returns verbose or non verbose json output for the given trace.      *
+     *
+     * @param trace     the trace
+     * @param verbosity based on verbosity level
+     * @return a json representing the trace.
+     */
+    public ObjectNode getTraceJson(StaticPacketTrace trace, boolean verbosity) {
+        ObjectNode nodeOutput = mapper.createObjectNode();
+        if (verbosity) {
+            nodeOutput.set("trace", getTrace(trace, verbosity));
+        } else {
+            ArrayNode nodePath = mapper.createArrayNode();
+            for (List<ConnectPoint> listPaths : trace.getCompletePaths()) {
+                ArrayNode node = mapper.createArrayNode();
+                for (ConnectPoint path : listPaths) {
+                    node.add(path.toString());
+                }
+                nodePath.add(node);
+            }
+            nodeOutput.set("paths", nodePath);
+        }
+
+        nodeOutput.put("result", trace.resultMessage());
+        return nodeOutput;
+    }
+
+    /**
+     * Returns verbose json output for the given trace.      *
+     *
+     * @param trace the trace
+     * @return a json representing the trace.
+     */
+    private ObjectNode getTrace(StaticPacketTrace trace, boolean verbose) {
+
+        ObjectNode nodeOutput = mapper.createObjectNode();
+
+        List<List<ConnectPoint>> paths = trace.getCompletePaths();
+        ArrayNode nodePath = mapper.createArrayNode();
+        for (List<ConnectPoint> path : paths) {
+            ArrayNode pathNode = mapper.createArrayNode();
+            for (ConnectPoint pathItr : path) {
+                pathNode.add(pathItr.toString());
+            }
+            nodePath.add(pathNode);
+
+            ConnectPoint previous = null;
+
+            if (path.size() == 1) {
+                ConnectPoint connectPoint = path.get(0);
+                nodeOutput.put("device", connectPoint.deviceId().toString());
+                nodeOutput.put("input", connectPoint.toString());
+                nodeOutput.put("flowCount", trace.getFlowsForDevice(connectPoint.deviceId()).size());
+                nodeOutput.set("flows", getFlowArray(trace, connectPoint, verbose));
+
+                List<GroupsInDevice> groupsInDevice = trace.getGroupOuputs(connectPoint.deviceId());
+
+                if (groupsInDevice != null) {
+                    groupsInDevice.forEach(output -> {
+                        nodeOutput.set("groups", getGroupObj(connectPoint, output, verbose));
+                    });
+                }
+
+            } else {
+                for (ConnectPoint connectPoint : path) {
+                    if (previous == null || !previous.deviceId().equals(connectPoint.deviceId())) {
+                        nodeOutput.put("device", connectPoint.deviceId().toString());
+                        nodeOutput.put("input", connectPoint.toString());
+                        nodeOutput.put("flows", trace.getFlowsForDevice(connectPoint.deviceId()).size());
+                        nodeOutput.put("verbose", verbose);
+                        nodeOutput.set("flows", getFlowArray(trace, connectPoint, verbose));
+                    } else {
+                        List<GroupsInDevice> groupsInDevice = trace.getGroupOuputs(connectPoint.deviceId());
+                        if (groupsInDevice != null) {
+                            groupsInDevice.forEach(output -> {
+                                nodeOutput.set("groups", getGroupObj(connectPoint, output, verbose));
+                            });
+
+                        }
+
+                    }
+                    previous = connectPoint;
+                }
+            }
+        }
+        nodeOutput.set("path", nodePath);
+        return nodeOutput;
+    }
+
+    //Return groups Object for a given trace and a specified level of verbosity
+    private ObjectNode getGroupObj(ConnectPoint connectPoint, GroupsInDevice output, boolean verbose) {
+        ArrayNode groupArray = mapper.createArrayNode();
+        ObjectNode groupsObj = mapper.createObjectNode();
+        if (output.getOutput().equals(connectPoint)) {
+            output.getGroups().forEach(group -> {
+                ObjectNode groups = mapper.createObjectNode();
+                if (verbose) {
+                    groups = codec(Group.class).encode(group, this);
+                } else {
+                    groups.put("groupId", group.id().toString());
+                }
+                groupArray.add(groups);
+            });
+            ArrayNode node = mapper.createArrayNode();
+            for (Criterion packet : output.getFinalPacket().criteria()) {
+                node.add(packet.toString());
+            }
+            groupsObj.set("outgoing packet", node);
+        }
+        groupsObj.set("groups", groupArray);
+        return groupsObj;
+    }
+
+    //Return flows Object for a given trace and a specified level of verbosity
+    private ArrayNode getFlowArray(StaticPacketTrace trace, ConnectPoint connectPoint, boolean verbose) {
+        ArrayNode flowArray = mapper.createArrayNode();
+        trace.getFlowsForDevice(connectPoint.deviceId()).forEach(f -> {
+            ObjectNode flows = mapper.createObjectNode();
+            if (verbose) {
+                flows = codec(FlowEntry.class).encode(f, this);
+            } else {
+                flows.put("flowId: ", f.id().toString());
+                flows.put("table: ", f.table().toString());
+                flows.put("selector: ", f.selector().criteria().toString());
+            }
+            flowArray.add(flows);
+        });
+        return flowArray;
+    }
+
+}
diff --git a/apps/t3/web/src/main/java/org/onosproject/t3/rest/package-info.java b/apps/t3/web/src/main/java/org/onosproject/t3/rest/package-info.java
new file mode 100644
index 0000000..e390f3e
--- /dev/null
+++ b/apps/t3/web/src/main/java/org/onosproject/t3/rest/package-info.java
@@ -0,0 +1,20 @@
+/*
+ * Copyright 2017-present Open Networking Foundation
+ *
+ * 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.
+ */
+
+/**
+ * Troubleshooting toolkit for trellis fabrics implementation.
+ */
+package org.onosproject.t3.rest;
diff --git a/apps/t3/web/src/main/webapp/WEB-INF/web.xml b/apps/t3/web/src/main/webapp/WEB-INF/web.xml
new file mode 100644
index 0000000..d99a6ae
--- /dev/null
+++ b/apps/t3/web/src/main/webapp/WEB-INF/web.xml
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ Copyright 2018-present Open Networking Foundation
+  ~
+  ~ 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.
+  -->
+<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xmlns="http://java.sun.com/xml/ns/javaee"
+         xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
+         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
+         id="ONOS" version="2.5">
+    <display-name>T3 REST API v1.0</display-name>
+
+    <security-constraint>
+        <web-resource-collection>
+            <web-resource-name>Secured</web-resource-name>
+            <url-pattern>/*</url-pattern>
+        </web-resource-collection>
+        <auth-constraint>
+            <role-name>admin</role-name>
+        </auth-constraint>
+    </security-constraint>
+
+    <security-role>
+        <role-name>admin</role-name>
+    </security-role>
+
+    <login-config>
+        <auth-method>BASIC</auth-method>
+        <realm-name>karaf</realm-name>
+    </login-config>
+
+    <servlet>
+        <servlet-name>JAX-RS Service</servlet-name>
+        <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
+        <init-param>
+            <param-name>javax.ws.rs.Application</param-name>
+            <param-value>org.onosproject.t3.rest.T3WebApplication</param-value>
+        </init-param>
+        <load-on-startup>1</load-on-startup>
+    </servlet>
+
+    <servlet-mapping>
+        <servlet-name>JAX-RS Service</servlet-name>
+        <url-pattern>/*</url-pattern>
+    </servlet-mapping>
+</web-app>
