diff --git a/apps/ofagent/src/main/java/org/onosproject/ofagent/impl/OFSwitchManager.java b/apps/ofagent/src/main/java/org/onosproject/ofagent/impl/OFSwitchManager.java
index e23cb81..59a2b2c 100644
--- a/apps/ofagent/src/main/java/org/onosproject/ofagent/impl/OFSwitchManager.java
+++ b/apps/ofagent/src/main/java/org/onosproject/ofagent/impl/OFSwitchManager.java
@@ -33,8 +33,10 @@
 import org.onosproject.incubator.net.virtual.VirtualNetworkEvent;
 import org.onosproject.incubator.net.virtual.VirtualNetworkListener;
 import org.onosproject.incubator.net.virtual.VirtualNetworkService;
+import org.onosproject.incubator.net.virtual.VirtualPort;
 import org.onosproject.net.Device;
 import org.onosproject.net.DeviceId;
+import org.onosproject.net.Port;
 import org.onosproject.net.device.DeviceEvent;
 import org.onosproject.net.device.DeviceListener;
 import org.onosproject.net.device.DeviceService;
@@ -157,10 +159,19 @@
         return ImmutableSet.copyOf(ofSwitches);
     }
 
+    @Override
+    public Set<Port> ports(NetworkId networkId, DeviceId deviceId) {
+        Set<Port> ports = virtualNetService.getVirtualPorts(networkId, deviceId)
+                .stream()
+                .collect(Collectors.toSet());
+        return ImmutableSet.copyOf(ports);
+    }
+
     private void addOFSwitch(NetworkId networkId, DeviceId deviceId) {
         OFSwitch ofSwitch = DefaultOFSwitch.of(
                 dpidWithDeviceId(deviceId),
-                DEFAULT_CAPABILITIES);
+                DEFAULT_CAPABILITIES, networkId, deviceId,
+                virtualNetService.getServiceDirectory());
         ofSwitchMap.put(deviceId, ofSwitch);
         log.info("Added virtual OF switch for {}", deviceId);
 
@@ -289,6 +300,7 @@
 
         @Override
         public void event(VirtualNetworkEvent event) {
+            log.trace("Vnet event {}", event);
             switch (event.type()) {
                 case VIRTUAL_DEVICE_ADDED:
                     eventExecutor.execute(() -> {
@@ -312,14 +324,46 @@
                 case NETWORK_UPDATED:
                 case NETWORK_REMOVED:
                 case NETWORK_ADDED:
+                    break;
                 case VIRTUAL_PORT_ADDED:
+                    eventExecutor.execute(() -> {
+                        OFSwitch ofSwitch = ofSwitch(event.virtualPort());
+                        if (ofSwitch != null) {
+                            ofSwitch.processPortAdded(event.virtualPort());
+                            log.debug("Virtual port {} added to network {}",
+                                      event.virtualPort(),
+                                      event.subject());
+                        }
+                    });
+                    break;
                 case VIRTUAL_PORT_UPDATED:
+                    break;
                 case VIRTUAL_PORT_REMOVED:
+                    eventExecutor.execute(() -> {
+                        OFSwitch ofSwitch = ofSwitch(event.virtualPort());
+                        if (ofSwitch != null) {
+                            ofSwitch.processPortRemoved(event.virtualPort());
+                            log.debug("Virtual port {} removed from network {}",
+                                      event.virtualPort(),
+                                      event.subject());
+                        }
+                    });
+                    break;
                 default:
                     // do nothing
                     break;
             }
         }
+
+        private OFSwitch ofSwitch(VirtualPort virtualPort) {
+            OFSwitch ofSwitch = ofSwitchMap.get(virtualPort.element().id());
+            if (ofSwitch == null) {
+                log.warn("Switch does not exist for port {}", virtualPort);
+            } else {
+                log.trace("Switch exists for port {}", virtualPort);
+            }
+            return ofSwitch;
+        }
     }
 
     private class InternalOFAgentListener implements OFAgentListener {
