diff --git a/apps/patchpanel/BUCK b/apps/patchpanel/BUCK
deleted file mode 100644
index 77f75b3..0000000
--- a/apps/patchpanel/BUCK
+++ /dev/null
@@ -1,16 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:org.apache.karaf.shell.console',
-    '//cli:onos-cli',
-]
-
-osgi_jar (
-    deps = COMPILE_DEPS,
-)
-
-onos_app (
-    title = 'Patch Panel',
-    category = 'Traffic Steering',
-    url = 'http://onosproject.org',
-    description = 'Creates patches between ports on a switch',
-)
diff --git a/apps/patchpanel/pom.xml b/apps/patchpanel/pom.xml
deleted file mode 100644
index 99eb985..0000000
--- a/apps/patchpanel/pom.xml
+++ /dev/null
@@ -1,57 +0,0 @@
-<?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-apps</artifactId>
-        <groupId>org.onosproject</groupId>
-        <version>1.9.0-SNAPSHOT</version>
-    </parent>
-    <modelVersion>4.0.0</modelVersion>
-
-    <artifactId>patchpanel</artifactId>
-    <packaging>bundle</packaging>
-
-    <description>ONOS patch panel application</description>
-    <url>http://onosproject.org</url>
-
-    <properties>
-        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-        <onos.app.name>org.onosproject.patchpanel</onos.app.name>
-        <onos.app.title>Patch Panel</onos.app.title>
-        <onos.app.origin>ON.Lab</onos.app.origin>
-        <onos.app.category>Traffic Steering</onos.app.category>
-        <onos.app.url>http://onosproject.org</onos.app.url>
-        <onos.app.readme>Creates patches between ports on a switch</onos.app.readme>
-    </properties>
-
-    <dependencies>
-
-        <dependency>
-            <groupId>org.onosproject</groupId>
-            <artifactId>onos-cli</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-
-        <dependency>
-          <groupId>org.apache.karaf.shell</groupId>
-          <artifactId>org.apache.karaf.shell.console</artifactId>
-        </dependency>
-
-    </dependencies>
-
-</project>
diff --git a/apps/patchpanel/src/main/java/org/onosproject/patchpanel/cli/PatchListCommand.java b/apps/patchpanel/src/main/java/org/onosproject/patchpanel/cli/PatchListCommand.java
deleted file mode 100644
index 9d8f088..0000000
--- a/apps/patchpanel/src/main/java/org/onosproject/patchpanel/cli/PatchListCommand.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * 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.
- */
-
-/**
- * This class defines the cli command for the PatchPanel class. It creates
- * an instance of the PatchPanelService class to call it's method addPatch().
- * The command takes 2 parameters, 2 connectPoints.
- */
-package org.onosproject.patchpanel.cli;
-
-import org.apache.karaf.shell.commands.Command;
-import org.onosproject.cli.AbstractShellCommand;
-import org.onosproject.patchpanel.impl.Patch;
-import org.onosproject.patchpanel.impl.PatchPanelService;
-
-/**
- * Lists the patches.
- */
-@Command(scope = "onos", name = "patches",
-         description = "Lists the patches")
-public class PatchListCommand extends AbstractShellCommand {
-
-    private static final String FORMAT = "%s: %s <-> %s";
-
-    @Override
-    protected void execute() {
-        PatchPanelService patchPanelService = get(PatchPanelService.class);
-
-        patchPanelService.getPatches().forEach(this::print);
-    }
-
-    private void print(Patch patch) {
-        print(FORMAT, patch.id(), patch.port1(), patch.port2());
-    }
-
-}
diff --git a/apps/patchpanel/src/main/java/org/onosproject/patchpanel/cli/PatchPanelCommand.java b/apps/patchpanel/src/main/java/org/onosproject/patchpanel/cli/PatchPanelCommand.java
deleted file mode 100644
index 5b6221a..0000000
--- a/apps/patchpanel/src/main/java/org/onosproject/patchpanel/cli/PatchPanelCommand.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * 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.
- */
-
-/**
- * This class defines the cli command for the PatchPanel class. It creates
- * an instance of the PatchPanelService class to call it's method addPatch().
- * The command takes 2 parameters, 2 connectPoints.
- */
-package org.onosproject.patchpanel.cli;
-
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
-import org.onosproject.cli.AbstractShellCommand;
-import org.onosproject.net.ConnectPoint;
-import org.onosproject.net.DeviceId;
-import org.onosproject.patchpanel.impl.PatchPanelService;
-
-/**
- * Command for adding a new patch.
- */
-@Command(scope = "onos", name = "patch",
-         description = "Gets the 2 ports of one ConnectPoint that will be patched")
-public class PatchPanelCommand extends AbstractShellCommand {
-    //the 2 arguments, both connect points
-    @Argument(index = 0, name = "switch/portNumber", description = "ConnectPoint and first port number",
-            required = true, multiValued = false)
-    String port1 = null;
-    @Argument (index = 1, name = "switch/portNumber2", description = "ConnectPoint and second port number",
-            required = true, multiValued = false)
-    String port2 = null;
-
-    private ConnectPoint cp1, cp2;
-    private PatchPanelService patchPanelService;
-    private DeviceId deviceId, deviceId2;
-
-    /**
-     * This method creates an instance of the Service class and then uses the user
-     * input to call the addPatch method in PatchPanel. It also
-     * @throws IllegalArgumentException if the 2 connectpoints are of different devices
-     */
-    @Override
-    protected void execute() {
-        patchPanelService = get(PatchPanelService.class);
-        boolean done = false;
-        cp1 = ConnectPoint.deviceConnectPoint(port1);
-        cp2 = ConnectPoint.deviceConnectPoint(port2);
-        deviceId = cp1.deviceId();
-        deviceId2 = cp2.deviceId();
-        if (!(deviceId.equals(deviceId2))) {
-            throw new IllegalArgumentException("ERROR: Two Different Device Id's");
-        } else {
-            done = patchPanelService.addPatch(cp1, cp2);
-        }
-        if (done) {
-            log.info("This patch has been created");
-        } else {
-            log.info("This patch was NOT created");
-        }
-
-    }
-
-}
diff --git a/apps/patchpanel/src/main/java/org/onosproject/patchpanel/cli/PatchRemoveCommand.java b/apps/patchpanel/src/main/java/org/onosproject/patchpanel/cli/PatchRemoveCommand.java
deleted file mode 100644
index 429cd50..0000000
--- a/apps/patchpanel/src/main/java/org/onosproject/patchpanel/cli/PatchRemoveCommand.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * 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.
- */
-
-/**
- * This class defines the cli command for the PatchPanel class. It creates
- * an instance of the PatchPanelService class to call it's method addPatch().
- * The command takes 2 parameters, 2 connectPoints.
- */
-package org.onosproject.patchpanel.cli;
-
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
-import org.onosproject.cli.AbstractShellCommand;
-import org.onosproject.patchpanel.impl.PatchId;
-import org.onosproject.patchpanel.impl.PatchPanelService;
-
-/**
- * Removes a patch.
- */
-@Command(scope = "onos", name = "patch-remove",
-         description = "Removes a patch")
-public class PatchRemoveCommand extends AbstractShellCommand {
-
-    @Argument(index = 0, name = "patchId", description = "ID of patch to remove",
-            required = true, multiValued = false)
-    String id = null;
-
-    private PatchPanelService patchPanelService;
-
-    @Override
-    protected void execute() {
-        patchPanelService = get(PatchPanelService.class);
-        boolean done = false;
-
-        PatchId patchId = PatchId.patchId(Integer.parseInt(id));
-
-        done = patchPanelService.removePatch(patchId);
-
-        if (done) {
-            log.info("This patch has been removed");
-        } else {
-            log.info("This patch was NOT removed");
-        }
-
-    }
-
-}
diff --git a/apps/patchpanel/src/main/java/org/onosproject/patchpanel/cli/package-info.java b/apps/patchpanel/src/main/java/org/onosproject/patchpanel/cli/package-info.java
deleted file mode 100644
index f4e7c9e..0000000
--- a/apps/patchpanel/src/main/java/org/onosproject/patchpanel/cli/package-info.java
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * 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.
- */
-
-/**
- * Patch panel-related CLI commands(in cli folder).
- */
-package org.onosproject.patchpanel.cli;
-
diff --git a/apps/patchpanel/src/main/java/org/onosproject/patchpanel/impl/Patch.java b/apps/patchpanel/src/main/java/org/onosproject/patchpanel/impl/Patch.java
deleted file mode 100644
index 3b1c821..0000000
--- a/apps/patchpanel/src/main/java/org/onosproject/patchpanel/impl/Patch.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * 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.patchpanel.impl;
-
-import org.onosproject.net.ConnectPoint;
-
-/**
- * Abstraction of a patch between two ports on a switch.
- */
-public class Patch {
-
-    private final PatchId patchId;
-    private final ConnectPoint port1;
-    private final ConnectPoint port2;
-
-    /**
-     * Creates a new patch.
-     *
-     * @param patchId patch ID
-     * @param port1 first switch port
-     * @param port2 second switch port
-     */
-    public Patch(PatchId patchId, ConnectPoint port1, ConnectPoint port2) {
-        this.patchId = patchId;
-        this.port1 = port1;
-        this.port2 = port2;
-    }
-
-    /**
-     * Gets the patch ID.
-     *
-     * @return patch ID
-     */
-    public PatchId id() {
-        return patchId;
-    }
-
-    /**
-     * Gets the first connect point.
-     *
-     * @return connect point
-     */
-    public ConnectPoint port1() {
-        return port1;
-    }
-
-    /**
-     * Gets the second connect point.
-     *
-     * @return connect point
-     */
-    public ConnectPoint port2() {
-        return port2;
-    }
-}
diff --git a/apps/patchpanel/src/main/java/org/onosproject/patchpanel/impl/PatchId.java b/apps/patchpanel/src/main/java/org/onosproject/patchpanel/impl/PatchId.java
deleted file mode 100644
index d40cb21..0000000
--- a/apps/patchpanel/src/main/java/org/onosproject/patchpanel/impl/PatchId.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * 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.patchpanel.impl;
-
-import org.onlab.util.Identifier;
-
-/**
- * Identifier of a patch.
- */
-public final class PatchId extends Identifier<Integer> {
-
-    private PatchId(int id) {
-        super(id);
-    }
-
-    /**
-     * Creates a new patch based of an integer.
-     *
-     * @param id backing value
-     * @return patch ID
-     */
-    public static PatchId patchId(int id) {
-        return new PatchId(id);
-    }
-}
diff --git a/apps/patchpanel/src/main/java/org/onosproject/patchpanel/impl/PatchPanel.java b/apps/patchpanel/src/main/java/org/onosproject/patchpanel/impl/PatchPanel.java
deleted file mode 100644
index e10b097..0000000
--- a/apps/patchpanel/src/main/java/org/onosproject/patchpanel/impl/PatchPanel.java
+++ /dev/null
@@ -1,163 +0,0 @@
-/*
- * 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.patchpanel.impl;
-
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableSet;
-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.cli.net.ConnectPointCompleter;
-import org.onosproject.core.ApplicationId;
-import org.onosproject.core.CoreService;
-import org.onosproject.net.ConnectPoint;
-import org.onosproject.net.DeviceId;
-import org.onosproject.net.PortNumber;
-import org.onosproject.net.flow.DefaultFlowRule;
-import org.onosproject.net.flow.DefaultTrafficSelector;
-import org.onosproject.net.flow.DefaultTrafficTreatment;
-import org.onosproject.net.flow.FlowRule;
-import org.onosproject.net.flow.FlowRuleService;
-import org.onosproject.net.packet.PacketPriority;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.atomic.AtomicInteger;
-
-import static com.google.common.base.Preconditions.checkArgument;
-import static com.google.common.base.Preconditions.checkNotNull;
-
-/**
- * This class acts as a software patch panel application.
- * The user specifies 2 connectpoint on the same device that he/she would like to patch.
- * Using a flow rule, the 2 connectpoints are patched.
- */
-@Component(immediate = true)
-@Service
-public class PatchPanel implements PatchPanelService {
-
-    private final Logger log = LoggerFactory.getLogger(getClass());
-
-    // OSGI: help bundle plugin discover runtime package dependency.
-    @SuppressWarnings("unused")
-    private ConnectPointCompleter connectPointCompleter;
-
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    protected FlowRuleService flowRuleService;
-
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    protected CoreService coreService;
-
-    private Map<PatchId, Patch> patches;
-
-    private ApplicationId appId;
-
-    private AtomicInteger ids = new AtomicInteger();
-
-
-    @Activate
-    protected void activate() throws NullPointerException {
-        patches = new HashMap<>();
-
-        appId = coreService.registerApplication("org.onosproject.patchpanel");
-        log.info("Started");
-    }
-
-    @Deactivate
-    protected void deactivate() {
-        log.info("Stopped");
-    }
-
-    @Override
-    public boolean addPatch(ConnectPoint cp1, ConnectPoint cp2) {
-        checkNotNull(cp1);
-        checkNotNull(cp2);
-
-        checkArgument(cp1.deviceId().equals(cp2.deviceId()), "Ports must be on the same device");
-        checkArgument(!cp1.equals(cp2), "Ports cannot be the same");
-
-        if (patches.values().stream()
-                .filter(patch -> patch.port1().equals(cp1) || patch.port1().equals(cp2)
-                        || patch.port2().equals(cp1) || patch.port2().equals(cp2))
-                .findAny().isPresent()) {
-            log.info("One or both of these ports are already in use, NO FLOW");
-            return false;
-        }
-
-        Patch patch = new Patch(PatchId.patchId(ids.incrementAndGet()), cp1, cp2);
-
-        patches.put(patch.id(), patch);
-
-        setFlowRuleService(patch);
-
-        return true;
-    }
-
-    @Override
-    public boolean removePatch(PatchId id) {
-        Patch patch = patches.remove(id);
-        if (patch == null) {
-            return false;
-        }
-
-        removePatchFlows(patch);
-        return true;
-    }
-
-    @Override
-    public Set<Patch> getPatches() {
-        return ImmutableSet.copyOf(patches.values());
-    }
-
-    public void setFlowRuleService(Patch patch) {
-        createFlowRules(patch).forEach(flowRuleService::applyFlowRules);
-    }
-
-    private void removePatchFlows(Patch patch) {
-        createFlowRules(patch).forEach(flowRuleService::removeFlowRules);
-    }
-
-    private Collection<FlowRule> createFlowRules(Patch patch) {
-        DeviceId deviceId = patch.port1().deviceId();
-        PortNumber outPort = patch.port2().port();
-        PortNumber inPort = patch.port1().port();
-        FlowRule fr = DefaultFlowRule.builder()
-                .forDevice(deviceId)
-                .withSelector(DefaultTrafficSelector.builder().matchInPort(inPort).build())
-                .withTreatment(DefaultTrafficTreatment.builder().setOutput(outPort).build())
-                .withPriority(PacketPriority.REACTIVE.priorityValue())
-                .makePermanent()
-                .fromApp(appId).build();
-
-        FlowRule fr2 = DefaultFlowRule.builder()
-                .forDevice(deviceId)
-                .withSelector(DefaultTrafficSelector.builder().matchInPort(outPort).build())
-                .withTreatment(DefaultTrafficTreatment.builder().setOutput(inPort).build())
-                .withPriority(PacketPriority.REACTIVE.priorityValue())
-                .makePermanent()
-                .fromApp(appId).build();
-
-        return ImmutableList.of(fr, fr2);
-    }
-}
diff --git a/apps/patchpanel/src/main/java/org/onosproject/patchpanel/impl/PatchPanelService.java b/apps/patchpanel/src/main/java/org/onosproject/patchpanel/impl/PatchPanelService.java
deleted file mode 100644
index 4ece312..0000000
--- a/apps/patchpanel/src/main/java/org/onosproject/patchpanel/impl/PatchPanelService.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * 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.patchpanel.impl;
-
-import org.onosproject.net.ConnectPoint;
-
-import java.util.Set;
-
-/**
- * A service for the patch panel application to export and use with the cli.
- */
-public interface PatchPanelService {
-
-    /**
-     * Adds a new patch between two connect points.
-     *
-     * @param cp    the first connect point
-     * @param cp2   the second connect point
-     * @return      true if the patch was created, false otherwise
-     */
-    boolean addPatch(ConnectPoint cp, ConnectPoint cp2);
-
-    /**
-     * Removes an existing patch.
-     *
-     * @param id patch ID
-     * @return true if the patch was removed, otherwise false.
-     */
-    boolean removePatch(PatchId id);
-
-    /**
-     * Gets the set of patches in the system.
-     *
-     * @return set of patches
-     */
-    Set<Patch> getPatches();
-}
diff --git a/apps/patchpanel/src/main/java/org/onosproject/patchpanel/impl/PatchPanelUiComponent.java b/apps/patchpanel/src/main/java/org/onosproject/patchpanel/impl/PatchPanelUiComponent.java
deleted file mode 100644
index ea2f085..0000000
--- a/apps/patchpanel/src/main/java/org/onosproject/patchpanel/impl/PatchPanelUiComponent.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * 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.patchpanel.impl;
-
-import com.google.common.collect.ImmutableList;
-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.onosproject.ui.UiExtension;
-import org.onosproject.ui.UiExtensionService;
-import org.onosproject.ui.UiMessageHandlerFactory;
-import org.onosproject.ui.UiView;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.List;
-
-/**
- *  ONOS UI Custom-View application component for the Patch Panel Application.
- */
-@Component(immediate = true)
-public class PatchPanelUiComponent {
-
-    private static final String VIEW_ID = "sampleCustom";
-    private static final String VIEW_TEXT = "Patch Panel Application";
-
-    private final Logger log = LoggerFactory.getLogger(getClass());
-
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    protected UiExtensionService uiExtensionService;
-
-    // List of application views
-    private final List<UiView> uiViews = ImmutableList.of(
-            new UiView(UiView.Category.OTHER, VIEW_ID, VIEW_TEXT)
-    );
-
-    // Factory for UI message handlers
-    private final UiMessageHandlerFactory messageHandlerFactory =
-            () -> ImmutableList.of(new PatchPanelUiMessageHandler());
-
-    // Application UI extension
-    protected UiExtension extension =
-            new UiExtension.Builder(getClass().getClassLoader(), uiViews)
-                    .resourcePath(VIEW_ID)
-                    .messageHandlerFactory(messageHandlerFactory)
-                    .build();
-
-    @Activate
-    protected void activate() {
-        uiExtensionService.register(extension);
-        log.info("Started");
-    }
-
-    @Deactivate
-    protected void deactivate() {
-        uiExtensionService.unregister(extension);
-        log.info("Stopped");
-    }
-
-}
diff --git a/apps/patchpanel/src/main/java/org/onosproject/patchpanel/impl/PatchPanelUiMessageHandler.java b/apps/patchpanel/src/main/java/org/onosproject/patchpanel/impl/PatchPanelUiMessageHandler.java
deleted file mode 100644
index d1f0cbf..0000000
--- a/apps/patchpanel/src/main/java/org/onosproject/patchpanel/impl/PatchPanelUiMessageHandler.java
+++ /dev/null
@@ -1,147 +0,0 @@
-/*
- * 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.patchpanel.impl;
-
-
-import com.fasterxml.jackson.databind.node.ArrayNode;
-import com.fasterxml.jackson.databind.node.ObjectNode;
-import com.google.common.collect.ImmutableSet;
-import org.onosproject.net.ConnectPoint;
-import org.onosproject.net.Device;
-import org.onosproject.net.Port;
-import org.onosproject.net.device.DeviceService;
-import org.onosproject.ui.RequestHandler;
-import org.onosproject.ui.UiMessageHandler;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-
-import static org.onosproject.net.ConnectPoint.deviceConnectPoint;
-
-/**
- * ONOS UI Custom-View message handler.
- * <p>
- * This class contains the request handlers that handle the response
- * to each event. In this particular implementation the second message
- * handler creates the patch and the first message handler loads the data.
- */
-public class PatchPanelUiMessageHandler extends UiMessageHandler {
-
-    private static final String SAMPLE_CUSTOM_DATA_REQ = "sampleCustomDataRequest";
-    private static final String SAMPLE_CUSTOM_DATA_RESP = "sampleCustomDataResponse";
-    private static final String SAMPLE_CUSTOM_DATA_REQ2 = "sampleCustomDataRequest2";
-    private static final String SAMPLE_CUSTOM_DATA_RESP2 = "sampleCustomDataResponse2";
-    private static final String SAMPLE_CUSTOM_DATA_REQ3 = "sampleCustomDataRequest3";
-    private static final String SAMPLE_CUSTOM_DATA_RESP3 = "sampleCustomDataResponse3";
-
-    private static final String SLASH = "/";
-    private static final String CPS = "cps";
-    private static final String RESULT = "result";
-    private static final String MESSAGE = "message";
-
-    private static final String EOL = String.format("%n");
-    private static final String WITH = " with ";
-    private static final String CPOINTS = "cpoints";
-
-    private List<ConnectPoint> previous = new ArrayList<>();
-    private final Logger log = LoggerFactory.getLogger(getClass());
-
-    @Override
-    protected Collection<RequestHandler> createRequestHandlers() {
-        return ImmutableSet.of(
-                new DataRequestHandler(),
-                new SecondDataRequestHandler(),
-                new ThirdDataRequestHandler()
-        );
-    }
-
-    // handler for data requests/events
-    private final class DataRequestHandler extends RequestHandler {
-        private DataRequestHandler() {
-            super(SAMPLE_CUSTOM_DATA_REQ);
-        }
-
-        @Override
-        public void process(ObjectNode payload) {
-            DeviceService service = get(DeviceService.class);
-            ObjectNode result = objectNode();
-            ArrayNode cps = arrayNode();
-            result.set(CPS, cps);
-
-            for (Device device : service.getDevices()) {
-                cps.add(device.id().toString());
-                for (Port port : service.getPorts(device.id())) {
-                    if (!port.number().isLogical()) {
-                        cps.add(port.number().toString());
-                        log.info(device.id() + SLASH + port.number());
-                    }
-                }
-            }
-            sendMessage(SAMPLE_CUSTOM_DATA_RESP, result);
-        }
-    }
-
-    private final class SecondDataRequestHandler extends RequestHandler {
-        private SecondDataRequestHandler() {
-            super(SAMPLE_CUSTOM_DATA_REQ2);
-        }
-
-        @Override
-        public void process(ObjectNode payload) {
-            String deviceId = payload.get(RESULT).get(0).asText();
-            ConnectPoint cp1 = deviceConnectPoint(deviceId + SLASH + payload.get(RESULT).get(1).asText());
-            ConnectPoint cp2 = deviceConnectPoint(deviceId + SLASH + payload.get(RESULT).get(2).asText());
-            PatchPanelService pps = get(PatchPanelService.class);
-
-            boolean done = pps.addPatch(cp1, cp2);
-            String message;
-            if (done) {
-                message = "Patch has been created";
-                previous.add(cp1);
-                previous.add(cp2);
-            } else {
-                message = "One or both of these ports are already in use";
-                if (cp1.port().equals(cp2.port())) {
-                    message = "Both ports can not be the same";
-                }
-            }
-            payload.put(MESSAGE, message);
-            sendMessage(SAMPLE_CUSTOM_DATA_RESP2, payload);
-
-        }
-    }
-
-    private final class ThirdDataRequestHandler extends RequestHandler {
-        private ThirdDataRequestHandler() {
-            super(SAMPLE_CUSTOM_DATA_REQ3);
-        }
-
-        @Override
-        public void process(ObjectNode payload) {
-            StringBuilder sb = new StringBuilder();
-            for (int i = 0; i < previous.size(); i++) {
-                sb.append(previous.get(i)).append(i % 2 == 0 ? WITH : EOL);
-            }
-            payload.put(CPOINTS, sb.toString());
-            sendMessage(SAMPLE_CUSTOM_DATA_RESP3, payload);
-        }
-    }
-
-}
diff --git a/apps/patchpanel/src/main/java/org/onosproject/patchpanel/impl/package-info.java b/apps/patchpanel/src/main/java/org/onosproject/patchpanel/impl/package-info.java
deleted file mode 100644
index 7c109d2..0000000
--- a/apps/patchpanel/src/main/java/org/onosproject/patchpanel/impl/package-info.java
+++ /dev/null
@@ -1,21 +0,0 @@
-
-/*
- * 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.
- */
-
-/**
- * Patch panel-related CLI commands(in implementation folder).
- */
-package org.onosproject.patchpanel.impl;
diff --git a/apps/patchpanel/src/main/resources/OSGI-INF/blueprint/shell-config.xml b/apps/patchpanel/src/main/resources/OSGI-INF/blueprint/shell-config.xml
deleted file mode 100644
index 1db5a5d..0000000
--- a/apps/patchpanel/src/main/resources/OSGI-INF/blueprint/shell-config.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<!--
-  ~ 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.
-  -->
-<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
-    <command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.1.0">
-        <command>
-            <action class="org.onosproject.patchpanel.cli.PatchPanelCommand"/>
-            <completers>
-                <ref component-id="ConnectPointCompleter"/>
-            </completers>
-        </command>
-        <command>
-            <action class="org.onosproject.patchpanel.cli.PatchRemoveCommand"/>
-        </command>
-        <command>
-            <action class="org.onosproject.patchpanel.cli.PatchListCommand"/>
-        </command>
-    </command-bundle>
-    <bean id="ConnectPointCompleter" class="org.onosproject.cli.net.ConnectPointCompleter"/>
-</blueprint>
diff --git a/apps/patchpanel/src/main/resources/app/view/sampleCustom/sampleCustom.css b/apps/patchpanel/src/main/resources/app/view/sampleCustom/sampleCustom.css
deleted file mode 100644
index ffeac0a..0000000
--- a/apps/patchpanel/src/main/resources/app/view/sampleCustom/sampleCustom.css
+++ /dev/null
@@ -1,48 +0,0 @@
-/* css for sample app custom view */
-
-#ov-sample-custom {
-    padding: 20px;
-}
-.light #ov-sample-custom {
-    color: navy;
-}
-.dark #ov-sample-custom {
-    color: #88f;
-}
-
-#ov-sample-custom .button-panel {
-    margin: 10px;
-    width: 200px;
-}
-
-.light #ov-sample-custom .button-panel {
-    background-color: #ccf;
-}
-.dark #ov-sample-custom .button-panel {
-    background-color: #444;
-}
-
-#ov-sample-custom .my-button {
-    cursor: pointer;
-    padding: 4px;
-    text-align: center;
-}
-
-.light #ov-sample-custom .my-button {
-    color: white;
-    background-color: #99d;
-}
-.dark #ov-sample-custom .my-button {
-    color: black;
-    background-color: #aaa;
-}
-
-#ov-sample-custom .number {
-    font-size: 140%;
-    text-align: right;
-}
-
-#ov-sample-custom .quote {
-    margin: 10px 20px;
-    font-style: italic;
-}
\ No newline at end of file
diff --git a/apps/patchpanel/src/main/resources/app/view/sampleCustom/sampleCustom.html b/apps/patchpanel/src/main/resources/app/view/sampleCustom/sampleCustom.html
deleted file mode 100644
index 34204b4..0000000
--- a/apps/patchpanel/src/main/resources/app/view/sampleCustom/sampleCustom.html
+++ /dev/null
@@ -1,54 +0,0 @@
-<!-- partial HTML of patch panel app -->
-<div id="ov-sample-custom" ng-controller="OvSampleCustomCtrl">
-    <div class="button-panel">
-        <div class="my-button" ng-click="getData()">
-            Load Devices
-        </div>
-
-    </div>
-    <div class="data-panel">
-        <div>
-            <label>Devices:
-                <select ng-model="myDev" ng-options="dev.name for dev in devices"></select>
-            </label>
-
-        </div>
-    </div>
-    <div class="button-panel">
-        <div class="my-button" ng-click="loadPorts()">
-            Load Ports
-        </div>
-    </div>
-    <div class="data-panel2">
-        <label>First Port:
-            <select ng-model="myPort1" ng-options="port.name for port in ports"></select>
-        </label>
-        <label>Second Port:
-            <select ng-model="myPort2" ng-options="port.name for port in ports"></select>
-        </label>
-    </div>
-    <div class="button-panel">
-        <div class="my-button" ng-click="done()">
-            Patch!
-        </div>
-    </div>
-    <div class="data-panel3">
-        <p>
-            <span class="quote">{{data.message}} </span>
-        </p>
-         <pre>
-
-
-        </pre>
-    </div>
-    <div class="button-panel">
-        <div class="my-button" ng-click="used()">
-            ConnectPoints in use
-        </div>
-    </div>
-    <div class="data-panel4">
-        <p>
-            <span class="quote">{{data.cpoints}} </span>
-        </p>
-    </div>
-</div>
\ No newline at end of file
diff --git a/apps/patchpanel/src/main/resources/app/view/sampleCustom/sampleCustom.js b/apps/patchpanel/src/main/resources/app/view/sampleCustom/sampleCustom.js
deleted file mode 100644
index 08902e3..0000000
--- a/apps/patchpanel/src/main/resources/app/view/sampleCustom/sampleCustom.js
+++ /dev/null
@@ -1,122 +0,0 @@
-// js for patch panel app custom view
-(function () {
-    'use strict';
-
-    // injected refs
-    var $log, $scope, wss, ks;
-
-    // constants
-    var dataReq = 'sampleCustomDataRequest',
-        dataResp = 'sampleCustomDataResponse';
-    var dataReq2 = 'sampleCustomDataRequest2',
-        dataResp2 = 'sampleCustomDataResponse2';
-    var dataReq3 = 'sampleCustomDataRequest3',
-        dataResp3 = 'sampleCustomDataResponse3';
-
-
-    function addKeyBindings() {
-        var map = {space: [getData, 'Fetch data from server'], _helpFormat: [['space']]};
-        ks.keyBindings(map);
-
-    }
-
-    function getData() {
-       wss.sendEvent(dataReq);
-    }
-    function used() {
-        wss.sendEvent(dataReq3);
-    }
-    function loadPorts(){
-        $scope.ports = [];
-        var i;
-        var index;
-        for(i = 0; i < $scope.cps.length ; i++){
-            if($scope.cps[i] == $scope.myDev){
-                index = i;
-            }
-        }
-        var j = index+1;
-        while( $scope.data.cps[j].indexOf("o") != 0){
-            var tempi = {name : $scope.data.cps[j]};
-            $scope.ports.push(tempi);
-            j++;
-        }
-    }
-    function done(){
-        var temp = [$scope.myDev.name, $scope.myPort1.name, $scope.myPort2.name];
-        var temp1 = {result : temp};
-        wss.sendEvent(dataReq2, temp1);
-
-    }
-    function respDataCb(data) {
-        $scope.data = data;
-        $scope.cps = [];
-        $scope.devices = [];
-        var i;
-        for(i = 0; i < $scope.data.cps.length; i++){
-            $scope.cps.push(temp);
-            if($scope.data.cps[i].indexOf("o") == 0){
-                var temp = {name : $scope.data.cps[i]};
-                $scope.devices.push(temp);
-            }
-        }
-        $scope.$apply();
-    }
-    function respDataCb2(data) {
-        $scope.data = data;
-        $scope.$apply();
-    }
-    function respDataCb3(data) {
-        $scope.data = data;
-        $scope.$apply();
-    }
-
-    var app = angular.module('ovSampleCustom', [])
-        .controller('OvSampleCustomCtrl',
-        ['$log', '$scope', 'WebSocketService', 'KeyService',
-
-        function (_$log_, _$scope_, _wss_, _ks_) {
-            $log = _$log_;
-            $scope = _$scope_;
-            wss = _wss_;
-            ks = _ks_;
-
-            $scope.cps = [];
-            $scope.devices = [];
-            $scope.ports = [];
-            $scope.myDev = $scope.devices[0];
-            $scope.myPort1 = $scope.ports[0];
-            $scope.myPort2 = $scope.ports[0];
-
-
-            var handlers = {};
-            $scope.data = {};
-            
-            // data response handler
-            handlers[dataResp] = respDataCb;
-            handlers[dataResp2] = respDataCb2;
-            handlers[dataResp3] = respDataCb3;
-            wss.bindHandlers(handlers);
-
-            addKeyBindings();
-
-            // custom click handler
-            $scope.getData = getData;
-            $scope.loadPorts = loadPorts;
-            $scope.used = used;
-            $scope.done = done;
-
-            // cleanup
-            $scope.$on('$destroy', function () {
-                wss.unbindHandlers(handlers);
-                ks.unbindKeys();
-                $log.log('OvSampleCustomCtrl has been destroyed');
-            });
-
-            $log.log('OvSampleCustomCtrl has been created');
-        }]);
-
-
-
-}());
-
diff --git a/apps/patchpanel/src/main/resources/sampleCustom/css.html b/apps/patchpanel/src/main/resources/sampleCustom/css.html
deleted file mode 100644
index 4e7b709..0000000
--- a/apps/patchpanel/src/main/resources/sampleCustom/css.html
+++ /dev/null
@@ -1 +0,0 @@
-<link rel="stylesheet" href="app/view/sampleCustom/sampleCustom.css">
\ No newline at end of file
diff --git a/apps/patchpanel/src/main/resources/sampleCustom/js.html b/apps/patchpanel/src/main/resources/sampleCustom/js.html
deleted file mode 100644
index 6550b85..0000000
--- a/apps/patchpanel/src/main/resources/sampleCustom/js.html
+++ /dev/null
@@ -1 +0,0 @@
-<script src="app/view/sampleCustom/sampleCustom.js"></script>
\ No newline at end of file
diff --git a/apps/pom.xml b/apps/pom.xml
index 9dc33aa..f8f0725 100644
--- a/apps/pom.xml
+++ b/apps/pom.xml
@@ -61,7 +61,6 @@
         <module>pim</module>
         <module>mlb</module>
         <module>pathpainter</module>
-        <module>patchpanel</module>
         <module>drivermatrix</module>
         <module>cpman</module>
         <module>events</module>
diff --git a/modules.defs b/modules.defs
index 0545759..08de85d 100644
--- a/modules.defs
+++ b/modules.defs
@@ -173,7 +173,6 @@
     '//apps/cpman/app:onos-apps-cpman-app-oar',
     '//apps/xosclient:onos-apps-xosclient-oar',
     '//apps/scalablegateway:onos-apps-scalablegateway-oar',
-    '//apps/patchpanel:onos-apps-patchpanel-oar',
     '//apps/castor:onos-apps-castor-oar',
     '//apps/yms:onos-apps-yms-oar',
     '//apps/ofagent:onos-apps-ofagent-oar',
