diff --git a/ovsdb/api/pom.xml b/ovsdb/api/pom.xml
new file mode 100644
index 0000000..62e8148
--- /dev/null
+++ b/ovsdb/api/pom.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0"?>
+<project
+    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
+    xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>org.onosproject</groupId>
+        <artifactId>onos-ovsdb</artifactId>
+        <version>1.3.0-SNAPSHOT</version>
+    </parent>
+    <artifactId>onos-ovsdb-api</artifactId>
+    <packaging>bundle</packaging>
+
+    <dependencies>
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>commons-pool</groupId>
+            <artifactId>commons-pool</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>io.netty</groupId>
+            <artifactId>netty-transport</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>io.netty</groupId>
+            <artifactId>netty-transport-native-epoll</artifactId>
+            <version>${netty4.version}</version>
+        </dependency>
+    </dependencies>
+
+</project>
diff --git a/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/EventSubject.java b/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/EventSubject.java
new file mode 100644
index 0000000..6a06724
--- /dev/null
+++ b/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/EventSubject.java
@@ -0,0 +1,23 @@
+/*
+ * 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.ovsdb.controller;
+
+/**
+ * Represents for a entity that carry important information for listener.
+ */
+public interface EventSubject {
+
+}
diff --git a/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/OvsdbBridge.java b/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/OvsdbBridge.java
new file mode 100644
index 0000000..1ee0a36
--- /dev/null
+++ b/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/OvsdbBridge.java
@@ -0,0 +1,87 @@
+/*
+ * 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.ovsdb.controller;
+
+import static com.google.common.base.MoreObjects.toStringHelper;
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import java.util.Objects;
+
+/**
+ * The class representing a ovsdb bridge. This class is immutable.
+ */
+public final class OvsdbBridge {
+
+    private final OvsdbBridgeName bridgeName;
+    private final OvsdbDatapathId datapathId;
+
+    /**
+     * Constructor from a OvsdbBridgeName bridgeName and a OvsdbDatapathId
+     * datapathId.
+     *
+     * @param bridgeName the bridgeName to use
+     * @param datapathId the datapathId to use
+     */
+    public OvsdbBridge(OvsdbBridgeName bridgeName, OvsdbDatapathId datapathId) {
+        checkNotNull(bridgeName, "bridgeName is not null");
+        checkNotNull(datapathId, "datapathId is not null");
+        this.bridgeName = bridgeName;
+        this.datapathId = datapathId;
+    }
+
+    /**
+     * Gets the bridge name of the bridge.
+     *
+     * @return the bridge name of the bridge
+     */
+    public OvsdbBridgeName bridgeName() {
+        return bridgeName;
+    }
+
+    /**
+     * Gets the datapathId of the bridge.
+     *
+     * @return datapathId the datapathId to use
+     */
+    public OvsdbDatapathId datapathId() {
+        return datapathId;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(bridgeName, datapathId);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj instanceof OvsdbBridge) {
+            final OvsdbBridge otherOvsdbBridge = (OvsdbBridge) obj;
+            return Objects.equals(this.bridgeName, otherOvsdbBridge.bridgeName)
+                    && Objects.equals(this.datapathId,
+                                      otherOvsdbBridge.datapathId);
+        }
+        return false;
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(this).add("bridgeName", bridgeName.value())
+                .add("datapathId", datapathId.value()).toString();
+    }
+}
diff --git a/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/OvsdbBridgeName.java b/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/OvsdbBridgeName.java
new file mode 100644
index 0000000..daedff5
--- /dev/null
+++ b/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/OvsdbBridgeName.java
@@ -0,0 +1,71 @@
+/*
+ * 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.ovsdb.controller;
+
+import static com.google.common.base.MoreObjects.toStringHelper;
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import java.util.Objects;
+
+/**
+ * The class representing a bridge name. This class is immutable.
+ */
+public final class OvsdbBridgeName {
+
+    private final String value;
+
+    /**
+     * Constructor from a String bridge name.
+     *
+     * @param value the bridge name to use
+     */
+    public OvsdbBridgeName(String value) {
+        checkNotNull(value, "value is not null");
+        this.value = value;
+    }
+
+    /**
+     * Gets the value of the bridge name.
+     *
+     * @return the value of the bridge name
+     */
+    public String value() {
+        return value;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(value);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj instanceof OvsdbBridgeName) {
+            final OvsdbBridgeName otherBridgeName = (OvsdbBridgeName) obj;
+            return Objects.equals(this.value, otherBridgeName.value);
+        }
+        return false;
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(this).add("value", value).toString();
+    }
+
+}
diff --git a/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/OvsdbClientService.java b/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/OvsdbClientService.java
new file mode 100644
index 0000000..08e3175
--- /dev/null
+++ b/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/OvsdbClientService.java
@@ -0,0 +1,107 @@
+/*
+ * 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.ovsdb.controller;
+
+import java.util.Set;
+
+import org.onlab.packet.IpAddress;
+
+/**
+ * Represents to provider facing side of a node.
+ */
+public interface OvsdbClientService {
+    /**
+     * Gets the node identifier.
+     *
+     * @return node identifier
+     */
+    OvsdbNodeId nodeId();
+
+    /**
+     * Creates the configuration for the tunnel.
+     *
+     * @param srcIp source IP address
+     * @param dstIp destination IP address
+     */
+    void createTunnel(IpAddress srcIp, IpAddress dstIp);
+
+    /**
+     * Drops the configuration for the tunnel.
+     *
+     * @param srcIp source IP address
+     * @param dstIp destination IP address
+     */
+    void dropTunnel(IpAddress srcIp, IpAddress dstIp);
+
+    /**
+     * Gets tunnels of the node.
+     *
+     * @return set of tunnels; empty if no tunnel is find
+     */
+    Set<OvsdbTunnel> getTunnels();
+
+    /**
+     * Creates a bridge.
+     *
+     * @param bridgeName bridge name
+     */
+    void createBridge(String bridgeName);
+
+    /**
+     * Drops a bridge.
+     *
+     * @param bridgeName bridge name
+     */
+    void dropBridge(String bridgeName);
+
+    /**
+     * Gets bridges of the node.
+     *
+     * @return set of bridges; empty if no bridge is find
+     */
+    Set<OvsdbBridge> getBridges();
+
+    /**
+     * Creates a port.
+     *
+     * @param bridgeName bridge name
+     * @param portName port name
+     */
+    void createPort(String bridgeName, String portName);
+
+    /**
+     * Drops a port.
+     *
+     * @param bridgeName bridge name
+     * @param portName port name
+     */
+    void dropPort(String bridgeName, String portName);
+
+    /**
+     * Gets ports of the bridge.
+     *
+     * @return set of ports; empty if no ports is find
+     */
+    Set<OvsdbPort> getPorts();
+
+    /**
+     * Checks if the node is still connected.
+     *
+     * @return true if the node is still connected
+     */
+    boolean isConnected();
+
+}
diff --git a/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/OvsdbController.java b/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/OvsdbController.java
new file mode 100644
index 0000000..9e24524
--- /dev/null
+++ b/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/OvsdbController.java
@@ -0,0 +1,68 @@
+/*
+ * 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.ovsdb.controller;
+
+import java.util.List;
+
+/**
+ * Abstraction of an ovsdb controller. Serves as a one stop shop for obtaining
+ * OvsdbNode and (un)register listeners on ovsdb events and ovsdb node events.
+ */
+public interface OvsdbController {
+
+    /**
+     * Adds Node Event Listener.
+     *
+     * @param listener node listener
+     */
+    void addNodeListener(OvsdbNodeListener listener);
+
+    /**
+     * Removes Node Event Listener.
+     *
+     * @param listener node listener
+     */
+    void removeNodeListener(OvsdbNodeListener listener);
+
+    /**
+     * Adds ovsdb event listener.
+     *
+     * @param listener event listener
+     */
+    void addOvsdbEventListener(OvsdbEventListener listener);
+
+    /**
+     * Removes ovsdb event listener.
+     *
+     * @param listener event listener
+     */
+    void removeOvsdbEventListener(OvsdbEventListener listener);
+
+    /**
+     * Gets all the nodes information.
+     *
+     * @return the list of node id
+     */
+    List<OvsdbNodeId> getNodeIds();
+
+    /**
+     * Gets a ovsdb client by node identifier.
+     *
+     * @param nodeId node identifier
+     * @return OvsdbClient ovsdb node information
+     */
+    OvsdbClientService getOvsdbClient(OvsdbNodeId nodeId);
+}
diff --git a/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/OvsdbDatapathId.java b/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/OvsdbDatapathId.java
new file mode 100644
index 0000000..1a2d836
--- /dev/null
+++ b/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/OvsdbDatapathId.java
@@ -0,0 +1,68 @@
+/*
+ * 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.ovsdb.controller;
+
+import static com.google.common.base.MoreObjects.toStringHelper;
+import static com.google.common.base.Preconditions.checkNotNull;
+import java.util.Objects;
+
+/**
+ * The class representing a datapathid. This class is immutable.
+ */
+public final class OvsdbDatapathId {
+    private final String value;
+
+    /**
+     * Constructor from a String datapathid.
+     *
+     * @param value the datapathid to use
+     */
+    public OvsdbDatapathId(String value) {
+        checkNotNull(value, "value is not null");
+        this.value = value;
+    }
+
+    /**
+     * Gets the value of the datapathid.
+     *
+     * @return the value of the datapathid
+     */
+    public String value() {
+        return value;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(value);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj instanceof OvsdbDatapathId) {
+            final OvsdbDatapathId otherDatapathId = (OvsdbDatapathId) obj;
+            return Objects.equals(this.value, otherDatapathId.value);
+        }
+        return false;
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(this).add("value", value).toString();
+    }
+}
diff --git a/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/OvsdbEvent.java b/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/OvsdbEvent.java
new file mode 100644
index 0000000..35fac7bc
--- /dev/null
+++ b/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/OvsdbEvent.java
@@ -0,0 +1,74 @@
+/*
+ * 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.ovsdb.controller;
+
+import static com.google.common.base.MoreObjects.toStringHelper;
+
+/**
+ * The abstract event of ovsdb.
+ */
+public final class OvsdbEvent<S> {
+
+    public enum Type {
+        /**
+         * Signifies that a new ovs port update has been detected.
+         */
+        PORT_ADDED,
+        /**
+         * Signifies that a ovs port has been removed.
+         */
+        PORT_REMOVED
+    }
+
+    private final Type type;
+    private final S subject;
+
+    /**
+     * Creates an event of a given type and for the specified event subject.
+     *
+     * @param type event type
+     * @param subject event subject
+     */
+    public OvsdbEvent(Type type, S subject) {
+        this.type = type;
+        this.subject = subject;
+    }
+
+    /**
+     * Returns the type of the event.
+     *
+     * @return event type
+     */
+    public Type type() {
+        return type;
+    }
+
+    /**
+     * Returns the subject of the event.
+     *
+     * @return subject to which this event pertains
+     */
+    public S subject() {
+        return subject;
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(this).add("type", type())
+                .add("subject", subject()).toString();
+    }
+
+}
diff --git a/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/OvsdbEventListener.java b/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/OvsdbEventListener.java
new file mode 100644
index 0000000..b7bf2b5
--- /dev/null
+++ b/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/OvsdbEventListener.java
@@ -0,0 +1,28 @@
+/*
+ * 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.ovsdb.controller;
+
+/**
+ * Allows for providers interested in ovsdb events to be notified.
+ */
+public interface OvsdbEventListener {
+    /**
+     * Handles the ovsdb event.
+     *
+     * @param event ovsdb event
+     */
+    void handle(OvsdbEvent<EventSubject> event);
+}
diff --git a/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/OvsdbNodeId.java b/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/OvsdbNodeId.java
new file mode 100644
index 0000000..2c1a440
--- /dev/null
+++ b/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/OvsdbNodeId.java
@@ -0,0 +1,83 @@
+/*
+ * 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.ovsdb.controller;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import java.util.Objects;
+
+import org.onlab.packet.IpAddress;
+
+/**
+ * The class representing a OpenStack Compute or Network nodeId. This class is
+ * immutable.
+ */
+public final class OvsdbNodeId {
+    private static final String SCHEME = "ovsdb";
+    private final String nodeId;
+    private final String ipAddress;
+
+    /**
+     * Creates a new node identifier from a IpAddress ipAddress, a long port.
+     *
+     * @param ipAddress node IP address
+     * @param port node port
+     */
+    public OvsdbNodeId(IpAddress ipAddress, long port) {
+        checkNotNull(ipAddress, "ipAddress is not null");
+        this.ipAddress = ipAddress.toString();
+        this.nodeId = ipAddress + ":" + port;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(nodeId);
+    }
+
+    @Override
+    public boolean equals(Object other) {
+        if (!(other instanceof OvsdbNodeId)) {
+            return false;
+        }
+
+        OvsdbNodeId otherNodeId = (OvsdbNodeId) other;
+
+        return Objects.equals(otherNodeId.nodeId, this.nodeId);
+    }
+
+    @Override
+    public String toString() {
+        return SCHEME + ":" + nodeId;
+    }
+
+    /**
+     * Gets the value of the NodeId.
+     *
+     * @return the value of the NodeId.
+     */
+    public String nodeId() {
+        return SCHEME + ":" + nodeId;
+    }
+
+    /**
+     * Get the IP address of the node.
+     *
+     * @return the IP address of the node
+     */
+    public String getIpAddress() {
+        return ipAddress;
+    }
+}
diff --git a/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/OvsdbNodeListener.java b/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/OvsdbNodeListener.java
new file mode 100644
index 0000000..ca732ef
--- /dev/null
+++ b/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/OvsdbNodeListener.java
@@ -0,0 +1,36 @@
+/*
+ * 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.ovsdb.controller;
+
+/**
+ * Allows for providers interested in node events to be notified.
+ */
+public interface OvsdbNodeListener {
+
+    /**
+     * Notifies that the node was added.
+     *
+     * @param nodeId the node where the event occurred
+     */
+    void nodeAdded(OvsdbNodeId nodeId);
+
+    /**
+     * Notifies that the node was removed.
+     *
+     * @param nodeId the node where the event occurred
+     */
+    void nodeRemoved(OvsdbNodeId nodeId);
+}
diff --git a/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/OvsdbPort.java b/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/OvsdbPort.java
new file mode 100644
index 0000000..3c04f6a
--- /dev/null
+++ b/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/OvsdbPort.java
@@ -0,0 +1,86 @@
+/*
+ * 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.ovsdb.controller;
+
+import static com.google.common.base.MoreObjects.toStringHelper;
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import java.util.Objects;
+
+/**
+ * The class representing a ovsdb port. This class is immutable.
+ */
+public final class OvsdbPort {
+
+    private final OvsdbPortNumber portNumber;
+    private final OvsdbPortName portName;
+
+    /**
+     * Constructor from a OvsdbPortNumber portNumber, OvsdbPortName portName.
+     *
+     * @param portNumber the portNumber to use
+     * @param portName the portName to use
+     */
+    public OvsdbPort(OvsdbPortNumber portNumber, OvsdbPortName portName) {
+        checkNotNull(portNumber, "portNumber is not null");
+        checkNotNull(portName, "portName is not null");
+        this.portNumber = portNumber;
+        this.portName = portName;
+    }
+
+    /**
+     * Gets the port number of the port.
+     *
+     * @return the port number of the port
+     */
+    public OvsdbPortNumber portNumber() {
+        return portNumber;
+    }
+
+    /**
+     * Gets the port name of the port.
+     *
+     * @return the port name of the port
+     */
+    public OvsdbPortName portName() {
+        return portName;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(portNumber, portName);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj instanceof OvsdbPort) {
+            final OvsdbPort otherOvsdbPort = (OvsdbPort) obj;
+            return Objects.equals(this.portNumber, otherOvsdbPort.portNumber)
+                    && Objects.equals(this.portName, otherOvsdbPort.portName);
+        }
+        return false;
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(this)
+                .add("portNumber", String.valueOf(portNumber.value()))
+                .add("portName", portName.value()).toString();
+    }
+}
diff --git a/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/OvsdbPortName.java b/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/OvsdbPortName.java
new file mode 100644
index 0000000..aa0f55b0
--- /dev/null
+++ b/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/OvsdbPortName.java
@@ -0,0 +1,70 @@
+/*
+ * 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.ovsdb.controller;
+
+import static com.google.common.base.MoreObjects.toStringHelper;
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import java.util.Objects;
+
+/**
+ * The class representing a port number. This class is immutable.
+ */
+public final class OvsdbPortName {
+
+    private final String value;
+
+    /**
+     * Constructor from a String port name.
+     *
+     * @param value the port name to use
+     */
+    public OvsdbPortName(String value) {
+        checkNotNull(value, "value is not null");
+        this.value = value;
+    }
+
+    /**
+     * Gets the value of the port name.
+     *
+     * @return the value of the port name
+     */
+    public String value() {
+        return value;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(value);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj instanceof OvsdbPortName) {
+            final OvsdbPortName otherOvsdbPortName = (OvsdbPortName) obj;
+            return Objects.equals(this.value, otherOvsdbPortName.value);
+        }
+        return false;
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(this).add("value", value).toString();
+    }
+}
diff --git a/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/OvsdbPortNumber.java b/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/OvsdbPortNumber.java
new file mode 100644
index 0000000..9c57b5d
--- /dev/null
+++ b/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/OvsdbPortNumber.java
@@ -0,0 +1,68 @@
+/*
+ * 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.ovsdb.controller;
+
+import static com.google.common.base.MoreObjects.toStringHelper;
+
+import java.util.Objects;
+
+/**
+ * The class representing a port number. This class is immutable.
+ */
+public final class OvsdbPortNumber {
+
+    private final long value;
+
+    /**
+     * Constructor from a long port number.
+     *
+     * @param value the port number to use
+     */
+    public OvsdbPortNumber(long value) {
+        this.value = value;
+    }
+
+    /**
+     * Gets the value of the port number.
+     *
+     * @return the value of the port number
+     */
+    public long value() {
+        return value;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(value);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj instanceof OvsdbPortNumber) {
+            final OvsdbPortNumber ovsdbPortNumber = (OvsdbPortNumber) obj;
+            return Objects.equals(this.value, ovsdbPortNumber.value);
+        }
+        return false;
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(this).add("value", value).toString();
+    }
+}
diff --git a/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/OvsdbTunnel.java b/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/OvsdbTunnel.java
new file mode 100644
index 0000000..e1c5c7f
--- /dev/null
+++ b/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/OvsdbTunnel.java
@@ -0,0 +1,125 @@
+/*
+ * 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.ovsdb.controller;
+
+import static com.google.common.base.MoreObjects.toStringHelper;
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import java.util.Objects;
+
+import org.onlab.packet.IpAddress;
+
+/**
+ * The class representing a ovsdb tunnel. This class is immutable.
+ */
+public final class OvsdbTunnel {
+
+    private final IpAddress localIp;
+    private final IpAddress remoteIp;
+
+    public enum Type {
+        VXLAN, GRE
+    }
+
+    private final Type tunnelType;
+    private final OvsdbTunnelName tunnelName;
+
+    /**
+     * Constructor from a IpAddress localIp, IpAddress remoteIp Type tunnelType,
+     * OvsdbTunnelName tunnelName.
+     *
+     * @param localIp the localIp to use
+     * @param remoteIp the remoteIp to use
+     * @param tunnelType the tunnelType to use
+     * @param tunnelName the tunnelName to use
+     */
+    public OvsdbTunnel(IpAddress localIp, IpAddress remoteIp, Type tunnelType,
+                       OvsdbTunnelName tunnelName) {
+        checkNotNull(localIp, "portName is not null");
+        checkNotNull(remoteIp, "portName is not null");
+        checkNotNull(tunnelName, "portName is not null");
+        this.localIp = localIp;
+        this.remoteIp = remoteIp;
+        this.tunnelType = tunnelType;
+        this.tunnelName = tunnelName;
+    }
+
+    /**
+     * Gets the local IP of the tunnel.
+     *
+     * @return the local IP of the tunnel
+     */
+    public IpAddress localIp() {
+        return localIp;
+    }
+
+    /**
+     * Gets the remote IP of the tunnel.
+     *
+     * @return the remote IP of the tunnel
+     */
+    public IpAddress remoteIp() {
+        return remoteIp;
+    }
+
+    /**
+     * Gets the tunnel type of the tunnel.
+     *
+     * @return the tunnel type of the tunnel
+     */
+    public Type tunnelType() {
+        return tunnelType;
+    }
+
+    /**
+     * Gets the tunnel name of the tunnel.
+     *
+     * @return the tunnel name of the tunnel
+     */
+    public OvsdbTunnelName tunnelName() {
+        return tunnelName;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(localIp, remoteIp, tunnelType, tunnelName);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj instanceof OvsdbTunnel) {
+            final OvsdbTunnel otherOvsdbTunnel = (OvsdbTunnel) obj;
+            return Objects.equals(this.localIp, otherOvsdbTunnel.localIp)
+                    && Objects.equals(this.remoteIp, otherOvsdbTunnel.remoteIp)
+                    && Objects.equals(this.tunnelType,
+                                      otherOvsdbTunnel.tunnelType)
+                    && Objects.equals(this.tunnelName,
+                                      otherOvsdbTunnel.tunnelName);
+        }
+        return false;
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(this).add("localIp", localIp.toString())
+                .add("remoteIp", remoteIp.toString())
+                .add("tunnelType", tunnelType).add("tunnelName", tunnelName)
+                .toString();
+    }
+}
diff --git a/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/OvsdbTunnelName.java b/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/OvsdbTunnelName.java
new file mode 100644
index 0000000..116f621
--- /dev/null
+++ b/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/OvsdbTunnelName.java
@@ -0,0 +1,69 @@
+/*
+ * 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.ovsdb.controller;
+
+import static com.google.common.base.MoreObjects.toStringHelper;
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import java.util.Objects;
+
+/**
+ * The class representing a tunnel name. This class is immutable.
+ */
+public final class OvsdbTunnelName {
+    private final String value;
+
+    /**
+     * Constructor from a String tunnel name.
+     *
+     * @param value the tunnel name to use
+     */
+    public OvsdbTunnelName(String value) {
+        checkNotNull(value, "value is not null");
+        this.value = value;
+    }
+
+    /**
+     * Gets the value of the tunnel name.
+     *
+     * @return the value of the tunnel name
+     */
+    public String value() {
+        return value;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(value);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj instanceof OvsdbTunnelName) {
+            final OvsdbTunnelName otherOvsdbTunnelName = (OvsdbTunnelName) obj;
+            return Objects.equals(this.value, otherOvsdbTunnelName.value);
+        }
+        return false;
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(this).add("value", value).toString();
+    }
+}
diff --git a/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/driver/OvsdbAgent.java b/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/driver/OvsdbAgent.java
new file mode 100644
index 0000000..70ffae8
--- /dev/null
+++ b/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/driver/OvsdbAgent.java
@@ -0,0 +1,42 @@
+/*
+ * 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.ovsdb.controller.driver;
+
+import org.onosproject.ovsdb.controller.OvsdbNodeId;
+import org.onosproject.ovsdb.controller.OvsdbClientService;
+
+/**
+ * Responsible for keeping track of the current set of nodes connected to the
+ * system.
+ */
+public interface OvsdbAgent {
+    /**
+     * Add a node that has just connected to the system.
+     *
+     * @param nodeId the nodeId to add
+     * @param ovsdbClient the actual node object.
+     */
+    void addConnectedNode(OvsdbNodeId nodeId, OvsdbClientService ovsdbClient);
+
+    /**
+     * Clear all state in controller node maps for a node that has disconnected
+     * from the local controller. Also release control for that node from the
+     * global repository. Notify node listeners.
+     *
+     * @param nodeId the node id to be removed.
+     */
+    void removeConnectedNode(OvsdbNodeId nodeId);
+}
diff --git a/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/driver/OvsdbProviderService.java b/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/driver/OvsdbProviderService.java
new file mode 100644
index 0000000..a7c0840
--- /dev/null
+++ b/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/driver/OvsdbProviderService.java
@@ -0,0 +1,55 @@
+/*
+ * 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.ovsdb.controller.driver;
+
+import io.netty.channel.Channel;
+
+/**
+ * Represents the driver side of an ovsdb node. This interface should never be
+ * exposed to consumers.
+ */
+public interface OvsdbProviderService {
+    /**
+     * Sets the ovsdb agent to be used. This method can only be called once.
+     *
+     * @param agent the agent to set.
+     */
+    void setAgent(OvsdbAgent agent);
+
+    /**
+     * Sets the associated Netty channel for this node.
+     *
+     * @param channel the Netty channel
+     */
+    void setChannel(Channel channel);
+
+    /**
+     * Announces to the ovsdb agent that this node has added.
+     */
+    void nodeAdded();
+
+    /**
+     * Announces to the ovsdb agent that this node has removed.
+     */
+    void nodeRemoved();
+
+    /**
+     * Sets whether the node is connected.
+     *
+     * @param connected whether the node is connected
+     */
+    void setConnection(boolean connected);
+}
diff --git a/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/driver/package-info.java b/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/driver/package-info.java
new file mode 100644
index 0000000..b14afdf
--- /dev/null
+++ b/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/driver/package-info.java
@@ -0,0 +1,20 @@
+/*
+ * 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.
+ */
+
+/**
+ * Ovsdb controller node driver API.
+ */
+package org.onosproject.ovsdb.controller.driver;
\ No newline at end of file
diff --git a/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/package-info.java b/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/package-info.java
new file mode 100644
index 0000000..d6fb434
--- /dev/null
+++ b/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/package-info.java
@@ -0,0 +1,20 @@
+/*
+ * 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.
+ */
+
+/**
+ * Ovsdb controller API.
+ */
+package org.onosproject.ovsdb.controller;
\ No newline at end of file
diff --git a/ovsdb/pom.xml b/ovsdb/pom.xml
new file mode 100644
index 0000000..f0e081a
--- /dev/null
+++ b/ovsdb/pom.xml
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>org.onosproject</groupId>
+        <artifactId>onos</artifactId>
+        <version>1.3.0-SNAPSHOT</version>
+    </parent>
+    <artifactId>onos-ovsdb</artifactId>
+    <name>onos-ovsdb</name>
+    <packaging>pom</packaging>
+
+    <dependencies>
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.onosproject</groupId>
+            <artifactId>onlab-misc</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.onosproject</groupId>
+            <artifactId>onlab-junit</artifactId>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>maven-bundle-plugin</artifactId>
+            </plugin>
+        </plugins>
+    </build>
+
+    <modules>
+        <module>api</module>
+    </modules>
+</project>
\ No newline at end of file
