diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/DefaultInstancePort.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/DefaultInstancePort.java
index b1addf0..0a53885 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/DefaultInstancePort.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/DefaultInstancePort.java
@@ -45,24 +45,30 @@
     private final MacAddress macAddress;
     private final IpAddress ipAddress;
     private final DeviceId deviceId;
+    private final DeviceId oldDeviceId;
     private final PortNumber portNumber;
+    private final PortNumber oldPortNumber;
     private final State state;
 
     // private constructor not intended for invoked from external
     private DefaultInstancePort(String networkId, String portId,
                                 MacAddress macAddress, IpAddress ipAddress,
-                                DeviceId deviceId, PortNumber portNumber,
+                                DeviceId deviceId, DeviceId oldDeviceId,
+                                PortNumber portNumber, PortNumber oldPortNumber,
                                 State state) {
         this.networkId = networkId;
         this.portId = portId;
         this.macAddress = macAddress;
         this.ipAddress = ipAddress;
         this.deviceId = deviceId;
+        this.oldDeviceId = oldDeviceId;
         this.portNumber = portNumber;
+        this.oldPortNumber = oldPortNumber;
         this.state = state;
     }
 
-    private DefaultInstancePort(Host host, State state) {
+    private DefaultInstancePort(Host host, State state,
+                                DeviceId oldDeviceId, PortNumber oldPortNumber) {
         this.networkId = host.annotations().value(ANNOTATION_NETWORK_ID);
         this.portId = host.annotations().value(ANNOTATION_PORT_ID);
         this.macAddress = host.mac();
@@ -72,6 +78,8 @@
         this.deviceId = host.location().deviceId();
         this.portNumber = host.location().port();
         this.state = state;
+        this.oldDeviceId = oldDeviceId;
+        this.oldPortNumber = oldPortNumber;
     }
 
     public static DefaultInstancePort from(Host host, State state) {
@@ -83,7 +91,22 @@
         checkArgument(!Strings.isNullOrEmpty(
                                 host.annotations().value(ANNOTATION_CREATE_TIME)));
 
-        return new DefaultInstancePort(host, state);
+        return new DefaultInstancePort(host, state, null, null);
+    }
+
+    public static DefaultInstancePort from(Host host,
+                                           State state,
+                                           DeviceId oldDeviceId,
+                                           PortNumber oldPortNumber) {
+        checkNotNull(host);
+        checkArgument(!Strings.isNullOrEmpty(
+                host.annotations().value(ANNOTATION_NETWORK_ID)));
+        checkArgument(!Strings.isNullOrEmpty(
+                host.annotations().value(ANNOTATION_PORT_ID)));
+        checkArgument(!Strings.isNullOrEmpty(
+                host.annotations().value(ANNOTATION_CREATE_TIME)));
+
+        return new DefaultInstancePort(host, state, oldDeviceId, oldPortNumber);
     }
 
     @Override
@@ -112,15 +135,34 @@
     }
 
     @Override
+    public DeviceId oldDeviceId() {
+        return oldDeviceId;
+    }
+
+    @Override
     public PortNumber portNumber() {
         return portNumber;
     }
 
     @Override
+    public PortNumber oldPortNumber() {
+        return oldPortNumber;
+    }
+
+    @Override
     public State state() {
         return state;
     }
 
+    /**
+     * Obtains an instance port builder.
+     *
+     * @return instance port builder
+     */
+    public static Builder builder() {
+        return new Builder();
+    }
+
     @Override
     public InstancePort updateState(State newState) {
         return new Builder()
@@ -129,12 +171,30 @@
                 .macAddress(macAddress)
                 .ipAddress(ipAddress)
                 .deviceId(deviceId)
+                .oldDeviceId(oldDeviceId)
                 .portNumber(portNumber)
+                .oldPortNumber(oldPortNumber)
                 .state(newState)
                 .build();
     }
 
     @Override
+    public InstancePort updatePrevData(DeviceId oldDeviceId,
+                                       PortNumber oldPortNumber) {
+        return new Builder()
+                .networkId(networkId)
+                .portId(portId)
+                .macAddress(macAddress)
+                .ipAddress(ipAddress)
+                .deviceId(deviceId)
+                .oldDeviceId(oldDeviceId)
+                .portNumber(portNumber)
+                .oldPortNumber(oldPortNumber)
+                .state(state)
+                .build();
+    }
+
+    @Override
     public String toString() {
         return MoreObjects.toStringHelper(getClass())
                 .add("networkId", networkId)
@@ -142,7 +202,9 @@
                 .add("macAddress", macAddress)
                 .add("ipAddress", ipAddress)
                 .add("deviceId", deviceId)
+                .add("oldDeviceId", oldDeviceId)
                 .add("portNumber", portNumber)
+                .add("oldPortNumber", oldPortNumber)
                 .add("state", state)
                 .toString();
     }
@@ -159,7 +221,9 @@
                     Objects.equals(macAddress, that.macAddress) &&
                     Objects.equals(ipAddress, that.ipAddress) &&
                     Objects.equals(deviceId, that.deviceId) &&
+                    Objects.equals(oldDeviceId, that.oldDeviceId) &&
                     Objects.equals(portNumber, that.portNumber) &&
+                    Objects.equals(oldPortNumber, that.oldPortNumber) &&
                     Objects.equals(state, that.state);
         }
         return false;
@@ -172,7 +236,9 @@
                 macAddress,
                 ipAddress,
                 deviceId,
+                oldDeviceId,
                 portNumber,
+                oldPortNumber,
                 state);
     }
 
@@ -186,7 +252,9 @@
         private MacAddress macAddress;
         private IpAddress ipAddress;
         private DeviceId deviceId;
+        private DeviceId oldDeviceId;
         private PortNumber portNumber;
+        private PortNumber oldPortNumber;
         private State state;
 
         // private constructor not intended to use from external
@@ -209,7 +277,9 @@
                     macAddress,
                     ipAddress,
                     deviceId,
+                    oldDeviceId,
                     portNumber,
+                    oldPortNumber,
                     state);
         }
 
@@ -244,12 +314,24 @@
         }
 
         @Override
+        public InstancePort.Builder oldDeviceId(DeviceId oldDeviceId) {
+            this.oldDeviceId = oldDeviceId;
+            return this;
+        }
+
+        @Override
         public InstancePort.Builder portNumber(PortNumber portNumber) {
             this.portNumber = portNumber;
             return this;
         }
 
         @Override
+        public InstancePort.Builder oldPortNumber(PortNumber oldPortNumber) {
+            this.oldPortNumber = oldPortNumber;
+            return this;
+        }
+
+        @Override
         public InstancePort.Builder state(State state) {
             this.state = state;
             return this;
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/DistributedInstancePortStore.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/DistributedInstancePortStore.java
index f663980..b313cce 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/DistributedInstancePortStore.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/DistributedInstancePortStore.java
@@ -48,6 +48,7 @@
 import static org.onosproject.openstacknetworking.api.Constants.OPENSTACK_NETWORKING_APP_ID;
 import static org.onosproject.openstacknetworking.api.InstancePort.State.ACTIVE;
 import static org.onosproject.openstacknetworking.api.InstancePort.State.INACTIVE;
+import static org.onosproject.openstacknetworking.api.InstancePort.State.MIGRATED;
 import static org.onosproject.openstacknetworking.api.InstancePort.State.MIGRATING;
 import static org.onosproject.openstacknetworking.api.InstancePortEvent.Type.OPENSTACK_INSTANCE_MIGRATION_ENDED;
 import static org.onosproject.openstacknetworking.api.InstancePortEvent.Type.OPENSTACK_INSTANCE_MIGRATION_STARTED;
@@ -169,12 +170,7 @@
                     break;
                 case UPDATE:
                     log.debug("Instance port updated");
-                    eventExecutor.execute(() -> {
-                            notifyDelegate(new InstancePortEvent(
-                                    OPENSTACK_INSTANCE_PORT_UPDATED,
-                                    event.newValue().value()));
-                            processInstancePortUpdate(event);
-                    });
+                    eventExecutor.execute(() -> processInstancePortUpdate(event));
                     break;
                 case REMOVE:
                     log.debug("Instance port removed");
@@ -198,25 +194,41 @@
                 notifyDelegate(new InstancePortEvent(
                         OPENSTACK_INSTANCE_MIGRATION_STARTED,
                         event.newValue().value()));
+                return;
             }
 
-            if (oldState == MIGRATING && newState == ACTIVE) {
+            if (oldState == MIGRATING && newState == MIGRATED) {
                 notifyDelegate(new InstancePortEvent(
                         OPENSTACK_INSTANCE_MIGRATION_ENDED,
                         event.newValue().value()));
+                updateInstancePort(event.newValue().value().updateState(ACTIVE));
+                return;
             }
 
             if (oldState == ACTIVE && newState == INACTIVE) {
                 notifyDelegate(new InstancePortEvent(
                         OPENSTACK_INSTANCE_TERMINATED,
                         event.newValue().value()));
+                return;
             }
 
             if (oldState == INACTIVE && newState == ACTIVE) {
                 notifyDelegate(new InstancePortEvent(
                         OPENSTACK_INSTANCE_RESTARTED,
                         event.newValue().value()));
+                return;
             }
+
+            // this should be auto-transition
+            if (oldState == MIGRATED && newState == ACTIVE) {
+                return;
+            }
+
+            notifyDelegate(new InstancePortEvent(
+                    OPENSTACK_INSTANCE_PORT_UPDATED,
+                    event.newValue().value()));
+
+            // TODO: need to handle cold migration
         }
     }
 }
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/HostBasedInstancePort.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/HostBasedInstancePort.java
deleted file mode 100644
index 12e51fe..0000000
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/HostBasedInstancePort.java
+++ /dev/null
@@ -1,136 +0,0 @@
-/*
- * 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.
- */
-package org.onosproject.openstacknetworking.impl;
-
-import com.google.common.base.Strings;
-import org.onlab.packet.IpAddress;
-import org.onlab.packet.MacAddress;
-import org.onosproject.net.DeviceId;
-import org.onosproject.net.Host;
-import org.onosproject.net.PortNumber;
-import org.onosproject.openstacknetworking.api.InstancePort;
-
-import java.util.Objects;
-import java.util.Optional;
-
-import static com.google.common.base.Preconditions.checkArgument;
-import static com.google.common.base.Preconditions.checkNotNull;
-import static org.onosproject.openstacknetworking.api.InstancePort.State.ACTIVE;
-
-/**
- * Implementation of instance port based on host subsystem.
- * Basically, HostBasedInstancePort is just a wrapper of a host, which helps
- * mapping between OpenStack port and the OVS port and retrieving information
- * such as IP address, location, and so on.
- */
-public final class HostBasedInstancePort implements InstancePort {
-
-    static final String ANNOTATION_NETWORK_ID = "networkId";
-    static final String ANNOTATION_PORT_ID = "portId";
-    static final String ANNOTATION_CREATE_TIME = "createTime";
-
-    private final Host host;
-
-    /**
-     * Default constructor.
-     *
-     * @param instance host object of this instance
-     */
-    private HostBasedInstancePort(Host instance) {
-        this.host = instance;
-    }
-
-    /**
-     * Returns new instance.
-     *
-     * @param host host object of this instance
-     * @return instance
-     */
-    public static HostBasedInstancePort of(Host host) {
-        checkNotNull(host);
-        checkArgument(!Strings.isNullOrEmpty(host.annotations().value(ANNOTATION_NETWORK_ID)));
-        checkArgument(!Strings.isNullOrEmpty(host.annotations().value(ANNOTATION_PORT_ID)));
-        checkArgument(!Strings.isNullOrEmpty(host.annotations().value(ANNOTATION_CREATE_TIME)));
-
-        return new HostBasedInstancePort(host);
-    }
-
-    @Override
-    public String networkId() {
-        return host.annotations().value(ANNOTATION_NETWORK_ID);
-    }
-
-    @Override
-    public String portId() {
-        return host.annotations().value(ANNOTATION_PORT_ID);
-    }
-
-    @Override
-    public MacAddress macAddress() {
-        return host.mac();
-    }
-
-    @Override
-    public IpAddress ipAddress() {
-        Optional<IpAddress> ipAddr = host.ipAddresses().stream().findFirst();
-        return ipAddr.orElse(null);
-    }
-
-    @Override
-    public DeviceId deviceId() {
-        return host.location().deviceId();
-    }
-
-    @Override
-    public PortNumber portNumber() {
-        return host.location().port();
-    }
-
-    @Override
-    public State state() {
-        return ACTIVE;
-    }
-
-    @Override
-    public InstancePort updateState(State newState) {
-        return null;
-    }
-
-    @Override
-    public String toString() {
-        return host.toString();
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (this == obj) {
-            return true;
-        }
-
-        if (obj instanceof HostBasedInstancePort) {
-            HostBasedInstancePort that = (HostBasedInstancePort) obj;
-            if (Objects.equals(this.portId(), that.portId())) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    @Override
-    public int hashCode() {
-        return Objects.hash(portId());
-    }
-}
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/HostBasedInstancePortManager.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/HostBasedInstancePortManager.java
deleted file mode 100644
index 3378b82..0000000
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/HostBasedInstancePortManager.java
+++ /dev/null
@@ -1,194 +0,0 @@
-/*
- * 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.
- */
-package org.onosproject.openstacknetworking.impl;
-
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.Maps;
-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.onlab.packet.IpAddress;
-import org.onlab.packet.MacAddress;
-import org.onlab.util.Tools;
-import org.onosproject.event.ListenerRegistry;
-import org.onosproject.net.Host;
-import org.onosproject.net.HostId;
-import org.onosproject.net.host.HostEvent;
-import org.onosproject.net.host.HostListener;
-import org.onosproject.net.host.HostService;
-import org.onosproject.openstacknetworking.api.InstancePort;
-import org.onosproject.openstacknetworking.api.InstancePortEvent;
-import org.onosproject.openstacknetworking.api.InstancePortEvent.Type;
-import org.onosproject.openstacknetworking.api.InstancePortListener;
-import org.onosproject.openstacknetworking.api.InstancePortService;
-import org.slf4j.Logger;
-
-import java.util.Map;
-import java.util.Set;
-import java.util.stream.Collectors;
-
-import static org.onosproject.openstacknetworking.api.InstancePortEvent.Type.OPENSTACK_INSTANCE_MIGRATION_ENDED;
-import static org.onosproject.openstacknetworking.api.InstancePortEvent.Type.OPENSTACK_INSTANCE_MIGRATION_STARTED;
-import static org.onosproject.openstacknetworking.api.InstancePortEvent.Type.OPENSTACK_INSTANCE_PORT_DETECTED;
-import static org.onosproject.openstacknetworking.api.InstancePortEvent.Type.OPENSTACK_INSTANCE_PORT_UPDATED;
-import static org.onosproject.openstacknetworking.api.InstancePortEvent.Type.OPENSTACK_INSTANCE_PORT_VANISHED;
-import static org.onosproject.openstacknetworking.impl.HostBasedInstancePort.ANNOTATION_NETWORK_ID;
-import static org.onosproject.openstacknetworking.impl.HostBasedInstancePort.ANNOTATION_PORT_ID;
-import static org.slf4j.LoggerFactory.getLogger;
-
-/**
- * Provides implementation of administering and interfacing host based instance ports.
- * It also provides instance port events for the hosts mapped to OpenStack VM interface.
- */
-@Service
-@Component(immediate = true)
-public class HostBasedInstancePortManager
-        extends ListenerRegistry<InstancePortEvent, InstancePortListener>
-        implements InstancePortService {
-
-    protected final Logger log = getLogger(getClass());
-
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    protected HostService hostService;
-
-    private final InternalHostListener hostListener = new InternalHostListener();
-
-    @Activate
-    protected void activate() {
-        hostService.addListener(hostListener);
-        log.info("Started");
-    }
-
-    @Deactivate
-    protected void deactivate() {
-        hostService.removeListener(hostListener);
-        log.info("Stopped");
-    }
-
-    @Override
-    public InstancePort instancePort(MacAddress macAddress) {
-        Host host = hostService.getHost(HostId.hostId(macAddress));
-        if (host == null || !isValidHost(host)) {
-            return null;
-        }
-        return HostBasedInstancePort.of(host);
-    }
-
-    @Override
-    public InstancePort instancePort(IpAddress ipAddress, String osNetId) {
-        return Tools.stream(hostService.getHosts()).filter(this::isValidHost)
-                .map(HostBasedInstancePort::of)
-                .filter(instPort -> instPort.networkId().equals(osNetId))
-                .filter(instPort -> instPort.ipAddress().equals(ipAddress))
-                .findAny().orElse(null);
-    }
-
-    @Override
-    public InstancePort instancePort(String osPortId) {
-        return Tools.stream(hostService.getHosts()).filter(this::isValidHost)
-                .map(HostBasedInstancePort::of)
-                .filter(instPort -> instPort.portId().equals(osPortId))
-                .findAny().orElse(null);
-    }
-
-    @Override
-    public Set<InstancePort> instancePorts() {
-        Set<InstancePort> instPors = Tools.stream(hostService.getHosts())
-                .filter(this::isValidHost)
-                .map(HostBasedInstancePort::of)
-                .collect(Collectors.toSet());
-        return ImmutableSet.copyOf(instPors);
-    }
-
-    @Override
-    public Set<InstancePort> instancePorts(String osNetId) {
-        Set<InstancePort> instPors = Tools.stream(hostService.getHosts())
-                .filter(this::isValidHost)
-                .map(HostBasedInstancePort::of)
-                .filter(instPort -> instPort.networkId().equals(osNetId))
-                .collect(Collectors.toSet());
-        return ImmutableSet.copyOf(instPors);
-    }
-
-    @Override
-    public void migrationPortAdded(InstancePort port) {
-        hostListener.processEvent(OPENSTACK_INSTANCE_MIGRATION_STARTED, port);
-    }
-
-    @Override
-    public void migrationPortRemoved(InstancePort port) {
-        hostListener.processEvent(OPENSTACK_INSTANCE_MIGRATION_ENDED, port);
-    }
-
-    private boolean isValidHost(Host host) {
-        return !host.ipAddresses().isEmpty() &&
-                host.annotations().value(ANNOTATION_NETWORK_ID) != null &&
-                host.annotations().value(ANNOTATION_PORT_ID) != null;
-    }
-
-    /**
-     * An internal listener that listens host event generated by HostLocationTracker
-     * in DistributedHostStore. The role of this listener is to convert host event
-     * to instance port event and post to the subscribers that have interested on
-     * this type of event.
-     */
-    private class InternalHostListener implements HostListener {
-
-        @Override
-        public boolean isRelevant(HostEvent event) {
-            Host host = event.subject();
-            if (!isValidHost(host)) {
-                log.debug("Invalid host detected, ignore it {}", host);
-                return false;
-            }
-            return true;
-        }
-
-        @Override
-        public void event(HostEvent event) {
-            InstancePort instPort = HostBasedInstancePort.of(event.subject());
-            switch (event.type()) {
-                case HOST_UPDATED:
-                    processEvent(OPENSTACK_INSTANCE_PORT_UPDATED, instPort);
-                    break;
-                case HOST_ADDED:
-                    processEvent(OPENSTACK_INSTANCE_PORT_DETECTED, instPort);
-                    break;
-                case HOST_REMOVED:
-                    processEvent(OPENSTACK_INSTANCE_PORT_VANISHED, instPort);
-                    break;
-                default:
-                    break;
-            }
-        }
-
-        private void processEvent(Type type, InstancePort port) {
-            Map<Type, String> eventMap = Maps.newConcurrentMap();
-            eventMap.put(OPENSTACK_INSTANCE_PORT_UPDATED, "updated");
-            eventMap.put(OPENSTACK_INSTANCE_PORT_DETECTED, "detected");
-            eventMap.put(OPENSTACK_INSTANCE_PORT_VANISHED, "disabled");
-            eventMap.put(OPENSTACK_INSTANCE_MIGRATION_STARTED, "detected");
-            eventMap.put(OPENSTACK_INSTANCE_MIGRATION_ENDED, "disabled");
-
-            InstancePortEvent instPortEvent = new InstancePortEvent(type, port);
-            log.debug("Instance port is {}: {}", eventMap.get(type), port);
-            process(instPortEvent);
-        }
-    }
-}
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/InstancePortManager.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/InstancePortManager.java
index c7ae7cc..7ad2b02 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/InstancePortManager.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/InstancePortManager.java
@@ -17,6 +17,7 @@
 
 import com.google.common.base.Strings;
 import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Sets;
 import org.apache.felix.scr.annotations.Activate;
 import org.apache.felix.scr.annotations.Component;
 import org.apache.felix.scr.annotations.Deactivate;
@@ -28,6 +29,7 @@
 import org.onosproject.core.CoreService;
 import org.onosproject.event.ListenerRegistry;
 import org.onosproject.net.Host;
+import org.onosproject.net.HostLocation;
 import org.onosproject.net.host.HostEvent;
 import org.onosproject.net.host.HostListener;
 import org.onosproject.net.host.HostService;
@@ -46,9 +48,12 @@
 
 import static com.google.common.base.Preconditions.checkArgument;
 import static com.google.common.base.Preconditions.checkNotNull;
+import static org.onosproject.openstacknetworking.api.Constants.ANNOTATION_NETWORK_ID;
+import static org.onosproject.openstacknetworking.api.Constants.ANNOTATION_PORT_ID;
 import static org.onosproject.openstacknetworking.api.InstancePort.State.ACTIVE;
-import static org.onosproject.openstacknetworking.impl.HostBasedInstancePort.ANNOTATION_NETWORK_ID;
-import static org.onosproject.openstacknetworking.impl.HostBasedInstancePort.ANNOTATION_PORT_ID;
+import static org.onosproject.openstacknetworking.api.InstancePort.State.INACTIVE;
+import static org.onosproject.openstacknetworking.api.InstancePort.State.MIGRATED;
+import static org.onosproject.openstacknetworking.api.InstancePort.State.MIGRATING;
 import static org.slf4j.LoggerFactory.getLogger;
 
 /**
@@ -56,7 +61,7 @@
  * It also provides instance port events for the hosts mapped to OpenStack VM interface.
  */
 @Service
-@Component(immediate = false)
+@Component(immediate = true)
 public class InstancePortManager
         extends ListenerRegistry<InstancePortEvent, InstancePortListener>
         implements InstancePortService, InstancePortAdminService {
@@ -193,16 +198,6 @@
         return ImmutableSet.copyOf(ports);
     }
 
-    @Override
-    public void migrationPortAdded(InstancePort port) {
-        // TODO need to be removed
-    }
-
-    @Override
-    public void migrationPortRemoved(InstancePort port) {
-        // TODO need to be removed
-    }
-
     private boolean isInstancePortInUse(String portId) {
         // TODO add checking logic
         return false;
@@ -246,13 +241,45 @@
                     updateInstancePort(instPort);
                     break;
                 case HOST_ADDED:
-                    createInstancePort(instPort);
+                    InstancePort existingPort = instancePort(instPort.portId());
+                    if (existingPort == null) {
+                        // first time to add instance
+                        createInstancePort(instPort);
+                    } else {
+                        // the instance was restarted
+                        if (existingPort.state() == InstancePort.State.INACTIVE) {
+                            updateInstancePort(existingPort.updateState(ACTIVE));
+                        }
+                    }
                     break;
                 case HOST_REMOVED:
-                    removeInstancePort(instPort.portId());
+                    // we will remove instance port from persistent store,
+                    // only if we receive port removal signal from neutron
+                    // by default, we update the instance port state to INACTIVE
+                    // to indicate the instance is terminated
+                    updateInstancePort(instPort.updateState(INACTIVE));
                     break;
                 case HOST_MOVED:
-                    // TODO: require implementation for VM migration case
+                    Host oldHost = event.prevSubject();
+                    Host currHost = event.subject();
+
+                    // in the middle of VM migration
+                    if (oldHost.locations().size() < currHost.locations().size()) {
+                        updateInstancePort(instPort.updateState(MIGRATING));
+                    }
+
+                    // finish of VM migration
+                    if (oldHost.locations().size() > currHost.locations().size()) {
+                        Set<HostLocation> diff =
+                                Sets.difference(oldHost.locations(), currHost.locations());
+                        HostLocation location = diff.stream().findFirst().orElse(null);
+
+                        if (location != null) {
+                            InstancePort updated = instPort.updateState(MIGRATED);
+                            updateInstancePort(updated.updatePrevData(
+                                        location.deviceId(), location.port()));
+                        }
+                    }
                     break;
                 default:
                     break;
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackRoutingArpHandler.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackRoutingArpHandler.java
index 0a916d8..1f73566 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackRoutingArpHandler.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackRoutingArpHandler.java
@@ -58,8 +58,6 @@
 import org.onosproject.openstacknetworking.api.InstancePortService;
 import org.onosproject.openstacknetworking.api.OpenstackFlowRuleService;
 import org.onosproject.openstacknetworking.api.OpenstackNetworkAdminService;
-import org.onosproject.openstacknetworking.api.OpenstackNetworkEvent;
-import org.onosproject.openstacknetworking.api.OpenstackNetworkListener;
 import org.onosproject.openstacknetworking.api.OpenstackNetworkService;
 import org.onosproject.openstacknetworking.api.OpenstackRouterEvent;
 import org.onosproject.openstacknetworking.api.OpenstackRouterListener;
@@ -98,6 +96,7 @@
 import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.getGwByInstancePort;
 import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.getPropertyValue;
 import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.isAssociatedWithVM;
+import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.swapStaleLocation;
 import static org.onosproject.openstacknode.api.OpenstackNode.NodeType.GATEWAY;
 import static org.slf4j.LoggerFactory.getLogger;
 
@@ -156,14 +155,12 @@
     private final OpenstackNodeListener osNodeListener = new InternalNodeEventListener();
     private final InstancePortListener instPortListener = new InternalInstancePortListener();
 
-    private final OpenstackNetworkListener osNetworkListener = new InternalOpenstackNetworkListener();
-
     private ApplicationId appId;
     private NodeId localNodeId;
+
     private final Map<String, MacAddress> floatingIpMacMap = Maps.newConcurrentMap();
-    private final Map<String, DeviceId> migrationPool = Maps.newConcurrentMap();
-    private final Map<MacAddress, InstancePort> terminatedInstPorts = Maps.newConcurrentMap();
-    private final Map<MacAddress, InstancePort> tobeRemovedInstPorts = Maps.newConcurrentMap();
+
+    // TODO: pendingInstPortIds should be purged later
     private final Map<String, NetFloatingIP> pendingInstPortIds = Maps.newConcurrentMap();
 
     private final ExecutorService eventExecutor = newSingleThreadExecutor(
@@ -178,7 +175,6 @@
         localNodeId = clusterService.getLocalNode().id();
         osRouterService.addListener(osRouterListener);
         osNodeService.addListener(osNodeListener);
-        osNetworkService.addListener(osNetworkListener);
         instancePortService.addListener(instPortListener);
         leadershipService.runForLeadership(appId.name());
         packetService.addProcessor(packetProcessor, PacketProcessor.director(1));
@@ -192,7 +188,6 @@
         osRouterService.removeListener(osRouterListener);
         osNodeService.removeListener(osNodeListener);
         instancePortService.removeListener(instPortListener);
-        osNetworkService.removeListener(osNetworkListener);
         leadershipService.withdraw(appId.name());
         eventExecutor.shutdown();
         configService.unregisterProperties(getClass(), false);
@@ -358,8 +353,7 @@
             if (f.getPortId() != null) {
                 Port port = osNetworkAdminService.port(f.getPortId());
                 if (port != null) {
-                    if (!Strings.isNullOrEmpty(port.getDeviceId()) &&
-                            instancePortService.instancePort(f.getPortId()) == null) {
+                    if (!Strings.isNullOrEmpty(port.getDeviceId())) {
                         pendingInstPortIds.put(f.getPortId(), f);
                     }
                 }
@@ -488,16 +482,6 @@
 
             instPort = instancePortService.instancePort(targetMac);
 
-            // in VM purge case, we will have null instance port
-            if (instPort == null) {
-                instPort = tobeRemovedInstPorts.get(targetMac);
-                tobeRemovedInstPorts.remove(targetMac);
-            }
-
-            if (instPort == null) {
-                instPort = terminatedInstPorts.get(targetMac);
-            }
-
             OpenstackNode gw = getGwByInstancePort(gateways, instPort);
 
             if (gw == null) {
@@ -586,38 +570,12 @@
                     );
                     break;
                 case OPENSTACK_FLOATING_IP_ASSOCIATED:
-
-                    if (instancePortService.instancePort(event.portId()) == null) {
-                        log.info("Try to associate the fip {} with a terminated VM",
-                                event.floatingIp().getFloatingIpAddress());
-                        pendingInstPortIds.put(event.portId(), event.floatingIp());
-                        return;
-                    }
-
                     eventExecutor.execute(() ->
                         // associate a floating IP with an existing VM
                         setFloatingIpArpRule(event.floatingIp(), completedGws, true)
                     );
                     break;
                 case OPENSTACK_FLOATING_IP_DISASSOCIATED:
-
-                    MacAddress mac = floatingIpMacMap.get(event.floatingIp().getFloatingIpAddress());
-
-                    if (mac != null && !tobeRemovedInstPorts.containsKey(mac) &&
-                            terminatedInstPorts.containsKey(mac)) {
-                        tobeRemovedInstPorts.put(mac, terminatedInstPorts.get(mac));
-                    }
-
-                    if (instancePortService.instancePort(event.portId()) == null) {
-
-                        if (pendingInstPortIds.containsKey(event.portId())) {
-                            log.info("Try to disassociate the fip {} with a terminated VM",
-                                    event.floatingIp().getFloatingIpAddress());
-                            pendingInstPortIds.remove(event.portId());
-                            return;
-                        }
-                    }
-
                     eventExecutor.execute(() ->
                         // disassociate a floating IP with the existing VM
                         setFloatingIpArpRule(event.floatingIp(), completedGws, false)
@@ -731,7 +689,6 @@
 
             switch (event.type()) {
                 case OPENSTACK_INSTANCE_PORT_DETECTED:
-                    terminatedInstPorts.remove(instPort.macAddress());
 
                     if (pendingInstPortIds.containsKey(instPort.portId())) {
                         Set<OpenstackNode> completedGws =
@@ -742,11 +699,6 @@
                     }
 
                     break;
-
-                case OPENSTACK_INSTANCE_PORT_VANISHED:
-                    terminatedInstPorts.put(instPort.macAddress(), instPort);
-                    break;
-
                 case OPENSTACK_INSTANCE_MIGRATION_STARTED:
 
                     if (gateways.size() == 1) {
@@ -754,25 +706,24 @@
                     }
 
                     if (fip != null && isAssociatedWithVM(osNetworkService, fip)) {
-                        migrationPool.put(fip.getFloatingIpAddress(), event.subject().deviceId());
-
-                        eventExecutor.execute(() -> {
+                        eventExecutor.execute(() ->
                             setFloatingIpArpRuleWithPortEvent(fip, event.subject(),
-                                    gateways, true);
-                        });
+                                    gateways, true)
+                        );
                     }
 
                     break;
                 case OPENSTACK_INSTANCE_MIGRATION_ENDED:
 
+                    InstancePort revisedInstPort = swapStaleLocation(event.subject());
+
                     if (gateways.size() == 1) {
                         return;
                     }
 
                     if (fip != null && isAssociatedWithVM(osNetworkService, fip)) {
-                        DeviceId newDeviceId = migrationPool.get(fip.getFloatingIpAddress());
-                        DeviceId oldDeviceId = event.subject().deviceId();
-                        migrationPool.remove(fip.getFloatingIpAddress());
+                        DeviceId newDeviceId = event.subject().deviceId();
+                        DeviceId oldDeviceId = revisedInstPort.deviceId();
 
                         OpenstackNode oldGw = getGwByComputeDevId(gateways, oldDeviceId);
                         OpenstackNode newGw = getGwByComputeDevId(gateways, newDeviceId);
@@ -782,34 +733,8 @@
                         }
 
                         eventExecutor.execute(() ->
-                                setFloatingIpArpRuleWithPortEvent(fip, event.subject(),
-                                        gateways, false));
-                    }
-                    break;
-                default:
-                    break;
-            }
-        }
-    }
-
-    private class InternalOpenstackNetworkListener implements OpenstackNetworkListener {
-
-        @Override
-        public boolean isRelevant(OpenstackNetworkEvent event) {
-            // do not allow to proceed without leadership
-            NodeId leader = leadershipService.getLeader(appId.name());
-            return Objects.equals(localNodeId, leader);
-        }
-
-        @Override
-        public void event(OpenstackNetworkEvent event) {
-            switch (event.type()) {
-                case OPENSTACK_PORT_REMOVED:
-                    Port osPort = event.port();
-                    MacAddress mac = MacAddress.valueOf(osPort.getMacAddress());
-                    if (terminatedInstPorts.containsKey(mac)) {
-                        tobeRemovedInstPorts.put(mac, terminatedInstPorts.get(mac));
-                        terminatedInstPorts.remove(mac);
+                                setFloatingIpArpRuleWithPortEvent(fip,
+                                        revisedInstPort, gateways, false));
                     }
                     break;
                 default:
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackRoutingFloatingIpHandler.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackRoutingFloatingIpHandler.java
index 831f53b..5be8b87 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackRoutingFloatingIpHandler.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackRoutingFloatingIpHandler.java
@@ -43,9 +43,9 @@
 import org.onosproject.openstacknetworking.api.Constants;
 import org.onosproject.openstacknetworking.api.ExternalPeerRouter;
 import org.onosproject.openstacknetworking.api.InstancePort;
+import org.onosproject.openstacknetworking.api.InstancePortAdminService;
 import org.onosproject.openstacknetworking.api.InstancePortEvent;
 import org.onosproject.openstacknetworking.api.InstancePortListener;
-import org.onosproject.openstacknetworking.api.InstancePortService;
 import org.onosproject.openstacknetworking.api.OpenstackFlowRuleService;
 import org.onosproject.openstacknetworking.api.OpenstackNetworkEvent;
 import org.onosproject.openstacknetworking.api.OpenstackNetworkListener;
@@ -82,11 +82,14 @@
 import static org.onosproject.openstacknetworking.api.Constants.PRIORITY_FLOATING_EXTERNAL;
 import static org.onosproject.openstacknetworking.api.Constants.PRIORITY_FLOATING_INTERNAL;
 import static org.onosproject.openstacknetworking.api.Constants.ROUTING_TABLE;
+import static org.onosproject.openstacknetworking.api.InstancePort.State.PENDING_REMOVAL;
+import static org.onosproject.openstacknetworking.api.InstancePort.State.REMOVED;
 import static org.onosproject.openstacknetworking.api.InstancePortEvent.Type.OPENSTACK_INSTANCE_MIGRATION_ENDED;
 import static org.onosproject.openstacknetworking.api.InstancePortEvent.Type.OPENSTACK_INSTANCE_MIGRATION_STARTED;
 import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.associatedFloatingIp;
 import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.getGwByComputeDevId;
 import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.isAssociatedWithVM;
+import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.swapStaleLocation;
 import static org.onosproject.openstacknetworking.util.RulePopulatorUtil.buildExtension;
 import static org.onosproject.openstacknode.api.OpenstackNode.NodeType.GATEWAY;
 
@@ -117,7 +120,7 @@
     protected OpenstackNodeService osNodeService;
 
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    protected InstancePortService instancePortService;
+    protected InstancePortAdminService instancePortService;
 
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
     protected OpenstackRouterAdminService osRouterAdminService;
@@ -136,10 +139,7 @@
     private final OpenstackNetworkListener osNetworkListener = new InternalOpenstackNetworkListener();
     private final InstancePortListener instPortListener = new InternalInstancePortListener();
 
-    private final Map<String, DeviceId> migrationPool = Maps.newConcurrentMap();
     private Map<String, Port> terminatedOsPorts = Maps.newConcurrentMap();
-    private Map<String, InstancePort> terminatedInstPorts = Maps.newConcurrentMap();
-    private Map<String, InstancePort> tobeRemovedInstPorts = Maps.newConcurrentMap();
     private Map<String, NetFloatingIP> pendingInstPortIds = Maps.newConcurrentMap();
 
     private ApplicationId appId;
@@ -189,21 +189,16 @@
         InstancePort instPort = instancePortService.instancePort(srcMac);
 
         if (instPort == null) {
-            instPort = tobeRemovedInstPorts.get(osPort.getId());
-            tobeRemovedInstPorts.remove(osPort.getId());
-        }
-
-        if (instPort == null) {
-            instPort = terminatedInstPorts.get(osPort.getId());
-        }
-
-        if (instPort == null) {
             final String errorFormat = ERR_FLOW + "no host(MAC:%s) found";
             final String error = String.format(errorFormat,
                     floatingIp.getFloatingIpAddress(), srcMac);
             throw new IllegalStateException(error);
         }
 
+        if (instPort.state() == PENDING_REMOVAL) {
+            instancePortService.updateInstancePort(instPort.updateState(REMOVED));
+        }
+
         ExternalPeerRouter externalPeerRouter = externalPeerRouter(osNet);
         if (externalPeerRouter == null) {
             final String errorFormat = ERR_FLOW + "no external peer router found";
@@ -638,12 +633,6 @@
         // set floating IP rules only if the port is associated to a VM
         if (!Strings.isNullOrEmpty(osPort.getDeviceId())) {
 
-            if (!tobeRemovedInstPorts.containsKey(osPort.getId()) &&
-                    terminatedInstPorts.containsKey(osPort.getId())) {
-                tobeRemovedInstPorts.put(osPort.getId(),
-                                    terminatedInstPorts.get(osPort.getId()));
-            }
-
             if (instancePortService.instancePort(osPort.getId()) == null) {
 
                 // in case there is pending instance port, we simply remove that
@@ -753,15 +742,6 @@
                                 continue;
                             }
 
-                            // This is for handling a VM, which is associated
-                            // with a floating IP, was terminated case
-                            // in this case, we cannot obtain instance port
-                            // information from a terminated VM, we simply
-                            // construct a pending map where key is terminated
-                            // instance port ID while value is floating IP
-                            // address which supposed to be associated with the
-                            // terminated instance port.
-
                             // Note that, at OPENSTACK_INSTANCE_PORT_DETECTED phase,
                             // we will install floating IP related rules by
                             // referring to the key and value stored in pending map
@@ -770,6 +750,7 @@
                                 pendingInstPortIds.put(fip.getPortId(), fip);
                                 continue;
                             }
+
                             setFloatingIpRules(fip, osPort, event.subject(), true);
                         }
                     });
@@ -863,7 +844,6 @@
                     if (instPort != null && instPort.portId() != null) {
                         String portId = instPort.portId();
 
-                        terminatedInstPorts.remove(portId);
                         terminatedOsPorts.remove(portId);
 
                         Port port = osNetworkService.port(portId);
@@ -877,19 +857,6 @@
 
                     break;
 
-                case OPENSTACK_INSTANCE_PORT_VANISHED:
-                    if (instPort != null && instPort.portId() != null) {
-                        String portId = instPort.portId();
-                        Port port = osNetworkService.port(portId);
-
-                        if (port != null) {
-                            terminatedInstPorts.put(portId, instPort);
-                            terminatedOsPorts.put(portId, port);
-                        }
-                    }
-
-                    break;
-
                 case OPENSTACK_INSTANCE_MIGRATION_STARTED:
 
                     fip = associatedFloatingIp(event.subject(), ips);
@@ -923,14 +890,13 @@
                         // corresponding compute node, we need to install new rule to
                         // the target compute node, and remove rules from original node
                         setComputeNodeToGatewayHelper(event.subject(), osNet, gateways, true);
-
-                        migrationPool.put(fip.getFloatingIpAddress(), event.subject().deviceId());
-
                     });
                     break;
                 case OPENSTACK_INSTANCE_MIGRATION_ENDED:
 
-                    fip = associatedFloatingIp(event.subject(), ips);
+                    InstancePort revisedInstPort = swapStaleLocation(event.subject());
+
+                    fip = associatedFloatingIp(revisedInstPort, ips);
 
                     if (fip == null) {
                         return;
@@ -956,9 +922,8 @@
                     // if it is true, we simply do not remove the rules, as
                     // it has been overwritten at port detention event
                     // if it is false, we will remove the rules
-                    DeviceId newDeviceId = migrationPool.get(fip.getFloatingIpAddress());
-                    DeviceId oldDeviceId = event.subject().deviceId();
-                    migrationPool.remove(fip.getFloatingIpAddress());
+                    DeviceId newDeviceId = event.subject().deviceId();
+                    DeviceId oldDeviceId = revisedInstPort.deviceId();
 
                     OpenstackNode oldGateway = getGwByComputeDevId(gateways, oldDeviceId);
                     OpenstackNode newGateway = getGwByComputeDevId(gateways, newDeviceId);
@@ -971,13 +936,13 @@
 
                         // We need to remove the old ComputeNodeToGateway rules from
                         // original compute node
-                        setComputeNodeToGatewayHelper(event.subject(), osNet, gateways, false);
+                        setComputeNodeToGatewayHelper(revisedInstPort, osNet, gateways, false);
 
                         // Since DownstreamExternal rules should only be placed in
                         // corresponding gateway node, we need to remove old rule from
                         // the corresponding gateway node
-                        setDownstreamExternalRulesHelper(fip, osNet,
-                                event.subject(), externalPeerRouter, gateways, false);
+                        setDownstreamExternalRulesHelper(fip, osNet, revisedInstPort,
+                                externalPeerRouter, gateways, false);
                     });
                     break;
                 default:
@@ -999,10 +964,23 @@
         public void event(OpenstackNetworkEvent event) {
             switch (event.type()) {
                 case OPENSTACK_PORT_REMOVED:
-                    Port osPort = event.port();
-                    if (terminatedInstPorts.containsKey(osPort.getId())) {
-                        updateFipStore(terminatedInstPorts.get(osPort.getId()));
-                        terminatedInstPorts.remove(osPort.getId());
+                    String portId = event.port().getId();
+                    terminatedOsPorts.put(portId, event.port());
+
+                    InstancePort instPort = instancePortService.instancePort(portId);
+                    InstancePort updated = instPort.updateState(PENDING_REMOVAL);
+                    instancePortService.updateInstancePort(updated);
+
+                    updateFipStore(instPort);
+
+                    // we will hold the instance port in its store, until its
+                    // state is changed to REMOVED
+                    while (true) {
+                        if (instancePortService.instancePort(portId).state() ==
+                                REMOVED) {
+                            instancePortService.removeInstancePort(portId);
+                            break;
+                        }
                     }
                     break;
                 default:
@@ -1029,7 +1007,6 @@
                     // invalidate bound fixed IP and port
                     neutronFip.setFixedIpAddress(null);
                     neutronFip.setPortId(null);
-                    tobeRemovedInstPorts.put(port.portId(), port);
 
                     // Following update will in turn trigger
                     // OPENSTACK_FLOATING_IP_DISASSOCIATED event
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackRoutingHandler.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackRoutingHandler.java
index 45928ba..03f65aa 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackRoutingHandler.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackRoutingHandler.java
@@ -1072,30 +1072,39 @@
         public void event(InstancePortEvent event) {
             InstancePort instPort = event.subject();
             switch (event.type()) {
-                case OPENSTACK_INSTANCE_PORT_UPDATED:
                 case OPENSTACK_INSTANCE_PORT_DETECTED:
-                    eventExecutor.execute(() -> {
-                        log.info("RoutingHandler: Instance port detected MAC:{} IP:{}",
-                                instPort.macAddress(),
-                                instPort.ipAddress());
-                        instPortDetected(event.subject());
-                    });
+                case OPENSTACK_INSTANCE_PORT_UPDATED:
+                    log.info("RoutingHandler: Instance port detected MAC:{} IP:{}",
+                                                            instPort.macAddress(),
+                                                            instPort.ipAddress());
+
+                    eventExecutor.execute(() -> instPortDetected(event.subject()));
+
                     break;
                 case OPENSTACK_INSTANCE_PORT_VANISHED:
-                    eventExecutor.execute(() -> {
-                        log.info("RoutingHandler: Instance port vanished MAC:{} IP:{}",
-                                instPort.macAddress(),
-                                instPort.ipAddress());
-                        instPortRemoved(event.subject());
-                    });
+                    log.info("RoutingHandler: Instance port vanished MAC:{} IP:{}",
+                                                            instPort.macAddress(),
+                                                            instPort.ipAddress());
+
+                    eventExecutor.execute(() -> instPortRemoved(event.subject()));
+
+                    break;
+                case OPENSTACK_INSTANCE_MIGRATION_STARTED:
+                    log.info("RoutingHandler: Migration started for MAC:{} IP:{}",
+                                                            instPort.macAddress(),
+                                                            instPort.ipAddress());
+
+                    eventExecutor.execute(() -> instPortDetected(instPort));
+
                     break;
                 case OPENSTACK_INSTANCE_MIGRATION_ENDED:
+                    log.info("RoutingHandler: Migration finished for MAC:{} IP:{}",
+                                                            instPort.macAddress(),
+                                                            instPort.ipAddress());
                     eventExecutor.execute(() -> {
-                        log.info("RoutingHandler: Instance port vanished MAC:{} IP:{} due to VM migration",
-                                instPort.macAddress(),
-                                instPort.ipAddress());
                         // TODO: need to reconfigure rules to point to update VM
                     });
+
                     break;
                 default:
                     break;
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackRoutingIcmpHandler.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackRoutingIcmpHandler.java
index 292ea3f..e5289a2 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackRoutingIcmpHandler.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackRoutingIcmpHandler.java
@@ -120,7 +120,8 @@
     private static final KryoNamespace SERIALIZER_ICMP_MAP = KryoNamespace.newBuilder()
             .register(KryoNamespaces.API)
             .register(InstancePort.class)
-            .register(HostBasedInstancePort.class)
+            .register(DefaultInstancePort.class)
+            .register(InstancePort.State.class)
             .build();
 
     private ApplicationId appId;
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackSecurityGroupHandler.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackSecurityGroupHandler.java
index 7fa85a9..d659c4d 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackSecurityGroupHandler.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackSecurityGroupHandler.java
@@ -640,8 +640,8 @@
         public void event(InstancePortEvent event) {
             InstancePort instPort = event.subject();
             switch (event.type()) {
-                case OPENSTACK_INSTANCE_PORT_UPDATED:
                 case OPENSTACK_INSTANCE_PORT_DETECTED:
+                case OPENSTACK_INSTANCE_PORT_UPDATED:
                     log.debug("Instance port detected MAC:{} IP:{}",
                             instPort.macAddress(),
                             instPort.ipAddress());
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackSwitchingArpHandler.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackSwitchingArpHandler.java
index fa72289..3131263 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackSwitchingArpHandler.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackSwitchingArpHandler.java
@@ -86,6 +86,7 @@
 import static org.onosproject.openstacknetworking.api.Constants.PRIORITY_ARP_REQUEST_RULE;
 import static org.onosproject.openstacknetworking.api.Constants.PRIORITY_ARP_SUBNET_RULE;
 import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.getPropertyValue;
+import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.swapStaleLocation;
 import static org.onosproject.openstacknetworking.util.RulePopulatorUtil.buildExtension;
 import static org.onosproject.openstacknode.api.OpenstackNode.NodeType.COMPUTE;
 
@@ -749,8 +750,8 @@
         @Override
         public void event(InstancePortEvent event) {
             switch (event.type()) {
-                case OPENSTACK_INSTANCE_PORT_UPDATED:
                 case OPENSTACK_INSTANCE_PORT_DETECTED:
+                case OPENSTACK_INSTANCE_PORT_UPDATED:
                     setArpRequestRule(event.subject(), true);
                     setArpReplyRule(event.subject(), true);
                     break;
@@ -758,8 +759,13 @@
                     setArpRequestRule(event.subject(), false);
                     setArpReplyRule(event.subject(), false);
                     break;
+                case OPENSTACK_INSTANCE_MIGRATION_STARTED:
+                    setArpRequestRule(event.subject(), true);
+                    setArpReplyRule(event.subject(), true);
+                    break;
                 case OPENSTACK_INSTANCE_MIGRATION_ENDED:
-                    setArpRequestRule(event.subject(), false);
+                    InstancePort revisedInstPort = swapStaleLocation(event.subject());
+                    setArpRequestRule(revisedInstPort, false);
                     break;
                 default:
                     break;
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackSwitchingHandler.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackSwitchingHandler.java
index 18116a9..75cdea1 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackSwitchingHandler.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackSwitchingHandler.java
@@ -69,6 +69,7 @@
 import static org.onosproject.openstacknetworking.api.Constants.PRIORITY_TUNNEL_TAG_RULE;
 import static org.onosproject.openstacknetworking.api.Constants.STAT_FLAT_OUTBOUND_TABLE;
 import static org.onosproject.openstacknetworking.api.Constants.VTAG_TABLE;
+import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.swapStaleLocation;
 import static org.onosproject.openstacknetworking.util.RulePopulatorUtil.buildExtension;
 import static org.onosproject.openstacknode.api.OpenstackNode.NodeType.COMPUTE;
 import static org.slf4j.LoggerFactory.getLogger;
@@ -608,39 +609,39 @@
             InstancePort instPort = event.subject();
 
             switch (event.type()) {
-                case OPENSTACK_INSTANCE_PORT_UPDATED:
                 case OPENSTACK_INSTANCE_PORT_DETECTED:
-                    log.info("Instance port detected MAC:{} IP:{}",
+                case OPENSTACK_INSTANCE_PORT_UPDATED:
+                    log.info("SwitchingHandler: Instance port detected MAC:{} IP:{}",
                                                         instPort.macAddress(),
                                                         instPort.ipAddress());
-                    eventExecutor.execute(() ->
-                        instPortDetected(instPort)
-                    );
+
+                    eventExecutor.execute(() -> instPortDetected(instPort));
 
                     break;
                 case OPENSTACK_INSTANCE_PORT_VANISHED:
-                    log.info("Instance port vanished MAC:{} IP:{}",
+                    log.info("SwitchingHandler: Instance port vanished MAC:{} IP:{}",
                                                         instPort.macAddress(),
                                                         instPort.ipAddress());
-                    eventExecutor.execute(() ->
-                        instPortRemoved(instPort)
-                    );
+
+                    eventExecutor.execute(() -> instPortRemoved(instPort));
 
                     break;
-
-                // we do not consider MIGRATION_STARTED case, because the rules
-                // will be installed to corresponding switches at
-                // OPENSTACK_INSTANCE_PORT_UPDATED phase
-
-                // TODO: we may need to consider to refactor the VM migration
-                // event detection logic for better code readability
-                case OPENSTACK_INSTANCE_MIGRATION_ENDED:
-                    log.info("Instance port vanished MAC:{} IP:{}, " +
-                                 "due to VM migration", instPort.macAddress(),
+                case OPENSTACK_INSTANCE_MIGRATION_STARTED:
+                    log.info("SwitchingHandler: Migration started for MAC:{} IP:{}",
+                                                        instPort.macAddress(),
                                                         instPort.ipAddress());
-                    eventExecutor.execute(() ->
-                        removeVportRules(instPort)
-                    );
+
+                    eventExecutor.execute(() -> instPortDetected(instPort));
+
+                    break;
+                case OPENSTACK_INSTANCE_MIGRATION_ENDED:
+                    log.info("SwitchingHandler: Migration finished for MAC:{} IP:{}",
+                                                        instPort.macAddress(),
+                                                        instPort.ipAddress());
+
+                    InstancePort revisedInstPort = swapStaleLocation(instPort);
+                    eventExecutor.execute(() -> removeVportRules(revisedInstPort));
+
                     break;
                 default:
                     break;
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackSwitchingHostProvider.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackSwitchingHostProvider.java
index 6094e72..b2af7b3 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackSwitchingHostProvider.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackSwitchingHostProvider.java
@@ -16,8 +16,6 @@
 package org.onosproject.openstacknetworking.impl;
 
 import com.google.common.base.Strings;
-import com.google.common.collect.Maps;
-import com.google.common.collect.Sets;
 import org.apache.felix.scr.annotations.Activate;
 import org.apache.felix.scr.annotations.Component;
 import org.apache.felix.scr.annotations.Deactivate;
@@ -32,9 +30,7 @@
 import org.onosproject.mastership.MastershipService;
 import org.onosproject.net.ConnectPoint;
 import org.onosproject.net.DefaultAnnotations;
-import org.onosproject.net.DefaultHost;
 import org.onosproject.net.Device;
-import org.onosproject.net.DeviceId;
 import org.onosproject.net.Host;
 import org.onosproject.net.HostId;
 import org.onosproject.net.HostLocation;
@@ -50,8 +46,7 @@
 import org.onosproject.net.host.HostService;
 import org.onosproject.net.provider.AbstractProvider;
 import org.onosproject.net.provider.ProviderId;
-import org.onosproject.openstacknetworking.api.InstancePort;
-import org.onosproject.openstacknetworking.api.InstancePortService;
+import org.onosproject.openstacknetworking.api.InstancePortAdminService;
 import org.onosproject.openstacknetworking.api.OpenstackNetworkService;
 import org.onosproject.openstacknode.api.OpenstackNode;
 import org.onosproject.openstacknode.api.OpenstackNodeEvent;
@@ -62,7 +57,7 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import java.util.Map;
+import java.util.Optional;
 import java.util.Set;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
@@ -70,11 +65,12 @@
 
 import static org.onlab.util.Tools.groupedThreads;
 import static org.onosproject.net.AnnotationKeys.PORT_NAME;
+import static org.onosproject.openstacknetworking.api.Constants.ANNOTATION_CREATE_TIME;
+import static org.onosproject.openstacknetworking.api.Constants.ANNOTATION_NETWORK_ID;
+import static org.onosproject.openstacknetworking.api.Constants.ANNOTATION_PORT_ID;
+import static org.onosproject.openstacknetworking.api.Constants.ANNOTATION_SEGMENT_ID;
 import static org.onosproject.openstacknetworking.api.Constants.OPENSTACK_NETWORKING_APP_ID;
 import static org.onosproject.openstacknetworking.api.Constants.portNamePrefixMap;
-import static org.onosproject.openstacknetworking.impl.HostBasedInstancePort.ANNOTATION_CREATE_TIME;
-import static org.onosproject.openstacknetworking.impl.HostBasedInstancePort.ANNOTATION_NETWORK_ID;
-import static org.onosproject.openstacknetworking.impl.HostBasedInstancePort.ANNOTATION_PORT_ID;
 import static org.onosproject.openstacknode.api.OpenstackNode.NodeType.CONTROLLER;
 
 @Service
@@ -85,7 +81,6 @@
 
     private static final String PORT_NAME_PREFIX_VM = "tap";
     private static final String ERR_ADD_HOST = "Failed to add host: ";
-    private static final String ANNOTATION_SEGMENT_ID = "segId";
     private static final String SONA_HOST_SCHEME = "sona";
 
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
@@ -110,7 +105,7 @@
     protected OpenstackNodeService osNodeService;
 
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    protected InstancePortService instancePortService;
+    protected InstancePortAdminService instancePortAdminService;
 
     private final ExecutorService deviceEventExecutor =
             Executors.newSingleThreadExecutor(groupedThreads("openstacknetworking", "device-event"));
@@ -119,9 +114,6 @@
 
     private HostProviderService hostProvider;
 
-    private Map<HostId, Device> hostDeviceMap = Maps.newConcurrentMap();
-    private Set<Host> migratingHosts = Sets.newConcurrentHashSet();
-
     /**
      * Creates OpenStack switching host provider.
      */
@@ -183,58 +175,55 @@
             return;
         }
 
-        MacAddress macAddr = MacAddress.valueOf(osPort.getMacAddress());
+        MacAddress mac = MacAddress.valueOf(osPort.getMacAddress());
+        HostId hostId = HostId.hostId(mac);
+
+        // typically one openstack port should only be bound to one fix IP address;
+        // however, openstack4j binds multiple fixed IPs to one port, this might
+        // be a defect of openstack4j implementation
+
+        // TODO: we need to find a way to bind multiple ports from multiple
+        // openstack networks into one host sooner or later
         Set<IpAddress> fixedIps = osPort.getFixedIps().stream()
-                .map(ip -> IpAddress.valueOf(ip.getIpAddress()))
-                .collect(Collectors.toSet());
+                                    .map(ip -> IpAddress.valueOf(ip.getIpAddress()))
+                                    .collect(Collectors.toSet());
+
+        // connect point is the combination of switch ID with port number where
+        // the host is attached to
         ConnectPoint connectPoint = new ConnectPoint(port.element().id(), port.number());
-        HostId oldHostId = HostId.hostId(macAddr);
 
-        // In VM migration case, a duplicated host port (port created in at new
-        // compute node) will be detected at OVS; in this case, we will store
-        // the old host instance into migration list, and overwrite old host
-        // with new host instance issue host creation event to ONOS core
-        Device oldDevice = hostDeviceMap.get(oldHostId);
+        long createTime = System.currentTimeMillis();
 
-        if (device != null && oldDevice != null && !oldDevice.equals(device)) {
-            Host host = hostService.getHost(oldHostId);
-            if (host != null) {
-                migratingHosts.add(host);
+        // we check whether the host already attached to some locations
+        Host host = hostService.getHost(hostId);
+        if (host != null) {
+            Set<HostLocation> locations = host.locations().stream()
+                    .filter(l -> l.deviceId().equals(connectPoint.deviceId()))
+                    .filter(l -> l.port().equals(connectPoint.port()))
+                    .collect(Collectors.toSet());
+            if (locations.size() == 0) {
+                hostProvider.addLocationToHost(hostId,
+                                    new HostLocation(connectPoint, createTime));
             }
-        }
+        } else {
 
-        if (device != null) {
-            hostDeviceMap.put(oldHostId, device);
-        }
+            DefaultAnnotations.Builder annotations = DefaultAnnotations.builder()
+                    .set(ANNOTATION_NETWORK_ID, osPort.getNetworkId())
+                    .set(ANNOTATION_PORT_ID, osPort.getId())
+                    .set(ANNOTATION_CREATE_TIME, String.valueOf(createTime));
 
-        DefaultAnnotations.Builder annotations = DefaultAnnotations.builder()
-                .set(ANNOTATION_NETWORK_ID, osPort.getNetworkId())
-                .set(ANNOTATION_PORT_ID, osPort.getId())
-                .set(ANNOTATION_CREATE_TIME, String.valueOf(System.currentTimeMillis()));
+            // FLAT does not require segment ID
+            if (osNet.getNetworkType() != NetworkType.FLAT) {
+                annotations.set(ANNOTATION_SEGMENT_ID, osNet.getProviderSegID());
+            }
 
-        if (osNet.getNetworkType() != NetworkType.FLAT) {
-            annotations.set(ANNOTATION_SEGMENT_ID, osNet.getProviderSegID());
-
-        }
-
-        long currentTime = System.currentTimeMillis();
-
-        HostDescription hostDesc = new DefaultHostDescription(
-                macAddr,
-                VlanId.NONE,
-                new HostLocation(connectPoint, currentTime),
-                fixedIps,
-                annotations.build());
-
-        HostId hostId = HostId.hostId(macAddr);
-        hostProvider.hostDetected(hostId, hostDesc, false);
-
-        if (device != null && oldDevice != null && !oldDevice.equals(device)) {
-            Host oldHost = hostService.getHost(oldHostId);
-            Host newHost = new DefaultHost(oldHost.providerId(), hostId, macAddr,
-                    VlanId.NONE, new HostLocation(connectPoint, currentTime),
-                    fixedIps, annotations.build());
-            instancePortService.migrationPortAdded(HostBasedInstancePort.of(newHost));
+            HostDescription hostDesc = new DefaultHostDescription(
+                    mac,
+                    VlanId.NONE,
+                    new HostLocation(connectPoint, createTime),
+                    fixedIps,
+                    annotations.build());
+            hostProvider.hostDetected(hostId, hostDesc, false);
         }
     }
 
@@ -248,33 +237,26 @@
      */
     private void processPortRemoved(DeviceEvent event) {
         Port port = event.port();
-        DeviceId deviceId = event.subject().id();
         ConnectPoint connectPoint = new ConnectPoint(port.element().id(), port.number());
 
-        Set<Host> hostsToBeRemoved = hostService.getConnectedHosts(connectPoint);
+        Set<Host> hosts = hostService.getConnectedHosts(connectPoint);
 
-        if (hostsToBeRemoved.size() == 0) {
+        hosts.forEach(h -> {
+            Optional<HostLocation> hostLocation = h.locations().stream()
+                    .filter(l -> l.deviceId().equals(port.element().id()))
+                    .filter(l -> l.port().equals(port.number())).findAny();
 
-            for (Host host : migratingHosts) {
-                if (host.location() == null) {
-                    continue;
-                }
-                String hostLocation = host.location().toString();
-                StringBuilder deviceIdWithPort = new StringBuilder();
-                deviceIdWithPort.append(deviceId.toString());
-                deviceIdWithPort.append("/");
-                deviceIdWithPort.append(port.number().toString());
-
-                if (hostLocation.equals(deviceIdWithPort.toString())) {
-                    InstancePort instPort = HostBasedInstancePort.of(host);
-                    instancePortService.migrationPortRemoved(instPort);
-                    migratingHosts.remove(host);
-                }
+            // if the host contains only one filtered location, we remove the host
+            if (h.locations().size() == 1) {
+                hostProvider.hostVanished(h.id());
             }
 
-        } else {
-            hostsToBeRemoved.forEach(host -> hostProvider.hostVanished(host.id()));
-        }
+            // if the host contains multiple locations, we simply remove the
+            // host location
+            if (h.locations().size() > 1 && hostLocation.isPresent()) {
+                hostProvider.removeLocationFromHost(h.id(), hostLocation.get());
+            }
+        });
     }
 
     /**
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/util/OpenstackNetworkingUtil.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/util/OpenstackNetworkingUtil.java
index 609b580..c384a44 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/util/OpenstackNetworkingUtil.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/util/OpenstackNetworkingUtil.java
@@ -24,6 +24,7 @@
 import org.onosproject.openstacknetworking.api.InstancePort;
 import org.onosproject.openstacknetworking.api.OpenstackNetworkService;
 import org.onosproject.openstacknetworking.api.OpenstackRouterAdminService;
+import org.onosproject.openstacknetworking.impl.DefaultInstancePort;
 import org.onosproject.openstacknode.api.OpenstackAuth;
 import org.onosproject.openstacknode.api.OpenstackAuth.Perspective;
 import org.onosproject.openstacknode.api.OpenstackNode;
@@ -383,6 +384,25 @@
     }
 
     /**
+     * Swaps current location with old location info.
+     * The revised instance port will be used to mod the flow rules after migration.
+     *
+     * @param instPort instance port
+     * @return location swapped instance port
+     */
+    public static InstancePort swapStaleLocation(InstancePort instPort) {
+        return DefaultInstancePort.builder()
+                .deviceId(instPort.oldDeviceId())
+                .portNumber(instPort.oldPortNumber())
+                .state(instPort.state())
+                .ipAddress(instPort.ipAddress())
+                .macAddress(instPort.macAddress())
+                .networkId(instPort.networkId())
+                .portId(instPort.portId())
+                .build();
+    }
+
+    /**
      * Builds up and a complete endpoint URL from gateway node.
      *
      * @param node gateway node
diff --git a/apps/openstacknetworking/app/src/test/java/org/onosproject/openstacknetworking/impl/DefaultInstancePortTest.java b/apps/openstacknetworking/app/src/test/java/org/onosproject/openstacknetworking/impl/DefaultInstancePortTest.java
index 6fecc1a..50e8f01 100644
--- a/apps/openstacknetworking/app/src/test/java/org/onosproject/openstacknetworking/impl/DefaultInstancePortTest.java
+++ b/apps/openstacknetworking/app/src/test/java/org/onosproject/openstacknetworking/impl/DefaultInstancePortTest.java
@@ -35,8 +35,8 @@
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.is;
 import static org.onlab.junit.ImmutableClassChecker.assertThatClassIsImmutable;
+import static org.onosproject.openstacknetworking.api.Constants.ANNOTATION_CREATE_TIME;
 import static org.onosproject.openstacknetworking.api.InstancePort.State.ACTIVE;
-import static org.onosproject.openstacknetworking.impl.HostBasedInstancePort.ANNOTATION_CREATE_TIME;
 
 /**
  * Unit tests for the default instance port class.
diff --git a/apps/openstacknetworking/app/src/test/java/org/onosproject/openstacknetworking/impl/InstancePortManagerTest.java b/apps/openstacknetworking/app/src/test/java/org/onosproject/openstacknetworking/impl/InstancePortManagerTest.java
index 9070452..8b325a3 100644
--- a/apps/openstacknetworking/app/src/test/java/org/onosproject/openstacknetworking/impl/InstancePortManagerTest.java
+++ b/apps/openstacknetworking/app/src/test/java/org/onosproject/openstacknetworking/impl/InstancePortManagerTest.java
@@ -49,8 +49,10 @@
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertNull;
+import static org.onosproject.openstacknetworking.api.Constants.ANNOTATION_CREATE_TIME;
 import static org.onosproject.openstacknetworking.api.InstancePort.State.ACTIVE;
 import static org.onosproject.openstacknetworking.api.InstancePort.State.INACTIVE;
+import static org.onosproject.openstacknetworking.api.InstancePort.State.MIGRATED;
 import static org.onosproject.openstacknetworking.api.InstancePort.State.MIGRATING;
 import static org.onosproject.openstacknetworking.api.InstancePortEvent.Type.OPENSTACK_INSTANCE_MIGRATION_ENDED;
 import static org.onosproject.openstacknetworking.api.InstancePortEvent.Type.OPENSTACK_INSTANCE_MIGRATION_STARTED;
@@ -59,7 +61,6 @@
 import static org.onosproject.openstacknetworking.api.InstancePortEvent.Type.OPENSTACK_INSTANCE_PORT_VANISHED;
 import static org.onosproject.openstacknetworking.api.InstancePortEvent.Type.OPENSTACK_INSTANCE_RESTARTED;
 import static org.onosproject.openstacknetworking.api.InstancePortEvent.Type.OPENSTACK_INSTANCE_TERMINATED;
-import static org.onosproject.openstacknetworking.impl.HostBasedInstancePort.ANNOTATION_CREATE_TIME;
 
 /**
  * Unit tests for instance port manager.
@@ -311,8 +312,7 @@
                 1, target.instancePorts().size());
         assertNotNull("Instance port did not match", target.instancePort(PORT_ID_1));
 
-        validateEvents(OPENSTACK_INSTANCE_PORT_DETECTED,
-                OPENSTACK_INSTANCE_PORT_UPDATED, OPENSTACK_INSTANCE_TERMINATED);
+        validateEvents(OPENSTACK_INSTANCE_PORT_DETECTED, OPENSTACK_INSTANCE_TERMINATED);
     }
 
     /**
@@ -330,8 +330,7 @@
                 1, target.instancePorts().size());
         assertNotNull("Instance port did not match", target.instancePort(PORT_ID_1));
 
-        validateEvents(OPENSTACK_INSTANCE_PORT_DETECTED,
-                OPENSTACK_INSTANCE_PORT_UPDATED, OPENSTACK_INSTANCE_RESTARTED);
+        validateEvents(OPENSTACK_INSTANCE_PORT_DETECTED, OPENSTACK_INSTANCE_RESTARTED);
     }
 
     /**
@@ -342,15 +341,14 @@
         InstancePort instancePort = instancePort1;
         target.createInstancePort(instancePort);
 
-        InstancePort inactiveInstancePort = instancePort.updateState(MIGRATING);
-        target.updateInstancePort(inactiveInstancePort);
+        InstancePort migratingPort = instancePort.updateState(MIGRATING);
+        target.updateInstancePort(migratingPort);
 
         assertEquals("Number of instance port did not match",
                 1, target.instancePorts().size());
         assertNotNull("Instance port did not match", target.instancePort(PORT_ID_1));
 
-        validateEvents(OPENSTACK_INSTANCE_PORT_DETECTED,
-                OPENSTACK_INSTANCE_PORT_UPDATED, OPENSTACK_INSTANCE_MIGRATION_STARTED);
+        validateEvents(OPENSTACK_INSTANCE_PORT_DETECTED, OPENSTACK_INSTANCE_MIGRATION_STARTED);
     }
 
     /**
@@ -359,17 +357,17 @@
     @Test
     public void testMigrateInstanceEnd() {
         InstancePort instancePort = instancePort1;
-        InstancePort inactiveInstancePort = instancePort.updateState(MIGRATING);
+        InstancePort migratingPort = instancePort.updateState(MIGRATING);
+        target.createInstancePort(migratingPort);
 
-        target.createInstancePort(inactiveInstancePort);
-        target.updateInstancePort(instancePort);
+        InstancePort migratedPort = instancePort.updateState(MIGRATED);
+        target.updateInstancePort(migratedPort);
 
         assertEquals("Number of instance port did not match",
                 1, target.instancePorts().size());
         assertNotNull("Instance port did not match", target.instancePort(PORT_ID_1));
 
-        validateEvents(OPENSTACK_INSTANCE_PORT_DETECTED,
-                OPENSTACK_INSTANCE_PORT_UPDATED, OPENSTACK_INSTANCE_MIGRATION_ENDED);
+        validateEvents(OPENSTACK_INSTANCE_PORT_DETECTED, OPENSTACK_INSTANCE_MIGRATION_ENDED);
     }
 
     /**
@@ -393,8 +391,7 @@
                 0, target.instancePorts().size());
         assertNull("Instance port did not match", target.instancePort(PORT_ID_1));
 
-        validateEvents(OPENSTACK_INSTANCE_PORT_DETECTED,
-                OPENSTACK_INSTANCE_PORT_UPDATED, OPENSTACK_INSTANCE_TERMINATED,
+        validateEvents(OPENSTACK_INSTANCE_PORT_DETECTED, OPENSTACK_INSTANCE_TERMINATED,
                 OPENSTACK_INSTANCE_PORT_VANISHED);
     }
 
@@ -419,8 +416,7 @@
                 0, target.instancePorts().size());
         assertNull("Instance port did not match", target.instancePort(PORT_ID_1));
 
-        validateEvents(OPENSTACK_INSTANCE_PORT_DETECTED,
-                OPENSTACK_INSTANCE_PORT_UPDATED, OPENSTACK_INSTANCE_MIGRATION_STARTED,
+        validateEvents(OPENSTACK_INSTANCE_PORT_DETECTED, OPENSTACK_INSTANCE_MIGRATION_STARTED,
                 OPENSTACK_INSTANCE_PORT_VANISHED);
     }
 
diff --git a/apps/openstacknetworking/app/src/test/java/org/onosproject/openstacknetworking/impl/InstancePortServiceAdapter.java b/apps/openstacknetworking/app/src/test/java/org/onosproject/openstacknetworking/impl/InstancePortServiceAdapter.java
index 64c7747..885c7d8 100644
--- a/apps/openstacknetworking/app/src/test/java/org/onosproject/openstacknetworking/impl/InstancePortServiceAdapter.java
+++ b/apps/openstacknetworking/app/src/test/java/org/onosproject/openstacknetworking/impl/InstancePortServiceAdapter.java
@@ -54,14 +54,6 @@
     }
 
     @Override
-    public void migrationPortAdded(InstancePort port) {
-    }
-
-    @Override
-    public void migrationPortRemoved(InstancePort port) {
-    }
-
-    @Override
     public void addListener(InstancePortListener listener) {
 
     }
diff --git a/apps/openstacknetworking/app/src/test/java/org/onosproject/openstacknetworking/impl/OpenstackSwitchingArpHandlerTest.java b/apps/openstacknetworking/app/src/test/java/org/onosproject/openstacknetworking/impl/OpenstackSwitchingArpHandlerTest.java
index a40aacc..53cba29 100644
--- a/apps/openstacknetworking/app/src/test/java/org/onosproject/openstacknetworking/impl/OpenstackSwitchingArpHandlerTest.java
+++ b/apps/openstacknetworking/app/src/test/java/org/onosproject/openstacknetworking/impl/OpenstackSwitchingArpHandlerTest.java
@@ -223,11 +223,21 @@
         }
 
         @Override
+        public DeviceId oldDeviceId() {
+            return null;
+        }
+
+        @Override
         public PortNumber portNumber() {
             return null;
         }
 
         @Override
+        public PortNumber oldPortNumber() {
+            return null;
+        }
+
+        @Override
         public State state() {
             return null;
         }
@@ -236,6 +246,11 @@
         public InstancePort updateState(State newState) {
             return null;
         }
+
+        @Override
+        public InstancePort updatePrevData(DeviceId oldDeviceId, PortNumber oldPortNumber) {
+            return null;
+        }
     }
 
     /**
diff --git a/apps/openstacknetworking/app/src/test/java/org/onosproject/openstacknetworking/impl/OpenstackSwitchingDhcpHandlerTest.java b/apps/openstacknetworking/app/src/test/java/org/onosproject/openstacknetworking/impl/OpenstackSwitchingDhcpHandlerTest.java
index 75bec3c..530d947 100644
--- a/apps/openstacknetworking/app/src/test/java/org/onosproject/openstacknetworking/impl/OpenstackSwitchingDhcpHandlerTest.java
+++ b/apps/openstacknetworking/app/src/test/java/org/onosproject/openstacknetworking/impl/OpenstackSwitchingDhcpHandlerTest.java
@@ -545,11 +545,21 @@
         }
 
         @Override
+        public DeviceId oldDeviceId() {
+            return null;
+        }
+
+        @Override
         public PortNumber portNumber() {
             return null;
         }
 
         @Override
+        public PortNumber oldPortNumber() {
+            return null;
+        }
+
+        @Override
         public State state() {
             return null;
         }
@@ -558,6 +568,11 @@
         public InstancePort updateState(State newState) {
             return null;
         }
+
+        @Override
+        public InstancePort updatePrevData(DeviceId oldDeviceId, PortNumber oldPortNumber) {
+            return null;
+        }
     }
 
     /**
