diff --git a/apps/oecfg/pom.xml b/apps/oecfg/pom.xml
deleted file mode 100644
index 8f595db..0000000
--- a/apps/oecfg/pom.xml
+++ /dev/null
@@ -1,73 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Copyright 2014 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/maven-v4_0_0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-
-    <parent>
-        <groupId>org.onosproject</groupId>
-        <artifactId>onos-apps</artifactId>
-        <version>1.3.0-SNAPSHOT</version>
-        <relativePath>../pom.xml</relativePath>
-    </parent>
-
-    <artifactId>onos-app-oecfg</artifactId>
-    <packaging>jar</packaging>
-
-    <description>Standalone utility for converting ONOS JSON config to OE-Linc JSON config</description>
-
-    <dependencies>
-        <dependency>
-            <groupId>com.fasterxml.jackson.core</groupId>
-            <artifactId>jackson-databind</artifactId>
-            <scope>compile</scope>
-        </dependency>
-        <dependency>
-            <groupId>com.fasterxml.jackson.core</groupId>
-            <artifactId>jackson-annotations</artifactId>
-            <scope>compile</scope>
-        </dependency>
-    </dependencies>
-
-    <build>
-        <plugins>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-shade-plugin</artifactId>
-                <executions>
-                    <execution>
-                        <phase>package</phase>
-                        <goals>
-                            <goal>shade</goal>
-                        </goals>
-                        <configuration>
-                            <transformers>
-                                <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
-                                    <manifestEntries>
-                                        <Main-Class>org.onosproject.oecfg.OELinkConfig</Main-Class>
-                                    </manifestEntries>
-                                </transformer>
-                            </transformers>
-                        </configuration>
-                    </execution>
-                </executions>
-            </plugin>
-        </plugins>
-    </build>
-
-</project>
diff --git a/apps/oecfg/src/main/java/org/onosproject/oecfg/OELinkConfig.java b/apps/oecfg/src/main/java/org/onosproject/oecfg/OELinkConfig.java
deleted file mode 100644
index 480640c..0000000
--- a/apps/oecfg/src/main/java/org/onosproject/oecfg/OELinkConfig.java
+++ /dev/null
@@ -1,142 +0,0 @@
-/*
- * Copyright 2014 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.oecfg;
-
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.node.ArrayNode;
-import com.fasterxml.jackson.databind.node.ObjectNode;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * Utility program to convert standard ONOS config JSON to format expected
- * by the OE Link switch.
- */
-public final class OELinkConfig {
-
-    private ObjectMapper mapper = new ObjectMapper();
-    private Map<String, String> dpidToName = new HashMap<>();
-
-    public static void main(String[] args) {
-        try {
-            OELinkConfig config = new OELinkConfig();
-            JsonNode json = config.convert(System.in);
-            System.out.println(json.toString());
-        } catch (IOException e) {
-            System.err.println("Unable to convert JSON due to: " + e.getMessage());
-            e.printStackTrace();
-        }
-    }
-
-    private OELinkConfig() {
-    }
-
-    private JsonNode convert(InputStream input) throws IOException {
-        JsonNode json = mapper.readTree(input);
-        ObjectNode result = mapper.createObjectNode();
-        result.set("switchConfig", opticalSwitches(json));
-        result.set("linkConfig", opticalLinks(json));
-        return result;
-    }
-
-    private JsonNode opticalSwitches(JsonNode json) {
-        ArrayNode result = mapper.createArrayNode();
-        for (JsonNode node : json.get("devices")) {
-            String dpid = dpid(node.path("uri"));
-            String name = node.path("name").asText("none");
-            dpidToName.put(dpid, name);
-            if (node.path("type").asText("none").equals("ROADM")) {
-                result.add(opticalSwitch(dpid, name, (ObjectNode) node));
-            }
-        }
-        return result;
-    }
-
-    private ObjectNode opticalSwitch(String dpid, String name, ObjectNode node) {
-        ObjectNode result = mapper.createObjectNode();
-        ObjectNode annot = (ObjectNode) node.path("annotations");
-        result.put("allowed", true).put("type", "Roadm")
-                .put("name", name).put("nodeDpid", dpid)
-                .put("latitude", annot.path("latitude").asDouble(0.0))
-                .put("longitude", annot.path("longitude").asDouble(0.0))
-                .set("params", switchParams(annot));
-        return result;
-    }
-
-    private ObjectNode switchParams(ObjectNode annot) {
-        return mapper.createObjectNode()
-                .put("numRegen", annot.path("optical.regens").asInt(0));
-    }
-
-    private JsonNode opticalLinks(JsonNode json) {
-        ArrayNode result = mapper.createArrayNode();
-        for (JsonNode node : json.get("links")) {
-            if (node.path("type").asText("none").equals("OPTICAL")) {
-                result.add(opticalLink((ObjectNode) node));
-            }
-        }
-        return result;
-    }
-
-    private ObjectNode opticalLink(ObjectNode node) {
-        ObjectNode result = mapper.createObjectNode();
-        ObjectNode annot = (ObjectNode) node.path("annotations");
-        String src = dpid(node.path("src"));
-        String dst = dpid(node.path("dst"));
-        result.put("allowed", true).put("type", linkType(annot))
-                .put("nodeDpid1", src).put("nodeDpid2", dst)
-                .set("params", linkParams(src, dst, node, annot));
-        return result;
-    }
-
-    private String linkType(ObjectNode annot) {
-        return annot.path("optical.type").asText("cross-connect").equals("WDM") ?
-                "wdmLink" : "pktOptLink";
-    }
-
-    private ObjectNode linkParams(String src, String dst,
-                                  ObjectNode node, ObjectNode annot) {
-        ObjectNode result = mapper.createObjectNode()
-                .put("nodeName1", dpidToName.get(src))
-                .put("nodeName2", dpidToName.get(dst))
-                .put("port1", port(node.path("src")))
-                .put("port2", port(node.path("dst")));
-        if (annot.has("bandwidth")) {
-            result.put("bandwidth", annot.path("bandwidth").asInt());
-        }
-        if (annot.has("optical.waves")) {
-            result.put("numWaves", annot.path("optical.waves").asInt());
-        }
-        return result;
-    }
-
-    private String dpid(JsonNode node) {
-        String s = node.asText("of:0000000000000000").substring(3);
-        return s.substring(0, 2) + ":" + s.substring(2, 4) + ":" +
-                s.substring(4, 6) + ":" + s.substring(6, 8) + ":" +
-                s.substring(8, 10) + ":" + s.substring(10, 12) + ":" +
-                s.substring(12, 14) + ":" + s.substring(14, 16);
-    }
-
-    private int port(JsonNode node) {
-        return Integer.parseInt(node.asText("of:0000000000000000/0").substring(20));
-    }
-
-}
diff --git a/apps/pom.xml b/apps/pom.xml
index e30973e..e08f306 100644
--- a/apps/pom.xml
+++ b/apps/pom.xml
@@ -41,7 +41,6 @@
         <module>sdnip</module>
         <module>optical</module>
         <module>metrics</module>
-        <module>oecfg</module>
         <module>routing</module>
         <module>routing-api</module>
         <module>reactive-routing</module>
diff --git a/tools/test/topos/opticalUtils.py b/tools/test/topos/opticalUtils.py
index 5b47d53..ddbe19a 100644
--- a/tools/test/topos/opticalUtils.py
+++ b/tools/test/topos/opticalUtils.py
@@ -366,11 +366,17 @@
         with open('Topology.json', 'w') as outfile:
             json.dump(opticalJSON, outfile, indent=4, separators=(',', ': '))
 
-        info('*** Converting Topology.json to linc-oe format (TopoConfig.json) file\n')
-        output = quietRun('%s/tools/test/bin/onos-oecfg ./Topology.json > TopoConfig.json' % LINCSwitch.onosDir, shell=True)
-        if output:
-            error('***ERROR: Error creating topology file: %s ' % output + '\n')
-            return False
+        info('*** Converting Topology.json to linc-oe format (TopoConfig.json) file (no oecfg) \n')
+        
+        topoConfigJson = {};
+        dpIdToName = {};
+
+        topoConfigJson["switchConfig"] = getSwitchConfig(dpIdToName);
+        topoConfigJson["linkConfig"] = getLinkConfig(dpIdToName);
+
+        #Writing to TopoConfig.json
+        with open( 'TopoConfig.json', 'w' ) as outfile:
+            json.dump( topoConfigJson, outfile, indent=4, separators=(',', ': ') )
 
         info('*** Creating sys.config...\n')
         output = quietRun('%s/config_generator TopoConfig.json %s/sys.config.template %s %s'
@@ -452,6 +458,87 @@
             if output.strip('{}'):
                 warn('***WARNING: Could not push topology file to ONOS: %s\n' % output)
 
+    #converts node ids to linc-oe format, with colons every two chars
+    def dpId(id):
+        nodeDpid = ""
+        id = id.split("/", 1)[0]
+        for i in range(3, len(id) - 1, 2):
+            nodeDpid += (id[i:(i + 2):]) + ":"
+        return nodeDpid[0:(len(nodeDpid) - 1)];
+
+    def getSwitchConfig (dpIdToName):
+        switchConfig = [];
+        #Iterate through all switches and convert the ROADM switches to linc-oe format
+        for switch in opticalJSON["devices"]:
+            if switch.get("type", "none") == "ROADM":
+                builtSwitch = {}
+
+                #set basic switch params based on annotations
+                builtSwitch["allowed"] = True;
+                builtSwitch["latitude"] = switch["annotations"].get("latitude", 0.0);
+                builtSwitch["longitude"] = switch["annotations"].get("longitude", 0.0);
+
+                #assumed that all switches have this entry
+                nodeId = switch["uri"]
+
+                #convert the nodeId to linc-oe format
+                nodeDpid = dpId(nodeId);
+
+                builtSwitch["name"] = switch.get("name", "none");
+
+                #keep track of the name corresponding to each switch dpid
+                dpIdToName[nodeDpid] = builtSwitch["name"];
+
+                builtSwitch["nodeDpid"] = nodeDpid
+
+                #set switch params and type
+                builtSwitch["params"] = {};
+                builtSwitch["params"]["numregens"] = switch["annotations"].get("optical.regens", 0);
+                builtSwitch["type"] = "Roadm"
+
+                #append to list of switches
+                switchConfig.append(builtSwitch);
+        return switchConfig
+
+
+    def getLinkConfig (dpIdToName):
+        newLinkConfig = [];
+        #Iterate through all optical links and convert them to linc-oe format
+        for link in opticalJSON["links"]:
+            if link.get("type", "none") == "OPTICAL":
+                builtLink = {}
+
+                #set basic link params for src and dst
+                builtLink["allowed"] = True;
+                builtLink["nodeDpid1"] = dpId(link["src"])
+                builtLink["nodeDpid2"] = dpId(link["dst"])
+
+                #set more params such as name/bandwidth/port/waves if they exist
+                params = {}
+                params["nodeName1"] = dpIdToName.get(builtLink["nodeDpid1"], "none")
+                params["nodeName2"] = dpIdToName.get(builtLink["nodeDpid2"], "none")
+                
+                params["port1"] = int(link["src"].split("/")[1])
+                params["port2"]  = int(link["dst"].split("/")[1])
+
+                if "bandwidth" in link["annotations"]:
+                    params["bandwidth"] = link["annotations"]["bandwidth"]
+
+                if "optical.waves" in link["annotations"]:
+                    params["numWaves"] = link["annotations"]["optical.waves"]
+                
+                builtLink["params"] = params
+
+                #set type of link (WDM or pktOpt)
+                if link["annotations"].get("optical.type", "cross-connect") == "WDM":
+                    builtLink["type"] = "wdmLink"
+                else:
+                    builtLink["type"] = "pktOptLink"
+
+                newLinkConfig.append(builtLink);
+        return newLinkConfig
+
+
     @staticmethod
     def waitStarted(net, timeout=TIMEOUT):
         "wait until all tap interfaces are available"
@@ -559,6 +646,8 @@
     def terminate(self):
         pass
 
+
+
 class LINCLink(Link):
     """
     LINC link class
