diff --git a/utils/misc/src/main/java/org/onlab/packet/lacp/Lacp.java b/utils/misc/src/main/java/org/onlab/packet/lacp/Lacp.java
new file mode 100644
index 0000000..0124b7f
--- /dev/null
+++ b/utils/misc/src/main/java/org/onlab/packet/lacp/Lacp.java
@@ -0,0 +1,196 @@
+/*
+ * Copyright 2018-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.onlab.packet.lacp;
+
+import com.google.common.collect.ImmutableMap;
+import org.onlab.packet.BasePacket;
+import org.onlab.packet.DeserializationException;
+import org.onlab.packet.Deserializer;
+
+import java.nio.ByteBuffer;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Optional;
+import java.util.concurrent.ConcurrentHashMap;
+
+import static com.google.common.base.MoreObjects.toStringHelper;
+import static org.onlab.packet.PacketUtils.checkInput;
+
+public class Lacp extends BasePacket {
+    public static final int HEADER_LENGTH = 1;
+    public static final byte TYPE_ACTOR = 1;
+    public static final byte TYPE_PARTNER = 2;
+    public static final byte TYPE_COLLECTOR = 3;
+    public static final byte TYPE_TERMINATOR = 0;
+
+    private static final Map<Byte, Deserializer<? extends LacpTlv>> PROTOCOL_DESERIALIZER_MAP =
+            ImmutableMap.<Byte, Deserializer<? extends LacpTlv>>builder()
+                    .put(TYPE_ACTOR, LacpBaseTlv.deserializer())
+                    .put(TYPE_PARTNER, LacpBaseTlv.deserializer())
+                    .put(TYPE_COLLECTOR, LacpCollectorTlv.deserializer())
+                    .put(TYPE_TERMINATOR, LacpTerminatorTlv.deserializer())
+                    .build();
+
+    private byte lacpVersion;
+    private Map<Byte, LacpTlv> tlv = new ConcurrentHashMap<>();
+
+    /**
+     * Gets LACP version.
+     *
+     * @return LACP version
+     */
+    public byte getLacpVersion() {
+        return this.lacpVersion;
+    }
+
+    /**
+     * Sets LACP version.
+     *
+     * @param lacpVersion LACP version
+     * @return this
+     */
+    public Lacp setLacpVersion(byte lacpVersion) {
+        this.lacpVersion = lacpVersion;
+        return this;
+    }
+
+    /**
+     * Gets LACP TLV.
+     *
+     * @return LACP TLV
+     */
+    public Map<Byte, LacpTlv> getTlv() {
+        return this.tlv;
+    }
+
+    /**
+     * Sets LACP TLV.
+     *
+     * @param tlv LACP TLV
+     * @return this
+     */
+    public Lacp setTlv(Map<Byte, LacpTlv> tlv) {
+        this.tlv = tlv;
+        return this;
+    }
+
+    /**
+     * Deserializer function for LACP packets.
+     *
+     * @return deserializer function
+     */
+    public static Deserializer<Lacp> deserializer() {
+        return (data, offset, length) -> {
+            checkInput(data, offset, length, HEADER_LENGTH);
+
+            Lacp lacp = new Lacp();
+            ByteBuffer bb = ByteBuffer.wrap(data, offset, length);
+            lacp.setLacpVersion(bb.get());
+
+            while (bb.limit() - bb.position() > 0) {
+                byte nextType = bb.get();
+                int nextLength = Byte.toUnsignedInt(bb.get());
+                int parseLength = nextLength == 0 ?
+                        LacpTerminatorTlv.PADDING_LENGTH : // Special case for LacpTerminatorTlv
+                        nextLength - 2;
+
+                Deserializer<? extends LacpTlv> deserializer;
+                if (Lacp.PROTOCOL_DESERIALIZER_MAP.containsKey(nextType)) {
+                    deserializer = Lacp.PROTOCOL_DESERIALIZER_MAP.get(nextType);
+                } else {
+                    throw new DeserializationException("Unsupported LACP subtype " + Byte.toString(nextType));
+                }
+
+                LacpTlv tlv = deserializer.deserialize(data, bb.position(), parseLength);
+                LacpTlv previousTlv = lacp.tlv.put(nextType, tlv);
+                if (previousTlv != null) {
+                    throw new DeserializationException("Duplicated type " + Byte.toString(nextType)
+                            + "in LACP TLV");
+                }
+
+                bb.position(bb.position() + parseLength);
+            }
+
+            return lacp;
+        };
+    }
+
+    @Override
+    public byte[] serialize() {
+        byte[] actorInfo = Optional.ofNullable(tlv.get(TYPE_ACTOR)).map(LacpTlv::serialize)
+                .orElse(new byte[0]);
+        byte[] partnerInfo = Optional.ofNullable(tlv.get(TYPE_PARTNER)).map(LacpTlv::serialize)
+                .orElse(new byte[0]);
+        byte[] collectorInfo = Optional.ofNullable(tlv.get(TYPE_COLLECTOR)).map(LacpTlv::serialize)
+                .orElse(new byte[0]);
+        byte[] terminatorInfo = Optional.ofNullable(tlv.get(TYPE_TERMINATOR)).map(LacpTlv::serialize)
+                .orElse(new byte[0]);
+
+        final byte[] data = new byte[HEADER_LENGTH
+                + LacpTlv.HEADER_LENGTH + actorInfo.length
+                + LacpTlv.HEADER_LENGTH + partnerInfo.length
+                + LacpTlv.HEADER_LENGTH + collectorInfo.length
+                + LacpTlv.HEADER_LENGTH + terminatorInfo.length];
+
+        final ByteBuffer bb = ByteBuffer.wrap(data);
+        bb.put(lacpVersion);
+        bb.put(TYPE_ACTOR);
+        bb.put(LacpBaseTlv.LENGTH);
+        bb.put(actorInfo);
+        bb.put(TYPE_PARTNER);
+        bb.put(LacpBaseTlv.LENGTH);
+        bb.put(partnerInfo);
+        bb.put(TYPE_COLLECTOR);
+        bb.put(LacpCollectorTlv.LENGTH);
+        bb.put(collectorInfo);
+        bb.put(TYPE_TERMINATOR);
+        bb.put(LacpTerminatorTlv.LENGTH);
+        bb.put(terminatorInfo);
+
+        return data;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(super.hashCode(), lacpVersion, tlv);
+    }
+
+    @Override
+    public boolean equals(final Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (!super.equals(obj)) {
+            return false;
+        }
+        if (!(obj instanceof Lacp)) {
+            return false;
+        }
+        final Lacp other = (Lacp) obj;
+
+        return this.lacpVersion == other.lacpVersion &&
+                Objects.equals(this.tlv, other.tlv);
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(getClass())
+                .add("lacpVersion", Byte.toString(lacpVersion))
+                .add("tlv", tlv)
+                .toString();
+    }
+}
diff --git a/utils/misc/src/main/java/org/onlab/packet/lacp/LacpBaseTlv.java b/utils/misc/src/main/java/org/onlab/packet/lacp/LacpBaseTlv.java
new file mode 100644
index 0000000..5a4a0c9
--- /dev/null
+++ b/utils/misc/src/main/java/org/onlab/packet/lacp/LacpBaseTlv.java
@@ -0,0 +1,239 @@
+/*
+ * Copyright 2018-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.onlab.packet.lacp;
+
+import org.onlab.packet.Deserializer;
+import org.onlab.packet.MacAddress;
+
+import java.nio.ByteBuffer;
+import java.util.Objects;
+
+import static com.google.common.base.MoreObjects.toStringHelper;
+import static org.onlab.packet.PacketUtils.checkInput;
+
+/**
+ * Represents LACP ActorInfo or PartnerInfo information.
+ */
+public class LacpBaseTlv extends LacpTlv {
+    public static final byte LENGTH = 20;
+    private static final byte[] RESERVED = new byte[3];
+
+    private short systemPriority;
+    private MacAddress systemMac;
+    private short key;
+    private short portPriority;
+    private short port;
+    private LacpState state;
+
+    /**
+     * Gets system priority.
+     *
+     * @return system priority
+     */
+    public short getSystemPriority() {
+        return systemPriority;
+    }
+
+    /**
+     * Sets system priority.
+     *
+     * @param systemPriority system priority
+     * @return this
+     */
+    public LacpBaseTlv setSystemPriority(short systemPriority) {
+        this.systemPriority = systemPriority;
+        return this;
+    }
+
+    /**
+     * Gets system MAC address.
+     *
+     * @return system MAC address
+     */
+    public MacAddress getSystemMac() {
+        return systemMac;
+    }
+
+    /**
+     * Sets system MAC address.
+     *
+     * @param systemMac system MAC
+     * @return this
+     */
+    public LacpBaseTlv setSystemMac(MacAddress systemMac) {
+        this.systemMac = systemMac;
+        return this;
+    }
+
+    /**
+     * Gets key.
+     *
+     * @return key
+     */
+    public short getKey() {
+        return key;
+    }
+
+    /**
+     * Sets key.
+     *
+     * @param key key
+     * @return this
+     */
+    public LacpBaseTlv setKey(short key) {
+        this.key = key;
+        return this;
+    }
+
+    /**
+     * Gets port priority.
+     *
+     * @return port priority
+     */
+    public short getPortPriority() {
+        return portPriority;
+    }
+
+    /**
+     * Sets port priority.
+     *
+     * @param portPriority port priority
+     * @return this
+     */
+    public LacpBaseTlv setPortPriority(short portPriority) {
+        this.portPriority = portPriority;
+        return this;
+    }
+
+    /**
+     * Gets port.
+     *
+     * @return port
+     */
+    public short getPort() {
+        return port;
+    }
+
+    /**
+     * Sets port.
+     *
+     * @param port port
+     * @return this
+     */
+    public LacpBaseTlv setPort(short port) {
+        this.port = port;
+        return this;
+    }
+
+    /**
+     * Gets state.
+     *
+     * @return state
+     */
+    public LacpState getState() {
+        return state;
+    }
+
+    /**
+     * Sets state.
+     *
+     * @param state state
+     * @return this
+     */
+    public LacpBaseTlv setState(byte state) {
+        this.state = new LacpState(state);
+        return this;
+    }
+
+    /**
+     * Deserializer function for LacpBaseTlv packets.
+     *
+     * @return deserializer function
+     */
+    public static Deserializer<LacpBaseTlv> deserializer() {
+        return (data, offset, length) -> {
+            checkInput(data, offset, length, LENGTH - HEADER_LENGTH);
+
+            LacpBaseTlv lacpBaseTlv = new LacpBaseTlv();
+            ByteBuffer bb = ByteBuffer.wrap(data, offset, length);
+
+            lacpBaseTlv.setSystemPriority(bb.getShort());
+            byte[] mac = new byte[6];
+            bb.get(mac);
+            lacpBaseTlv.setSystemMac(MacAddress.valueOf(mac));
+            lacpBaseTlv.setKey(bb.getShort());
+            lacpBaseTlv.setPortPriority(bb.getShort());
+            lacpBaseTlv.setPort(bb.getShort());
+            lacpBaseTlv.setState(bb.get());
+
+            return lacpBaseTlv;
+        };
+    }
+
+    @Override
+    public byte[] serialize() {
+        final byte[] data = new byte[LENGTH - HEADER_LENGTH];
+
+        final ByteBuffer bb = ByteBuffer.wrap(data);
+        bb.putShort(this.systemPriority);
+        bb.put(this.systemMac.toBytes());
+        bb.putShort(this.key);
+        bb.putShort(this.portPriority);
+        bb.putShort(this.port);
+        bb.put(this.state.toByte());
+        bb.put(RESERVED);
+
+        return data;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (!super.equals(obj)) {
+            return false;
+        }
+        if (!(obj instanceof LacpBaseTlv)) {
+            return false;
+        }
+        final LacpBaseTlv other = (LacpBaseTlv) obj;
+        return systemPriority == other.systemPriority &&
+                key == other.key &&
+                portPriority == other.portPriority &&
+                port == other.port &&
+                Objects.equals(state, other.state) &&
+                Objects.equals(systemMac, other.systemMac);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(super.hashCode(), systemPriority, systemMac, key,
+                portPriority, port, state);
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(getClass())
+                .add("systemPriority", Short.toString(systemPriority))
+                .add("systemMac", systemMac.toString())
+                .add("key", Short.toString(key))
+                .add("portPriority", Short.toString(portPriority))
+                .add("port", Short.toString(port))
+                .add("state", state.toString())
+                .toString();
+    }
+}
diff --git a/utils/misc/src/main/java/org/onlab/packet/lacp/LacpCollectorTlv.java b/utils/misc/src/main/java/org/onlab/packet/lacp/LacpCollectorTlv.java
new file mode 100644
index 0000000..e2d7039
--- /dev/null
+++ b/utils/misc/src/main/java/org/onlab/packet/lacp/LacpCollectorTlv.java
@@ -0,0 +1,111 @@
+/*
+ * Copyright 2018-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.onlab.packet.lacp;
+
+import com.google.common.base.Objects;
+import org.onlab.packet.Deserializer;
+
+import java.nio.ByteBuffer;
+
+import static com.google.common.base.MoreObjects.toStringHelper;
+import static org.onlab.packet.PacketUtils.checkInput;
+
+/**
+ * Represents LACP collector information.
+ */
+public class LacpCollectorTlv extends LacpTlv {
+    public static final byte LENGTH = 16;
+    private static final byte[] RESERVED = new byte[12];
+
+    private short collectorMaxDelay;
+
+    /**
+     * Gets collector max delay.
+     *
+     * @return collector max delay
+     */
+    public short getCollectorMaxDelay() {
+        return collectorMaxDelay;
+    }
+
+    /**
+     * Sets collector max delay.
+     *
+     * @param collectorMaxDelay collector max delay
+     * @return this
+     */
+    public LacpCollectorTlv setCollectorMaxDelay(short collectorMaxDelay) {
+        this.collectorMaxDelay = collectorMaxDelay;
+        return this;
+    }
+
+    /**
+     * Deserializer function for LacpCollectorTlv packets.
+     *
+     * @return deserializer function
+     */
+    public static Deserializer<LacpCollectorTlv> deserializer() {
+        return (data, offset, length) -> {
+            checkInput(data, offset, length, LENGTH - HEADER_LENGTH);
+
+            LacpCollectorTlv lacpCollectorTlv = new LacpCollectorTlv();
+            ByteBuffer bb = ByteBuffer.wrap(data, offset, length);
+
+            lacpCollectorTlv.setCollectorMaxDelay(bb.getShort());
+
+            return lacpCollectorTlv;
+        };
+    }
+
+    @Override
+    public byte[] serialize() {
+        final byte[] data = new byte[LENGTH - HEADER_LENGTH];
+
+        final ByteBuffer bb = ByteBuffer.wrap(data);
+        bb.putShort(this.collectorMaxDelay);
+        bb.put(RESERVED);
+
+        return data;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (!super.equals(obj)) {
+            return false;
+        }
+        if (!(obj instanceof LacpCollectorTlv)) {
+            return false;
+        }
+        final LacpCollectorTlv other = (LacpCollectorTlv) obj;
+        return this.collectorMaxDelay == other.collectorMaxDelay;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hashCode(super.hashCode(), collectorMaxDelay);
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(getClass())
+                .add("collectorMaxDelay", Short.toString(collectorMaxDelay))
+                .toString();
+    }
+}
diff --git a/utils/misc/src/main/java/org/onlab/packet/lacp/LacpState.java b/utils/misc/src/main/java/org/onlab/packet/lacp/LacpState.java
new file mode 100644
index 0000000..bd3a5ae
--- /dev/null
+++ b/utils/misc/src/main/java/org/onlab/packet/lacp/LacpState.java
@@ -0,0 +1,280 @@
+/*
+ * Copyright 2018-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.onlab.packet.lacp;
+
+import java.util.Objects;
+
+/**
+ * LACP state.
+ */
+public class LacpState {
+    private static final byte MASK_ACTIVE = 0x1;
+    private static final byte MASK_TIMEOUT = 0x2;
+    private static final byte MASK_AGG = 0x4;
+    private static final byte MASK_SYNC = 0x8;
+    private static final byte MASK_COLLECTING = 0x10;
+    private static final byte MASK_DISTRIBUTING = 0x20;
+    private static final byte MASK_DEFAULT = 0x40;
+    private static final byte MASK_EXPIRED = (byte) 0x80;
+
+    private byte state;
+
+    /**
+     * Constructs LACP state with zero value.
+     */
+    public LacpState() {
+        this.state = 0;
+    }
+
+    /**
+     * Constructs LACP state with given value.
+     *
+     * @param state state in byte.
+     */
+    public LacpState(byte state) {
+        this.state = state;
+    }
+
+    /**
+     * Gets LACP state in byte.
+     *
+     * @return LACP state
+     */
+    public byte toByte() {
+        return state;
+    }
+
+    /**
+     * Checks if this state has the active flag set.
+     *
+     * @return true if this state has the active flag set.
+     */
+    public boolean isActive() {
+        return (state & MASK_ACTIVE) != 0;
+    }
+
+    /**
+     * Sets active bit.
+     *
+     * @param value desired value
+     * @return this
+     */
+    public LacpState setActive(boolean value) {
+        setBit(MASK_ACTIVE, value);
+        return this;
+    }
+
+    /**
+     * Checks if this state has the timeout flag set. Timeout flag indicates short timeout if set.
+     *
+     * @return true if this state has the timeout flag set.
+     */
+    public boolean isTimeout() {
+        return (state & MASK_TIMEOUT) != 0;
+    }
+
+    /**
+     * Sets timeout bit.
+     *
+     * @param value desired value
+     * @return this
+     */
+    public LacpState setTimeout(boolean value) {
+        setBit(MASK_TIMEOUT, value);
+        return this;
+    }
+
+    /**
+     * Checks if this state has the aggregatable flag set.
+     *
+     * @return true if this state has the aggregatable flag set.
+     */
+    public boolean isAggregatable() {
+        return (state & MASK_AGG) != 0;
+    }
+
+    /**
+     * Sets aggregatable bit.
+     *
+     * @param value desired value
+     * @return this
+     */
+    public LacpState setAggregatable(boolean value) {
+        setBit(MASK_AGG, value);
+        return this;
+    }
+
+    /**
+     * Checks if this state has the synchronization flag set.
+     *
+     * @return true if this state has the synchronization flag set.
+     */
+    public boolean isSync() {
+        return (state & MASK_SYNC) != 0;
+    }
+
+    /**
+     * Sets sync bit.
+     *
+     * @param value desired value
+     * @return this
+     */
+    public LacpState setSync(boolean value) {
+        setBit(MASK_SYNC, value);
+        return this;
+    }
+
+    /**
+     * Checks if this state has the collecting flag set.
+     *
+     * @return true if this state has the collecting flag set.
+     */
+    public boolean isCollecting() {
+        return (state & MASK_COLLECTING) != 0;
+    }
+
+    /**
+     * Sets collecting bit.
+     *
+     * @param value desired value
+     * @return this
+     */
+    public LacpState setCollecting(boolean value) {
+        setBit(MASK_COLLECTING, value);
+        return this;
+    }
+
+    /**
+     * Checks if this state has the distributing flag set.
+     *
+     * @return true if this state has the distributing flag set.
+     */
+    public boolean isDistributing() {
+        return (state & MASK_DISTRIBUTING) != 0;
+    }
+
+    /**
+     * Sets distributing bit.
+     *
+     * @param value desired value
+     * @return this
+     */
+    public LacpState setDistributing(boolean value) {
+        setBit(MASK_DISTRIBUTING, value);
+        return this;
+    }
+
+    /**
+     * Checks if this state has the default flag set.
+     *
+     * @return true if this state has the default flag set.
+     */
+    public boolean isDefault() {
+        return (state & MASK_DEFAULT) != 0;
+    }
+
+    /**
+     * Sets default bit.
+     *
+     * @param value desired value
+     * @return this
+     */
+    public LacpState setDefault(boolean value) {
+        setBit(MASK_DEFAULT, value);
+        return this;
+    }
+
+    /**
+     * Checks if this state has the expired flag set.
+     *
+     * @return true if this state has the expired flag set.
+     */
+    public boolean isExpired() {
+        return (state & MASK_EXPIRED) != 0;
+    }
+
+    /**
+     * Sets expired bit.
+     *
+     * @param value desired value
+     * @return this
+     */
+    public LacpState setExpired(boolean value) {
+        setBit(MASK_EXPIRED, value);
+        return this;
+    }
+
+    /**
+     * Sets the bit masked by given mask in the state to desired value.
+     *
+     * @param mask bit to mask
+     * @param value desire value
+     */
+    private void setBit(byte mask, boolean value) {
+        state = (byte) (value ? state | mask : state & ~mask);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (!(obj instanceof LacpState)) {
+            return false;
+        }
+        final LacpState other = (LacpState) obj;
+
+        return this.state == other.state;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(state);
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder builder = new StringBuilder();
+        builder.append("{ ");
+        if (isActive()) {
+            builder.append("ACT ");
+        }
+        if (isTimeout()) {
+            builder.append("STO ");
+        }
+        if (isAggregatable()) {
+            builder.append("AGG ");
+        }
+        if (isSync()) {
+            builder.append("SYN ");
+        }
+        if (isCollecting()) {
+            builder.append("COL ");
+        }
+        if (isDistributing()) {
+            builder.append("DIS ");
+        }
+        if (isDefault()) {
+            builder.append("DEF ");
+        }
+        if (isExpired()) {
+            builder.append("EXP ");
+        }
+        builder.append("}");
+        return builder.toString();
+    }
+}
diff --git a/utils/misc/src/main/java/org/onlab/packet/lacp/LacpTerminatorTlv.java b/utils/misc/src/main/java/org/onlab/packet/lacp/LacpTerminatorTlv.java
new file mode 100644
index 0000000..2afd50a
--- /dev/null
+++ b/utils/misc/src/main/java/org/onlab/packet/lacp/LacpTerminatorTlv.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright 2018-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.onlab.packet.lacp;
+
+import org.onlab.packet.Deserializer;
+
+import java.nio.ByteBuffer;
+
+import static com.google.common.base.MoreObjects.toStringHelper;
+import static org.onlab.packet.PacketUtils.checkInput;
+
+/**
+ * Represents LACP terminator information.
+ */
+public class LacpTerminatorTlv extends LacpTlv {
+    public static final byte LENGTH = 0;
+    static final byte PADDING_LENGTH = 50;
+    private static final byte[] PADDING = new byte[PADDING_LENGTH];
+
+    /**
+     * Deserializer function for LacpTerminatorTlv packets.
+     *
+     * @return deserializer function
+     */
+    public static Deserializer<LacpTerminatorTlv> deserializer() {
+        return (data, offset, length) -> {
+            checkInput(data, offset, length, LENGTH);
+
+            return new LacpTerminatorTlv();
+        };
+    }
+
+    @Override
+    public byte[] serialize() {
+        final byte[] data = new byte[LENGTH + PADDING_LENGTH];
+
+        final ByteBuffer bb = ByteBuffer.wrap(data);
+        bb.put(PADDING);
+
+        return data;
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(getClass()).toString();
+    }
+}
\ No newline at end of file
diff --git a/utils/misc/src/main/java/org/onlab/packet/lacp/LacpTlv.java b/utils/misc/src/main/java/org/onlab/packet/lacp/LacpTlv.java
new file mode 100644
index 0000000..dedb095
--- /dev/null
+++ b/utils/misc/src/main/java/org/onlab/packet/lacp/LacpTlv.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright 2018-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.onlab.packet.lacp;
+
+import org.onlab.packet.BasePacket;
+
+public abstract class LacpTlv extends BasePacket {
+    public static final byte HEADER_LENGTH = 2;
+}
diff --git a/utils/misc/src/main/java/org/onlab/packet/lacp/package-info.java b/utils/misc/src/main/java/org/onlab/packet/lacp/package-info.java
new file mode 100644
index 0000000..f7f7bfe
--- /dev/null
+++ b/utils/misc/src/main/java/org/onlab/packet/lacp/package-info.java
@@ -0,0 +1,20 @@
+/*
+ * Copyright 2018-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.
+ */
+
+/**
+ * Utilities for decoding and encoding LACP packets.
+ */
+package org.onlab.packet.lacp;
\ No newline at end of file
