diff --git a/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/DefaultEventSubject.java b/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/DefaultEventSubject.java
new file mode 100644
index 0000000..5d9134b
--- /dev/null
+++ b/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/DefaultEventSubject.java
@@ -0,0 +1,126 @@
+/*
+ * 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;
+import java.util.Set;
+
+import org.onlab.packet.IpAddress;
+import org.onlab.packet.MacAddress;
+
+/**
+ * This class is default event subject that implements OvsdbEventSubject.
+ */
+public class DefaultEventSubject implements OvsdbEventSubject {
+    private final MacAddress mac;
+    private final Set<IpAddress> ips;
+    private final OvsdbPortName portname;
+    private final OvsdbPortNumber portnumber;
+    private final OvsdbDatapathId dpid;
+    private final OvsdbPortType portType;
+    private final OvsdbIfaceId ifaceid;
+
+    /**
+     * Creates an end-station event subject using the supplied information.
+     *
+     * @param mac host MAC address
+     * @param ips host MAC ips
+     * @param portname port name
+     * @param portnumber port number
+     * @param dpid ovs dpid
+     * @param portType port type
+     * @param ifaceid  vm ifaceid
+     */
+    public DefaultEventSubject(MacAddress mac, Set<IpAddress> ips,
+                               OvsdbPortName portname, OvsdbPortNumber portnumber, OvsdbDatapathId dpid,
+                               OvsdbPortType portType, OvsdbIfaceId ifaceid) {
+        super();
+        this.mac = mac;
+        this.ips = ips;
+        this.portname = portname;
+        this.portnumber = portnumber;
+        this.dpid = dpid;
+        this.portType = portType;
+        this.ifaceid = ifaceid;
+    }
+
+    @Override
+    public MacAddress hwAddress() {
+        return mac;
+    }
+
+    @Override
+    public Set<IpAddress> ipAddress() {
+        return ips;
+    }
+
+    @Override
+    public OvsdbPortName portName() {
+        return portname;
+    }
+
+    @Override
+    public OvsdbPortNumber portNumber() {
+        return portnumber;
+    }
+
+    @Override
+    public OvsdbPortType portType() {
+        return portType;
+    }
+
+    @Override
+    public OvsdbDatapathId dpid() {
+        return dpid;
+    }
+
+    @Override
+    public OvsdbIfaceId ifaceid() {
+        return ifaceid;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(mac, portname, portnumber, dpid, portType, ifaceid);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj instanceof DefaultEventSubject) {
+            final DefaultEventSubject other = (DefaultEventSubject) obj;
+            return Objects.equals(this.mac, other.mac)
+                    && Objects.equals(this.portname, other.portname)
+                    && Objects.equals(this.portnumber, other.portnumber)
+                    && Objects.equals(this.dpid, other.dpid)
+                    && Objects.equals(this.portType, other.portType)
+                    && Objects.equals(this.ifaceid, other.ifaceid);
+        }
+        return false;
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(this).add("mac", mac).add("portname", portname)
+                .add("portnumber", portnumber).add("portType", portType)
+                .add("ipAddresses", ips).add("dpid", dpid).add("ifaceid", ifaceid)
+                .toString();
+    }
+}
