diff --git a/src/main/java/net/onrc/onos/core/topology/ImmutableInternalTopologyWrapper.java b/src/main/java/net/onrc/onos/core/topology/ImmutableInternalTopologyWrapper.java
new file mode 100644
index 0000000..8a2a89a
--- /dev/null
+++ b/src/main/java/net/onrc/onos/core/topology/ImmutableInternalTopologyWrapper.java
@@ -0,0 +1,119 @@
+package net.onrc.onos.core.topology;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import java.util.Collection;
+
+import net.floodlightcontroller.util.MACAddress;
+import net.onrc.onos.core.util.Dpid;
+import net.onrc.onos.core.util.LinkTuple;
+import net.onrc.onos.core.util.OnosInstanceId;
+import net.onrc.onos.core.util.PortNumber;
+import net.onrc.onos.core.util.SwitchPort;
+
+/**
+ * Wrapper to access {@link ImmutableInternalTopology} as {@link MutableInternalTopology}.
+ */
+public final class ImmutableInternalTopologyWrapper implements MutableInternalTopology {
+
+    private final ImmutableInternalTopology wrapped;
+
+    /**
+     * Constructor.
+     *
+     * @param toWrap {@link ImmutableInternalTopology} to wrap
+     */
+    public ImmutableInternalTopologyWrapper(ImmutableInternalTopology toWrap) {
+        this.wrapped = checkNotNull(toWrap);
+    }
+
+    @Override
+    public void acquireReadLock() {
+        // no-op
+    }
+
+    @Override
+    public void releaseReadLock() {
+        // no-op
+    }
+
+    @Override
+    public SwitchEvent getSwitchEvent(Dpid dpid) {
+        return wrapped.getSwitchEvent(dpid);
+    }
+
+    @Override
+    public Collection<SwitchEvent> getAllSwitchEvents() {
+        return wrapped.getAllSwitchEvents();
+    }
+
+    @Override
+    public PortEvent getPortEvent(SwitchPort port) {
+        return wrapped.getPortEvent(port);
+    }
+
+    @Override
+    public PortEvent getPortEvent(Dpid dpid, PortNumber portNumber) {
+        return wrapped.getPortEvent(dpid, portNumber);
+    }
+
+    @Override
+    public Collection<PortEvent> getPortEvents(Dpid dpid) {
+        return wrapped.getPortEvents(dpid);
+    }
+
+    @Override
+    public Collection<PortEvent> getAllPortEvents() {
+        return wrapped.getAllPortEvents();
+    }
+
+    @Override
+    public LinkEvent getLinkEvent(LinkTuple linkId) {
+        return wrapped.getLinkEvent(linkId);
+    }
+
+    @Override
+    public LinkEvent getLinkEvent(LinkTuple linkId, String type) {
+        return wrapped.getLinkEvent(linkId, type);
+    }
+
+    @Override
+    public Collection<LinkEvent> getLinkEvents(LinkTuple linkId) {
+        return wrapped.getLinkEvents(linkId);
+    }
+
+    @Override
+    public Collection<LinkEvent> getAllLinkEvents() {
+        return wrapped.getAllLinkEvents();
+    }
+
+    @Override
+    public HostEvent getHostEvent(MACAddress mac) {
+        return wrapped.getHostEvent(mac);
+    }
+
+    @Override
+    public Collection<HostEvent> getAllHostEvents() {
+        return wrapped.getAllHostEvents();
+    }
+
+    @Override
+    public Collection<LinkEvent> getLinkEventsFrom(SwitchPort srcPort) {
+        return wrapped.getLinkEventsFrom(srcPort);
+    }
+
+    @Override
+    public Collection<LinkEvent> getLinkEventsTo(SwitchPort dstPort) {
+        return wrapped.getLinkEventsTo(dstPort);
+    }
+
+    @Override
+    public Collection<HostEvent> getHostEvents(SwitchPort port) {
+        return wrapped.getHostEvents(port);
+    }
+
+    @Override
+    public OnosInstanceId getSwitchMaster(Dpid dpid) {
+        return wrapped.getSwitchMaster(dpid);
+    }
+}
diff --git a/src/main/java/net/onrc/onos/core/topology/ImmutableTopologyWrapper.java b/src/main/java/net/onrc/onos/core/topology/ImmutableTopologyWrapper.java
new file mode 100644
index 0000000..c44dc3b
--- /dev/null
+++ b/src/main/java/net/onrc/onos/core/topology/ImmutableTopologyWrapper.java
@@ -0,0 +1,150 @@
+package net.onrc.onos.core.topology;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import java.util.Collection;
+
+import net.floodlightcontroller.util.MACAddress;
+import net.onrc.onos.core.util.Dpid;
+import net.onrc.onos.core.util.OnosInstanceId;
+import net.onrc.onos.core.util.PortNumber;
+import net.onrc.onos.core.util.SwitchPort;
+
+/**
+ * Wrapper to access {@link ImmutableTopology} as {@link MutableTopology}.
+ */
+public final class ImmutableTopologyWrapper implements MutableTopology {
+
+    private final ImmutableTopology wrapped;
+
+    /**
+     * Constructor.
+     *
+     * @param toWrap {@link ImmutableTopology} to wrap
+     */
+    public ImmutableTopologyWrapper(ImmutableTopology toWrap) {
+        this.wrapped = checkNotNull(toWrap);
+    }
+
+    @Override
+    public void acquireReadLock() {
+        // no-op
+    }
+
+    @Override
+    public void releaseReadLock() {
+        // no-op
+    }
+
+    @Override
+    public Switch getSwitch(Dpid dpid) {
+        return wrapped.getSwitch(dpid);
+    }
+
+    @Override
+    public Iterable<Switch> getSwitches() {
+        return wrapped.getSwitches();
+    }
+
+    @Override
+    public Port getPort(Dpid dpid, PortNumber portNumber) {
+        return wrapped.getPort(dpid, portNumber);
+    }
+
+    @Override
+    public Port getPort(SwitchPort port) {
+        return wrapped.getPort(port);
+    }
+
+    @Override
+    public Collection<Port> getPorts(Dpid dpid) {
+        return wrapped.getPorts(dpid);
+    }
+
+    @Override
+    public Link getOutgoingLink(Dpid dpid, PortNumber portNumber) {
+        return wrapped.getOutgoingLink(dpid, portNumber);
+    }
+
+    @Override
+    public Link getOutgoingLink(Dpid dpid, PortNumber portNumber, String type) {
+        return wrapped.getOutgoingLink(dpid, portNumber, type);
+    }
+
+    @Override
+    public Link getOutgoingLink(SwitchPort port) {
+        return wrapped.getOutgoingLink(port);
+    }
+
+    @Override
+    public Link getOutgoingLink(SwitchPort port, String type) {
+        return wrapped.getOutgoingLink(port, type);
+    }
+
+    @Override
+    public Collection<Link> getOutgoingLinks(SwitchPort port) {
+        return wrapped.getOutgoingLinks(port);
+    }
+
+    @Override
+    public Link getIncomingLink(Dpid dpid, PortNumber portNumber) {
+        return wrapped.getIncomingLink(dpid, portNumber);
+    }
+
+    @Override
+    public Link getIncomingLink(Dpid dpid, PortNumber portNumber, String type) {
+        return wrapped.getIncomingLink(dpid, portNumber, type);
+    }
+
+    @Override
+    public Link getIncomingLink(SwitchPort port) {
+        return wrapped.getIncomingLink(port);
+    }
+
+    @Override
+    public Link getIncomingLink(SwitchPort port, String type) {
+        return wrapped.getIncomingLink(port, type);
+    }
+
+    @Override
+    public Collection<Link> getIncomingLinks(SwitchPort port) {
+        return wrapped.getIncomingLinks(port);
+    }
+
+    @Override
+    public Link getLink(Dpid srcDpid, PortNumber srcPortNumber, Dpid dstDpid,
+            PortNumber dstPortNumber) {
+        return wrapped.getLink(srcDpid, srcPortNumber, dstDpid, dstPortNumber);
+    }
+
+    @Override
+    public Link getLink(Dpid srcDpid, PortNumber srcPortNumber, Dpid dstDpid,
+            PortNumber dstPortNumber, String type) {
+        return wrapped.getLink(srcDpid, srcPortNumber, dstDpid, dstPortNumber, type);
+    }
+
+    @Override
+    public Iterable<Link> getLinks() {
+        return wrapped.getLinks();
+    }
+
+    @Override
+    public Host getHostByMac(MACAddress address) {
+        return wrapped.getHostByMac(address);
+    }
+
+    @Override
+    public Iterable<Host> getHosts() {
+        return wrapped.getHosts();
+    }
+
+    @Override
+    public Collection<Host> getHosts(SwitchPort port) {
+        return wrapped.getHosts(port);
+    }
+
+    @Override
+    public OnosInstanceId getSwitchMaster(Dpid dpid) {
+        return wrapped.getSwitchMaster(dpid);
+    }
+}
