diff --git a/apps/vtn/vtnmgr/src/main/java/org/onosproject/vtn/impl/VTNManager.java b/apps/vtn/vtnmgr/src/main/java/org/onosproject/vtn/impl/VTNManager.java
deleted file mode 100644
index 090ef0f..0000000
--- a/apps/vtn/vtnmgr/src/main/java/org/onosproject/vtn/impl/VTNManager.java
+++ /dev/null
@@ -1,672 +0,0 @@
-/*
- * Copyright 2015 Open Networking Laboratory
- *
- * 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.vtn.impl;
-
-import static java.util.concurrent.Executors.newSingleThreadScheduledExecutor;
-import static org.onlab.util.Tools.groupedThreads;
-import static org.slf4j.LoggerFactory.getLogger;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
-import java.util.concurrent.ScheduledExecutorService;
-import java.util.stream.Collectors;
-
-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.osgi.DefaultServiceDirectory;
-import org.onlab.osgi.ServiceDirectory;
-import org.onlab.packet.IpAddress;
-import org.onlab.packet.MacAddress;
-import org.onlab.util.KryoNamespace;
-import org.onosproject.core.ApplicationId;
-import org.onosproject.core.CoreService;
-import org.onosproject.net.Device;
-import org.onosproject.net.DeviceId;
-import org.onosproject.net.Host;
-import org.onosproject.net.HostId;
-import org.onosproject.net.Port;
-import org.onosproject.net.PortNumber;
-import org.onosproject.net.behaviour.BridgeConfig;
-import org.onosproject.net.behaviour.BridgeDescription;
-import org.onosproject.net.behaviour.BridgeName;
-import org.onosproject.net.behaviour.DefaultTunnelDescription;
-import org.onosproject.net.behaviour.IpTunnelEndPoint;
-import org.onosproject.net.behaviour.Pipeliner;
-import org.onosproject.net.behaviour.PipelinerContext;
-import org.onosproject.net.behaviour.TunnelConfig;
-import org.onosproject.net.behaviour.TunnelDescription;
-import org.onosproject.net.behaviour.TunnelEndPoint;
-import org.onosproject.net.device.DeviceEvent;
-import org.onosproject.net.device.DeviceListener;
-import org.onosproject.net.device.DeviceService;
-import org.onosproject.net.driver.DefaultDriverData;
-import org.onosproject.net.driver.Driver;
-import org.onosproject.net.driver.DriverHandler;
-import org.onosproject.net.driver.DriverService;
-import org.onosproject.net.flow.DefaultTrafficSelector;
-import org.onosproject.net.flow.DefaultTrafficTreatment;
-import org.onosproject.net.flow.FlowRuleService;
-import org.onosproject.net.flow.TrafficSelector;
-import org.onosproject.net.flow.TrafficTreatment;
-import org.onosproject.net.flow.criteria.Criteria;
-import org.onosproject.net.flow.instructions.Instructions;
-import org.onosproject.net.flowobjective.DefaultForwardingObjective;
-import org.onosproject.net.flowobjective.FlowObjectiveService;
-import org.onosproject.net.flowobjective.FlowObjectiveStore;
-import org.onosproject.net.flowobjective.ForwardingObjective;
-import org.onosproject.net.flowobjective.ForwardingObjective.Flag;
-import org.onosproject.net.flowobjective.Objective;
-import org.onosproject.net.host.HostEvent;
-import org.onosproject.net.host.HostListener;
-import org.onosproject.net.host.HostService;
-import org.onosproject.store.serializers.KryoNamespaces;
-import org.onosproject.store.service.EventuallyConsistentMap;
-import org.onosproject.store.service.StorageService;
-import org.onosproject.store.service.WallClockTimestamp;
-import org.onosproject.vtn.VTNService;
-import org.onosproject.vtnrsc.SegmentationId;
-import org.onosproject.vtnrsc.TenantNetwork;
-import org.onosproject.vtnrsc.VirtualPort;
-import org.onosproject.vtnrsc.VirtualPortId;
-import org.onosproject.vtnrsc.tenantnetwork.TenantNetworkService;
-import org.onosproject.vtnrsc.virtualport.VirtualPortService;
-import org.slf4j.Logger;
-
-import com.google.common.collect.Sets;
-
-/**
- * Provides implementation of VTNService.
- */
-@Component(immediate = true)
-@Service
-public class VTNManager implements VTNService {
-    private final Logger log = getLogger(getClass());
-
-    private static final String APP_ID = "org.onosproject.app.vtn";
-    private ScheduledExecutorService backgroundService;
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    protected DeviceService deviceService;
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    protected HostService hostService;
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    protected FlowRuleService flowRuleService;
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    protected CoreService coreService;
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    protected StorageService storageService;
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    protected TenantNetworkService tenantNetworkService;
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    protected VirtualPortService virtualPortService;
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    protected DriverService driverService;
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    protected FlowObjectiveService flowObjectiveService;
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    protected FlowObjectiveStore flowObjectiveStore;
-    protected ServiceDirectory serviceDirectory = new DefaultServiceDirectory();
-    private EventuallyConsistentMap<HostId, SegmentationId> binding;
-    private ApplicationId appId;
-    private HostListener hostListener = new InnerHostListener();
-    private DeviceListener deviceListener = new InnerDeviceListener();
-    private static final String IFACEID = "ifaceid";
-    private static final String PORT_HEAD = "vxlan";
-    private static final String DEFAULT_BRIDGE_NAME = "br-int";
-    private static final String CONTROLLER_IP_KEY = "ipaddress";
-    private static final int DEFAULT_MAC_PRIORITY = 0x0000;
-    private static final int MAC_PRIORITY = 0xffff;
-    private static final int DEFAULT_PORT_PRIORITY = 0x0000;
-    private static final int PORT_PRIORITY = 0xffff;
-    private static final String SWITCH_CHANNEL_ID = "channelId";
-    private static final String DRIVER_NAME = "onosfw";
-
-    @Activate
-    public void activate() {
-        KryoNamespace.Builder serializer = KryoNamespace.newBuilder()
-                .register(KryoNamespaces.API);
-        appId = coreService.registerApplication(APP_ID);
-        deviceService.addListener(deviceListener);
-        hostService.addListener(hostListener);
-        backgroundService = newSingleThreadScheduledExecutor(groupedThreads("onos-apps/vtn",
-                                                                            "manager-background"));
-        binding = storageService
-                .<HostId, SegmentationId>eventuallyConsistentMapBuilder()
-                .withName("all_tunnel").withSerializer(serializer)
-                .withTimestampProvider((k, v) -> new WallClockTimestamp())
-                .build();
-        log.info("Started");
-    }
-
-    @Deactivate
-    public void deactivate() {
-        backgroundService.shutdown();
-        binding.destroy();
-        log.info("Stopped");
-    }
-
-    @Override
-    public void onServerDetected(Device device) {
-        Iterable<Device> devices = deviceService.getAvailableDevices();
-        DriverHandler handler = driverService.createHandler(device.id());
-        BridgeConfig bridgeConfig = handler.behaviour(BridgeConfig.class);
-        bridgeConfig.addBridge(BridgeName.bridgeName(DEFAULT_BRIDGE_NAME));
-        String ipAddress = device.annotations().value(CONTROLLER_IP_KEY);
-        IpAddress ip = IpAddress.valueOf(ipAddress);
-        Sets.newHashSet(devices).stream()
-                .filter(d -> Device.Type.CONTROLLER == d.type())
-                .filter(d -> !device.id().equals(d.id())).forEach(d -> {
-                        String ipAddress1 = d.annotations()
-                                .value(CONTROLLER_IP_KEY);
-                        IpAddress ip1 = IpAddress.valueOf(ipAddress1);
-                        applyTunnelConfig(ip, ip1, handler);
-                        DriverHandler handler1 = driverService
-                                .createHandler(d.id());
-                        applyTunnelConfig(ip1, ip, handler1);
-
-                });
-    }
-
-    @Override
-    public void onServerVanished(Device device) {
-        Iterable<Device> devices = deviceService.getAvailableDevices();
-        String ipAddress = device.annotations().value(CONTROLLER_IP_KEY);
-        IpAddress dst = IpAddress.valueOf(ipAddress);
-        Sets.newHashSet(devices).stream()
-                .filter(d -> d.type() == Device.Type.CONTROLLER)
-                .filter(d -> !device.id().equals(d.id())).forEach(d -> {
-                    String ipAddress1 = d.annotations()
-                            .value(CONTROLLER_IP_KEY);
-                    DriverHandler handler = driverService.createHandler(d.id());
-                    IpAddress src = IpAddress.valueOf(ipAddress1);
-                    removeTunnelConfig(src, dst, handler);
-                });
-    }
-
-    private void applyTunnelConfig(IpAddress src, IpAddress dst,
-                                   DriverHandler handler) {
-        TunnelEndPoint tunnelAsSrc = IpTunnelEndPoint.ipTunnelPoint(src);
-        TunnelEndPoint tunnelAsDst = IpTunnelEndPoint.ipTunnelPoint(dst);
-        TunnelDescription tunnel = new DefaultTunnelDescription(
-                                                                tunnelAsSrc,
-                                                                tunnelAsDst,
-                                                                TunnelDescription.Type.VXLAN,
-                                                                null);
-        TunnelConfig config = handler.behaviour(TunnelConfig.class);
-        config.createTunnel(tunnel);
-    }
-
-    private void removeTunnelConfig(IpAddress src, IpAddress dst,
-                                    DriverHandler handler) {
-        TunnelEndPoint tunnelAsSrc = IpTunnelEndPoint.ipTunnelPoint(src);
-        TunnelEndPoint tunnelAsDst = IpTunnelEndPoint.ipTunnelPoint(dst);
-        TunnelDescription tunnel = new DefaultTunnelDescription(
-                                                                tunnelAsSrc,
-                                                                tunnelAsDst,
-                                                                TunnelDescription.Type.VXLAN,
-                                                                null);
-        TunnelConfig config = handler.behaviour(TunnelConfig.class);
-        config.removeTunnel(tunnel);
-    }
-
-    @Override
-    public void onOvsDetected(Device device) {
-        programMacDefaultRules(device.id(), appId, Objective.Operation.ADD);
-        programPortDefaultRules(device.id(), appId, Objective.Operation.ADD);
-    }
-
-    @Override
-    public void onOvsVanished(Device device) {
-        programMacDefaultRules(device.id(), appId, Objective.Operation.REMOVE);
-        programPortDefaultRules(device.id(), appId, Objective.Operation.REMOVE);
-    }
-
-    @Override
-    public void onHostDetected(Host host) {
-        String ifaceId = host.annotations().value(IFACEID);
-        DeviceId deviceId = host.location().deviceId();
-        String currentControllerIp = getControllerIpOfSwitch(deviceId);
-        Iterable<Device> devices = deviceService.getAvailableDevices();
-        VirtualPortId portId = VirtualPortId.portId(ifaceId);
-        VirtualPort port = virtualPortService.getPort(portId);
-        TenantNetwork network = tenantNetworkService
-                .getNetwork(port.networkId());
-        String tunnelName = "vxlan-" + currentControllerIp;
-        binding.put(host.id(), network.segmentationId());
-        List<Port> allPorts = deviceService.getPorts(deviceId);
-        PortNumber inPort = host.location().port();
-        List<PortNumber> localVmPorts = getLocalPorts(deviceId, ifaceId);
-        List<PortNumber> localTunnelPorts = new ArrayList<>();
-        Sets.newHashSet(allPorts.iterator()).stream()
-        .filter(p -> !p.number().equals(PortNumber.LOCAL)).forEach(p -> {
-            if (p.annotations().value("portName").startsWith(PORT_HEAD)) {
-                localTunnelPorts.add(p.number());
-            }
-        });
-
-        localVmPorts.forEach(lp -> programLocalBcastRules(deviceId, network.segmentationId(), lp, localVmPorts,
-                                                          localTunnelPorts, appId, Objective.Operation.ADD));
-        programLocalOut(deviceId, network.segmentationId(), inPort, host.mac(),
-                        appId, Objective.Operation.ADD);
-        localTunnelPorts
-                .forEach(tp -> programTunnelFloodOut(deviceId,
-                                                     network.segmentationId(),
-                                                     tp, localVmPorts,
-                                                     appId,
-                                                     Objective.Operation.ADD));
-        Sets.newHashSet(devices).stream()
-                .filter(d -> d.type() == Device.Type.CONTROLLER).forEach(d -> {
-                    DriverHandler handler = driverService.createHandler(d.id());
-                    BridgeConfig bridgeConfig = handler
-                            .behaviour(BridgeConfig.class);
-                    Collection<BridgeDescription> bridgeDescriptions = bridgeConfig
-                            .getBridges();
-
-                    Iterator<BridgeDescription> it = bridgeDescriptions
-                            .iterator();
-                    if (it.hasNext()) {
-                        BridgeDescription sw = it.next();
-                        Set<PortNumber> ports = bridgeConfig.getPortNumbers();
-                        ports.stream()
-                                .filter(p -> p.name()
-                                        .equalsIgnoreCase(tunnelName))
-                                .forEach(p -> programTunnelOut(sw.deviceId(),
-                                                 network.segmentationId(), p,
-                                                 host.mac(), appId,
-                                                 Objective.Operation.ADD));
-                    }
-                });
-        programLocalIn(deviceId, network.segmentationId(), inPort, host.mac(),
-                       appId, Objective.Operation.ADD);
-        localTunnelPorts
-                .forEach(tp -> programTunnelIn(deviceId,
-                                               network.segmentationId(),
-                                               tp, inPort, host.mac(),
-                                               appId, Objective.Operation.ADD));
-
-    }
-
-    @Override
-    public void onHostVanished(Host host) {
-        String ifaceId = host.annotations().value(IFACEID);
-        SegmentationId segId = binding.remove(host.id());
-        DeviceId deviceId = host.location().deviceId();
-        String currentControllerIp = getControllerIpOfSwitch(deviceId);
-        Iterable<Device> devices = deviceService.getAvailableDevices();
-
-        String tunnelName = "vxlan-" + currentControllerIp;
-        List<Port> allPorts = deviceService.getPorts(deviceId);
-        PortNumber inPort = host.location().port();
-
-        List<PortNumber> localTunnelPorts = new ArrayList<>();
-        Sets.newHashSet(allPorts.iterator()).stream()
-        .filter(p -> !p.number().equals(PortNumber.LOCAL)).forEach(p -> {
-            if (p.annotations().value("portName").startsWith(PORT_HEAD)) {
-                localTunnelPorts.add(p.number());
-            }
-        });
-
-        List<PortNumber> localVmPorts = getLocalPorts(deviceId, ifaceId);
-        localVmPorts.add(inPort);
-        localVmPorts.forEach(lp -> programLocalBcastRules(deviceId, segId, lp, localVmPorts,
-                                                          localTunnelPorts, appId, Objective.Operation.REMOVE));
-        programLocalOut(deviceId, segId, inPort, host.mac(),
-                        appId, Objective.Operation.REMOVE);
-        localTunnelPorts
-                .forEach(tp -> programTunnelFloodOut(deviceId,
-                                                     segId,
-                                                     tp, localVmPorts,
-                                                     appId,
-                                                     Objective.Operation.REMOVE));
-        Sets.newHashSet(devices).stream()
-                .filter(d -> d.type() == Device.Type.CONTROLLER).forEach(d -> {
-                    DriverHandler handler = driverService.createHandler(d.id());
-                    BridgeConfig bridgeConfig = handler
-                            .behaviour(BridgeConfig.class);
-                    Collection<BridgeDescription> bridgeDescriptions = bridgeConfig
-                            .getBridges();
-
-                    Iterator<BridgeDescription> it = bridgeDescriptions
-                            .iterator();
-                    if (it.hasNext()) {
-                        BridgeDescription sw = it.next();
-                        Set<PortNumber> ports = bridgeConfig.getPortNumbers();
-                        ports.stream()
-                                .filter(p -> p.name()
-                                        .equalsIgnoreCase(tunnelName))
-                                .forEach(p -> programTunnelOut(sw.deviceId(),
-                                                 segId, p,
-                                                 host.mac(), appId,
-                                                 Objective.Operation.REMOVE));
-                    }
-                });
-        programLocalIn(deviceId, segId, inPort, host.mac(),
-                       appId, Objective.Operation.REMOVE);
-        localTunnelPorts
-                .forEach(tp -> programTunnelIn(deviceId,
-                                               segId,
-                                               tp, inPort, host.mac(),
-                                               appId, Objective.Operation.REMOVE));
-    }
-
-    private class InnerDeviceListener implements DeviceListener {
-
-        @Override
-        public void event(DeviceEvent event) {
-            Device device = event.subject();
-            if (Device.Type.CONTROLLER == device.type()
-                    && DeviceEvent.Type.DEVICE_ADDED == event.type()) {
-                backgroundService.execute(() -> onServerDetected(device));
-            } else if (Device.Type.CONTROLLER == device.type()
-                    && DeviceEvent.Type.DEVICE_AVAILABILITY_CHANGED == event
-                            .type()) {
-                backgroundService.execute(() -> onServerVanished(device));
-            } else if (Device.Type.SWITCH == device.type()
-                    && DeviceEvent.Type.DEVICE_ADDED == event.type()) {
-                backgroundService.execute(() -> onOvsDetected(device));
-            } else if (Device.Type.SWITCH == device.type()
-                    && DeviceEvent.Type.DEVICE_AVAILABILITY_CHANGED == event
-                            .type()) {
-                backgroundService.execute(() -> onOvsVanished(device));
-            } else {
-                log.info("Do nothing for this device type");
-            }
-        }
-
-    }
-
-    private class InnerHostListener implements HostListener {
-
-        @Override
-        public void event(HostEvent event) {
-            Host host = event.subject();
-            if (HostEvent.Type.HOST_ADDED == event.type()) {
-                backgroundService.execute(() -> onHostDetected(host));
-            } else if (HostEvent.Type.HOST_REMOVED == event.type()) {
-                backgroundService.execute(() -> onHostVanished(host));
-            } else if (HostEvent.Type.HOST_UPDATED == event.type()) {
-                backgroundService.execute(() -> {
-                    onHostVanished(host);
-                    onHostDetected(host);
-                });
-            }
-        }
-
-    }
-
-    // Used to forward the flows to the local VM.
-    private void programLocalOut(DeviceId dpid, SegmentationId segmentationId,
-                                 PortNumber outPort, MacAddress sourceMac,
-                                 ApplicationId appid,
-                                 Objective.Operation type) {
-        TrafficSelector selector = DefaultTrafficSelector.builder()
-                .matchTunnelId(Long.parseLong(segmentationId.toString()))
-                .matchEthDst(sourceMac).build();
-        TrafficTreatment treatment = DefaultTrafficTreatment.builder()
-                .setOutput(outPort).build();
-        ForwardingObjective.Builder objective = DefaultForwardingObjective
-                .builder().withTreatment(treatment).withSelector(selector)
-                .fromApp(appId).withFlag(Flag.SPECIFIC)
-                .withPriority(MAC_PRIORITY);
-        if (type.equals(Objective.Operation.ADD)) {
-            flowServiceForward(dpid, objective.add());
-        } else {
-            flowServiceForward(dpid, objective.remove());
-        }
-
-    }
-
-    // Used to forward the flows into the VXLAN tunnel.
-    private void programTunnelOut(DeviceId dpid, SegmentationId segmentationId,
-                                  PortNumber tunnelOutPort, MacAddress dstMac,
-                                  ApplicationId appid,
-                                  Objective.Operation type) {
-        TrafficSelector selector = DefaultTrafficSelector.builder()
-                .matchEthDst(dstMac).add(Criteria.matchTunnelId(Long
-                        .parseLong(segmentationId.toString())))
-                .build();
-        TrafficTreatment treatment = DefaultTrafficTreatment.builder()
-
-        .setOutput(tunnelOutPort).build();
-        ForwardingObjective.Builder objective = DefaultForwardingObjective
-                .builder().withTreatment(treatment).withSelector(selector)
-                .fromApp(appId).withFlag(Flag.SPECIFIC)
-                .withPriority(MAC_PRIORITY);
-        if (type.equals(Objective.Operation.ADD)) {
-            flowServiceForward(dpid, objective.add());
-        } else {
-            flowServiceForward(dpid, objective.remove());
-        }
-
-    }
-
-    // Used to forward multicast flows to remote VMs of the same tenant via
-    // VXLAN tunnel.
-    private void programTunnelFloodOut(DeviceId deviceId,
-                                       SegmentationId segmentationId,
-                                       PortNumber ofPortOut,
-                                       List<PortNumber> localVmPorts,
-                                       ApplicationId appid,
-                                       Objective.Operation type) {
-        TrafficSelector selector = DefaultTrafficSelector.builder()
-                .matchInPort(ofPortOut)
-
-                .add(Criteria.matchTunnelId(Long.parseLong(segmentationId
-                             .toString()))).matchEthDst(MacAddress.BROADCAST)
-                .build();
-        TrafficTreatment.Builder treatment = DefaultTrafficTreatment.builder();
-
-        for (PortNumber outPort : localVmPorts) {
-                treatment.setOutput(outPort);
-        }
-
-        ForwardingObjective.Builder objective = DefaultForwardingObjective
-                .builder().withTreatment(treatment.build())
-                .withSelector(selector).fromApp(appId).makePermanent()
-                .withFlag(Flag.SPECIFIC).withPriority(MAC_PRIORITY);
-        if (type.equals(Objective.Operation.ADD)) {
-            flowServiceForward(deviceId, objective.add());
-        } else {
-            flowServiceForward(deviceId, objective.remove());
-        }
-    }
-
-    // Applies default flows to mac table.
-    private void programMacDefaultRules(DeviceId dpid, ApplicationId appid,
-                                        Objective.Operation type) {
-        TrafficSelector selector = DefaultTrafficSelector.builder().build();
-        TrafficTreatment treatment = DefaultTrafficTreatment.builder().drop()
-                .build();
-        ForwardingObjective.Builder objective = DefaultForwardingObjective
-                .builder().withTreatment(treatment).withSelector(selector)
-                .fromApp(appId).makePermanent().withFlag(Flag.SPECIFIC)
-                .withPriority(DEFAULT_MAC_PRIORITY);
-        if (type.equals(Objective.Operation.ADD)) {
-            flowServiceForward(dpid, objective.add());
-        } else {
-            flowServiceForward(dpid, objective.remove());
-        }
-    }
-
-    // Used to forward the flows to the local VMs with the same tenant.
-    private void programLocalBcastRules(DeviceId deviceId,
-                                        SegmentationId segmentationId,
-                                        PortNumber inPort,
-                                        List<PortNumber> localVmPorts,
-                                        List<PortNumber> localTunnelPorts,
-                                        ApplicationId appid,
-                                        Objective.Operation type) {
-        TrafficSelector selector = DefaultTrafficSelector.builder()
-                .matchInPort(inPort).matchEthDst(MacAddress.BROADCAST)
-                .add(Criteria.matchTunnelId(Long
-                        .parseLong(segmentationId.toString())))
-                .build();
-        TrafficTreatment.Builder treatment = DefaultTrafficTreatment.builder();
-        for (PortNumber outPort : localVmPorts) {
-            if (inPort != outPort) {
-                treatment.setOutput(outPort);
-            }
-        }
-        for (PortNumber outport : localTunnelPorts) {
-                treatment.setOutput(outport);
-        }
-        ForwardingObjective.Builder objective = DefaultForwardingObjective
-                .builder().withTreatment(treatment.build())
-                .withSelector(selector).fromApp(appId).makePermanent()
-                .withFlag(Flag.SPECIFIC).withPriority(MAC_PRIORITY);
-        if (type.equals(Objective.Operation.ADD)) {
-            flowServiceForward(deviceId, objective.add());
-        } else {
-            flowServiceForward(deviceId, objective.remove());
-        }
-    }
-
-    // Used to apply local entry flow.
-    private void programLocalIn(DeviceId dpid, SegmentationId segmentationId,
-                                PortNumber inPort, MacAddress srcMac,
-                                ApplicationId appid, Objective.Operation type) {
-        TrafficSelector selector = DefaultTrafficSelector.builder()
-                .matchInPort(inPort).matchEthSrc(srcMac).build();
-        TrafficTreatment.Builder treatment = DefaultTrafficTreatment.builder();
-        treatment.add(Instructions.modTunnelId(Long.parseLong(segmentationId
-                .toString())));
-        ForwardingObjective.Builder objective = DefaultForwardingObjective
-                .builder().withTreatment(treatment.build())
-                .withSelector(selector).fromApp(appId).makePermanent()
-                .withFlag(Flag.SPECIFIC).withPriority(PORT_PRIORITY);
-        if (type.equals(Objective.Operation.ADD)) {
-            flowServiceForward(dpid, objective.add());
-        } else {
-            flowServiceForward(dpid, objective.remove());
-        }
-    }
-
-    // Used to forward the flows from the egress tunnel to the VM.
-    private void programTunnelIn(DeviceId dpid, SegmentationId segmentationId,
-                                 PortNumber tunnelInPort, PortNumber outPort,
-                                 MacAddress sourceMac, ApplicationId appid,
-                                 Objective.Operation type) {
-        TrafficSelector selector = DefaultTrafficSelector.builder()
-                .matchInPort(tunnelInPort).add(Criteria.matchTunnelId(Long
-                        .parseLong(segmentationId.toString())))
-                .build();
-        TrafficTreatment treatment = DefaultTrafficTreatment.builder().build();
-
-        ForwardingObjective.Builder objective = DefaultForwardingObjective
-                .builder().withTreatment(treatment).withSelector(selector)
-                .fromApp(appId).makePermanent().withFlag(Flag.SPECIFIC)
-                .withPriority(PORT_PRIORITY);
-        if (type.equals(Objective.Operation.ADD)) {
-            flowServiceForward(dpid, objective.add());
-        } else {
-            flowServiceForward(dpid, objective.remove());
-        }
-    }
-
-    // Applies the default flows to port table.
-    private void programPortDefaultRules(DeviceId dpid, ApplicationId appid,
-                                         Objective.Operation type) {
-        TrafficSelector selector = DefaultTrafficSelector.builder().build();
-        TrafficTreatment treatment = DefaultTrafficTreatment.builder().build();
-        ForwardingObjective.Builder objective = DefaultForwardingObjective
-                .builder().withTreatment(treatment).withSelector(selector)
-                .fromApp(appId).makePermanent().withFlag(Flag.SPECIFIC)
-                .withPriority(DEFAULT_PORT_PRIORITY);
-        if (type.equals(Objective.Operation.ADD)) {
-            flowServiceForward(dpid, objective.add());
-        } else {
-            flowServiceForward(dpid, objective.remove());
-        }
-    }
-
-    // Used to get channelId from the device annotations.
-    private String getControllerIpOfSwitch(DeviceId deviceId) {
-        Device device = deviceService.getDevice(deviceId);
-        String url = device.annotations().value(SWITCH_CHANNEL_ID);
-        return url.substring(0, url.lastIndexOf(":"));
-    }
-
-    private Iterable<String> getIfaceIds(String ifaceId) {
-        VirtualPortId portId = VirtualPortId.portId(ifaceId);
-        VirtualPort port = virtualPortService.getPort(portId);
-        if (port == null) {
-            return Collections.emptyList();
-        }
-
-        TenantNetwork network = tenantNetworkService
-                .getNetwork(port.networkId());
-        if (network == null) {
-            return Collections.emptyList();
-        }
-
-        Collection<VirtualPort> ports = virtualPortService
-                .getPorts(network.id());
-        return ports.stream().map(p -> p.portId().portId())
-                .collect(Collectors.toSet());
-    }
-
-    private List<PortNumber> getLocalPorts(DeviceId deviceId, String ifaceId) {
-        DriverHandler handler = driverService
-                .createHandler(getController(deviceId));
-        BridgeConfig bridgeConfig = handler.behaviour(BridgeConfig.class);
-        Iterable<String> ifaceIds = getIfaceIds(ifaceId);
-        return bridgeConfig.getLocalPorts(ifaceIds);
-    }
-
-    private DeviceId getController(DeviceId deviceId) {
-        Iterable<Device> devices = deviceService.getAvailableDevices();
-        for (Device device : devices) {
-            if (device.type() == Device.Type.CONTROLLER && device.id()
-                    .toString().contains(getControllerIpOfSwitch(deviceId))) {
-                return device.id();
-            }
-        }
-        log.info("Can not find controller for device : {}", deviceId);
-        return null;
-    }
-
-    //Used to apply flowRule
-    private void flowServiceForward(DeviceId deviceId, ForwardingObjective forwardingObjective) {
-        Driver driver = driverService.getDriver(DRIVER_NAME);
-        Pipeliner pipeLiner = driver.createBehaviour(new DefaultDriverData(driver, deviceId), Pipeliner.class);
-        if (pipeLiner != null) {
-            final PipelinerContext context = new InnerPipelineContext();
-            pipeLiner.init(deviceId, context);
-            pipeLiner.forward(forwardingObjective);
-        }
-    }
-
-    // Processing context for initializing pipeline driver behaviours.
-    private class InnerPipelineContext implements PipelinerContext {
-        @Override
-        public ServiceDirectory directory() {
-            return serviceDirectory;
-        }
-
-        @Override
-        public FlowObjectiveStore store() {
-            return flowObjectiveStore;
-        }
-    }
-
-}
diff --git a/apps/vtn/vtnmgr/src/main/java/org/onosproject/vtn/VTNService.java b/apps/vtn/vtnmgr/src/main/java/org/onosproject/vtn/manager/VTNService.java
similarity index 89%
rename from apps/vtn/vtnmgr/src/main/java/org/onosproject/vtn/VTNService.java
rename to apps/vtn/vtnmgr/src/main/java/org/onosproject/vtn/manager/VTNService.java
index a20f852..a104e52 100644
--- a/apps/vtn/vtnmgr/src/main/java/org/onosproject/vtn/VTNService.java
+++ b/apps/vtn/vtnmgr/src/main/java/org/onosproject/vtn/manager/VTNService.java
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.onosproject.vtn;
+package org.onosproject.vtn.manager;
 
 import org.onosproject.net.Device;
 import org.onosproject.net.Host;
@@ -24,18 +24,20 @@
 public interface VTNService {
 
     /**
-     * Creates a vxlan tunnel and creates the ovs when a ovs controller node is detected.
+     * Creates a vxlan tunnel and creates the ovs when a ovs controller node is
+     * detected.
      *
      * @param device controller-type device
      */
-    void onServerDetected(Device device);
+    void onControllerDetected(Device device);
 
     /**
-     * Drops a vxlan tunnel and drops the ovs when a ovs controller node is vanished.
+     * Drops a vxlan tunnel and drops the ovs when a ovs controller node is
+     * vanished.
      *
      * @param device controller-type device
      */
-    void onServerVanished(Device device);
+    void onControllerVanished(Device device);
 
     /**
      * Applies default forwarding flows when a ovs is detected.
diff --git a/apps/vtn/vtnmgr/src/main/java/org/onosproject/vtn/manager/impl/VTNManager.java b/apps/vtn/vtnmgr/src/main/java/org/onosproject/vtn/manager/impl/VTNManager.java
new file mode 100644
index 0000000..7192ad9
--- /dev/null
+++ b/apps/vtn/vtnmgr/src/main/java/org/onosproject/vtn/manager/impl/VTNManager.java
@@ -0,0 +1,528 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * 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.vtn.manager.impl;
+
+import static org.slf4j.LoggerFactory.getLogger;
+
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Set;
+
+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.KryoNamespace;
+import org.onosproject.core.ApplicationId;
+import org.onosproject.core.CoreService;
+import org.onosproject.mastership.MastershipService;
+import org.onosproject.net.Device;
+import org.onosproject.net.DeviceId;
+import org.onosproject.net.Host;
+import org.onosproject.net.Port;
+import org.onosproject.net.PortNumber;
+import org.onosproject.net.behaviour.BridgeConfig;
+import org.onosproject.net.behaviour.BridgeDescription;
+import org.onosproject.net.config.NetworkConfigService;
+import org.onosproject.net.config.basics.BasicDeviceConfig;
+import org.onosproject.net.device.DeviceEvent;
+import org.onosproject.net.device.DeviceListener;
+import org.onosproject.net.device.DeviceService;
+import org.onosproject.net.driver.DriverHandler;
+import org.onosproject.net.driver.DriverService;
+import org.onosproject.net.flowobjective.Objective;
+import org.onosproject.net.host.HostEvent;
+import org.onosproject.net.host.HostListener;
+import org.onosproject.net.host.HostService;
+import org.onosproject.store.serializers.KryoNamespaces;
+import org.onosproject.store.service.ConsistentMap;
+import org.onosproject.store.service.EventuallyConsistentMap;
+import org.onosproject.store.service.LogicalClockService;
+import org.onosproject.store.service.Serializer;
+import org.onosproject.store.service.StorageService;
+import org.onosproject.vtn.manager.VTNService;
+import org.onosproject.vtn.table.ClassifierService;
+import org.onosproject.vtn.table.L2ForwardService;
+import org.onosproject.vtn.table.impl.ClassifierServiceImpl;
+import org.onosproject.vtn.table.impl.L2ForwardServiceImpl;
+import org.onosproject.vtn.util.DataPathIdGenerator;
+import org.onosproject.vtn.util.VtnConfig;
+import org.onosproject.vtn.util.VtnData;
+import org.onosproject.vtnrsc.SegmentationId;
+import org.onosproject.vtnrsc.SubnetId;
+import org.onosproject.vtnrsc.TenantId;
+import org.onosproject.vtnrsc.TenantNetwork;
+import org.onosproject.vtnrsc.TenantNetworkId;
+import org.onosproject.vtnrsc.VirtualPort;
+import org.onosproject.vtnrsc.VirtualPortId;
+import org.onosproject.vtnrsc.tenantnetwork.TenantNetworkService;
+import org.onosproject.vtnrsc.virtualport.VirtualPortService;
+import org.slf4j.Logger;
+
+import com.google.common.collect.Sets;
+
+/**
+ * Provides implementation of VTNService.
+ */
+@Component(immediate = true)
+@Service
+public class VTNManager implements VTNService {
+    private final Logger log = getLogger(getClass());
+    private static final String APP_ID = "org.onosproject.app.vtn";
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected NetworkConfigService configService;
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected DeviceService deviceService;
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected HostService hostService;
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected CoreService coreService;
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected StorageService storageService;
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected TenantNetworkService tenantNetworkService;
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected VirtualPortService virtualPortService;
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected DriverService driverService;
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected LogicalClockService clockService;
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected MastershipService mastershipService;
+
+    private ApplicationId appId;
+    private ClassifierService classifierService;
+    private L2ForwardService l2ForwardService;
+
+    private final HostListener hostListener = new InnerHostListener();
+    private final DeviceListener deviceListener = new InnerDeviceListener();
+
+    private static final String IFACEID = "ifaceid";
+    private static final String CONTROLLER_IP_KEY = "ipaddress";
+    public static final String DRIVER_NAME = "onosfw";
+    private static final String EX_PORT_NAME = "eth0";
+    private static final String SWITCHES_OF_CONTROLLER = "switchesOfController";
+    private static final String SWITCH_OF_LOCAL_HOST_PORTS = "switchOfLocalHostPorts";
+
+    private EventuallyConsistentMap<IpAddress, Boolean> switchesOfController;
+    private ConsistentMap<DeviceId, NetworkOfLocalHostPorts> switchOfLocalHostPorts;
+
+    @Activate
+    public void activate() {
+        appId = coreService.registerApplication(APP_ID);
+        classifierService = new ClassifierServiceImpl(appId);
+        l2ForwardService = new L2ForwardServiceImpl(appId);
+
+        deviceService.addListener(deviceListener);
+        hostService.addListener(hostListener);
+
+        KryoNamespace.Builder serializer = KryoNamespace.newBuilder()
+                                .register(KryoNamespaces.API)
+                                .register(NetworkOfLocalHostPorts.class)
+                                .register(TenantNetworkId.class)
+                                .register(Host.class)
+                                .register(TenantNetwork.class)
+                                .register(TenantId.class)
+                                .register(SubnetId.class);
+
+        switchesOfController = storageService
+                .<IpAddress, Boolean>eventuallyConsistentMapBuilder()
+                .withName(SWITCHES_OF_CONTROLLER).withSerializer(serializer)
+                .withTimestampProvider((k, v) -> clockService.getTimestamp())
+                .build();
+
+        switchOfLocalHostPorts = storageService
+                .<DeviceId, NetworkOfLocalHostPorts>consistentMapBuilder()
+                .withName(SWITCH_OF_LOCAL_HOST_PORTS)
+                .withSerializer(Serializer.using(serializer.build()))
+                .build();
+
+        log.info("Started");
+    }
+
+    @Deactivate
+    public void deactivate() {
+        deviceService.removeListener(deviceListener);
+        hostService.removeListener(hostListener);
+        log.info("Stopped");
+    }
+
+    @Override
+    public void onControllerDetected(Device controllerDevice) {
+        if (controllerDevice == null) {
+            log.error("The controller device is null");
+            return;
+        }
+        String localIpAddress = controllerDevice.annotations()
+                .value(CONTROLLER_IP_KEY);
+        IpAddress localIp = IpAddress.valueOf(localIpAddress);
+        DeviceId controllerDeviceId = controllerDevice.id();
+        DriverHandler handler = driverService.createHandler(controllerDeviceId);
+        if (mastershipService.isLocalMaster(controllerDeviceId)) {
+            // Get DataPathIdGenerator
+            String ipaddress = controllerDevice.annotations().value("ipaddress");
+            DataPathIdGenerator dpidGenerator = DataPathIdGenerator.builder()
+                                            .addIpAddress(ipaddress).build();
+            DeviceId deviceId = dpidGenerator.getDeviceId();
+            String dpid = dpidGenerator.getDpId();
+            // Inject pipeline driver name
+            BasicDeviceConfig config = configService.addConfig(deviceId,
+                                                               BasicDeviceConfig.class);
+            config.driver(DRIVER_NAME);
+            configService.applyConfig(deviceId, BasicDeviceConfig.class, config.node());
+            // Add Bridge
+            VtnConfig.applyBridgeConfig(handler, dpid, EX_PORT_NAME);
+            log.info("A new ovs is created in node {}", localIp.toString());
+            switchesOfController.put(localIp, true);
+        }
+        // Create tunnel in br-int on all controllers
+        programTunnelConfig(controllerDeviceId, localIp, handler);
+    }
+
+    @Override
+    public void onControllerVanished(Device controllerDevice) {
+        if (controllerDevice == null) {
+            log.error("The device is null");
+            return;
+        }
+        String dstIp = controllerDevice.annotations().value(CONTROLLER_IP_KEY);
+        IpAddress dstIpAddress = IpAddress.valueOf(dstIp);
+        DeviceId controllerDeviceId = controllerDevice.id();
+        if (mastershipService.isLocalMaster(controllerDeviceId)) {
+            switchesOfController.remove(dstIpAddress);
+        }
+        // remove tunnel in br-int on other controllers
+        programTunnelConfig(controllerDeviceId, dstIpAddress, null);
+    }
+
+    @Override
+    public void onOvsDetected(Device device) {
+        // Create tunnel out flow rules
+        applyTunnelOut(device, Objective.Operation.ADD);
+    }
+
+    @Override
+    public void onOvsVanished(Device device) {
+        // Remove Tunnel out flow rules
+        applyTunnelOut(device, Objective.Operation.REMOVE);
+    }
+
+    @Override
+    public void onHostDetected(Host host) {
+        // apply L2 openflow rules
+        applyHostMonitoredL2Rules(host, Objective.Operation.ADD);
+    }
+
+    @Override
+    public void onHostVanished(Host host) {
+        // apply L2 openflow rules
+        applyHostMonitoredL2Rules(host, Objective.Operation.REMOVE);
+    }
+
+    private void programTunnelConfig(DeviceId localDeviceId, IpAddress localIp,
+                                     DriverHandler localHandler) {
+        Iterable<Device> devices = deviceService.getAvailableDevices();
+        Sets.newHashSet(devices).stream()
+                .filter(d -> Device.Type.CONTROLLER == d.type())
+                .filter(d -> !localDeviceId.equals(d.id())).forEach(d -> {
+                    DriverHandler tunHandler = driverService
+                            .createHandler(d.id());
+                    String remoteIpAddress = d.annotations()
+                            .value(CONTROLLER_IP_KEY);
+                    IpAddress remoteIp = IpAddress.valueOf(remoteIpAddress);
+                    if (remoteIp.toString()
+                            .equalsIgnoreCase(localIp.toString())) {
+                        log.error("The localIp and remoteIp are the same");
+                        return;
+                    }
+                    if (localHandler != null) {
+                        // Create tunnel in br-int on local controller
+                        if (mastershipService.isLocalMaster(localDeviceId)) {
+                            VtnConfig.applyTunnelConfig(localHandler, localIp, remoteIp);
+                            log.info("Add tunnel between {} and {}", localIp,
+                                     remoteIp);
+                        }
+                        // Create tunnel in br-int on other controllers
+                        if (mastershipService.isLocalMaster(d.id())) {
+                            VtnConfig.applyTunnelConfig(tunHandler, remoteIp,
+                                                        localIp);
+                            log.info("Add tunnel between {} and {}", remoteIp,
+                                     localIp);
+                        }
+                    } else {
+                        // remove tunnel in br-int on other controllers
+                        if (mastershipService.isLocalMaster(d.id())) {
+                            VtnConfig.removeTunnelConfig(tunHandler, remoteIp,
+                                                        localIp);
+                            log.info("Remove tunnel between {} and {}", remoteIp,
+                                     localIp);
+                        }
+                    }
+                });
+    }
+
+    private void applyTunnelOut(Device device, Objective.Operation type) {
+        if (device == null) {
+            log.error("The device is null");
+            return;
+        }
+        if (!mastershipService.isLocalMaster(device.id())) {
+            return;
+        }
+        String controllerIp = VtnData.getControllerIpOfSwitch(device);
+        if (controllerIp == null) {
+            log.error("Can't find controller of device: {}",
+                      device.id().toString());
+            return;
+        }
+        IpAddress ipAddress = IpAddress.valueOf(controllerIp);
+        if (!switchesOfController.containsKey(ipAddress)) {
+            log.error("Can't find controller of device: {}",
+                      device.id().toString());
+            return;
+        }
+        if (type == Objective.Operation.ADD) {
+            switchOfLocalHostPorts.put(device.id(), new NetworkOfLocalHostPorts());
+        } else if (type == Objective.Operation.REMOVE) {
+            switchOfLocalHostPorts.remove(device.id());
+        }
+        Iterable<Device> devices = deviceService.getAvailableDevices();
+        DeviceId localControllerId = VtnData.getControllerId(device, devices);
+        DriverHandler handler = driverService.createHandler(localControllerId);
+        Set<PortNumber> ports = VtnConfig.getPortNumbers(handler);
+        Iterable<Host> allHosts = hostService.getHosts();
+        if (allHosts != null) {
+            Sets.newHashSet(allHosts).stream().forEach(host -> {
+                MacAddress hostMac = host.mac();
+                String ifaceId = host.annotations().value(IFACEID);
+                if (ifaceId == null) {
+                    log.error("The ifaceId of Host is null");
+                    return;
+                }
+                VirtualPortId virtualPortId = VirtualPortId.portId(ifaceId);
+                VirtualPort virtualPort = virtualPortService
+                        .getPort(virtualPortId);
+                TenantNetwork network = tenantNetworkService
+                        .getNetwork(virtualPort.networkId());
+                SegmentationId segmentationId = network.segmentationId();
+                DeviceId remoteDeviceId = host.location().deviceId();
+                Device remoteDevice = deviceService.getDevice(remoteDeviceId);
+                String remoteControllerIp = VtnData
+                        .getControllerIpOfSwitch(remoteDevice);
+                if (remoteControllerIp == null) {
+                    log.error("Can't find remote controller of device: {}",
+                              remoteDeviceId.toString());
+                    return;
+                }
+                IpAddress remoteIpAddress = IpAddress
+                        .valueOf(remoteControllerIp);
+                String tunnelName = "vxlan-" + remoteIpAddress.toString();
+                ports.stream()
+                        .filter(p -> p.name().equalsIgnoreCase(tunnelName))
+                        .forEach(p -> {
+                    l2ForwardService
+                            .programTunnelOut(device.id(), segmentationId, p,
+                                              hostMac, type);
+                });
+            });
+        }
+    }
+
+    private void applyHostMonitoredL2Rules(Host host, Objective.Operation type) {
+        DeviceId deviceId = host.location().deviceId();
+        if (!mastershipService.isLocalMaster(deviceId)) {
+            return;
+        }
+        String ifaceId = host.annotations().value(IFACEID);
+        if (ifaceId == null) {
+            log.error("The ifaceId of Host is null");
+            return;
+        }
+        VirtualPortId virtualPortId = VirtualPortId.portId(ifaceId);
+        VirtualPort virtualPort = virtualPortService.getPort(virtualPortId);
+        if (virtualPort == null) {
+            log.error("The virtualPort of host is null");
+            return;
+        }
+
+        Iterable<Device> devices = deviceService.getAvailableDevices();
+        PortNumber inPort = host.location().port();
+        MacAddress mac = host.mac();
+        Device device = deviceService.getDevice(deviceId);
+        String controllerIp = VtnData.getControllerIpOfSwitch(device);
+        IpAddress ipAddress = IpAddress.valueOf(controllerIp);
+        TenantNetwork network = tenantNetworkService.getNetwork(virtualPort.networkId());
+        if (network == null) {
+            log.error("Can't find network of the host");
+            return;
+        }
+        SegmentationId segmentationId = network.segmentationId();
+        // Get all the tunnel PortNumber in the current node
+        Iterable<Port> ports = deviceService.getPorts(deviceId);
+        Collection<PortNumber> localTunnelPorts = VtnData.getLocalTunnelPorts(ports);
+        // Get all the local vm's PortNumber in the current node
+        Map<TenantNetworkId, Set<PortNumber>> localHostPorts = switchOfLocalHostPorts
+                .get(deviceId).value().getNetworkOfLocalHostPorts();
+        Set<PortNumber> networkOflocalHostPorts = localHostPorts.get(network.id());
+
+        l2ForwardService.programLocalBcastRules(deviceId, segmentationId,
+                                                inPort, networkOflocalHostPorts,
+                                                localTunnelPorts,
+                                                type);
+
+        l2ForwardService.programLocalOut(deviceId, segmentationId, inPort, mac,
+                                         type);
+
+        if (type == Objective.Operation.ADD) {
+            if (networkOflocalHostPorts == null) {
+                networkOflocalHostPorts = new HashSet<PortNumber>();
+                localHostPorts.putIfAbsent(network.id(), networkOflocalHostPorts);
+            }
+            networkOflocalHostPorts.add(inPort);
+            classifierService.programTunnelIn(deviceId, segmentationId,
+                                              localTunnelPorts,
+                                              type);
+        } else if (type == Objective.Operation.REMOVE) {
+            networkOflocalHostPorts.remove(inPort);
+            if (networkOflocalHostPorts.isEmpty()) {
+                classifierService.programTunnelIn(deviceId, segmentationId,
+                                                  localTunnelPorts,
+                                                  Objective.Operation.REMOVE);
+                switchOfLocalHostPorts.get(deviceId).value().getNetworkOfLocalHostPorts()
+                                            .remove(virtualPort.networkId());
+            }
+        }
+
+        l2ForwardService.programTunnelBcastRules(deviceId, segmentationId,
+                                                 networkOflocalHostPorts,
+                                                 localTunnelPorts,
+                                                 type);
+
+        programTunnelOuts(devices, ipAddress, segmentationId, mac,
+                          type);
+
+        classifierService.programLocalIn(deviceId, segmentationId, inPort, mac,
+                                         appId, type);
+    }
+
+    private void programTunnelOuts(Iterable<Device> devices,
+                                   IpAddress ipAddress,
+                                   SegmentationId segmentationId,
+                                   MacAddress dstMac,
+                                   Objective.Operation type) {
+        String tunnelName = "vxlan-" + ipAddress.toString();
+        Sets.newHashSet(devices).stream()
+                .filter(d -> d.type() == Device.Type.CONTROLLER).forEach(d -> {
+                    DriverHandler handler = driverService.createHandler(d.id());
+                    BridgeConfig bridgeConfig = handler
+                            .behaviour(BridgeConfig.class);
+                    Collection<BridgeDescription> bridgeDescriptions = bridgeConfig
+                            .getBridges();
+                    Set<PortNumber> ports = bridgeConfig.getPortNumbers();
+                    Iterator<BridgeDescription> it = bridgeDescriptions
+                            .iterator();
+                    if (it.hasNext()) {
+                        BridgeDescription sw = it.next();
+                        ports.stream()
+                                .filter(p -> p.name()
+                                        .equalsIgnoreCase(tunnelName))
+                                .forEach(p -> {
+                            l2ForwardService.programTunnelOut(sw.deviceId(),
+                                                              segmentationId, p,
+                                                              dstMac, type);
+                        });
+                    }
+                });
+    }
+
+    private class InnerDeviceListener implements DeviceListener {
+
+        @Override
+        public void event(DeviceEvent event) {
+            Device device = event.subject();
+            if (Device.Type.CONTROLLER == device.type()) {
+                if (DeviceEvent.Type.DEVICE_ADDED == event.type()) {
+                    onControllerDetected(device);
+                }
+                if (DeviceEvent.Type.DEVICE_AVAILABILITY_CHANGED == event.type()) {
+                    if (deviceService.isAvailable(device.id())) {
+                        onControllerDetected(device);
+                    } else {
+                        onControllerVanished(device);
+                    }
+                }
+            } else if (Device.Type.SWITCH == device.type()) {
+                if (DeviceEvent.Type.DEVICE_ADDED == event.type()) {
+                    onOvsDetected(device);
+                }
+                if (DeviceEvent.Type.DEVICE_AVAILABILITY_CHANGED == event.type()) {
+                    if (deviceService.isAvailable(device.id())) {
+                        onOvsDetected(device);
+                    } else {
+                        onOvsVanished(device);
+                    }
+                }
+            } else {
+                log.info("Do nothing for this device type");
+            }
+        }
+    }
+
+    private class InnerHostListener implements HostListener {
+
+        @Override
+        public void event(HostEvent event) {
+            Host host = event.subject();
+            if (HostEvent.Type.HOST_ADDED == event.type()) {
+                onHostDetected(host);
+            } else if (HostEvent.Type.HOST_REMOVED == event.type()) {
+                onHostVanished(host);
+            } else if (HostEvent.Type.HOST_UPDATED == event.type()) {
+                onHostVanished(host);
+                onHostDetected(host);
+            }
+        }
+
+    }
+
+    // Local Host Ports of Network.
+    private class NetworkOfLocalHostPorts {
+        private final Map<TenantNetworkId, Set<PortNumber>> networkOfLocalHostPorts =
+                                      new HashMap<TenantNetworkId, Set<PortNumber>>();
+
+        public Map<TenantNetworkId, Set<PortNumber>> getNetworkOfLocalHostPorts() {
+            return networkOfLocalHostPorts;
+        }
+    }
+
+}
diff --git a/apps/vtn/vtnmgr/src/main/java/org/onosproject/vtn/impl/package-info.java b/apps/vtn/vtnmgr/src/main/java/org/onosproject/vtn/manager/impl/package-info.java
similarity index 94%
copy from apps/vtn/vtnmgr/src/main/java/org/onosproject/vtn/impl/package-info.java
copy to apps/vtn/vtnmgr/src/main/java/org/onosproject/vtn/manager/impl/package-info.java
index f18dbf8..4c9a58c 100644
--- a/apps/vtn/vtnmgr/src/main/java/org/onosproject/vtn/impl/package-info.java
+++ b/apps/vtn/vtnmgr/src/main/java/org/onosproject/vtn/manager/impl/package-info.java
@@ -17,4 +17,4 @@
 /**
  * VTN application that applies configuration and flows to the device.
  */
-package org.onosproject.vtn.impl;
+package org.onosproject.vtn.manager.impl;
diff --git a/apps/vtn/vtnmgr/src/main/java/org/onosproject/vtn/impl/package-info.java b/apps/vtn/vtnmgr/src/main/java/org/onosproject/vtn/manager/package-info.java
similarity index 94%
copy from apps/vtn/vtnmgr/src/main/java/org/onosproject/vtn/impl/package-info.java
copy to apps/vtn/vtnmgr/src/main/java/org/onosproject/vtn/manager/package-info.java
index f18dbf8..09bd80f 100644
--- a/apps/vtn/vtnmgr/src/main/java/org/onosproject/vtn/impl/package-info.java
+++ b/apps/vtn/vtnmgr/src/main/java/org/onosproject/vtn/manager/package-info.java
@@ -17,4 +17,4 @@
 /**
  * VTN application that applies configuration and flows to the device.
  */
-package org.onosproject.vtn.impl;
+package org.onosproject.vtn.manager;
diff --git a/apps/vtn/vtnmgr/src/main/java/org/onosproject/vtn/package-info.java b/apps/vtn/vtnmgr/src/main/java/org/onosproject/vtn/package-info.java
deleted file mode 100644
index 371466c..0000000
--- a/apps/vtn/vtnmgr/src/main/java/org/onosproject/vtn/package-info.java
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright 2015 Open Networking Laboratory
- *
- * 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.
- */
-
-/**
- * VTN application that applies configuration and flows to the device.
- */
-package org.onosproject.vtn;
diff --git a/apps/vtn/vtnmgr/src/main/java/org/onosproject/vtn/table/ClassifierService.java b/apps/vtn/vtnmgr/src/main/java/org/onosproject/vtn/table/ClassifierService.java
new file mode 100644
index 0000000..84fcefb
--- /dev/null
+++ b/apps/vtn/vtnmgr/src/main/java/org/onosproject/vtn/table/ClassifierService.java
@@ -0,0 +1,58 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * 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.vtn.table;
+
+import org.onlab.packet.MacAddress;
+import org.onosproject.core.ApplicationId;
+import org.onosproject.net.DeviceId;
+import org.onosproject.net.PortNumber;
+import org.onosproject.net.flowobjective.Objective;
+import org.onosproject.vtnrsc.SegmentationId;
+
+/**
+ * Applies classifier flows to the device.
+ */
+public interface ClassifierService {
+
+    /**
+     * The port rule that message from host matches Table(0) Match: host mac and
+     * ingress port Action: set vnid and go to table(50).
+     *
+     * @param deviceId Device Id
+     * @param segmentationId the vnid of the host belong to
+     * @param inPort the ingress port of the host
+     * @param srcMac the mac of the host
+     * @param appId the application ID of the vtn
+     * @param type the operation of the flow
+     */
+    void programLocalIn(DeviceId deviceId, SegmentationId segmentationId,
+                        PortNumber inPort, MacAddress srcMac,
+                        ApplicationId appId, Objective.Operation type);
+
+    /**
+     * The port rule that message from tunnel Table(0) Match: tunnel port and
+     * vnid Action: go to table(50).
+     *
+     * @param deviceId Device Id
+     * @param segmentationId the vnid of the host belong to
+     * @param localTunnelPorts the tunnel pors of the device
+     * @param type the operation of the flow
+     */
+    void programTunnelIn(DeviceId deviceId, SegmentationId segmentationId,
+                         Iterable<PortNumber> localTunnelPorts,
+                         Objective.Operation type);
+
+}
diff --git a/apps/vtn/vtnmgr/src/main/java/org/onosproject/vtn/table/L2ForwardService.java b/apps/vtn/vtnmgr/src/main/java/org/onosproject/vtn/table/L2ForwardService.java
new file mode 100644
index 0000000..3781c2b
--- /dev/null
+++ b/apps/vtn/vtnmgr/src/main/java/org/onosproject/vtn/table/L2ForwardService.java
@@ -0,0 +1,91 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * 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.vtn.table;
+
+import org.onlab.packet.MacAddress;
+import org.onosproject.net.DeviceId;
+import org.onosproject.net.PortNumber;
+import org.onosproject.net.flowobjective.Objective;
+import org.onosproject.vtnrsc.SegmentationId;
+
+/**
+ * Applies L2 flows to the device.
+ */
+public interface L2ForwardService {
+
+    /**
+     * The local broadcast rule that message matches Table(50) Match: broadcast
+     * mac and vnid Action: output port.
+     *
+     * @param deviceId Device Id
+     * @param segmentationId the vnid of the host belong to
+     * @param inPort the ingress port of the host
+     * @param localVmPorts the local ports of the network which connect host
+     * @param localTunnelPorts the tunnel pors of the device
+     * @param type the operation of the flow
+     */
+    void programLocalBcastRules(DeviceId deviceId,
+                                SegmentationId segmentationId,
+                                PortNumber inPort,
+                                Iterable<PortNumber> localVmPorts,
+                                Iterable<PortNumber> localTunnelPorts,
+                                Objective.Operation type);
+
+    /**
+     * The tunnel broadcast rule that message matches Table(50) Match: broadcast
+     * mac and vnid Action: output port.
+     *
+     * @param deviceId Device Id
+     * @param segmentationId the vnid of the host belong to
+     * @param localVmPorts the local ports of the network which connect host
+     * @param localTunnelPorts the tunnel pors of the device
+     * @param type the operation of the flow
+     */
+    void programTunnelBcastRules(DeviceId deviceId,
+                                 SegmentationId segmentationId,
+                                 Iterable<PortNumber> localVmPorts,
+                                 Iterable<PortNumber> localTunnelPorts,
+                                 Objective.Operation type);
+
+    /**
+     * The local out rule that message matches. Table(50) Match: local host mac
+     * and vnid Action: output local host port.
+     *
+     * @param deviceId Device Id
+     * @param segmentationId the vnid of the host belong to
+     * @param outPort the ingress port of the host
+     * @param sourceMac the mac of the host
+     * @param type the operation of the flow
+     */
+    void programLocalOut(DeviceId deviceId, SegmentationId segmentationId,
+                         PortNumber outPort, MacAddress sourceMac,
+                         Objective.Operation type);
+
+    /**
+     * The tunnel out rule that message matches. Table(50) Match: host mac and
+     * vnid Action: output tunnel port.
+     *
+     * @param deviceId Device Id
+     * @param segmentationId the vnid of the host belong to
+     * @param tunnelOutPort the port of the tunnel
+     * @param dstMac the mac of the host
+     * @param type the operation of the flow
+     */
+    void programTunnelOut(DeviceId deviceId, SegmentationId segmentationId,
+                          PortNumber tunnelOutPort, MacAddress dstMac,
+                          Objective.Operation type);
+
+}
diff --git a/apps/vtn/vtnmgr/src/main/java/org/onosproject/vtn/table/impl/ClassifierServiceImpl.java b/apps/vtn/vtnmgr/src/main/java/org/onosproject/vtn/table/impl/ClassifierServiceImpl.java
new file mode 100644
index 0000000..620a0e9
--- /dev/null
+++ b/apps/vtn/vtnmgr/src/main/java/org/onosproject/vtn/table/impl/ClassifierServiceImpl.java
@@ -0,0 +1,120 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * 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.vtn.table.impl;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+import static org.slf4j.LoggerFactory.getLogger;
+
+import org.onlab.osgi.DefaultServiceDirectory;
+import org.onlab.osgi.ServiceDirectory;
+import org.onlab.packet.MacAddress;
+import org.onosproject.core.ApplicationId;
+import org.onosproject.net.DeviceId;
+import org.onosproject.net.PortNumber;
+import org.onosproject.net.flow.DefaultTrafficSelector;
+import org.onosproject.net.flow.DefaultTrafficTreatment;
+import org.onosproject.net.flow.TrafficSelector;
+import org.onosproject.net.flow.TrafficTreatment;
+import org.onosproject.net.flow.criteria.Criteria;
+import org.onosproject.net.flow.instructions.Instructions;
+import org.onosproject.net.flowobjective.DefaultForwardingObjective;
+import org.onosproject.net.flowobjective.FlowObjectiveService;
+import org.onosproject.net.flowobjective.ForwardingObjective;
+import org.onosproject.net.flowobjective.ForwardingObjective.Flag;
+import org.onosproject.net.flowobjective.Objective;
+import org.onosproject.vtn.table.ClassifierService;
+import org.onosproject.vtnrsc.SegmentationId;
+import org.slf4j.Logger;
+
+import com.google.common.collect.Sets;
+
+/**
+ * Provides implementation of ClassifierService.
+ */
+public class ClassifierServiceImpl implements ClassifierService {
+    private final Logger log = getLogger(getClass());
+
+    private static final int L2_CLAFFIFIER_PRIORITY = 50000;
+
+    private final FlowObjectiveService flowObjectiveService;
+    private final ApplicationId appId;
+
+    /**
+     * Constructor.
+     *
+     * @param appId the application id of vtn
+     */
+    public ClassifierServiceImpl(ApplicationId appId) {
+        this.appId = checkNotNull(appId, "ApplicationId can not be null");
+        ServiceDirectory serviceDirectory = new DefaultServiceDirectory();
+        this.flowObjectiveService = serviceDirectory.get(FlowObjectiveService.class);
+    }
+
+    @Override
+    public void programLocalIn(DeviceId deviceId,
+                               SegmentationId segmentationId, PortNumber inPort,
+                               MacAddress srcMac, ApplicationId appid,
+                               Objective.Operation type) {
+        TrafficSelector selector = DefaultTrafficSelector.builder()
+                .matchInPort(inPort).matchEthSrc(srcMac).build();
+        TrafficTreatment.Builder treatment = DefaultTrafficTreatment.builder();
+        treatment.add(Instructions
+                .modTunnelId(Long.parseLong(segmentationId.toString())));
+        ForwardingObjective.Builder objective = DefaultForwardingObjective
+                .builder().withTreatment(treatment.build())
+                .withSelector(selector).fromApp(appId).makePermanent()
+                .withFlag(Flag.SPECIFIC).withPriority(L2_CLAFFIFIER_PRIORITY);
+        if (type.equals(Objective.Operation.ADD)) {
+            log.debug("programLocalIn-->ADD");
+            flowObjectiveService.forward(deviceId, objective.add());
+        } else {
+            log.debug("programLocalIn-->REMOVE");
+            flowObjectiveService.forward(deviceId, objective.remove());
+        }
+    }
+
+    @Override
+    public void programTunnelIn(DeviceId deviceId,
+                                SegmentationId segmentationId,
+                                Iterable<PortNumber> localTunnelPorts,
+                                Objective.Operation type) {
+        if (localTunnelPorts == null) {
+            log.info("No tunnel port in device");
+            return;
+        }
+        Sets.newHashSet(localTunnelPorts).stream().forEach(tp -> {
+            TrafficSelector selector = DefaultTrafficSelector.builder()
+                    .matchInPort(tp).add(Criteria.matchTunnelId(Long
+                            .parseLong(segmentationId.toString())))
+                    .build();
+
+            TrafficTreatment treatment = DefaultTrafficTreatment.builder()
+                    .build();
+            ForwardingObjective.Builder objective = DefaultForwardingObjective
+                    .builder().withTreatment(treatment).withSelector(selector)
+                    .fromApp(appId).makePermanent().withFlag(Flag.SPECIFIC)
+                    .withPriority(L2_CLAFFIFIER_PRIORITY);
+            if (type.equals(Objective.Operation.ADD)) {
+                log.debug("programTunnelIn-->ADD");
+                flowObjectiveService.forward(deviceId, objective.add());
+            } else {
+                log.debug("programTunnelIn-->REMOVE");
+                flowObjectiveService.forward(deviceId, objective.remove());
+            }
+        });
+    }
+
+}
diff --git a/apps/vtn/vtnmgr/src/main/java/org/onosproject/vtn/table/impl/L2ForwardServiceImpl.java b/apps/vtn/vtnmgr/src/main/java/org/onosproject/vtn/table/impl/L2ForwardServiceImpl.java
new file mode 100644
index 0000000..64c5fee
--- /dev/null
+++ b/apps/vtn/vtnmgr/src/main/java/org/onosproject/vtn/table/impl/L2ForwardServiceImpl.java
@@ -0,0 +1,193 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * 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.vtn.table.impl;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+import static org.slf4j.LoggerFactory.getLogger;
+
+import org.onlab.osgi.DefaultServiceDirectory;
+import org.onlab.osgi.ServiceDirectory;
+import org.onlab.packet.MacAddress;
+import org.onosproject.core.ApplicationId;
+import org.onosproject.net.DeviceId;
+import org.onosproject.net.PortNumber;
+import org.onosproject.net.flow.DefaultTrafficSelector;
+import org.onosproject.net.flow.DefaultTrafficTreatment;
+import org.onosproject.net.flow.TrafficSelector;
+import org.onosproject.net.flow.TrafficTreatment;
+import org.onosproject.net.flow.criteria.Criteria;
+import org.onosproject.net.flowobjective.DefaultForwardingObjective;
+import org.onosproject.net.flowobjective.FlowObjectiveService;
+import org.onosproject.net.flowobjective.ForwardingObjective;
+import org.onosproject.net.flowobjective.ForwardingObjective.Flag;
+import org.onosproject.net.flowobjective.Objective;
+import org.onosproject.vtn.table.L2ForwardService;
+import org.onosproject.vtnrsc.SegmentationId;
+import org.slf4j.Logger;
+
+import com.google.common.collect.Sets;
+
+/**
+ * Provides implementation of L2ForwardService.
+ */
+public final class L2ForwardServiceImpl implements L2ForwardService {
+    private final Logger log = getLogger(getClass());
+
+    private static final int MAC_PRIORITY = 0xffff;
+
+    private final FlowObjectiveService flowObjectiveService;
+    private final ApplicationId appId;
+
+    /**
+     * Constructor.
+     *
+     * @param appId the application id of vtn
+     */
+    public L2ForwardServiceImpl(ApplicationId appId) {
+        this.appId = checkNotNull(appId, "ApplicationId can not be null");
+        ServiceDirectory serviceDirectory = new DefaultServiceDirectory();
+        this.flowObjectiveService = serviceDirectory.get(FlowObjectiveService.class);
+    }
+
+    @Override
+    public void programLocalBcastRules(DeviceId deviceId,
+                                       SegmentationId segmentationId,
+                                       PortNumber inPort,
+                                       Iterable<PortNumber> localVmPorts,
+                                       Iterable<PortNumber> localTunnelPorts,
+                                       Objective.Operation type) {
+        if (localVmPorts == null || localTunnelPorts == null) {
+            log.info("No other host port and tunnel in the device");
+            return;
+        }
+        Sets.newHashSet(localVmPorts).stream().forEach(lp -> {
+            TrafficSelector selector = DefaultTrafficSelector.builder()
+                    .matchInPort(lp).matchEthDst(MacAddress.BROADCAST)
+                    .add(Criteria.matchTunnelId(Long
+                            .parseLong(segmentationId.toString())))
+                    .build();
+            TrafficTreatment.Builder treatment = DefaultTrafficTreatment
+                    .builder();
+            boolean flag = false;
+            for (PortNumber outPort : localVmPorts) {
+                flag = true;
+                if (outPort != lp) {
+                    treatment.setOutput(outPort);
+                }
+            }
+            if (type.equals(Objective.Operation.REMOVE) && inPort == lp) {
+                flag = false;
+            }
+            for (PortNumber outport : localTunnelPorts) {
+                treatment.setOutput(outport);
+            }
+            ForwardingObjective.Builder objective = DefaultForwardingObjective
+                    .builder().withTreatment(treatment.build())
+                    .withSelector(selector).fromApp(appId).makePermanent()
+                    .withFlag(Flag.SPECIFIC).withPriority(MAC_PRIORITY);
+            if (flag) {
+                flowObjectiveService.forward(deviceId, objective.add());
+            } else {
+                flowObjectiveService.forward(deviceId, objective.remove());
+            }
+        });
+    }
+
+    @Override
+    public void programTunnelBcastRules(DeviceId deviceId,
+                                        SegmentationId segmentationId,
+                                        Iterable<PortNumber> localVmPorts,
+                                        Iterable<PortNumber> localTunnelPorts,
+                                        Objective.Operation type) {
+        if (localVmPorts == null || localTunnelPorts == null) {
+            log.info("No other host port or tunnel ports in the device");
+            return;
+        }
+        Sets.newHashSet(localTunnelPorts).stream().forEach(tp -> {
+            TrafficSelector selector = DefaultTrafficSelector.builder()
+                    .matchInPort(tp)
+                    .add(Criteria.matchTunnelId(Long
+                            .parseLong(segmentationId.toString())))
+                    .matchEthDst(MacAddress.BROADCAST).build();
+            TrafficTreatment.Builder treatment = DefaultTrafficTreatment
+                    .builder();
+
+            for (PortNumber outPort : localVmPorts) {
+                treatment.setOutput(outPort);
+            }
+
+            ForwardingObjective.Builder objective = DefaultForwardingObjective
+                    .builder().withTreatment(treatment.build())
+                    .withSelector(selector).fromApp(appId).makePermanent()
+                    .withFlag(Flag.SPECIFIC).withPriority(MAC_PRIORITY);
+            if (type.equals(Objective.Operation.ADD)) {
+                if (Sets.newHashSet(localVmPorts).size() == 0) {
+                    flowObjectiveService.forward(deviceId, objective.remove());
+                } else {
+                    flowObjectiveService.forward(deviceId, objective.add());
+                }
+            } else {
+                flowObjectiveService.forward(deviceId, objective.remove());
+            }
+        });
+    }
+
+    @Override
+    public void programLocalOut(DeviceId deviceId,
+                                SegmentationId segmentationId,
+                                PortNumber outPort, MacAddress sourceMac,
+                                Objective.Operation type) {
+        TrafficSelector selector = DefaultTrafficSelector.builder()
+                .matchTunnelId(Long.parseLong(segmentationId.toString()))
+                .matchEthDst(sourceMac).build();
+        TrafficTreatment treatment = DefaultTrafficTreatment.builder()
+                .setOutput(outPort).build();
+        ForwardingObjective.Builder objective = DefaultForwardingObjective
+                .builder().withTreatment(treatment).withSelector(selector)
+                .fromApp(appId).withFlag(Flag.SPECIFIC)
+                .withPriority(MAC_PRIORITY);
+        if (type.equals(Objective.Operation.ADD)) {
+            flowObjectiveService.forward(deviceId, objective.add());
+        } else {
+            flowObjectiveService.forward(deviceId, objective.remove());
+        }
+
+    }
+
+    @Override
+    public void programTunnelOut(DeviceId deviceId,
+                                 SegmentationId segmentationId,
+                                 PortNumber tunnelOutPort, MacAddress dstMac,
+                                 Objective.Operation type) {
+        TrafficSelector selector = DefaultTrafficSelector.builder()
+                .matchEthDst(dstMac).add(Criteria.matchTunnelId(Long
+                        .parseLong(segmentationId.toString())))
+                .build();
+        TrafficTreatment treatment = DefaultTrafficTreatment.builder()
+                .setOutput(tunnelOutPort).build();
+        ForwardingObjective.Builder objective = DefaultForwardingObjective
+                .builder().withTreatment(treatment).withSelector(selector)
+                .fromApp(appId).withFlag(Flag.SPECIFIC)
+                .withPriority(MAC_PRIORITY);
+        if (type.equals(Objective.Operation.ADD)) {
+            flowObjectiveService.forward(deviceId, objective.add());
+        } else {
+            flowObjectiveService.forward(deviceId, objective.remove());
+        }
+
+    }
+
+}
diff --git a/apps/vtn/vtnmgr/src/main/java/org/onosproject/vtn/impl/package-info.java b/apps/vtn/vtnmgr/src/main/java/org/onosproject/vtn/table/impl/package-info.java
similarity index 94%
copy from apps/vtn/vtnmgr/src/main/java/org/onosproject/vtn/impl/package-info.java
copy to apps/vtn/vtnmgr/src/main/java/org/onosproject/vtn/table/impl/package-info.java
index f18dbf8..fd2e18e 100644
--- a/apps/vtn/vtnmgr/src/main/java/org/onosproject/vtn/impl/package-info.java
+++ b/apps/vtn/vtnmgr/src/main/java/org/onosproject/vtn/table/impl/package-info.java
@@ -17,4 +17,4 @@
 /**
  * VTN application that applies configuration and flows to the device.
  */
-package org.onosproject.vtn.impl;
+package org.onosproject.vtn.table.impl;
diff --git a/apps/vtn/vtnmgr/src/main/java/org/onosproject/vtn/impl/package-info.java b/apps/vtn/vtnmgr/src/main/java/org/onosproject/vtn/table/package-info.java
similarity index 94%
copy from apps/vtn/vtnmgr/src/main/java/org/onosproject/vtn/impl/package-info.java
copy to apps/vtn/vtnmgr/src/main/java/org/onosproject/vtn/table/package-info.java
index f18dbf8..cf53c96 100644
--- a/apps/vtn/vtnmgr/src/main/java/org/onosproject/vtn/impl/package-info.java
+++ b/apps/vtn/vtnmgr/src/main/java/org/onosproject/vtn/table/package-info.java
@@ -17,4 +17,4 @@
 /**
  * VTN application that applies configuration and flows to the device.
  */
-package org.onosproject.vtn.impl;
+package org.onosproject.vtn.table;
diff --git a/apps/vtn/vtnmgr/src/main/java/org/onosproject/vtn/util/DataPathIdGenerator.java b/apps/vtn/vtnmgr/src/main/java/org/onosproject/vtn/util/DataPathIdGenerator.java
new file mode 100644
index 0000000..c241347
--- /dev/null
+++ b/apps/vtn/vtnmgr/src/main/java/org/onosproject/vtn/util/DataPathIdGenerator.java
@@ -0,0 +1,64 @@
+package org.onosproject.vtn.util;
+
+import static org.onlab.util.Tools.toHex;
+
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.Calendar;
+
+import org.onosproject.core.IdGenerator;
+import org.onosproject.net.DeviceId;
+
+public final class DataPathIdGenerator implements IdGenerator {
+    private static final String SCHEME = "of";
+    private String ipAddress;
+    private String timeStamp;
+
+    private DataPathIdGenerator(Builder builder) {
+        this.ipAddress = builder.ipAddress;
+        Calendar cal = Calendar.getInstance();
+        this.timeStamp = String.valueOf(cal.get(Calendar.SECOND))
+                + String.valueOf(cal.get(Calendar.MILLISECOND));
+    }
+
+    @Override
+    public long getNewId() {
+        String dpid = ipAddress.replace(".", "") + timeStamp;
+        return Long.parseLong(dpid);
+    }
+
+    public String getDpId() {
+        return toHex(getNewId());
+    }
+
+    public DeviceId getDeviceId() {
+        try {
+            URI uri = new URI(SCHEME, toHex(getNewId()), null);
+            return DeviceId.deviceId(uri);
+        } catch (URISyntaxException e) {
+            return null;
+        }
+    }
+
+    /**
+     * Returns a new builder.
+     *
+     * @return new builder
+     */
+    public static Builder builder() {
+        return new Builder();
+    }
+
+    public static final class Builder {
+        private String ipAddress;
+
+        public Builder addIpAddress(String ipAddress) {
+            this.ipAddress = ipAddress;
+            return this;
+        }
+
+        public DataPathIdGenerator build() {
+            return new DataPathIdGenerator(this);
+        }
+    }
+}
diff --git a/apps/vtn/vtnmgr/src/main/java/org/onosproject/vtn/util/VtnConfig.java b/apps/vtn/vtnmgr/src/main/java/org/onosproject/vtn/util/VtnConfig.java
new file mode 100644
index 0000000..1f98e55
--- /dev/null
+++ b/apps/vtn/vtnmgr/src/main/java/org/onosproject/vtn/util/VtnConfig.java
@@ -0,0 +1,108 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * 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.vtn.util;
+
+import java.util.Set;
+
+import org.onlab.packet.IpAddress;
+import org.onosproject.net.PortNumber;
+import org.onosproject.net.behaviour.BridgeConfig;
+import org.onosproject.net.behaviour.BridgeName;
+import org.onosproject.net.behaviour.DefaultTunnelDescription;
+import org.onosproject.net.behaviour.IpTunnelEndPoint;
+import org.onosproject.net.behaviour.TunnelConfig;
+import org.onosproject.net.behaviour.TunnelDescription;
+import org.onosproject.net.behaviour.TunnelEndPoint;
+import org.onosproject.net.driver.DriverHandler;
+
+/**
+ * Applies configuration to the device.
+ */
+public final class VtnConfig {
+
+    private static final String DEFAULT_BRIDGE_NAME = "br-int";
+
+    /**
+     * Constructs a vtn config object. Utility classes should not have a
+     * public or default constructor, otherwise IDE will compile unsuccessfully. This
+     * class should not be instantiated.
+     */
+    private VtnConfig() {
+    }
+
+    /**
+     * Creates or update bridge in the controller device.
+     *
+     * @param handler DriverHandler
+     * @param dpid datapath id
+     * @param exPortName external port name
+     */
+    public static void applyBridgeConfig(DriverHandler handler, String dpid, String exPortName) {
+        BridgeConfig bridgeConfig = handler.behaviour(BridgeConfig.class);
+        bridgeConfig.addBridge(BridgeName.bridgeName(DEFAULT_BRIDGE_NAME), dpid, exPortName);
+    }
+
+    /**
+     * Creates or update tunnel in the controller device.
+     *
+     * @param handler DriverHandler
+     * @param srcIp the ipAddress of the local controller device
+     * @param dstIp the ipAddress of the remote controller device
+     */
+    public static void applyTunnelConfig(DriverHandler handler, IpAddress srcIp,
+                                  IpAddress dstIp) {
+        TunnelConfig tunnelConfig = handler.behaviour(TunnelConfig.class);
+        TunnelEndPoint tunnelAsSrc = IpTunnelEndPoint.ipTunnelPoint(srcIp);
+        TunnelEndPoint tunnelAsDst = IpTunnelEndPoint.ipTunnelPoint(dstIp);
+        TunnelDescription tunnel = new DefaultTunnelDescription(
+                                                                tunnelAsSrc,
+                                                                tunnelAsDst,
+                                                                TunnelDescription.Type.VXLAN,
+                                                                null);
+        tunnelConfig.createTunnel(tunnel);
+    }
+
+    /**
+     * Creates or update tunnel in the controller device.
+     *
+     * @param handler DriverHandler
+     * @param srcIp the ipAddress of the local controller device
+     * @param dstIp the ipAddress of the remote controller device
+     */
+    public static void removeTunnelConfig(DriverHandler handler, IpAddress srcIp,
+                                   IpAddress dstIp) {
+        TunnelConfig tunnelConfig = handler.behaviour(TunnelConfig.class);
+        TunnelEndPoint tunnelAsSrc = IpTunnelEndPoint.ipTunnelPoint(srcIp);
+        TunnelEndPoint tunnelAsDst = IpTunnelEndPoint.ipTunnelPoint(dstIp);
+        TunnelDescription tunnel = new DefaultTunnelDescription(
+                                                                tunnelAsSrc,
+                                                                tunnelAsDst,
+                                                                TunnelDescription.Type.VXLAN,
+                                                                null);
+        tunnelConfig.removeTunnel(tunnel);
+    }
+
+    /**
+     * Gets ports in the controller device.
+     *
+     * @param handler DriverHandler
+     */
+    public static Set<PortNumber> getPortNumbers(DriverHandler handler) {
+        BridgeConfig bridgeConfig = handler.behaviour(BridgeConfig.class);
+        return bridgeConfig.getPortNumbers();
+    }
+
+}
diff --git a/apps/vtn/vtnmgr/src/main/java/org/onosproject/vtn/util/VtnData.java b/apps/vtn/vtnmgr/src/main/java/org/onosproject/vtn/util/VtnData.java
new file mode 100644
index 0000000..a8562e7
--- /dev/null
+++ b/apps/vtn/vtnmgr/src/main/java/org/onosproject/vtn/util/VtnData.java
@@ -0,0 +1,97 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * 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.vtn.util;
+
+import java.util.ArrayList;
+import java.util.Collection;
+
+import org.onosproject.net.AnnotationKeys;
+import org.onosproject.net.Device;
+import org.onosproject.net.DeviceId;
+import org.onosproject.net.Port;
+import org.onosproject.net.PortNumber;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.google.common.collect.Sets;
+
+/**
+ * VtnData utility class.
+ */
+public final class VtnData {
+
+    private static final Logger log = LoggerFactory.getLogger(VtnData.class);
+    private static final String SWITCH_CHANNEL_ID = "channelId";
+    private static final String PORT_HEAD = "vxlan";
+
+    /**
+     * Constructs a VtnData object. Utility classes should not have a public or
+     * default constructor, otherwise IDE will compile unsuccessfully. This
+     * class should not be instantiated.
+     */
+    private VtnData() {
+    }
+
+    /**
+     * Get the ControllerIp from the device .
+     *
+     * @param device Device
+     * @return Controller Ip
+     */
+    public static String getControllerIpOfSwitch(Device device) {
+        String url = device.annotations().value(SWITCH_CHANNEL_ID);
+        return url.substring(0, url.lastIndexOf(":"));
+    }
+
+    /**
+     * Get the ControllerId from the device .
+     *
+     * @param device Device
+     * @param devices Devices
+     * @return Controller Id
+     */
+    public static DeviceId getControllerId(Device device,
+                                           Iterable<Device> devices) {
+        for (Device d : devices) {
+            if (d.type() == Device.Type.CONTROLLER && d.id().toString()
+                    .contains(getControllerIpOfSwitch(device))) {
+                return d.id();
+            }
+        }
+        log.info("Can not find controller for device : {}", device.id());
+        return null;
+    }
+
+    /**
+     * Get local tunnel ports.
+     *
+     * @param ports Iterable of Port
+     * @return Collection of PortNumber
+     */
+    public static Collection<PortNumber> getLocalTunnelPorts(Iterable<Port> ports) {
+        Collection<PortNumber> localTunnelPorts = new ArrayList<>();
+        Sets.newHashSet(ports).stream()
+                .filter(p -> !p.number().equals(PortNumber.LOCAL))
+                .forEach(p -> {
+                    if (p.annotations().value(AnnotationKeys.PORT_NAME)
+                            .startsWith(PORT_HEAD)) {
+                        localTunnelPorts.add(p.number());
+                    }
+                });
+        return localTunnelPorts;
+    }
+
+}
diff --git a/apps/vtn/vtnmgr/src/main/java/org/onosproject/vtn/impl/package-info.java b/apps/vtn/vtnmgr/src/main/java/org/onosproject/vtn/util/package-info.java
similarity index 95%
rename from apps/vtn/vtnmgr/src/main/java/org/onosproject/vtn/impl/package-info.java
rename to apps/vtn/vtnmgr/src/main/java/org/onosproject/vtn/util/package-info.java
index f18dbf8..213b9e2 100644
--- a/apps/vtn/vtnmgr/src/main/java/org/onosproject/vtn/impl/package-info.java
+++ b/apps/vtn/vtnmgr/src/main/java/org/onosproject/vtn/util/package-info.java
@@ -17,4 +17,4 @@
 /**
  * VTN application that applies configuration and flows to the device.
  */
-package org.onosproject.vtn.impl;
+package org.onosproject.vtn.util;
