diff --git a/src/main/java/net/onrc/onos/core/topology/LinkEvent.java b/src/main/java/net/onrc/onos/core/topology/LinkEvent.java
index d73f80f..a975e60 100644
--- a/src/main/java/net/onrc/onos/core/topology/LinkEvent.java
+++ b/src/main/java/net/onrc/onos/core/topology/LinkEvent.java
@@ -60,17 +60,13 @@
         this.dst = original.dst;
     }
 
-    public LinkEvent(Long srcDpid, Long srcPortNo, Long dstDpid,
-                     Long dstPortNo) {
-        src = new SwitchPort(srcDpid, srcPortNo);
-        dst = new SwitchPort(dstDpid, dstPortNo);
-    }
-
+    // TODO probably want to remove this
     public LinkEvent(Link link) {
         src = new SwitchPort(link.getSrcSwitch().getDpid(),
                 link.getSrcPort().getNumber());
         dst = new SwitchPort(link.getDstSwitch().getDpid(),
                 link.getDstPort().getNumber());
+        // FIXME losing attributes here
     }
 
     /**
diff --git a/src/main/java/net/onrc/onos/core/topology/PortEvent.java b/src/main/java/net/onrc/onos/core/topology/PortEvent.java
index 222a641..e9256af 100644
--- a/src/main/java/net/onrc/onos/core/topology/PortEvent.java
+++ b/src/main/java/net/onrc/onos/core/topology/PortEvent.java
@@ -69,11 +69,6 @@
         this.id = original.id;
     }
 
-    // TODO remove me when ready
-    public PortEvent(Long dpid, Long number) {
-        this.id = new SwitchPort(dpid, number);
-    }
-
     /**
      * Gets the SwitchPort identifying this port.
      *
diff --git a/src/main/java/net/onrc/onos/core/topology/SwitchEvent.java b/src/main/java/net/onrc/onos/core/topology/SwitchEvent.java
index b6246d4..b61f7a5 100644
--- a/src/main/java/net/onrc/onos/core/topology/SwitchEvent.java
+++ b/src/main/java/net/onrc/onos/core/topology/SwitchEvent.java
@@ -48,11 +48,6 @@
         this.dpid = original.dpid;
     }
 
-    // TODO remove me when ready
-    public SwitchEvent(Long dpid) {
-        this.dpid = new Dpid(dpid);
-    }
-
     /**
      * Gets the DPID identifying this switch.
      *
diff --git a/src/main/java/net/onrc/onos/core/topology/SwitchImpl.java b/src/main/java/net/onrc/onos/core/topology/SwitchImpl.java
index 7fbc43d..b00409e 100644
--- a/src/main/java/net/onrc/onos/core/topology/SwitchImpl.java
+++ b/src/main/java/net/onrc/onos/core/topology/SwitchImpl.java
@@ -131,14 +131,6 @@
         return devices;
     }
 
-    // FIXME this should be removed from here and moved to MockTopology
-    Port addPort(Long portNumber) {
-        PortImpl port = new PortImpl(topology, getDpid(),
-                                new PortNumber(portNumber.shortValue()));
-        ((TopologyImpl) topology).putPort(port);
-        return port;
-    }
-
     void replaceStringAttributes(SwitchEvent updated) {
         Validate.isTrue(this.getDpid().equals(updated.getDpid()),
                 "Wrong SwitchEvent given.");
diff --git a/src/main/java/net/onrc/onos/core/topology/TopologyManager.java b/src/main/java/net/onrc/onos/core/topology/TopologyManager.java
index b079cae..eb2a799 100644
--- a/src/main/java/net/onrc/onos/core/topology/TopologyManager.java
+++ b/src/main/java/net/onrc/onos/core/topology/TopologyManager.java
@@ -26,6 +26,7 @@
 import net.onrc.onos.core.registry.IControllerRegistryService;
 import net.onrc.onos.core.util.Dpid;
 import net.onrc.onos.core.util.EventEntry;
+import net.onrc.onos.core.util.PortNumber;
 import net.onrc.onos.core.util.SwitchPort;
 import net.onrc.onos.core.util.serializers.KryoFactory;
 
@@ -1194,7 +1195,7 @@
                 continue;
             }
 
-            SwitchEvent switchEvent = new SwitchEvent(sw.getDpid());
+            SwitchEvent switchEvent = new SwitchEvent(new Dpid(sw.getDpid()));
             TopologyEvent topologyEvent = new TopologyEvent(switchEvent);
             EventEntry<TopologyEvent> eventEntry =
                     new EventEntry<TopologyEvent>(EventEntry.Type.ENTRY_ADD,
@@ -1208,7 +1209,9 @@
                 continue;
             }
 
-            PortEvent portEvent = new PortEvent(p.getDpid(), p.getNumber());
+            PortEvent portEvent = new PortEvent(
+                    new Dpid(p.getDpid()),
+                    new PortNumber(p.getNumber().shortValue()));
             TopologyEvent topologyEvent = new TopologyEvent(portEvent);
             EventEntry<TopologyEvent> eventEntry =
                     new EventEntry<TopologyEvent>(EventEntry.Type.ENTRY_ADD,
@@ -1226,10 +1229,9 @@
          }
 
         for (KVLink l : KVLink.getAllLinks()) {
-            LinkEvent linkEvent = new LinkEvent(l.getSrc().dpid,
-                    l.getSrc().number,
-                    l.getDst().dpid,
-                    l.getDst().number);
+            LinkEvent linkEvent = new LinkEvent(
+                    new SwitchPort(l.getSrc().dpid, l.getSrc().number),
+                    new SwitchPort(l.getDst().dpid, l.getDst().number));
             TopologyEvent topologyEvent = new TopologyEvent(linkEvent);
             EventEntry<TopologyEvent> eventEntry =
                     new EventEntry<TopologyEvent>(EventEntry.Type.ENTRY_ADD,
diff --git a/src/main/java/net/onrc/onos/core/topology/TopologyPublisher.java b/src/main/java/net/onrc/onos/core/topology/TopologyPublisher.java
index 60b0823..6cb2bc1 100644
--- a/src/main/java/net/onrc/onos/core/topology/TopologyPublisher.java
+++ b/src/main/java/net/onrc/onos/core/topology/TopologyPublisher.java
@@ -123,7 +123,7 @@
                 log.debug("Got control to set switch {} INACTIVE",
                         HexString.toHexString(dpid));
 
-                SwitchEvent switchEvent = new SwitchEvent(dpid);
+                SwitchEvent switchEvent = new SwitchEvent(new Dpid(dpid));
                 topologyDiscoveryInterface.
                         removeSwitchDiscoveryEvent(switchEvent);
                 registryService.releaseControl(dpid);
@@ -193,13 +193,14 @@
 
     @Override
     public void switchPortRemoved(Long switchId, OFPhysicalPort port) {
+        final Dpid dpid = new Dpid(switchId);
 
-        PortEvent portEvent = new PortEvent(switchId, (long) port.getPortNumber());
+        PortEvent portEvent = new PortEvent(dpid, new PortNumber(port.getPortNumber()));
         if (registryService.hasControl(switchId)) {
             topologyDiscoveryInterface.removePortDiscoveryEvent(portEvent);
         } else {
             log.debug("Not the master for switch {}. Suppressed port del event {}.",
-                    new Dpid(switchId), portEvent);
+                    dpid, portEvent);
         }
     }
 
@@ -218,7 +219,7 @@
         // TODO Not very robust
         if (!registryService.hasControl(sw.getId())) {
             log.debug("Not the master for switch {}. Suppressed switch add event {}.",
-                    new Dpid(sw.getId()), switchEvent);
+                    dpid, switchEvent);
             return;
         }
 
