diff --git a/api/src/main/java/org/opencord/igmpproxy/GroupMemberId.java b/api/src/main/java/org/opencord/igmpproxy/GroupMemberId.java
new file mode 100644
index 0000000..137a259
--- /dev/null
+++ b/api/src/main/java/org/opencord/igmpproxy/GroupMemberId.java
@@ -0,0 +1,115 @@
+/*
+ * Copyright 2017-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opencord.igmpproxy;
+
+import com.google.common.base.MoreObjects;
+import org.onlab.packet.Ip4Address;
+import org.onosproject.net.DeviceId;
+import org.onosproject.net.PortNumber;
+
+import java.util.Objects;
+
+/**
+ * Identification of group member.
+ */
+public final class GroupMemberId {
+    private Ip4Address groupIp;
+    private DeviceId deviceId;
+    private PortNumber portNum;
+
+    /**
+     * Constructor for serializer.
+     */
+    private GroupMemberId() {
+        this.groupIp = null;
+        this.deviceId = null;
+        this.portNum = null;
+    }
+
+    private GroupMemberId(Ip4Address groupIp, DeviceId deviceId, PortNumber portNum) {
+        this.groupIp = groupIp;
+        this.deviceId = deviceId;
+        this.portNum = portNum;
+    }
+
+    /**
+     * Creates new group member identification.
+     *
+     * @param groupIp  group ip of member
+     * @param deviceId device id
+     * @param portNum  port number of connect point
+     * @return new identification of group-member
+     */
+    public static GroupMemberId of(Ip4Address groupIp, DeviceId deviceId, PortNumber portNum) {
+        return new GroupMemberId(groupIp, deviceId, portNum);
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(this)
+                .add("groupIp", groupIp)
+                .add("deviceId", deviceId)
+                .add("portNumber", portNum).toString();
+    }
+
+    /**
+     * Get group ip of group.
+     *
+     * @return group ip
+     */
+    public Ip4Address getGroupIp() {
+        return groupIp;
+    }
+
+    /**
+     * Get device id of connect point.
+     *
+     * @return device id
+     */
+    public DeviceId getDeviceId() {
+        return deviceId;
+    }
+
+    /**
+     * Get port number of connect point.
+     *
+     * @return port number
+     */
+    public PortNumber getPortNum() {
+        return portNum;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) {
+            return true;
+        }
+        if (o == null || getClass() != o.getClass()) {
+            return false;
+        }
+        GroupMemberId that = (GroupMemberId) o;
+        return Objects.equals(groupIp, that.groupIp) &&
+                Objects.equals(deviceId, that.deviceId) &&
+                Objects.equals(portNum, that.portNum);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(groupIp, deviceId, portNum);
+    }
+}
+
diff --git a/api/src/main/java/org/opencord/igmpproxy/GroupMemberIdSerializer.java b/api/src/main/java/org/opencord/igmpproxy/GroupMemberIdSerializer.java
new file mode 100644
index 0000000..370148a
--- /dev/null
+++ b/api/src/main/java/org/opencord/igmpproxy/GroupMemberIdSerializer.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2017-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.opencord.igmpproxy;
+
+import com.esotericsoftware.kryo.Kryo;
+import com.esotericsoftware.kryo.Serializer;
+import com.esotericsoftware.kryo.io.Input;
+import com.esotericsoftware.kryo.io.Output;
+import org.onlab.packet.Ip4Address;
+import org.onosproject.net.DeviceId;
+import org.onosproject.net.PortNumber;
+
+/**
+ * Custom serializer for {@link GroupMemberId}.
+ */
+public class GroupMemberIdSerializer extends Serializer<GroupMemberId> {
+    /**
+     * Creates serializer instance.
+     */
+    public GroupMemberIdSerializer() {
+        // non-null, immutable
+        super(false, true);
+    }
+
+    @Override
+    public void write(Kryo kryo, Output output, GroupMemberId groupMemberId) {
+        output.writeString(groupMemberId.getDeviceId().toString());
+        kryo.writeClassAndObject(output, groupMemberId.getGroupIp());
+        kryo.writeClassAndObject(output, groupMemberId.getPortNum());
+    }
+
+    @Override
+    public GroupMemberId read(Kryo kryo, Input input, Class<GroupMemberId> aClass) {
+        DeviceId deviceId = DeviceId.deviceId(input.readString());
+        Ip4Address groupIp = (Ip4Address) kryo.readClassAndObject(input);
+        PortNumber portNum = (PortNumber) kryo.readClassAndObject(input);
+        return GroupMemberId.of(groupIp, deviceId, portNum);
+    }
+}
diff --git a/api/src/main/java/org/opencord/igmpproxy/IgmpLeadershipService.java b/api/src/main/java/org/opencord/igmpproxy/IgmpLeadershipService.java
new file mode 100644
index 0000000..1b8d0fe
--- /dev/null
+++ b/api/src/main/java/org/opencord/igmpproxy/IgmpLeadershipService.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright 2017-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.opencord.igmpproxy;
+
+import org.onosproject.net.DeviceId;
+
+/**
+ * Leadership control service.
+ */
+public interface IgmpLeadershipService {
+    /**
+     * Makes leadership control.
+     *
+     * @param deviceId received deviceId
+     * @return if it is leadership of this device, return true
+     */
+    boolean isLocalLeader(DeviceId deviceId);
+}
diff --git a/api/src/main/java/org/opencord/igmpproxy/package-info.java b/api/src/main/java/org/opencord/igmpproxy/package-info.java
index a2f9362..f261bd7 100644
--- a/api/src/main/java/org/opencord/igmpproxy/package-info.java
+++ b/api/src/main/java/org/opencord/igmpproxy/package-info.java
@@ -15,6 +15,6 @@
  */
 
 /**
- * Created by onos on 17-3-9.
+ * Package of igmpproxy.
  */
 package org.opencord.igmpproxy;
diff --git a/api/src/main/java/org/opencord/igmpproxy/statemachine/State.java b/api/src/main/java/org/opencord/igmpproxy/statemachine/State.java
new file mode 100644
index 0000000..022d509
--- /dev/null
+++ b/api/src/main/java/org/opencord/igmpproxy/statemachine/State.java
@@ -0,0 +1,73 @@
+/*
+ * Copyright 2017-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.opencord.igmpproxy.statemachine;
+
+/**
+ * State of machine.
+ */
+public interface State {
+    /**
+     * Default state.
+     */
+    int STATE_NON = 0;
+    /**
+     * Delay state.
+     */
+    int STATE_DELAY = 1;
+    /**
+     * Idle state.
+     */
+    int STATE_IDLE = 2;
+
+    /**
+     * Transition to join.
+     */
+    int TRANSITION_JOIN = 0;
+    /**
+     * Transition to leave.
+     */
+    int TRANSITION_LEAVE = 1;
+    /**
+     * Transition to query.
+     */
+    int TRANSITION_QUERY = 2;
+    /**
+     * Transition to timeout.
+     */
+    int TRANSITION_TIMEOUT = 3;
+
+    /**
+     * Makes the requirements of join request.
+     */
+    void join();
+
+    /**
+     * Makes the requirements of leave request.
+     */
+    void leave();
+
+    /**
+     * Makes the requirements of query request.
+     *
+     * @param maxResp maximum resp
+     */
+    void query(int maxResp);
+
+    /**
+     * Makes the requirements of timeout .
+     */
+    void timeOut();
+}
diff --git a/api/src/main/java/org/opencord/igmpproxy/statemachine/StateMachine.java b/api/src/main/java/org/opencord/igmpproxy/statemachine/StateMachine.java
new file mode 100644
index 0000000..ae79931
--- /dev/null
+++ b/api/src/main/java/org/opencord/igmpproxy/statemachine/StateMachine.java
@@ -0,0 +1,136 @@
+/*
+ * Copyright 2017-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.opencord.igmpproxy.statemachine;
+
+import org.onlab.packet.Ip4Address;
+import org.onosproject.net.DeviceId;
+import org.onosproject.net.PortNumber;
+
+/**
+ * State machine object.
+ */
+public interface StateMachine {
+    /**
+     * Returns identification of state-machine.
+     *
+     * @return identification
+     */
+    StateMachineId getStateMachineId();
+
+    /**
+     * Returns group ip of state-machine.
+     *
+     * @return ip of group
+     */
+    Ip4Address getGroupIp();
+
+    /**
+     * Returns device id of state-machine.
+     *
+     * @return device id
+     */
+    DeviceId getDeviceId();
+
+    /**
+     * Returns source ip of state-machine.
+     *
+     * @return source ip
+     */
+    Ip4Address getSrcIp();
+
+    /**
+     * Returns up-link port of state-machine.
+     *
+     * @return up-link port
+     */
+    PortNumber getUpLinkPort();
+
+    /**
+     * Returns timeout. it is nullable.
+     *
+     * @return timeout
+     */
+    Integer getTimeOut();
+
+    /**
+     * Set timer to max timeout.
+     */
+    void setMaxTimeout();
+
+    /**
+     * Start timer.
+     *
+     * @param timeout timeout
+     */
+    void startTimer(int timeout);
+
+    /**
+     * Resets timer.
+     *
+     * @param timeout timeout of timer
+     */
+    void resetTimer(int timeout);
+
+    /**
+     * Destroy timeout.
+     */
+    void destroyTimer();
+
+    /**
+     * Increases timeout of timer.
+     */
+    void increaseTimeOut();
+
+    /**
+     * Decreases timeout of timer.
+     */
+    void decreaseTimeOut();
+
+    /**
+     * Returns current state.
+     *
+     * @return current state
+     */
+    int currentState();
+
+    /**
+     * Makes the requirements of join request and transition to next station.
+     *
+     * @param messageOutAllowed message out allowed
+     */
+    void join(boolean messageOutAllowed);
+
+    /**
+     * Makes the requirements of leave request and transition to next station.
+     *
+     * @param messageOutAllowed message out allowed
+     */
+    void leave(boolean messageOutAllowed);
+
+    /**
+     * Makes the requirements of query request and transition to next station.
+     *
+     * @param maxResp maximum resp
+     */
+    void query(int maxResp);
+
+    /**
+     * Makes the requirements of timeout request and transition to next station.
+     *
+     * @param sendQuery send query for test
+     */
+    void timeOut(boolean sendQuery);
+}
diff --git a/api/src/main/java/org/opencord/igmpproxy/statemachine/StateMachineId.java b/api/src/main/java/org/opencord/igmpproxy/statemachine/StateMachineId.java
new file mode 100644
index 0000000..38d2bf1
--- /dev/null
+++ b/api/src/main/java/org/opencord/igmpproxy/statemachine/StateMachineId.java
@@ -0,0 +1,98 @@
+/*
+ * Copyright 2017-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.opencord.igmpproxy.statemachine;
+
+import com.google.common.base.MoreObjects;
+import org.onlab.packet.Ip4Address;
+import org.onosproject.net.DeviceId;
+
+import java.util.Objects;
+
+/**
+ * Identification of state machine.
+ */
+public final class StateMachineId {
+    private DeviceId deviceId;
+    private Ip4Address groupIp;
+
+    /**
+     * Constructor for serializer.
+     */
+    private StateMachineId() {
+        this.deviceId = null;
+        this.groupIp = null;
+    }
+
+    private StateMachineId(DeviceId deviceId, Ip4Address groupIp) {
+        this.deviceId = deviceId;
+        this.groupIp = groupIp;
+    }
+
+    /**
+     * Creates new state-machine identification using device-id and group-ip.
+     *
+     * @param deviceId device id of state-machie
+     * @param groupIp  group ip of state-machine
+     * @return created identification
+     */
+    public static StateMachineId of(DeviceId deviceId, Ip4Address groupIp) {
+        return new StateMachineId(deviceId, groupIp);
+    }
+
+    /**
+     * Returns device id of identification.
+     *
+     * @return device id
+     */
+    public DeviceId getDeviceId() {
+        return deviceId;
+    }
+
+    /**
+     * Returns group ip of identification.
+     *
+     * @return group ip
+     */
+    public Ip4Address getGroupIp() {
+        return groupIp;
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(this)
+                .add("deviceId", deviceId)
+                .add("groupIp", groupIp)
+                .toString();
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) {
+            return true;
+        }
+        if (o == null || getClass() != o.getClass()) {
+            return false;
+        }
+        StateMachineId that = (StateMachineId) o;
+        return Objects.equals(deviceId, that.deviceId) &&
+                Objects.equals(groupIp, that.groupIp);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(deviceId, groupIp);
+    }
+}
diff --git a/api/src/main/java/org/opencord/igmpproxy/statemachine/StateMachineIdSerializer.java b/api/src/main/java/org/opencord/igmpproxy/statemachine/StateMachineIdSerializer.java
new file mode 100644
index 0000000..f7c747e
--- /dev/null
+++ b/api/src/main/java/org/opencord/igmpproxy/statemachine/StateMachineIdSerializer.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2017-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.opencord.igmpproxy.statemachine;
+
+import com.esotericsoftware.kryo.Kryo;
+import com.esotericsoftware.kryo.Serializer;
+import com.esotericsoftware.kryo.io.Input;
+import com.esotericsoftware.kryo.io.Output;
+import org.onlab.packet.Ip4Address;
+import org.onosproject.net.DeviceId;
+
+/**
+ * Custom serializer for {@link StateMachineId}.
+ */
+public class StateMachineIdSerializer extends Serializer<StateMachineId> {
+    /**
+     * Creates serializer instance.
+     */
+    public StateMachineIdSerializer() {
+        // non-null, immutable
+        super(false, true);
+    }
+
+    @Override
+    public void write(Kryo kryo, Output output, StateMachineId stateMachineId) {
+        output.writeString(stateMachineId.getDeviceId().toString());
+        kryo.writeClassAndObject(output, stateMachineId.getGroupIp());
+    }
+
+    @Override
+    public StateMachineId read(Kryo kryo, Input input, Class<StateMachineId> aClass) {
+        DeviceId deviceId = DeviceId.deviceId(input.readString());
+        Ip4Address groupIp = (Ip4Address) kryo.readClassAndObject(input);
+        return StateMachineId.of(deviceId, groupIp);
+    }
+}
\ No newline at end of file
diff --git a/api/src/main/java/org/opencord/igmpproxy/statemachine/StateMachineService.java b/api/src/main/java/org/opencord/igmpproxy/statemachine/StateMachineService.java
new file mode 100644
index 0000000..c8ed49e
--- /dev/null
+++ b/api/src/main/java/org/opencord/igmpproxy/statemachine/StateMachineService.java
@@ -0,0 +1,88 @@
+/*
+ * Copyright 2017-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.opencord.igmpproxy.statemachine;
+
+import org.onlab.packet.Ip4Address;
+import org.onosproject.net.DeviceId;
+import org.onosproject.net.PortNumber;
+
+/**
+ * Manage State Machine and Igmp Timer.
+ */
+public interface StateMachineService {
+
+    /**
+     * Makes the requirements of igmp-join request.
+     *
+     * @param devId      device id of connect point
+     * @param groupIp    group ip of igmp group
+     * @param srcIP      source ip of device
+     * @param upLinkPort uplink port of device
+     * @return if this is first join from the device and group-ip return true
+     */
+    boolean join(DeviceId devId, Ip4Address groupIp, Ip4Address srcIP, PortNumber upLinkPort);
+
+    /**
+     * Makes the requirements of igmp-leave request.
+     *
+     * @param devId   device id of connect point
+     * @param groupIp group ip of group-member
+     * @return If there are no more members of that device and group returns true
+     */
+    boolean leave(DeviceId devId, Ip4Address groupIp);
+
+    /**
+     * clear map of state-machine.
+     */
+    void clearAllMaps();
+
+    /**
+     * Makes the requirements of special query.
+     *
+     * @param devId   device id
+     * @param groupIp group ip of igmp group
+     * @param maxResp maximum resp of igmp
+     */
+    void specialQuery(DeviceId devId, Ip4Address groupIp, int maxResp);
+
+    /**
+     * Makes the requirements of igmp-query request.
+     *
+     * @param devId   device id
+     * @param maxResp maximum resp of igmp
+     */
+    void generalQuery(DeviceId devId, int maxResp);
+
+    /**
+     * Makes the requirements of igmp-query request.
+     *
+     * @param maxResp maximum resp of igmp
+     */
+    void generalQuery(int maxResp);
+
+    /**
+     * Makes the requirements of timeout.
+     *
+     * @param devId   device id
+     * @param groupIp group ip of igmp group
+     */
+    void timeOut(DeviceId devId, Ip4Address groupIp);
+
+    /**
+     * Checks all state-machines periodically.
+     */
+    void timeOut1s();
+}
diff --git a/api/src/main/java/org/opencord/igmpproxy/statemachine/package-info.java b/api/src/main/java/org/opencord/igmpproxy/statemachine/package-info.java
new file mode 100644
index 0000000..3270750
--- /dev/null
+++ b/api/src/main/java/org/opencord/igmpproxy/statemachine/package-info.java
@@ -0,0 +1,20 @@
+/*
+ * Copyright 2017-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * Package of state machine.
+ */
+package org.opencord.igmpproxy.statemachine;
\ No newline at end of file
