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
new file mode 100644
index 0000000..b1addf0
--- /dev/null
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/DefaultInstancePort.java
@@ -0,0 +1,258 @@
+/*
+ * Copyright 2018-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.MoreObjects;
+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 static com.google.common.base.Preconditions.checkArgument;
+import static com.google.common.base.Preconditions.checkNotNull;
+
+/**
+ * Default implementation of instance port.
+ */
+public final class DefaultInstancePort implements InstancePort {
+
+    private static final String ANNOTATION_NETWORK_ID = "networkId";
+    private static final String ANNOTATION_PORT_ID = "portId";
+    private static final String ANNOTATION_CREATE_TIME = "createTime";
+
+    private static final String NOT_NULL_MSG = "Instance Port % cannot be null";
+
+    private final String networkId;
+    private final String portId;
+    private final MacAddress macAddress;
+    private final IpAddress ipAddress;
+    private final DeviceId deviceId;
+    private final PortNumber portNumber;
+    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,
+                                State state) {
+        this.networkId = networkId;
+        this.portId = portId;
+        this.macAddress = macAddress;
+        this.ipAddress = ipAddress;
+        this.deviceId = deviceId;
+        this.portNumber = portNumber;
+        this.state = state;
+    }
+
+    private DefaultInstancePort(Host host, State state) {
+        this.networkId = host.annotations().value(ANNOTATION_NETWORK_ID);
+        this.portId = host.annotations().value(ANNOTATION_PORT_ID);
+        this.macAddress = host.mac();
+
+        this.ipAddress = host.ipAddresses().stream().findFirst().orElse(null);
+
+        this.deviceId = host.location().deviceId();
+        this.portNumber = host.location().port();
+        this.state = state;
+    }
+
+    public static DefaultInstancePort from(Host host, State state) {
+        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);
+    }
+
+    @Override
+    public String networkId() {
+        return networkId;
+    }
+
+    @Override
+    public String portId() {
+        return portId;
+    }
+
+    @Override
+    public MacAddress macAddress() {
+        return macAddress;
+    }
+
+    @Override
+    public IpAddress ipAddress() {
+        return ipAddress;
+    }
+
+    @Override
+    public DeviceId deviceId() {
+        return deviceId;
+    }
+
+    @Override
+    public PortNumber portNumber() {
+        return portNumber;
+    }
+
+    @Override
+    public State state() {
+        return state;
+    }
+
+    @Override
+    public InstancePort updateState(State newState) {
+        return new Builder()
+                .networkId(networkId)
+                .portId(portId)
+                .macAddress(macAddress)
+                .ipAddress(ipAddress)
+                .deviceId(deviceId)
+                .portNumber(portNumber)
+                .state(newState)
+                .build();
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(getClass())
+                .add("networkId", networkId)
+                .add("portId", portId)
+                .add("macAddress", macAddress)
+                .add("ipAddress", ipAddress)
+                .add("deviceId", deviceId)
+                .add("portNumber", portNumber)
+                .add("state", state)
+                .toString();
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj instanceof DefaultInstancePort) {
+            DefaultInstancePort that = (DefaultInstancePort) obj;
+            return Objects.equals(networkId, that.networkId) &&
+                    Objects.equals(portId, that.portId) &&
+                    Objects.equals(macAddress, that.macAddress) &&
+                    Objects.equals(ipAddress, that.ipAddress) &&
+                    Objects.equals(deviceId, that.deviceId) &&
+                    Objects.equals(portNumber, that.portNumber) &&
+                    Objects.equals(state, that.state);
+        }
+        return false;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(networkId,
+                portId,
+                macAddress,
+                ipAddress,
+                deviceId,
+                portNumber,
+                state);
+    }
+
+    /**
+     * A builder class for instance port.
+     */
+    public static final class Builder implements InstancePort.Builder {
+
+        private String networkId;
+        private String portId;
+        private MacAddress macAddress;
+        private IpAddress ipAddress;
+        private DeviceId deviceId;
+        private PortNumber portNumber;
+        private State state;
+
+        // private constructor not intended to use from external
+        private Builder() {
+        }
+
+        @Override
+        public InstancePort build() {
+
+            checkArgument(networkId != null, NOT_NULL_MSG, "networkId");
+            checkArgument(portId != null, NOT_NULL_MSG, "portId");
+            checkArgument(macAddress != null, NOT_NULL_MSG, "macAddress");
+            checkArgument(ipAddress != null, NOT_NULL_MSG, "ipAddress");
+            checkArgument(deviceId != null, NOT_NULL_MSG, "deviceId");
+            checkArgument(portNumber != null, NOT_NULL_MSG, "portNumber");
+            checkArgument(state != null, NOT_NULL_MSG, "state");
+
+            return new DefaultInstancePort(networkId,
+                    portId,
+                    macAddress,
+                    ipAddress,
+                    deviceId,
+                    portNumber,
+                    state);
+        }
+
+        @Override
+        public InstancePort.Builder networkId(String networkId) {
+            this.networkId = networkId;
+            return this;
+        }
+
+        @Override
+        public InstancePort.Builder portId(String portId) {
+            this.portId = portId;
+            return this;
+        }
+
+        @Override
+        public InstancePort.Builder macAddress(MacAddress macAddress) {
+            this.macAddress = macAddress;
+            return this;
+        }
+
+        @Override
+        public InstancePort.Builder ipAddress(IpAddress ipAddress) {
+            this.ipAddress = ipAddress;
+            return this;
+        }
+
+        @Override
+        public InstancePort.Builder deviceId(DeviceId deviceId) {
+            this.deviceId = deviceId;
+            return this;
+        }
+
+        @Override
+        public InstancePort.Builder portNumber(PortNumber portNumber) {
+            this.portNumber = portNumber;
+            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
new file mode 100644
index 0000000..f663980
--- /dev/null
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/DistributedInstancePortStore.java
@@ -0,0 +1,222 @@
+/*
+ * Copyright 2018-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 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.util.KryoNamespace;
+import org.onosproject.core.ApplicationId;
+import org.onosproject.core.CoreService;
+import org.onosproject.openstacknetworking.api.InstancePort;
+import org.onosproject.openstacknetworking.api.InstancePortEvent;
+import org.onosproject.openstacknetworking.api.InstancePortStore;
+import org.onosproject.openstacknetworking.api.InstancePortStoreDelegate;
+import org.onosproject.store.AbstractStore;
+import org.onosproject.store.serializers.KryoNamespaces;
+import org.onosproject.store.service.ConsistentMap;
+import org.onosproject.store.service.MapEvent;
+import org.onosproject.store.service.MapEventListener;
+import org.onosproject.store.service.Serializer;
+import org.onosproject.store.service.StorageService;
+import org.onosproject.store.service.Versioned;
+import org.slf4j.Logger;
+
+import java.util.Set;
+import java.util.concurrent.ExecutorService;
+
+import static com.google.common.base.Preconditions.checkArgument;
+import static java.util.concurrent.Executors.newSingleThreadExecutor;
+import static org.onlab.util.Tools.groupedThreads;
+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.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;
+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.api.InstancePortEvent.Type.OPENSTACK_INSTANCE_RESTARTED;
+import static org.onosproject.openstacknetworking.api.InstancePortEvent.Type.OPENSTACK_INSTANCE_TERMINATED;
+import static org.slf4j.LoggerFactory.getLogger;
+
+/**
+ * Manages the inventory of openstack instance port using a {@code ConsistentMap}.
+ */
+@Service
+@Component(immediate = true)
+public class DistributedInstancePortStore
+        extends AbstractStore<InstancePortEvent, InstancePortStoreDelegate>
+        implements InstancePortStore {
+
+    protected final Logger log = getLogger(getClass());
+
+    private static final String ERR_NOT_FOUND = " does not exist";
+    private static final String ERR_DUPLICATE = " already exists";
+
+    private static final KryoNamespace SERIALIZER_INSTANCE_PORT = KryoNamespace.newBuilder()
+            .register(KryoNamespaces.API)
+            .register(InstancePort.class)
+            .register(DefaultInstancePort.class)
+            .register(InstancePort.State.class)
+            .build();
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected CoreService coreService;
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected StorageService storageService;
+
+    private final ExecutorService eventExecutor = newSingleThreadExecutor(
+            groupedThreads(this.getClass().getSimpleName(), "event-handler", log));
+
+    private final MapEventListener<String, InstancePort>
+            instancePortMapListener = new InstancePortMapListener();
+
+    private ConsistentMap<String, InstancePort> instancePortStore;
+
+    @Activate
+    protected void activate() {
+        ApplicationId appId = coreService.registerApplication(OPENSTACK_NETWORKING_APP_ID);
+
+        instancePortStore = storageService.<String, InstancePort>consistentMapBuilder()
+                .withSerializer(Serializer.using(SERIALIZER_INSTANCE_PORT))
+                .withName("openstack-instanceport-store")
+                .withApplicationId(appId)
+                .build();
+        instancePortStore.addListener(instancePortMapListener);
+
+        log.info("Started");
+    }
+
+    @Deactivate
+    protected void deactivate() {
+        instancePortStore.removeListener(instancePortMapListener);
+        eventExecutor.shutdown();
+
+        log.info("Stopped");
+    }
+
+    @Override
+    public void createInstancePort(InstancePort port) {
+        instancePortStore.compute(port.portId(), (id, existing) -> {
+            final String error = port.portId() + ERR_DUPLICATE;
+            checkArgument(existing == null, error);
+            return port;
+        });
+    }
+
+    @Override
+    public void updateInstancePort(InstancePort port) {
+        instancePortStore.compute(port.portId(), (id, existing) -> {
+            final String error = port.portId() + ERR_NOT_FOUND;
+            checkArgument(existing != null, error);
+            return port;
+        });
+    }
+
+    @Override
+    public InstancePort removeInstancePort(String portId) {
+        Versioned<InstancePort> port = instancePortStore.remove(portId);
+        return port == null ? null : port.value();
+    }
+
+    @Override
+    public InstancePort instancePort(String portId) {
+        return instancePortStore.asJavaMap().get(portId);
+    }
+
+    @Override
+    public Set<InstancePort> instancePorts() {
+        return ImmutableSet.copyOf(instancePortStore.asJavaMap().values());
+    }
+
+    @Override
+    public void clear() {
+        instancePortStore.clear();
+    }
+
+    private class InstancePortMapListener implements MapEventListener<String, InstancePort> {
+
+        @Override
+        public void event(MapEvent<String, InstancePort> event) {
+            switch (event.type()) {
+                case INSERT:
+                    log.debug("Instance port created");
+                    eventExecutor.execute(() ->
+                            notifyDelegate(new InstancePortEvent(
+                                    OPENSTACK_INSTANCE_PORT_DETECTED,
+                                    event.newValue().value()))
+                    );
+                    break;
+                case UPDATE:
+                    log.debug("Instance port updated");
+                    eventExecutor.execute(() -> {
+                            notifyDelegate(new InstancePortEvent(
+                                    OPENSTACK_INSTANCE_PORT_UPDATED,
+                                    event.newValue().value()));
+                            processInstancePortUpdate(event);
+                    });
+                    break;
+                case REMOVE:
+                    log.debug("Instance port removed");
+                    eventExecutor.execute(() ->
+                            notifyDelegate(new InstancePortEvent(
+                                    OPENSTACK_INSTANCE_PORT_VANISHED,
+                                    event.oldValue().value()))
+                    );
+                    break;
+                default:
+                    log.error("Unsupported instance port event type");
+                    break;
+            }
+        }
+
+        private void processInstancePortUpdate(MapEvent<String, InstancePort> event) {
+            InstancePort.State oldState = event.oldValue().value().state();
+            InstancePort.State newState = event.newValue().value().state();
+
+            if (oldState == ACTIVE && newState == MIGRATING) {
+                notifyDelegate(new InstancePortEvent(
+                        OPENSTACK_INSTANCE_MIGRATION_STARTED,
+                        event.newValue().value()));
+            }
+
+            if (oldState == MIGRATING && newState == ACTIVE) {
+                notifyDelegate(new InstancePortEvent(
+                        OPENSTACK_INSTANCE_MIGRATION_ENDED,
+                        event.newValue().value()));
+            }
+
+            if (oldState == ACTIVE && newState == INACTIVE) {
+                notifyDelegate(new InstancePortEvent(
+                        OPENSTACK_INSTANCE_TERMINATED,
+                        event.newValue().value()));
+            }
+
+            if (oldState == INACTIVE && newState == ACTIVE) {
+                notifyDelegate(new InstancePortEvent(
+                        OPENSTACK_INSTANCE_RESTARTED,
+                        event.newValue().value()));
+            }
+        }
+    }
+}
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
index 6e20290..12e51fe 100644
--- 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
@@ -28,6 +28,7 @@
 
 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.
@@ -99,6 +100,16 @@
     }
 
     @Override
+    public State state() {
+        return ACTIVE;
+    }
+
+    @Override
+    public InstancePort updateState(State newState) {
+        return null;
+    }
+
+    @Override
     public String toString() {
         return host.toString();
     }
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
new file mode 100644
index 0000000..c7ae7cc
--- /dev/null
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/InstancePortManager.java
@@ -0,0 +1,268 @@
+/*
+ * Copyright 2018-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 com.google.common.collect.ImmutableSet;
+import org.apache.felix.scr.annotations.Activate;
+import org.apache.felix.scr.annotations.Component;
+import org.apache.felix.scr.annotations.Deactivate;
+import org.apache.felix.scr.annotations.Reference;
+import org.apache.felix.scr.annotations.ReferenceCardinality;
+import org.apache.felix.scr.annotations.Service;
+import org.onlab.packet.IpAddress;
+import org.onlab.packet.MacAddress;
+import org.onosproject.core.CoreService;
+import org.onosproject.event.ListenerRegistry;
+import org.onosproject.net.Host;
+import org.onosproject.net.host.HostEvent;
+import org.onosproject.net.host.HostListener;
+import org.onosproject.net.host.HostService;
+import org.onosproject.openstacknetworking.api.Constants;
+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.InstancePortStore;
+import org.onosproject.openstacknetworking.api.InstancePortStoreDelegate;
+import org.slf4j.Logger;
+
+import java.util.Set;
+import java.util.stream.Collectors;
+
+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;
+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 instance ports.
+ * It also provides instance port events for the hosts mapped to OpenStack VM interface.
+ */
+@Service
+@Component(immediate = false)
+public class InstancePortManager
+        extends ListenerRegistry<InstancePortEvent, InstancePortListener>
+        implements InstancePortService, InstancePortAdminService {
+
+    protected final Logger log = getLogger(getClass());
+
+    private static final String MSG_INSTANCE_PORT = "Instance port %s %s";
+    private static final String MSG_CREATED = "created";
+    private static final String MSG_UPDATED = "updated";
+    private static final String MSG_REMOVED = "removed";
+
+    private static final String ERR_NULL_INSTANCE_PORT = "Instance port cannot be null";
+    private static final String ERR_NULL_INSTANCE_PORT_ID = "Instance port ID cannot be null";
+    private static final String ERR_NULL_MAC_ADDRESS = "MAC address cannot be null";
+    private static final String ERR_NULL_IP_ADDRESS = "IP address cannot be null";
+    private static final String ERR_NULL_NETWORK_ID = "Network ID cannot be null";
+
+    private static final String ERR_IN_USE = " still in use";
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected CoreService coreService;
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected InstancePortStore instancePortStore;
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected HostService hostService;
+
+    private final InstancePortStoreDelegate
+                            delegate = new InternalInstancePortStoreDelegate();
+    private final InternalHostListener
+                            hostListener = new InternalHostListener();
+
+    @Activate
+    protected void activate() {
+        coreService.registerApplication(Constants.OPENSTACK_NETWORKING_APP_ID);
+        instancePortStore.setDelegate(delegate);
+        hostService.addListener(hostListener);
+        log.info("Started");
+    }
+
+    @Deactivate
+    protected void deactivate() {
+        hostService.removeListener(hostListener);
+        instancePortStore.unsetDelegate(delegate);
+        log.info("Stopped");
+    }
+
+    @Override
+    public void createInstancePort(InstancePort instancePort) {
+        checkNotNull(instancePort, ERR_NULL_INSTANCE_PORT);
+        checkArgument(!Strings.isNullOrEmpty(instancePort.portId()),
+                                                    ERR_NULL_INSTANCE_PORT_ID);
+
+        instancePortStore.createInstancePort(instancePort);
+        log.info(String.format(MSG_INSTANCE_PORT, instancePort.portId(),
+                                                    MSG_CREATED));
+    }
+
+    @Override
+    public void updateInstancePort(InstancePort instancePort) {
+        checkNotNull(instancePort, ERR_NULL_INSTANCE_PORT);
+        checkArgument(!Strings.isNullOrEmpty(instancePort.portId()),
+                                                    ERR_NULL_INSTANCE_PORT_ID);
+
+        instancePortStore.updateInstancePort(instancePort);
+        log.info(String.format(MSG_INSTANCE_PORT, instancePort.portId(), MSG_UPDATED));
+    }
+
+    @Override
+    public void removeInstancePort(String portId) {
+        checkArgument(!Strings.isNullOrEmpty(portId), ERR_NULL_INSTANCE_PORT_ID);
+
+        synchronized (this) {
+            if (isInstancePortInUse(portId)) {
+                final String error =
+                            String.format(MSG_INSTANCE_PORT, portId, ERR_IN_USE);
+                throw new IllegalStateException(error);
+            }
+            InstancePort instancePort = instancePortStore.removeInstancePort(portId);
+            if (instancePort != null) {
+                log.info(String.format(MSG_INSTANCE_PORT, instancePort.portId(), MSG_REMOVED));
+            }
+        }
+    }
+
+    @Override
+    public void clear() {
+        instancePortStore.clear();
+    }
+
+    @Override
+    public InstancePort instancePort(MacAddress macAddress) {
+        checkNotNull(macAddress, ERR_NULL_MAC_ADDRESS);
+
+        return instancePortStore.instancePorts().stream()
+                .filter(port -> port.macAddress().equals(macAddress))
+                .findFirst().orElse(null);
+    }
+
+    @Override
+    public InstancePort instancePort(IpAddress ipAddress, String osNetId) {
+        checkNotNull(ipAddress, ERR_NULL_IP_ADDRESS);
+        checkNotNull(osNetId, ERR_NULL_NETWORK_ID);
+
+        return instancePortStore.instancePorts().stream()
+                .filter(port -> port.networkId().equals(osNetId))
+                .filter(port -> port.ipAddress().equals(ipAddress))
+                .findFirst().orElse(null);
+    }
+
+    @Override
+    public InstancePort instancePort(String portId) {
+        checkArgument(!Strings.isNullOrEmpty(portId), ERR_NULL_INSTANCE_PORT_ID);
+
+        return instancePortStore.instancePort(portId);
+    }
+
+    @Override
+    public Set<InstancePort> instancePorts() {
+        Set<InstancePort> ports = instancePortStore.instancePorts();
+
+        return ImmutableSet.copyOf(ports);
+    }
+
+    @Override
+    public Set<InstancePort> instancePorts(String osNetId) {
+        checkNotNull(osNetId, ERR_NULL_NETWORK_ID);
+
+        Set<InstancePort> ports = instancePortStore.instancePorts().stream()
+                                    .filter(port -> port.networkId().equals(osNetId))
+                                    .collect(Collectors.toSet());
+
+        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;
+    }
+
+    private class InternalInstancePortStoreDelegate implements InstancePortStoreDelegate {
+
+        @Override
+        public void notify(InstancePortEvent event) {
+            if (event != null) {
+                log.trace("send instance port event {}", event);
+                process(event);
+            }
+        }
+    }
+
+    /**
+     * 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 = DefaultInstancePort.from(event.subject(), ACTIVE);
+
+            switch (event.type()) {
+                case HOST_UPDATED:
+                    updateInstancePort(instPort);
+                    break;
+                case HOST_ADDED:
+                    createInstancePort(instPort);
+                    break;
+                case HOST_REMOVED:
+                    removeInstancePort(instPort.portId());
+                    break;
+                case HOST_MOVED:
+                    // TODO: require implementation for VM migration case
+                    break;
+                default:
+                    break;
+            }
+        }
+
+        private boolean isValidHost(Host host) {
+            return !host.ipAddresses().isEmpty() &&
+                    host.annotations().value(ANNOTATION_NETWORK_ID) != null &&
+                    host.annotations().value(ANNOTATION_PORT_ID) != null;
+        }
+    }
+}
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 74bf681..0a916d8 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
@@ -199,11 +199,8 @@
         log.info("Stopped");
     }
 
-    // TODO: need to find a way to unify aprMode and gatewayMac variables with
-    // that in SwitchingArpHandler
     @Modified
     void modified(ComponentContext context) {
-
         log.info("Modified");
     }
 
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 e1b37d3..831f53b 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
@@ -133,10 +133,10 @@
     private final OpenstackRouterListener floatingIpListener = new InternalFloatingIpListener();
     private final InstancePortListener instancePortListener = new InternalInstancePortListener();
     private final OpenstackNodeListener osNodeListener = new InternalNodeListener();
-    private final Map<String, DeviceId> migrationPool = Maps.newConcurrentMap();
     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();
