BGP Route policy distribution and flow spec

Change-Id: I8903efd225a24db6ccc85a4a3148a4dd6076e042
diff --git a/apps/bgpflowspec/flowapi/BUCK b/apps/bgpflowspec/flowapi/BUCK
new file mode 100755
index 0000000..2686bce
--- /dev/null
+++ b/apps/bgpflowspec/flowapi/BUCK
@@ -0,0 +1,19 @@
+COMPILE_DEPS = [
+    '//utils/osgi:onlab-osgi',
+    '//utils/misc:onlab-misc',
+    '//lib:commons-io',
+    '//lib:guava',
+    '//lib:kryo',
+    '//lib:slf4j-api',
+]
+
+TEST_DEPS = [
+    '//lib:TEST_ADAPTERS',
+]
+
+osgi_jar_with_tests (
+    name = 'onos-apps-bgpflowspec-flowapi',
+    deps = COMPILE_DEPS,
+    test_deps = TEST_DEPS,
+    visibility = ['PUBLIC'],
+)
diff --git a/apps/bgpflowspec/flowapi/pom.xml b/apps/bgpflowspec/flowapi/pom.xml
new file mode 100755
index 0000000..01cb23b
--- /dev/null
+++ b/apps/bgpflowspec/flowapi/pom.xml
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ Copyright 2016-present 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.
+  -->
+<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/maven-v4_0_0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.onosproject</groupId>
+        <artifactId>onos-app-bgpflow</artifactId>
+        <version>1.6.0-SNAPSHOT</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <artifactId>onos-app-bgp-flowapi</artifactId>
+    <packaging>bundle</packaging>
+
+    <description>api bundle to be accessible across the layers</description>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.onosproject</groupId>
+            <artifactId>onlab-misc</artifactId>
+            <version>1.6.0-SNAPSHOT</version>
+        </dependency>
+        <dependency>
+            <groupId>com.google.guava</groupId>
+            <artifactId>guava-testlib</artifactId>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+
+</project>
diff --git a/apps/bgpflowspec/flowapi/src/main/java/org/onosproject/flowapi/DefaultExtDscpValue.java b/apps/bgpflowspec/flowapi/src/main/java/org/onosproject/flowapi/DefaultExtDscpValue.java
new file mode 100755
index 0000000..987c455
--- /dev/null
+++ b/apps/bgpflowspec/flowapi/src/main/java/org/onosproject/flowapi/DefaultExtDscpValue.java
@@ -0,0 +1,111 @@
+/*
+ * Copyright 2016-present 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.flowapi;
+
+import java.util.List;
+import java.util.Objects;
+
+import static com.google.common.base.MoreObjects.toStringHelper;
+import static com.google.common.base.Preconditions.checkNotNull;
+
+/**
+ * DSCP value extension implementation.
+ */
+public class DefaultExtDscpValue implements ExtDscpValue {
+
+    private List<ExtOperatorValue> dscpValue;
+    private ExtType type;
+
+    /**
+     * Creates an object of type DefaultExtDscpValue which contains dscp operator value list.
+     *
+     * @param dscpValue is a dscp value rule list
+     * @param type ExtType type
+     */
+    DefaultExtDscpValue(List<ExtOperatorValue> dscpValue, ExtType type) {
+        this.dscpValue = dscpValue;
+        this.type = type;
+    }
+
+    @Override
+    public ExtType type() {
+        return type;
+    }
+
+    @Override
+    public List<ExtOperatorValue> dscpValue() {
+        return dscpValue;
+    }
+
+    @Override
+    public boolean exactMatch(ExtDscpValue value) {
+        return this.equals(value) &&
+                Objects.equals(this.dscpValue, value.dscpValue())
+                && Objects.equals(this.type, value.type());
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(dscpValue, type);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj instanceof DefaultExtDscpValue) {
+            DefaultExtDscpValue that = (DefaultExtDscpValue) obj;
+            return Objects.equals(dscpValue, that.dscpValue())
+                    && Objects.equals(this.type, that.type());
+        }
+        return false;
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(this)
+                .add("dscpValue", dscpValue.toString())
+                .add("type", type.toString())
+                .toString();
+    }
+
+    /**
+     * Builder class for extension dscp value.
+     */
+    public static class Builder implements ExtDscpValue.Builder {
+        private List<ExtOperatorValue> dscpValue;
+        private ExtType type;
+
+        @Override
+        public Builder setDscpValue(List<ExtOperatorValue> dscpValue) {
+            this.dscpValue = dscpValue;
+            return this;
+        }
+
+        @Override
+        public Builder setType(ExtType type) {
+            this.type = type;
+            return this;
+        }
+
+        @Override
+        public ExtDscpValue build() {
+            checkNotNull(dscpValue, "dscpValue cannot be null");
+            return new DefaultExtDscpValue(dscpValue, type);
+        }
+    }
+}
diff --git a/apps/bgpflowspec/flowapi/src/main/java/org/onosproject/flowapi/DefaultExtFragment.java b/apps/bgpflowspec/flowapi/src/main/java/org/onosproject/flowapi/DefaultExtFragment.java
new file mode 100755
index 0000000..fba5446
--- /dev/null
+++ b/apps/bgpflowspec/flowapi/src/main/java/org/onosproject/flowapi/DefaultExtFragment.java
@@ -0,0 +1,111 @@
+/*
+ * Copyright 2016-present 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.flowapi;
+
+import java.util.List;
+import java.util.Objects;
+
+import static com.google.common.base.MoreObjects.toStringHelper;
+import static com.google.common.base.Preconditions.checkNotNull;
+
+/**
+ * Fragment extension implementation.
+ */
+public class DefaultExtFragment implements ExtFragment {
+
+    private List<ExtOperatorValue> fragment;
+    private ExtType type;
+
+    /**
+     * Creates an object of type DefaultExtFragment which contains fragment operator value list.
+     *
+     * @param fragment is a fragment value rule list
+     * @param type ExtType type
+     */
+    DefaultExtFragment(List<ExtOperatorValue> fragment, ExtType type) {
+        this.fragment = fragment;
+        this.type = type;
+    }
+
+    @Override
+    public ExtType type() {
+        return type;
+    }
+
+    @Override
+    public List<ExtOperatorValue> fragment() {
+        return fragment;
+    }
+
+    @Override
+    public boolean exactMatch(ExtFragment value) {
+        return this.equals(value) &&
+                Objects.equals(this.fragment, value.fragment())
+                && Objects.equals(this.type, value.type());
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(fragment, type);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj instanceof DefaultExtFragment) {
+            DefaultExtFragment that = (DefaultExtFragment) obj;
+            return Objects.equals(fragment, that.fragment())
+                    && Objects.equals(this.type, that.type());
+        }
+        return false;
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(this)
+                .add("fragment", fragment.toString())
+                .add("type", type.toString())
+                .toString();
+    }
+
+    /**
+     * Builder class for extension fragment value.
+     */
+    public static class Builder implements ExtFragment.Builder {
+        private List<ExtOperatorValue> fragment;
+        private ExtType type;
+
+        @Override
+        public Builder setFragment(List<ExtOperatorValue> fragment) {
+            this.fragment = fragment;
+            return this;
+        }
+
+        @Override
+        public Builder setType(ExtType type) {
+            this.type = type;
+            return this;
+        }
+
+        @Override
+        public ExtFragment build() {
+            checkNotNull(fragment, "fragment cannot be null");
+            return new DefaultExtFragment(fragment, type);
+        }
+    }
+}
diff --git a/apps/bgpflowspec/flowapi/src/main/java/org/onosproject/flowapi/DefaultExtIcmpCode.java b/apps/bgpflowspec/flowapi/src/main/java/org/onosproject/flowapi/DefaultExtIcmpCode.java
new file mode 100755
index 0000000..46632d5
--- /dev/null
+++ b/apps/bgpflowspec/flowapi/src/main/java/org/onosproject/flowapi/DefaultExtIcmpCode.java
@@ -0,0 +1,111 @@
+/*
+ * Copyright 2016-present 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.flowapi;
+
+import java.util.List;
+import java.util.Objects;
+
+import static com.google.common.base.MoreObjects.toStringHelper;
+import static com.google.common.base.Preconditions.checkNotNull;
+
+/**
+ * Icmp code extension implementation.
+ */
+public class DefaultExtIcmpCode implements ExtIcmpCode {
+
+    private List<ExtOperatorValue> icmpCode;
+    private ExtType type;
+
+    /**
+     * Creates an object of type DefaultExtIcmpCode which contains ICMP code operator value list.
+     *
+     * @param icmpCode is a icmp code rule list
+     * @param type ExtType type
+     */
+    DefaultExtIcmpCode(List<ExtOperatorValue> icmpCode, ExtType type) {
+        this.icmpCode = icmpCode;
+        this.type = type;
+    }
+
+    @Override
+    public ExtType type() {
+        return type;
+    }
+
+    @Override
+    public List<ExtOperatorValue> icmpCode() {
+        return icmpCode;
+    }
+
+    @Override
+    public boolean exactMatch(ExtIcmpCode icmpCode) {
+        return this.equals(icmpCode) &&
+                Objects.equals(this.icmpCode, icmpCode.icmpCode())
+                && Objects.equals(this.type, icmpCode.type());
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(icmpCode, type);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj instanceof DefaultExtIcmpCode) {
+            DefaultExtIcmpCode that = (DefaultExtIcmpCode) obj;
+            return Objects.equals(icmpCode, that.icmpCode())
+                    && Objects.equals(this.type, that.type());
+        }
+        return false;
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(this)
+                .add("icmpCode", icmpCode.toString())
+                .add("type", type.toString())
+                .toString();
+    }
+
+    /**
+     * Builder class for extension icmp type.
+     */
+    public static class Builder implements ExtIcmpCode.Builder {
+        private List<ExtOperatorValue> icmpCode;
+        private ExtType type;
+
+        @Override
+        public Builder setIcmpCode(List<ExtOperatorValue> icmpCode) {
+            this.icmpCode = icmpCode;
+            return this;
+        }
+
+        @Override
+        public Builder setType(ExtType type) {
+            this.type = type;
+            return this;
+        }
+
+        @Override
+        public ExtIcmpCode build() {
+            checkNotNull(icmpCode, "icmpCode cannot be null");
+            return new DefaultExtIcmpCode(icmpCode, type);
+        }
+    }
+}
diff --git a/apps/bgpflowspec/flowapi/src/main/java/org/onosproject/flowapi/DefaultExtIcmpType.java b/apps/bgpflowspec/flowapi/src/main/java/org/onosproject/flowapi/DefaultExtIcmpType.java
new file mode 100755
index 0000000..3b5d723
--- /dev/null
+++ b/apps/bgpflowspec/flowapi/src/main/java/org/onosproject/flowapi/DefaultExtIcmpType.java
@@ -0,0 +1,111 @@
+/*
+ * Copyright 2016-present 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.flowapi;
+
+import java.util.List;
+import java.util.Objects;
+
+import static com.google.common.base.MoreObjects.toStringHelper;
+import static com.google.common.base.Preconditions.checkNotNull;
+
+/**
+ * Icmp type extension implementation.
+ */
+public class DefaultExtIcmpType implements ExtIcmpType {
+
+    private List<ExtOperatorValue> icmpType;
+    private ExtType type;
+
+    /**
+     * Creates an object of type DefaultExtIcmpType which contains ICMP type operator value list.
+     *
+     * @param icmpType is a icmp type rule list
+     * @param type ExtType type
+     */
+    DefaultExtIcmpType(List<ExtOperatorValue> icmpType, ExtType type) {
+        this.icmpType = icmpType;
+        this.type = type;
+    }
+
+    @Override
+    public ExtType type() {
+        return type;
+    }
+
+    @Override
+    public List<ExtOperatorValue> icmpType() {
+        return icmpType;
+    }
+
+    @Override
+    public boolean exactMatch(ExtIcmpType icmpType) {
+        return this.equals(icmpType) &&
+                Objects.equals(this.icmpType, icmpType.icmpType())
+                && Objects.equals(this.type, icmpType.type());
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(icmpType, type);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj instanceof DefaultExtIcmpType) {
+            DefaultExtIcmpType that = (DefaultExtIcmpType) obj;
+            return Objects.equals(icmpType, that.icmpType())
+                    && Objects.equals(this.type, that.type());
+        }
+        return false;
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(this)
+                .add("icmpType", icmpType.toString())
+                .add("type", type.toString())
+                .toString();
+    }
+
+    /**
+     * Builder class for extension icmp type.
+     */
+    public static class Builder implements ExtIcmpType.Builder {
+        private List<ExtOperatorValue> icmpType;
+        private ExtType type;
+
+        @Override
+        public Builder setIcmpType(List<ExtOperatorValue> icmpType) {
+            this.icmpType = icmpType;
+            return this;
+        }
+
+        @Override
+        public Builder setType(ExtType type) {
+            this.type = type;
+            return this;
+        }
+
+        @Override
+        public ExtIcmpType build() {
+            checkNotNull(icmpType, "icmpType cannot be null");
+            return new DefaultExtIcmpType(icmpType, type);
+        }
+    }
+}
diff --git a/apps/bgpflowspec/flowapi/src/main/java/org/onosproject/flowapi/DefaultExtIpProtocol.java b/apps/bgpflowspec/flowapi/src/main/java/org/onosproject/flowapi/DefaultExtIpProtocol.java
new file mode 100755
index 0000000..d1e0e22
--- /dev/null
+++ b/apps/bgpflowspec/flowapi/src/main/java/org/onosproject/flowapi/DefaultExtIpProtocol.java
@@ -0,0 +1,112 @@
+/*
+ * Copyright 2016-present 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.flowapi;
+
+import java.util.List;
+import java.util.Objects;
+
+import static com.google.common.base.MoreObjects.toStringHelper;
+import static com.google.common.base.Preconditions.checkNotNull;
+
+/**
+ * Ip protocol extension implementation.
+ */
+public final class DefaultExtIpProtocol implements ExtIpProtocol {
+
+    private List<ExtOperatorValue> ipProtocol;
+    private ExtType type;
+
+    /**
+     * Creates an object of type DefaultExtIpProtocol which contains Ip protocol list.
+     *
+     * @param ipProtocol Ip protocol operator value list
+     * @param type BgpType type
+     */
+    DefaultExtIpProtocol(List<ExtOperatorValue> ipProtocol, ExtType type) {
+        this.ipProtocol = ipProtocol;
+        this.type = type;
+    }
+
+    @Override
+    public ExtType type() {
+        return type;
+    }
+
+    @Override
+    public List<ExtOperatorValue> ipProtocol() {
+        return ipProtocol;
+    }
+
+    @Override
+    public boolean exactMatch(ExtIpProtocol ipProto) {
+        return this.equals(ipProto) &&
+                Objects.equals(this.ipProtocol, ipProto.ipProtocol())
+                && Objects.equals(this.type, ipProto.type());
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(ipProtocol, type);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj instanceof DefaultExtIpProtocol) {
+            DefaultExtIpProtocol that = (DefaultExtIpProtocol) obj;
+            return Objects.equals(ipProtocol, that.ipProtocol())
+                    && Objects.equals(this.type, that.type);
+        }
+        return false;
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(this)
+                .add("ipProtocol", ipProtocol.toString())
+                .add("type", type.toString())
+                .toString();
+    }
+
+    /**
+     * Builder class for extension Ip protocol.
+     */
+    public static class Builder implements ExtIpProtocol.Builder {
+        private List<ExtOperatorValue> ipProtocol;
+        private ExtType type;
+
+        @Override
+        public Builder setIpProtocol(List<ExtOperatorValue> ipProtocol) {
+            this.ipProtocol = ipProtocol;
+            return this;
+        }
+
+        @Override
+        public Builder setType(ExtType type) {
+            this.type = type;
+            return this;
+        }
+
+        @Override
+        public ExtIpProtocol build() {
+            checkNotNull(ipProtocol, "Ip protocol cannot be null");
+            return new DefaultExtIpProtocol(ipProtocol, type);
+        }
+    }
+}
+
diff --git a/apps/bgpflowspec/flowapi/src/main/java/org/onosproject/flowapi/DefaultExtKeyName.java b/apps/bgpflowspec/flowapi/src/main/java/org/onosproject/flowapi/DefaultExtKeyName.java
new file mode 100755
index 0000000..0b9e18d
--- /dev/null
+++ b/apps/bgpflowspec/flowapi/src/main/java/org/onosproject/flowapi/DefaultExtKeyName.java
@@ -0,0 +1,109 @@
+/*
+ * Copyright 2016-present 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.flowapi;
+
+import java.util.Objects;
+import static com.google.common.base.MoreObjects.toStringHelper;
+import static com.google.common.base.Preconditions.checkNotNull;
+
+/**
+ * Key Name for the extension implementation.
+ */
+public class DefaultExtKeyName implements ExtKeyName {
+
+    private String keyName;
+    private ExtType type;
+
+    /**
+     * Creates an object of type DefaultExtKeyName which name for the flow rule.
+     *
+     * @param keyName is a key for the extended rule
+     * @param type ExtType type
+     */
+    DefaultExtKeyName(String keyName, ExtType type) {
+        this.keyName = keyName;
+        this.type = type;
+    }
+
+    @Override
+    public ExtType type() {
+        return type;
+    }
+
+    @Override
+    public String keyName() {
+        return keyName;
+    }
+
+    @Override
+    public boolean exactMatch(ExtKeyName value) {
+        return this.equals(value) &&
+                Objects.equals(this.keyName, value.keyName())
+                && Objects.equals(this.type, value.type());
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(keyName, type);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj instanceof DefaultExtKeyName) {
+            DefaultExtKeyName that = (DefaultExtKeyName) obj;
+            return Objects.equals(keyName, that.keyName())
+                    && Objects.equals(this.type, that.type());
+        }
+        return false;
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(this)
+                .add("keyName", keyName.toString())
+                .add("type", type.toString())
+                .toString();
+    }
+
+    /**
+     * Builder class for Extended key name for the rule.
+     */
+    public static class Builder implements ExtKeyName.Builder {
+        private String keyName;
+        private ExtType type;
+
+        @Override
+        public Builder setKeyName(String keyName) {
+            this.keyName = keyName;
+            return this;
+        }
+
+        @Override
+        public Builder setType(ExtType type) {
+            this.type = type;
+            return this;
+        }
+
+        @Override
+        public ExtKeyName build() {
+            checkNotNull(keyName, "keyName cannot be null");
+            return new DefaultExtKeyName(keyName, type);
+        }
+    }
+}
diff --git a/apps/bgpflowspec/flowapi/src/main/java/org/onosproject/flowapi/DefaultExtPacketLength.java b/apps/bgpflowspec/flowapi/src/main/java/org/onosproject/flowapi/DefaultExtPacketLength.java
new file mode 100755
index 0000000..3d3c501
--- /dev/null
+++ b/apps/bgpflowspec/flowapi/src/main/java/org/onosproject/flowapi/DefaultExtPacketLength.java
@@ -0,0 +1,111 @@
+/*
+ * Copyright 2016-present 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.flowapi;
+
+import java.util.List;
+import java.util.Objects;
+
+import static com.google.common.base.MoreObjects.toStringHelper;
+import static com.google.common.base.Preconditions.checkNotNull;
+
+/**
+ * Packet length extension implementation.
+ */
+public class DefaultExtPacketLength implements ExtPacketLength {
+
+    private List<ExtOperatorValue> packetLength;
+    private ExtType type;
+
+    /**
+     * Creates an object of type DefaultExtPacketLength which contains packet length list..
+     *
+     * @param packetLength is a packet length rule
+     * @param type ExtType type
+     */
+    DefaultExtPacketLength(List<ExtOperatorValue> packetLength, ExtType type) {
+        this.packetLength = packetLength;
+        this.type = type;
+    }
+
+    @Override
+    public ExtType type() {
+        return type;
+    }
+
+    @Override
+    public List<ExtOperatorValue> packetLength() {
+        return packetLength;
+    }
+
+    @Override
+    public boolean exactMatch(ExtPacketLength length) {
+        return this.equals(packetLength) &&
+                Objects.equals(this.packetLength, length.packetLength())
+                && Objects.equals(this.type, length.type());
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(packetLength, type);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj instanceof DefaultExtPacketLength) {
+            DefaultExtPacketLength that = (DefaultExtPacketLength) obj;
+            return Objects.equals(packetLength, that.packetLength())
+                    && Objects.equals(this.type, that.type());
+        }
+        return false;
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(this)
+                .add("packetLength", packetLength.toString())
+                .add("type", type.toString())
+                .toString();
+    }
+
+    /**
+     * Builder class for extension packet length.
+     */
+    public static class Builder implements ExtPacketLength.Builder {
+        private List<ExtOperatorValue> packetLength;
+        private ExtType type;
+
+        @Override
+        public Builder setPacketLength(List<ExtOperatorValue> packetLength) {
+            this.packetLength = packetLength;
+            return this;
+        }
+
+        @Override
+        public Builder setType(ExtType type) {
+            this.type = type;
+            return this;
+        }
+
+        @Override
+        public ExtPacketLength build() {
+            checkNotNull(packetLength, "packetLength cannot be null");
+            return new DefaultExtPacketLength(packetLength, type);
+        }
+    }
+}
diff --git a/apps/bgpflowspec/flowapi/src/main/java/org/onosproject/flowapi/DefaultExtPort.java b/apps/bgpflowspec/flowapi/src/main/java/org/onosproject/flowapi/DefaultExtPort.java
new file mode 100755
index 0000000..65c7297
--- /dev/null
+++ b/apps/bgpflowspec/flowapi/src/main/java/org/onosproject/flowapi/DefaultExtPort.java
@@ -0,0 +1,111 @@
+/*
+ * Copyright 2016-present 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.flowapi;
+
+import java.util.List;
+import java.util.Objects;
+
+import static com.google.common.base.MoreObjects.toStringHelper;
+import static com.google.common.base.Preconditions.checkNotNull;
+
+/**
+ * Port extension implementation.
+ */
+public class DefaultExtPort implements ExtPort {
+
+    private List<ExtOperatorValue> port;
+    private ExtType type;
+
+    /**
+     * Creates an object of type DefaultExtPort which contains port list.
+     *
+     * @param port is a port rule list
+     * @param type ExtType type
+     */
+    DefaultExtPort(List<ExtOperatorValue> port, ExtType type) {
+        this.port = port;
+        this.type = type;
+    }
+
+    @Override
+    public ExtType type() {
+        return type;
+    }
+
+    @Override
+    public List<ExtOperatorValue> port() {
+        return port;
+    }
+
+    @Override
+    public boolean exactMatch(ExtPort port) {
+        return this.equals(port) &&
+                Objects.equals(this.port, port.port())
+                && Objects.equals(this.type, port.type());
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(port, type);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj instanceof DefaultExtPort) {
+            DefaultExtPort that = (DefaultExtPort) obj;
+            return Objects.equals(port, that.port())
+                    && Objects.equals(this.type, that.type());
+        }
+        return false;
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(this)
+                .add("port", port.toString())
+                .add("type", type.toString())
+                .toString();
+    }
+
+    /**
+     * Builder class for extension port.
+     */
+    public static class Builder implements ExtPort.Builder {
+        private List<ExtOperatorValue> port;
+        private ExtType type;
+
+        @Override
+        public Builder setPort(List<ExtOperatorValue> port) {
+            this.port = port;
+            return this;
+        }
+
+        @Override
+        public Builder setType(ExtType type) {
+            this.type = type;
+            return this;
+        }
+
+        @Override
+        public ExtPort build() {
+            checkNotNull(port, "port cannot be null");
+            return new DefaultExtPort(port, type);
+        }
+    }
+}
diff --git a/apps/bgpflowspec/flowapi/src/main/java/org/onosproject/flowapi/DefaultExtPrefix.java b/apps/bgpflowspec/flowapi/src/main/java/org/onosproject/flowapi/DefaultExtPrefix.java
new file mode 100755
index 0000000..4b152d2
--- /dev/null
+++ b/apps/bgpflowspec/flowapi/src/main/java/org/onosproject/flowapi/DefaultExtPrefix.java
@@ -0,0 +1,115 @@
+/*
+ * Copyright 2016-present 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.flowapi;
+
+import org.onlab.packet.IpPrefix;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+
+import static com.google.common.base.MoreObjects.toStringHelper;
+import static com.google.common.base.Preconditions.checkNotNull;
+
+/**
+ * Ip prefix extension implementation.
+ */
+public final class DefaultExtPrefix implements ExtPrefix {
+
+    private List<IpPrefix> prefix;
+    private ExtType type;
+
+    /**
+     * Creates an object of type DefaultExtPrefix which contains Ip prefix list.
+     *
+     * @param prefix Ip prefix list
+     * @param type ExtType type
+     */
+    DefaultExtPrefix(List<IpPrefix> prefix, ExtType type) {
+        this.prefix = prefix;
+        this.type = type;
+    }
+
+    @Override
+    public ExtType type() {
+        return type;
+    }
+
+    @Override
+    public List<IpPrefix> prefix() {
+        return prefix;
+    }
+
+    @Override
+    public boolean exactMatch(ExtPrefix prefix) {
+        return this.equals(prefix) &&
+                Objects.equals(this.prefix, prefix.prefix())
+                && Objects.equals(this.type, prefix.type());
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(prefix, type);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj instanceof DefaultExtPrefix) {
+            DefaultExtPrefix that = (DefaultExtPrefix) obj;
+            return Objects.equals(prefix, that.prefix())
+                    && Objects.equals(this.type, that.type);
+        }
+        return false;
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(this)
+                .add("prefix", prefix.toString())
+                .add("type", type.toString())
+                .toString();
+    }
+
+    /**
+     * Builder class for extension Ip prefix.
+     */
+    public static class Builder implements ExtPrefix.Builder {
+        private List<IpPrefix> prefix = new ArrayList<>();
+        private ExtType type;
+
+        @Override
+        public Builder setPrefix(IpPrefix ip) {
+            this.prefix.add(ip);
+            return this;
+        }
+
+        @Override
+        public Builder setType(ExtType type) {
+            this.type = type;
+            return this;
+        }
+
+        @Override
+        public ExtPrefix build() {
+            checkNotNull(prefix, "Ip prefix cannot be null");
+            return new DefaultExtPrefix(prefix, type);
+        }
+    }
+}
+
diff --git a/apps/bgpflowspec/flowapi/src/main/java/org/onosproject/flowapi/DefaultExtTarget.java b/apps/bgpflowspec/flowapi/src/main/java/org/onosproject/flowapi/DefaultExtTarget.java
new file mode 100755
index 0000000..63c8c2f
--- /dev/null
+++ b/apps/bgpflowspec/flowapi/src/main/java/org/onosproject/flowapi/DefaultExtTarget.java
@@ -0,0 +1,146 @@
+/*
+ * Copyright 2016-present 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.flowapi;
+
+import java.util.Objects;
+
+import static com.google.common.base.MoreObjects.toStringHelper;
+import static com.google.common.base.Preconditions.checkNotNull;
+
+/**
+ * Target local and remote speaker implementation for wide community.
+ */
+public final class DefaultExtTarget implements ExtTarget {
+
+    private ExtPrefix localSpeaker;
+    private ExtPrefix remoteSpeaker;
+    private ExtType type;
+
+    /**
+     * Creates an object of type DefaultExtTarget which contains local and remote speakers.
+     *
+     * @param localSpeaker local speaker prefix list
+     * @param remoteSpeaker remoteSpeaker speaker prefix list
+     * @param type ExtType type
+     */
+    DefaultExtTarget(ExtPrefix localSpeaker, ExtPrefix remoteSpeaker, ExtType type) {
+        this.localSpeaker = localSpeaker;
+        this.remoteSpeaker = remoteSpeaker;
+        this.type = type;
+    }
+
+    @Override
+    public ExtType type() {
+        return type;
+    }
+
+    /**
+     * Returns the local speaker prefix list.
+     *
+     * @return the ExtPrefix
+     */
+    @Override
+    public ExtPrefix localSpeaker() {
+        return localSpeaker;
+    }
+
+    /**
+     * Returns the remote speaker prefix list.
+     *
+     * @return the ExtPrefix
+     */
+    @Override
+    public ExtPrefix remoteSpeaker() {
+        return remoteSpeaker;
+    }
+
+    /**
+     * Returns whether this target is an exact match to the target given
+     * in the argument.
+     *
+     * @param target other target to match
+     * @return true if the target are an exact match, otherwise false
+     */
+    @Override
+    public boolean exactMatch(ExtTarget target) {
+        return this.equals(target) &&
+                Objects.equals(this.localSpeaker, target.localSpeaker())
+                && Objects.equals(this.remoteSpeaker, target.remoteSpeaker())
+                && Objects.equals(this.type, target.type());
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(localSpeaker, remoteSpeaker, type);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj instanceof DefaultExtTarget) {
+            DefaultExtTarget that = (DefaultExtTarget) obj;
+            return Objects.equals(localSpeaker, that.localSpeaker())
+                    && Objects.equals(remoteSpeaker, that.remoteSpeaker())
+                    && Objects.equals(this.type, that.type);
+        }
+        return false;
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(this)
+                .add("localSpeaker", localSpeaker)
+                .add("remoteSpeaker", remoteSpeaker)
+                .add("type", type)
+                .toString();
+    }
+
+    /**
+     * Builder class for wide community target.
+     */
+    public static class Builder implements ExtTarget.Builder {
+        private ExtPrefix localSpeaker;
+        private ExtPrefix remoteSpeaker;
+        private ExtType type;
+
+        @Override
+        public Builder setLocalSpeaker(ExtPrefix localSpeaker) {
+            this.localSpeaker = localSpeaker;
+            return this;
+        }
+
+        @Override
+        public Builder setRemoteSpeaker(ExtPrefix remoteSpeaker) {
+            this.remoteSpeaker = remoteSpeaker;
+            return this;
+        }
+
+        @Override
+        public Builder setType(ExtType type) {
+            this.type = type;
+            return this;
+        }
+
+        @Override
+        public ExtTarget build() {
+            checkNotNull(localSpeaker, "localSpeaker cannot be null");
+            checkNotNull(remoteSpeaker, "remoteSpeaker cannot be null");
+            return new DefaultExtTarget(localSpeaker, remoteSpeaker, type);
+        }
+    }
+}
\ No newline at end of file
diff --git a/apps/bgpflowspec/flowapi/src/main/java/org/onosproject/flowapi/DefaultExtTcpFlag.java b/apps/bgpflowspec/flowapi/src/main/java/org/onosproject/flowapi/DefaultExtTcpFlag.java
new file mode 100755
index 0000000..468e528
--- /dev/null
+++ b/apps/bgpflowspec/flowapi/src/main/java/org/onosproject/flowapi/DefaultExtTcpFlag.java
@@ -0,0 +1,111 @@
+/*
+ * Copyright 2016-present 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.flowapi;
+
+import java.util.List;
+import java.util.Objects;
+
+import static com.google.common.base.MoreObjects.toStringHelper;
+import static com.google.common.base.Preconditions.checkNotNull;
+
+/**
+ * Tcp flag extension implementation.
+ */
+public class DefaultExtTcpFlag implements ExtTcpFlag {
+
+    private List<ExtOperatorValue> tcpFlag;
+    private ExtType type;
+
+    /**
+     * Creates an object of type DefaultExtTcpFlag which contains tcp flag.
+     *
+     * @param tcpFlag is a Tcp Flag rule list
+     * @param type ExtType type
+     */
+    DefaultExtTcpFlag(List<ExtOperatorValue> tcpFlag, ExtType type) {
+        this.tcpFlag = tcpFlag;
+        this.type = type;
+    }
+
+    @Override
+    public ExtType type() {
+        return type;
+    }
+
+    @Override
+    public List<ExtOperatorValue> tcpFlag() {
+        return tcpFlag;
+    }
+
+    @Override
+    public boolean exactMatch(ExtTcpFlag flag) {
+        return this.equals(tcpFlag) &&
+                Objects.equals(this.tcpFlag, flag.tcpFlag())
+                && Objects.equals(this.type, flag.type());
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(tcpFlag, type);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj instanceof DefaultExtTcpFlag) {
+            DefaultExtTcpFlag that = (DefaultExtTcpFlag) obj;
+            return Objects.equals(tcpFlag, that.tcpFlag())
+                    && Objects.equals(this.type, that.type());
+        }
+        return false;
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(this)
+                .add("tcpFlag", tcpFlag.toString())
+                .add("type", type.toString())
+                .toString();
+    }
+
+    /**
+     * Builder class for extension tcp flag.
+     */
+    public static class Builder implements ExtTcpFlag.Builder {
+        private List<ExtOperatorValue> tcpFlag;
+        private ExtType type;
+
+        @Override
+        public Builder setTcpFlag(List<ExtOperatorValue> tcpFlag) {
+            this.tcpFlag = tcpFlag;
+            return this;
+        }
+
+        @Override
+        public Builder setType(ExtType type) {
+            this.type = type;
+            return this;
+        }
+
+        @Override
+        public ExtTcpFlag build() {
+            checkNotNull(tcpFlag, "tcpFlag cannot be null");
+            return new DefaultExtTcpFlag(tcpFlag, type);
+        }
+    }
+}
diff --git a/apps/bgpflowspec/flowapi/src/main/java/org/onosproject/flowapi/DefaultExtTrafficAction.java b/apps/bgpflowspec/flowapi/src/main/java/org/onosproject/flowapi/DefaultExtTrafficAction.java
new file mode 100755
index 0000000..1a2bc27
--- /dev/null
+++ b/apps/bgpflowspec/flowapi/src/main/java/org/onosproject/flowapi/DefaultExtTrafficAction.java
@@ -0,0 +1,148 @@
+/*
+ * Copyright 2016-present 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.flowapi;
+
+import java.util.Objects;
+
+import static com.google.common.base.MoreObjects.toStringHelper;
+import static com.google.common.base.Preconditions.checkNotNull;
+
+/**
+ * Extended traffic action implementation.
+ */
+public class DefaultExtTrafficAction implements ExtTrafficAction {
+
+    private boolean terminal;
+    private boolean sample;
+    private boolean rpd;
+    private ExtType type;
+
+    /**
+     * Creates an object of type DefaultExtTrafficAction which contains traffic action flag.
+     *
+     * @param terminal traffic action terminal bit
+     * @param sample is a traffic action sampling
+     * @param rpd traffic action rpd bit
+     * @param type ExtType type
+     */
+    DefaultExtTrafficAction(boolean terminal, boolean sample, boolean rpd, ExtType type) {
+        this.terminal = terminal;
+        this.sample = sample;
+        this.rpd = rpd;
+        this.type = type;
+    }
+
+    @Override
+    public ExtType type() {
+        return type;
+    }
+
+    @Override
+    public boolean terminal() {
+        return terminal;
+    }
+
+    @Override
+    public boolean sample() {
+        return sample;
+    }
+
+    @Override
+    public boolean rpd() {
+        return rpd;
+    }
+
+    @Override
+    public boolean exactMatch(ExtTrafficAction value) {
+        return this.equals(value) &&
+                Objects.equals(this.terminal, value.terminal())
+                && Objects.equals(this.sample, value.sample())
+                && Objects.equals(this.rpd, value.rpd())
+                && Objects.equals(this.type, value.type());
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(terminal, sample, rpd, type);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj instanceof DefaultExtTrafficAction) {
+            DefaultExtTrafficAction that = (DefaultExtTrafficAction) obj;
+            return Objects.equals(terminal, that.terminal())
+                    && Objects.equals(this.sample, that.sample())
+                    && Objects.equals(this.rpd, that.rpd())
+                    && Objects.equals(this.type, that.type());
+        }
+        return false;
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(this)
+                .add("terminal", Boolean.valueOf(terminal).toString())
+                .add("sample",  Boolean.valueOf(sample).toString())
+                .add("rpd",  Boolean.valueOf(rpd).toString())
+                .add("type", type.toString())
+                .toString();
+    }
+
+    /**
+     * Builder class for extended traffic rate rule.
+     */
+    public static class Builder implements ExtTrafficAction.Builder {
+        private boolean terminal;
+        private boolean sample;
+        private boolean rpd;
+        private ExtType type;
+
+        @Override
+        public Builder setTerminal(boolean terminal) {
+            this.terminal = terminal;
+            return this;
+        }
+
+        @Override
+        public Builder setSample(boolean sample) {
+            this.sample = sample;
+            return this;
+        }
+
+        @Override
+        public Builder setRpd(boolean rpd) {
+            this.rpd = rpd;
+            return this;
+        }
+
+        @Override
+        public Builder setType(ExtType type) {
+            this.type = type;
+            return this;
+        }
+
+        @Override
+        public ExtTrafficAction build() {
+            checkNotNull(terminal, "terminal cannot be null");
+            checkNotNull(sample, "sample cannot be null");
+            checkNotNull(rpd, "rpd cannot be null");
+            return new DefaultExtTrafficAction(terminal, sample, rpd, type);
+        }
+    }
+}
diff --git a/apps/bgpflowspec/flowapi/src/main/java/org/onosproject/flowapi/DefaultExtTrafficMarking.java b/apps/bgpflowspec/flowapi/src/main/java/org/onosproject/flowapi/DefaultExtTrafficMarking.java
new file mode 100755
index 0000000..d014710
--- /dev/null
+++ b/apps/bgpflowspec/flowapi/src/main/java/org/onosproject/flowapi/DefaultExtTrafficMarking.java
@@ -0,0 +1,110 @@
+/*
+ * Copyright 2016-present 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.flowapi;
+
+import java.util.Objects;
+
+import static com.google.common.base.MoreObjects.toStringHelper;
+import static com.google.common.base.Preconditions.checkNotNull;
+
+/**
+ * Extended traffic marking implementation.
+ */
+public class DefaultExtTrafficMarking implements ExtTrafficMarking {
+
+    private byte marking;
+    private ExtType type;
+
+    /**
+     * Creates an object of type DefaultExtTrafficMarking which contains traffic marking byte.
+     *
+     * @param marking is a marking rule
+     * @param type ExtType type
+     */
+    DefaultExtTrafficMarking(byte marking, ExtType type) {
+        this.marking = marking;
+        this.type = type;
+    }
+
+    @Override
+    public ExtType type() {
+        return type;
+    }
+
+    @Override
+    public byte marking() {
+        return marking;
+    }
+
+    @Override
+    public boolean exactMatch(ExtTrafficMarking value) {
+        return this.equals(value) &&
+                Objects.equals(this.marking, value.marking())
+                && Objects.equals(this.type, value.type());
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(marking, type);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj instanceof DefaultExtTrafficMarking) {
+            DefaultExtTrafficMarking that = (DefaultExtTrafficMarking) obj;
+            return Objects.equals(marking, that.marking())
+                    && Objects.equals(this.type, that.type());
+        }
+        return false;
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(this)
+                .add("marking", marking)
+                .add("type", type.toString())
+                .toString();
+    }
+
+    /**
+     * Builder class for extended traffic marking value rule.
+     */
+    public static class Builder implements ExtTrafficMarking.Builder {
+        private byte marking;
+        private ExtType type;
+
+        @Override
+        public Builder setMarking(byte marking) {
+            this.marking = marking;
+            return this;
+        }
+
+        @Override
+        public Builder setType(ExtType type) {
+            this.type = type;
+            return this;
+        }
+
+        @Override
+        public ExtTrafficMarking build() {
+            checkNotNull(marking, "marking cannot be null");
+            return new DefaultExtTrafficMarking(marking, type);
+        }
+    }
+}
diff --git a/apps/bgpflowspec/flowapi/src/main/java/org/onosproject/flowapi/DefaultExtTrafficRate.java b/apps/bgpflowspec/flowapi/src/main/java/org/onosproject/flowapi/DefaultExtTrafficRate.java
new file mode 100755
index 0000000..fc4b2bf
--- /dev/null
+++ b/apps/bgpflowspec/flowapi/src/main/java/org/onosproject/flowapi/DefaultExtTrafficRate.java
@@ -0,0 +1,129 @@
+/*
+ * Copyright 2016-present 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.flowapi;
+
+import java.util.Objects;
+
+import static com.google.common.base.MoreObjects.toStringHelper;
+import static com.google.common.base.Preconditions.checkNotNull;
+
+/**
+ * Extended traffic rate implementation.
+ */
+public class DefaultExtTrafficRate implements ExtTrafficRate {
+
+    private Short asn;
+    private Float rate;
+    private ExtType type;
+
+    /**
+     * Creates an object of type DefaultExtTrafficRate which contains traffic rate action.
+     *
+     * @param asn is a AS number
+     * @param rate is a traffic rate in bytes per second
+     * @param type ExtType type
+     */
+    DefaultExtTrafficRate(short asn, float rate, ExtType type) {
+        this.asn = Short.valueOf(asn);
+        this.rate = Float.valueOf(rate);
+        this.type = type;
+    }
+
+    @Override
+    public ExtType type() {
+        return type;
+    }
+
+    @Override
+    public Short asn() {
+        return asn;
+    }
+
+    @Override
+    public Float rate() {
+        return rate;
+    }
+
+    @Override
+    public boolean exactMatch(ExtTrafficRate value) {
+        return this.equals(value) &&
+                Objects.equals(this.asn, value.asn())
+                && Objects.equals(this.rate, value.rate())
+                && Objects.equals(this.type, value.type());
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(asn, rate, type);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj instanceof DefaultExtTrafficRate) {
+            DefaultExtTrafficRate that = (DefaultExtTrafficRate) obj;
+            return Objects.equals(asn, that.asn())
+                    && Objects.equals(this.rate, that.rate())
+                    && Objects.equals(this.type, that.type());
+        }
+        return false;
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(this)
+                .add("asn", asn.toString())
+                .add("rate", rate.toString())
+                .add("type", type.toString())
+                .toString();
+    }
+
+    /**
+     * Builder class for extended traffic rate rule.
+     */
+    public static class Builder implements ExtTrafficRate.Builder {
+        private Short asn;
+        private Float rate;
+        private ExtType type;
+
+        @Override
+        public Builder setAsn(short asn) {
+            this.asn = Short.valueOf(asn);
+            return this;
+        }
+
+        @Override
+        public Builder setRate(float rate) {
+            this.rate = Float.valueOf(rate);
+            return this;
+        }
+
+        @Override
+        public Builder setType(ExtType type) {
+            this.type = type;
+            return this;
+        }
+
+        @Override
+        public ExtTrafficRate build() {
+            checkNotNull(asn, "asn cannot be null");
+            checkNotNull(rate, "rate cannot be null");
+            return new DefaultExtTrafficRate(asn, rate, type);
+        }
+    }
+}
diff --git a/apps/bgpflowspec/flowapi/src/main/java/org/onosproject/flowapi/DefaultExtTrafficRedirect.java b/apps/bgpflowspec/flowapi/src/main/java/org/onosproject/flowapi/DefaultExtTrafficRedirect.java
new file mode 100755
index 0000000..2a45d06
--- /dev/null
+++ b/apps/bgpflowspec/flowapi/src/main/java/org/onosproject/flowapi/DefaultExtTrafficRedirect.java
@@ -0,0 +1,110 @@
+/*
+ * Copyright 2016-present 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.flowapi;
+
+import java.util.Objects;
+
+import static com.google.common.base.MoreObjects.toStringHelper;
+import static com.google.common.base.Preconditions.checkNotNull;
+
+/**
+ * Extended traffic redirect implementation.
+ */
+public class DefaultExtTrafficRedirect implements ExtTrafficRedirect {
+
+    private String redirect;
+    private ExtType type;
+
+    /**
+     * Creates an object of type DefaultExtTrafficRedirect which contains traffic redirect action.
+     *
+     * @param redirect is a redirect rule
+     * @param type ExtType type
+     */
+    DefaultExtTrafficRedirect(String redirect, ExtType type) {
+        this.redirect = redirect;
+        this.type = type;
+    }
+
+    @Override
+    public ExtType type() {
+        return type;
+    }
+
+    @Override
+    public String redirect() {
+        return redirect;
+    }
+
+    @Override
+    public boolean exactMatch(ExtTrafficRedirect value) {
+        return this.equals(value) &&
+                Objects.equals(this.redirect, value.redirect())
+                && Objects.equals(this.type, value.type());
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(redirect, type);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj instanceof DefaultExtTrafficRedirect) {
+            DefaultExtTrafficRedirect that = (DefaultExtTrafficRedirect) obj;
+            return Objects.equals(redirect, that.redirect())
+                    && Objects.equals(this.type, that.type());
+        }
+        return false;
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(this)
+                .add("redirect", redirect.toString())
+                .add("type", type.toString())
+                .toString();
+    }
+
+    /**
+     * Builder class for extended redirect value rule.
+     */
+    public static class Builder implements ExtTrafficRedirect.Builder {
+        private String redirect;
+        private ExtType type;
+
+        @Override
+        public Builder setRedirect(String redirect) {
+            this.redirect = redirect;
+            return this;
+        }
+
+        @Override
+        public Builder setType(ExtType type) {
+            this.type = type;
+            return this;
+        }
+
+        @Override
+        public ExtTrafficRedirect build() {
+            checkNotNull(redirect, "redirect cannot be null");
+            return new DefaultExtTrafficRedirect(redirect, type);
+        }
+    }
+}
diff --git a/apps/bgpflowspec/flowapi/src/main/java/org/onosproject/flowapi/DefaultExtWideCommunityInt.java b/apps/bgpflowspec/flowapi/src/main/java/org/onosproject/flowapi/DefaultExtWideCommunityInt.java
new file mode 100755
index 0000000..05ed379
--- /dev/null
+++ b/apps/bgpflowspec/flowapi/src/main/java/org/onosproject/flowapi/DefaultExtWideCommunityInt.java
@@ -0,0 +1,112 @@
+/*
+ * Copyright 2016-present 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.flowapi;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+
+import static com.google.common.base.MoreObjects.toStringHelper;
+import static com.google.common.base.Preconditions.checkNotNull;
+
+/**
+ * Wide community attributes for RPD implementation.
+ */
+public class DefaultExtWideCommunityInt implements ExtWideCommunityInt {
+
+    private List<Integer> wCommInt;
+    private ExtType type;
+
+    /**
+     * Creates an object of type DefaultExtWideCommunityInt which contains wide community attributes.
+     *
+     * @param wCommInt is a wide community value
+     * @param type ExtType type
+     */
+    DefaultExtWideCommunityInt(List<Integer> wCommInt, ExtType type) {
+        this.wCommInt = wCommInt;
+        this.type = type;
+    }
+
+    @Override
+    public ExtType type() {
+        return type;
+    }
+
+    @Override
+    public List<Integer> communityInt() {
+        return wCommInt;
+    }
+
+    @Override
+    public boolean exactMatch(ExtWideCommunityInt value) {
+        return this.equals(value) &&
+                Objects.equals(this.wCommInt, value.communityInt())
+                && Objects.equals(this.type, value.type());
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(wCommInt, type);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj instanceof DefaultExtWideCommunityInt) {
+            DefaultExtWideCommunityInt that = (DefaultExtWideCommunityInt) obj;
+            return Objects.equals(wCommInt, that.communityInt())
+                    && Objects.equals(this.type, that.type());
+        }
+        return false;
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(this)
+                .add("value", wCommInt.toString())
+                .add("type", type.toString())
+                .toString();
+    }
+
+    /**
+     * Builder class for wide community value rule.
+     */
+    public static class Builder implements ExtWideCommunityInt.Builder {
+        private List<Integer> wCommInt = new ArrayList<>();
+        private ExtType type;
+
+        @Override
+        public Builder setwCommInt(Integer wCommInt) {
+            this.wCommInt.add(wCommInt);
+            return this;
+        }
+
+        @Override
+        public Builder setType(ExtType type) {
+            this.type = type;
+            return this;
+        }
+
+        @Override
+        public ExtWideCommunityInt build() {
+            checkNotNull(wCommInt, "value cannot be null");
+            return new DefaultExtWideCommunityInt(wCommInt, type);
+        }
+    }
+}
diff --git a/apps/bgpflowspec/flowapi/src/main/java/org/onosproject/flowapi/ExtDscpValue.java b/apps/bgpflowspec/flowapi/src/main/java/org/onosproject/flowapi/ExtDscpValue.java
new file mode 100755
index 0000000..55b7150
--- /dev/null
+++ b/apps/bgpflowspec/flowapi/src/main/java/org/onosproject/flowapi/ExtDscpValue.java
@@ -0,0 +1,76 @@
+/*
+ * Copyright 2016-present 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.flowapi;
+
+import java.util.List;
+
+/**
+ * Extended multivalue Dscp value class.
+ */
+public interface ExtDscpValue extends ExtFlowTypes {
+
+    /**
+     * Returns the ExtType.
+     *
+     * @return the ExtType
+     */
+    ExtType type();
+
+    /**
+     * Returns the dscp value operator value list.
+     *
+     * @return the dscp value operator value list
+     */
+    List<ExtOperatorValue> dscpValue();
+
+    /**
+     * Returns whether this dscp value list is an exact match to the dscp value list given
+     * in the argument.
+     *
+     * @param dscpValue other dscp value to match against
+     * @return true if the dscp value list are an exact match, otherwise false
+     */
+    boolean exactMatch(ExtDscpValue dscpValue);
+
+    /**
+     * A dscp value extended builder..
+     */
+    interface Builder {
+
+        /**
+         * Assigns the ExtType to this object.
+         *
+         * @param type extended type
+         * @return this the builder object
+         */
+        Builder setType(ExtType type);
+
+        /**
+         * Assigns the dscp operator value to this object.
+         *
+         * @param dscpValue the dscp value
+         * @return this the builder object
+         */
+        Builder setDscpValue(List<ExtOperatorValue> dscpValue);
+
+        /**
+         * Builds a dscp value object.
+         *
+         * @return a dscp value object.
+         */
+        ExtDscpValue build();
+    }
+}
diff --git a/apps/bgpflowspec/flowapi/src/main/java/org/onosproject/flowapi/ExtFlowContainer.java b/apps/bgpflowspec/flowapi/src/main/java/org/onosproject/flowapi/ExtFlowContainer.java
new file mode 100755
index 0000000..14f493c
--- /dev/null
+++ b/apps/bgpflowspec/flowapi/src/main/java/org/onosproject/flowapi/ExtFlowContainer.java
@@ -0,0 +1,118 @@
+/*
+ * Copyright 2016-present 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.flowapi;
+
+import com.google.common.base.MoreObjects;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * Representation of Multi value flow container having custom rules.
+ */
+public final class ExtFlowContainer {
+
+    private List<ExtFlowTypes> container = new ArrayList<>();
+    private String deviceId;
+
+    /**
+     * Creates an object of type ExtFlowContainer.
+     */
+    public ExtFlowContainer(List<ExtFlowTypes> container) {
+        this.container = container;
+    }
+
+    /**
+     * Returns the ExtFlowContainer by setting its value.
+     *
+     * @return ExtFlowContainer
+     */
+    public static ExtFlowContainer of(List<ExtFlowTypes> container) {
+        return new ExtFlowContainer(container);
+    }
+
+    /**
+     * Returns the list of  ExtFlowTypes value.
+     *
+     * @return list of ExtFlowTypes
+     */
+    public List<ExtFlowTypes> container() {
+        return container;
+    }
+
+    /**
+     * Returns the device Id.
+     *
+     * @return deviceId
+     */
+    public String deviceId() {
+        return deviceId;
+    }
+
+    /**
+     * Adds the flow type to the container list.
+     *
+     * @param  obj of ExtFlowTypes type
+     */
+    public void add(ExtFlowTypes obj) {
+        container.add(obj);
+    }
+
+    /**
+     * Removes the flow type from the container list.
+     *
+     * @param  obj of ExtFlowTypes type
+     */
+    public void remove(ExtFlowTypes obj) {
+        container.remove(obj);
+    }
+
+    /**
+     * Sets the device Id to this container.
+     *
+     * @param deviceId to be set to this container
+     */
+    public void setDeviceId(String deviceId) {
+        this.deviceId = deviceId;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(container);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (!(obj instanceof ExtFlowContainer)) {
+            return false;
+        }
+        final ExtFlowContainer other = (ExtFlowContainer) obj;
+        return Objects.equals(this.container, other.container)
+                && Objects.equals(this.deviceId, other.deviceId);
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(this)
+                .add("container", container)
+                .add("deviceId", deviceId)
+                .toString();
+    }
+}
diff --git a/apps/bgpflowspec/flowapi/src/main/java/org/onosproject/flowapi/ExtFlowTypes.java b/apps/bgpflowspec/flowapi/src/main/java/org/onosproject/flowapi/ExtFlowTypes.java
new file mode 100755
index 0000000..777598c
--- /dev/null
+++ b/apps/bgpflowspec/flowapi/src/main/java/org/onosproject/flowapi/ExtFlowTypes.java
@@ -0,0 +1,120 @@
+/*
+ * Copyright 2016-present 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.flowapi;
+
+/**
+ * Representation of BgpFlow container having custom rules.
+ */
+public interface ExtFlowTypes {
+
+    /**
+     * Bgp types.
+     */
+    public enum ExtType {
+
+        /** Extended flow rule key. */
+        EXT_FLOW_RULE_KEY(0),
+
+        /** IPv4 destination address. */
+        IPV4_DST_PFX(1),
+
+        /** IPv4 source address. */
+        IPV4_SRC_PFX(2),
+
+        /** IP protocol list. */
+        IP_PROTO_LIST(3),
+
+        /** Input port list. */
+        IN_PORT_LIST(4),
+
+        /** Destination port list. */
+        DST_PORT_LIST(5),
+
+        /** Source port list. */
+        SRC_PORT_LIST(6),
+
+        /** ICMP type list. */
+        ICMP_TYPE_LIST(7),
+
+        /** ICMP code list. */
+        ICMP_CODE_LIST(8),
+
+        /** TCP flag list. */
+        TCP_FLAG_LIST(9),
+
+        /** Packet length list. */
+        PACKET_LENGTH_LIST(10),
+
+        /** DSCP Value component. */
+        DSCP_VALUE_LIST(11),
+
+        /** Fragment list. */
+        FRAGMENT_LIST(12),
+
+        /** Wide community flags. */
+        WIDE_COMM_FLAGS(13),
+
+        /** Wide community hop count. */
+        WIDE_COMM_HOP_COUNT(14),
+
+        /** Wide community community attribute. */
+        WIDE_COMM_COMMUNITY(15),
+
+        /** Wide community context AS. */
+        WIDE_COMM_CONTEXT_AS(16),
+
+        /** Wide community local AS. */
+        WIDE_COMM_LOCAL_AS(17),
+
+        /** Wide community target prefixes. */
+        WIDE_COMM_TARGET(18),
+
+        /** Wide community extended target prefixes. */
+        WIDE_COMM_EXT_TARGET(19),
+
+        /** Wide community parameter. */
+        WIDE_COMM_PARAMETER(20),
+
+        /** Traffic filtering actions. */
+
+        TRAFFIC_RATE(0x8006),
+        TRAFFIC_ACTION(0x8007),
+        TRAFFIC_REDIRECT(0x8008),
+        TRAFFIC_MARKING(0x8009);
+
+        private int type;
+
+        /**
+         * Creates a new type.
+         *
+         * @param type type code
+         */
+        ExtType(int type) {
+            this.type = type;
+        }
+
+        /**
+         * Returns the type object for this type code.
+         *
+         * @return ExtType object
+         */
+        public int type() {
+            return (type);
+        }
+    }
+
+    ExtType type();
+}
diff --git a/apps/bgpflowspec/flowapi/src/main/java/org/onosproject/flowapi/ExtFragment.java b/apps/bgpflowspec/flowapi/src/main/java/org/onosproject/flowapi/ExtFragment.java
new file mode 100755
index 0000000..8a606e8
--- /dev/null
+++ b/apps/bgpflowspec/flowapi/src/main/java/org/onosproject/flowapi/ExtFragment.java
@@ -0,0 +1,77 @@
+/*
+ * Copyright 2016-present 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.flowapi;
+
+import java.util.List;
+
+/**
+ * Extended multivalue Fragment value list class.
+ */
+public interface ExtFragment extends ExtFlowTypes {
+
+    /**
+     * Returns the ExtType.
+     *
+     * @return the ExtType
+     */
+    ExtType type();
+
+    /**
+     * Returns the fragment operator value list.
+     *
+     * @return the fragment operator value list
+     */
+    List<ExtOperatorValue> fragment();
+
+    /**
+     * Returns whether this fragment value list is an exact match to the fragment value list given
+     * in the argument.
+     *
+     * @param fragment other fragment value to match against
+     * @return true if the fragment value list are an exact match, otherwise false
+     */
+    boolean exactMatch(ExtFragment fragment);
+
+    /**
+     * Extended fragment value builder..
+     */
+    interface Builder {
+
+        /**
+         * Assigns the ExtType to this object.
+         *
+         * @param type extended type
+         * @return this the builder object
+         */
+        Builder setType(ExtType type);
+
+        /**
+         * Assigns the fragment operator value to this object.
+         *
+         * @param fragment the fragment value
+         * @return this the builder object
+         */
+        Builder setFragment(List<ExtOperatorValue> fragment);
+
+        /**
+         * Builds a fragment value object.
+         *
+         * @return a fragment value object.
+         */
+        ExtFragment build();
+    }
+}
+
diff --git a/apps/bgpflowspec/flowapi/src/main/java/org/onosproject/flowapi/ExtIcmpCode.java b/apps/bgpflowspec/flowapi/src/main/java/org/onosproject/flowapi/ExtIcmpCode.java
new file mode 100755
index 0000000..2e42aa0
--- /dev/null
+++ b/apps/bgpflowspec/flowapi/src/main/java/org/onosproject/flowapi/ExtIcmpCode.java
@@ -0,0 +1,76 @@
+/*
+ * Copyright 2016-present 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.flowapi;
+
+import java.util.List;
+
+/**
+ * Extended multivalue ICMP code class.
+ */
+public interface ExtIcmpCode extends ExtFlowTypes {
+
+    /**
+     * Returns the ExtType.
+     *
+     * @return the ExtType
+     */
+    ExtType type();
+
+    /**
+     * Returns the Icmp code operator value list.
+     *
+     * @return the Icmp code operator value list
+     */
+    List<ExtOperatorValue> icmpCode();
+
+    /**
+     * Returns whether this Icmp code list is an exact match to the Icmp code list given
+     * in the argument.
+     *
+     * @param icmpCode other Icmp code to match against
+     * @return true if the Icmp code list are an exact match, otherwise false
+     */
+    boolean exactMatch(ExtIcmpCode icmpCode);
+
+    /**
+     * An Icmp code extension builder..
+     */
+    interface Builder {
+
+        /**
+         * Assigns the ExtType to this object.
+         *
+         * @param type extended type
+         * @return this the builder object
+         */
+        Builder setType(ExtType type);
+
+        /**
+         * Assigns the Icmp code operator value to this object.
+         *
+         * @param icmpCode the Icmp code operator value combination
+         * @return this the builder object
+         */
+        Builder setIcmpCode(List<ExtOperatorValue> icmpCode);
+
+        /**
+         * Builds a Icmp code object.
+         *
+         * @return a Tcmp code object.
+         */
+        ExtIcmpCode build();
+    }
+}
diff --git a/apps/bgpflowspec/flowapi/src/main/java/org/onosproject/flowapi/ExtIcmpType.java b/apps/bgpflowspec/flowapi/src/main/java/org/onosproject/flowapi/ExtIcmpType.java
new file mode 100755
index 0000000..480c73d
--- /dev/null
+++ b/apps/bgpflowspec/flowapi/src/main/java/org/onosproject/flowapi/ExtIcmpType.java
@@ -0,0 +1,76 @@
+/*
+ * Copyright 2016 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.flowapi;
+
+import java.util.List;
+
+/**
+ * Extended multivalue ICMP type class.
+ */
+public interface ExtIcmpType extends ExtFlowTypes {
+
+    /**
+     * Returns the ExtType.
+     *
+     * @return the ExtType
+     */
+    ExtType type();
+
+    /**
+     * Returns the Icmp type operator value list.
+     *
+     * @return the Icmp type operator value list
+     */
+    List<ExtOperatorValue> icmpType();
+
+    /**
+     * Returns whether this Icmp type list is an exact match to the Icmp type list given
+     * in the argument.
+     *
+     * @param icmpType other Icmp type to match against
+     * @return true if the Icmp type list are an exact match, otherwise false
+     */
+    boolean exactMatch(ExtIcmpType icmpType);
+
+    /**
+     * An Icmp type extension builder..
+     */
+    interface Builder {
+
+        /**
+         * Assigns the ExtType to this object.
+         *
+         * @param type extended type
+         * @return this the builder object
+         */
+        Builder setType(ExtType type);
+
+        /**
+         * Assigns the Icmp type operator value to this object.
+         *
+         * @param icmpType the Icmp type operator value combination
+         * @return this the builder object
+         */
+        Builder setIcmpType(List<ExtOperatorValue> icmpType);
+
+        /**
+         * Builds a Icmp type object.
+         *
+         * @return a Tcmp type object.
+         */
+        ExtIcmpType build();
+    }
+}
diff --git a/apps/bgpflowspec/flowapi/src/main/java/org/onosproject/flowapi/ExtIpProtocol.java b/apps/bgpflowspec/flowapi/src/main/java/org/onosproject/flowapi/ExtIpProtocol.java
new file mode 100755
index 0000000..bee44c0
--- /dev/null
+++ b/apps/bgpflowspec/flowapi/src/main/java/org/onosproject/flowapi/ExtIpProtocol.java
@@ -0,0 +1,76 @@
+/*
+ * Copyright 2016-present 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.flowapi;
+
+import java.util.List;
+
+/**
+ * Extended multivalue Ip protocol class.
+ */
+public interface ExtIpProtocol extends ExtFlowTypes {
+
+    /**
+     * Returns the ExtType.
+     *
+     * @return the ExtType
+     */
+    ExtType type();
+
+    /**
+     * Returns the Ip protocol operator value list.
+     *
+     * @return the Ip protocol operator value list
+     */
+    List<ExtOperatorValue> ipProtocol();
+
+    /**
+     * Returns whether this Ip protocol list is an exact match to the Ip protocol list given
+     * in the argument.
+     *
+     * @param ipProto other Ip protocols list to match against
+     * @return true if the Ip protocols list are an exact match, otherwise false
+     */
+    boolean exactMatch(ExtIpProtocol ipProto);
+
+    /**
+     * Ip protocol extension builder.
+     */
+    interface Builder {
+
+        /**
+         * Assigns the ExtType to this object.
+         *
+         * @param type extended type
+         * @return this the builder object
+         */
+        Builder setType(ExtType type);
+
+        /**
+         * Adds the Ip protocol operator value to this object.
+         *
+         * @param ipProto is the operator-value combination
+         * @return this the builder object
+         */
+        Builder setIpProtocol(List<ExtOperatorValue> ipProto);
+
+        /**
+         * Builds a Ip protocol object.
+         *
+         * @return a Ip protocol object.
+         */
+        ExtIpProtocol build();
+    }
+}
diff --git a/apps/bgpflowspec/flowapi/src/main/java/org/onosproject/flowapi/ExtKeyName.java b/apps/bgpflowspec/flowapi/src/main/java/org/onosproject/flowapi/ExtKeyName.java
new file mode 100755
index 0000000..4759ef3
--- /dev/null
+++ b/apps/bgpflowspec/flowapi/src/main/java/org/onosproject/flowapi/ExtKeyName.java
@@ -0,0 +1,74 @@
+/*
+ * Copyright 2016-present 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.flowapi;
+
+/**
+ * Ext flwo key name class.
+ */
+public interface ExtKeyName extends ExtFlowTypes {
+
+    /**
+     * Returns the ExtType.
+     *
+     * @return the ExtType
+     */
+    ExtType type();
+
+    /**
+     * Returns the key name identifier for the flow.
+     *
+     * @return the key name
+     */
+    String keyName();
+
+    /**
+     * Returns whether this key name is an exact match to the key name given
+     * in the argument.
+     *
+     * @param key other key name to match against
+     * @return true if the key name are an exact match, otherwise false
+     */
+    boolean exactMatch(ExtKeyName key);
+
+    /**
+     * A key name value list builder..
+     */
+    interface Builder {
+
+        /**
+         * Assigns the ExtType to this object.
+         *
+         * @param type extended type
+         * @return this the builder object
+         */
+        Builder setType(ExtType type);
+
+        /**
+         * Assigns the key name to this object.
+         *
+         * @param key the key name
+         * @return this the builder object
+         */
+        Builder setKeyName(String key);
+
+        /**
+         * Builds a key name object.
+         *
+         * @return a key name object.
+         */
+        ExtKeyName build();
+    }
+}
diff --git a/apps/bgpflowspec/flowapi/src/main/java/org/onosproject/flowapi/ExtOperatorValue.java b/apps/bgpflowspec/flowapi/src/main/java/org/onosproject/flowapi/ExtOperatorValue.java
new file mode 100755
index 0000000..459b993
--- /dev/null
+++ b/apps/bgpflowspec/flowapi/src/main/java/org/onosproject/flowapi/ExtOperatorValue.java
@@ -0,0 +1,85 @@
+/*
+ * Copyright 2016-present 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.flowapi;
+
+import com.google.common.base.MoreObjects;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.Arrays;
+import java.util.Objects;
+
+/**
+ * Flow specification type operator and value implementation.
+ */
+public class ExtOperatorValue {
+
+    protected static final Logger log = LoggerFactory.getLogger(ExtOperatorValue.class);
+
+    private final byte option;
+    private final byte[] value;
+
+    /**
+     * Creates an object of type ExtOperatorValue.
+     *
+     * @param option for a specific flow type
+     * @param value for a specific flow type
+     */
+    public ExtOperatorValue(byte option, byte[] value) {
+        this.option = option;
+        this.value = Arrays.copyOf(value, value.length);
+    }
+
+    /**
+     * Returns option of the flow type.
+     *
+     * @return option of the flow type
+     */
+    public byte option() {
+        return option;
+    }
+
+    /**
+     * Returns value of the flow type.
+     *
+     * @return value of the flow type
+     */
+    public byte[] value() {
+        return value;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(option, Arrays.hashCode(value));
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj instanceof ExtOperatorValue) {
+            ExtOperatorValue other = (ExtOperatorValue) obj;
+            return Objects.equals(this.option, other.option) && Arrays.equals(this.value, other.value);
+        }
+        return false;
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(getClass()).add("option", option).add("value", value).toString();
+    }
+}
diff --git a/apps/bgpflowspec/flowapi/src/main/java/org/onosproject/flowapi/ExtPacketLength.java b/apps/bgpflowspec/flowapi/src/main/java/org/onosproject/flowapi/ExtPacketLength.java
new file mode 100755
index 0000000..6c3dedf
--- /dev/null
+++ b/apps/bgpflowspec/flowapi/src/main/java/org/onosproject/flowapi/ExtPacketLength.java
@@ -0,0 +1,76 @@
+/*
+ * Copyright 2016-present 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.flowapi;
+
+import java.util.List;
+
+/**
+ * Extended multivalue packet length list class.
+ */
+public interface ExtPacketLength extends ExtFlowTypes {
+
+    /**
+     * Returns the ExtType.
+     *
+     * @return the ExtType
+     */
+    ExtType type();
+
+    /**
+     * Returns the packet length operator value list.
+     *
+     * @return the packet length operator value list
+     */
+    List<ExtOperatorValue> packetLength();
+
+    /**
+     * Returns whether this packet length list is an exact match to the packet length list given
+     * in the argument.
+     *
+     * @param packetLength other packet length to match against
+     * @return true if the packet length list are an exact match, otherwise false
+     */
+    boolean exactMatch(ExtPacketLength packetLength);
+
+    /**
+     * A packet length extended builder..
+     */
+    interface Builder {
+
+        /**
+         * Assigns the ExtType to this object.
+         *
+         * @param type extended type
+         * @return this the builder object
+         */
+        Builder setType(ExtType type);
+
+        /**
+         * Assigns the packet length list to this object.
+         *
+         * @param packetLength the packet length
+         * @return this the builder object
+         */
+        Builder setPacketLength(List<ExtOperatorValue> packetLength);
+
+        /**
+         * Builds a packet length object.
+         *
+         * @return a packet length object.
+         */
+        ExtPacketLength build();
+    }
+}
diff --git a/apps/bgpflowspec/flowapi/src/main/java/org/onosproject/flowapi/ExtPort.java b/apps/bgpflowspec/flowapi/src/main/java/org/onosproject/flowapi/ExtPort.java
new file mode 100755
index 0000000..a84b8e7
--- /dev/null
+++ b/apps/bgpflowspec/flowapi/src/main/java/org/onosproject/flowapi/ExtPort.java
@@ -0,0 +1,76 @@
+/*
+ * Copyright 2016-present 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.flowapi;
+
+import java.util.List;
+
+/**
+ * Extended multivalue port class.
+ */
+public interface ExtPort extends ExtFlowTypes {
+
+    /**
+     * Returns the ExtType.
+     *
+     * @return the ExtType
+     */
+    ExtType type();
+
+    /**
+     * Returns the port operator value list.
+     *
+     * @return the port operator value list
+     */
+    List<ExtOperatorValue> port();
+
+    /**
+     * Returns whether this port list is an exact match to the port list given
+     * in the argument.
+     *
+     * @param port other port to match against
+     * @return true if the port list are an exact match, otherwise false
+     */
+    boolean exactMatch(ExtPort port);
+
+    /**
+     * An extended port extension builder..
+     */
+    interface Builder {
+
+        /**
+         * Assigns the ExtType to this object.
+         *
+         * @param type extended type
+         * @return this the builder object
+         */
+        Builder setType(ExtType type);
+
+        /**
+         * Assigns the port list operator value to this object.
+         *
+         * @param port is the operator-value combination
+         * @return this the builder object
+         */
+        Builder setPort(List<ExtOperatorValue> port);
+
+        /**
+         * Builds a port object.
+         *
+         * @return a port object.
+         */
+        ExtPort build();
+    }
+}
diff --git a/apps/bgpflowspec/flowapi/src/main/java/org/onosproject/flowapi/ExtPrefix.java b/apps/bgpflowspec/flowapi/src/main/java/org/onosproject/flowapi/ExtPrefix.java
new file mode 100755
index 0000000..3539ef2
--- /dev/null
+++ b/apps/bgpflowspec/flowapi/src/main/java/org/onosproject/flowapi/ExtPrefix.java
@@ -0,0 +1,78 @@
+/*
+ * Copyright 2016-present 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.flowapi;
+
+import org.onlab.packet.IpPrefix;
+
+import java.util.List;
+
+/**
+ * Ext Prefix class.
+ */
+public interface ExtPrefix extends ExtFlowTypes {
+
+    /**
+     * Returns the ExtType.
+     *
+     * @return the ExtType
+     */
+    ExtType type();
+
+    /**
+     * Returns the prefix list.
+     *
+     * @return the IpPrefix list
+     */
+    List<IpPrefix> prefix();
+
+    /**
+     * Returns whether this prefix list is an exact match to the prefix list given
+     * in the argument.
+     *
+     * @param prefix other prefix to match against
+     * @return true if the prefix are an exact match, otherwise false
+     */
+    boolean exactMatch(ExtPrefix prefix);
+
+    /**
+     * A prefix builder..
+     */
+    interface Builder {
+
+        /**
+         * Assigns the ExtType to this object.
+         *
+         * @param type the prefix
+         * @return this the builder object
+         */
+        Builder setType(ExtType type);
+
+        /**
+         * Add the prefix to this object.
+         *
+         * @param prefix the prefix
+         * @return this the builder object
+         */
+        Builder setPrefix(IpPrefix prefix);
+
+        /**
+         * Builds a prefix object.
+         *
+         * @return a port chain.
+         */
+        ExtPrefix build();
+    }
+}
diff --git a/apps/bgpflowspec/flowapi/src/main/java/org/onosproject/flowapi/ExtTarget.java b/apps/bgpflowspec/flowapi/src/main/java/org/onosproject/flowapi/ExtTarget.java
new file mode 100755
index 0000000..157ce9a
--- /dev/null
+++ b/apps/bgpflowspec/flowapi/src/main/java/org/onosproject/flowapi/ExtTarget.java
@@ -0,0 +1,89 @@
+/*
+ * Copyright 2016-present 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.flowapi;
+
+/**
+ * Ext target prefix class class.
+ */
+public interface ExtTarget extends ExtFlowTypes {
+
+    /**
+     * Returns the ExtType.
+     *
+     * @return the ExtType
+     */
+    ExtType type();
+
+    /**
+     * Returns the local speaker prefix list.
+     *
+     * @return the prefix list
+     */
+    ExtPrefix localSpeaker();
+
+    /**
+     * Returns the remote speaker prefix list.
+     *
+     * @return the prefix list
+     */
+    ExtPrefix remoteSpeaker();
+
+    /**
+     * Returns whether this prefix list is an exact match to the prefix list given
+     * in the argument.
+     *
+     * @param prefix other prefix to match against
+     * @return true if the prefix are an exact match, otherwise false
+     */
+    boolean exactMatch(ExtTarget prefix);
+
+    /**
+     * A prefix builder..
+     */
+    interface Builder {
+
+        /**
+         * Assigns the ExtType to this object.
+         *
+         * @param type the prefix
+         * @return this the builder object
+         */
+        Builder setType(ExtType type);
+
+        /**
+         * Add the local speaker prefix to this object.
+         *
+         * @param localSpeaker list of local speakers
+         * @return this the builder object
+         */
+        Builder setLocalSpeaker(ExtPrefix localSpeaker);
+
+        /**
+         * Add the remote speaker prefix to this object.
+         *
+         * @param remoteSpeaker list of remote speakers
+         * @return this the builder object
+         */
+        Builder setRemoteSpeaker(ExtPrefix remoteSpeaker);
+
+        /**
+         * Builds a prefix object.
+         *
+         * @return a port chain.
+         */
+        ExtTarget build();
+    }
+}
diff --git a/apps/bgpflowspec/flowapi/src/main/java/org/onosproject/flowapi/ExtTcpFlag.java b/apps/bgpflowspec/flowapi/src/main/java/org/onosproject/flowapi/ExtTcpFlag.java
new file mode 100755
index 0000000..17e5145
--- /dev/null
+++ b/apps/bgpflowspec/flowapi/src/main/java/org/onosproject/flowapi/ExtTcpFlag.java
@@ -0,0 +1,76 @@
+/*
+ * Copyright 2016-present 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.flowapi;
+
+import java.util.List;
+
+/**
+ * Extended multivalue Tcp Flags list class.
+ */
+public interface ExtTcpFlag extends ExtFlowTypes {
+
+    /**
+     * Returns the ExtType.
+     *
+     * @return the ExtType
+     */
+    ExtType type();
+
+    /**
+     * Returns the Tcp flag Extended multivalue.
+     *
+     * @return the Tcp flag Extended multivalue
+     */
+    List<ExtOperatorValue> tcpFlag();
+
+    /**
+     * Returns whether this Tcp flag list is an exact match to the Tcp flag list given
+     * in the argument.
+     *
+     * @param tcpFlag other Tcp flag to match against
+     * @return true if the Tcp flag list are an exact match, otherwise false
+     */
+    boolean exactMatch(ExtTcpFlag tcpFlag);
+
+    /**
+     * A Tcp flag extended builder..
+     */
+    interface Builder {
+
+        /**
+         * Assigns the ExtType to this object.
+         *
+         * @param type extended type
+         * @return this the builder object
+         */
+        Builder setType(ExtType type);
+
+        /**
+         * Assigns the Tcp flag operator value to this object.
+         *
+         * @param tcpFlag the Tcp flag
+         * @return this the builder object
+         */
+        Builder setTcpFlag(List<ExtOperatorValue> tcpFlag);
+
+        /**
+         * Builds a Tcp flag object.
+         *
+         * @return a Tcp flag object.
+         */
+        ExtTcpFlag build();
+    }
+}
diff --git a/apps/bgpflowspec/flowapi/src/main/java/org/onosproject/flowapi/ExtTrafficAction.java b/apps/bgpflowspec/flowapi/src/main/java/org/onosproject/flowapi/ExtTrafficAction.java
new file mode 100755
index 0000000..170cd6c
--- /dev/null
+++ b/apps/bgpflowspec/flowapi/src/main/java/org/onosproject/flowapi/ExtTrafficAction.java
@@ -0,0 +1,104 @@
+/*
+ * Copyright 2016-present 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.flowapi;
+
+/**
+ * Extended flow traffic action class.
+ */
+public interface ExtTrafficAction extends ExtFlowTypes {
+
+    /**
+     * Returns the ExtType.
+     *
+     * @return the ExtType
+     */
+    ExtType type();
+
+    /**
+     * Returns the terminal action.
+     *
+     * @return the terminal action is set or not
+     */
+    boolean terminal();
+
+    /**
+     * Returns the traffic sampling.
+     *
+     * @return the traffic sampling set or not
+     */
+    boolean sample();
+
+    /**
+     * Returns the traffic action to be taken is rpd.
+     *
+     * @return the traffic action rpd is set or not
+     */
+    boolean rpd();
+
+    /**
+     * Returns whether this traffic action is an exact match to the traffic action given
+     * in the argument.
+     *
+     * @param trafficAction other traffic action to match against
+     * @return true if the traffic action are an exact match, otherwise false
+     */
+    boolean exactMatch(ExtTrafficAction trafficAction);
+
+    /**
+     * A traffic action builder..
+     */
+    interface Builder {
+
+        /**
+         * Assigns the ExtType to this object.
+         *
+         * @param type extended type
+         * @return this the builder object
+         */
+        Builder setType(ExtType type);
+
+        /**
+         * Assigns the terminal action to this object.
+         *
+         * @param terminal action
+         * @return this the builder object
+         */
+        Builder setTerminal(boolean terminal);
+
+        /**
+         * Assigns the traffic sampling to this object.
+         *
+         * @param sample to be done or not
+         * @return this the builder object
+         */
+        Builder setSample(boolean sample);
+
+        /**
+         * Assigns the traffic action rpd to this object.
+         *
+         * @param rpd rpd or not
+         * @return this the builder object
+         */
+        Builder setRpd(boolean rpd);
+
+        /**
+         * Builds a traffic action object.
+         *
+         * @return a traffic action object.
+         */
+        ExtTrafficAction build();
+    }
+}
diff --git a/apps/bgpflowspec/flowapi/src/main/java/org/onosproject/flowapi/ExtTrafficMarking.java b/apps/bgpflowspec/flowapi/src/main/java/org/onosproject/flowapi/ExtTrafficMarking.java
new file mode 100755
index 0000000..ee43ba0
--- /dev/null
+++ b/apps/bgpflowspec/flowapi/src/main/java/org/onosproject/flowapi/ExtTrafficMarking.java
@@ -0,0 +1,74 @@
+/*
+ * Copyright 2016-present 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.flowapi;
+
+/**
+ * Extended traffic marking class.
+ */
+public interface ExtTrafficMarking extends ExtFlowTypes {
+
+    /**
+     * Returns the ExtType.
+     *
+     * @return the ExtType
+     */
+    ExtType type();
+
+    /**
+     * Returns the traffic marking DSCP value.
+     *
+     * @return the marking rule
+     */
+    byte marking();
+
+    /**
+     * Returns whether this traffic marking is an exact match to the traffic marking given
+     * in the argument.
+     *
+     * @param marking other traffic marking to match against
+     * @return true if the traffic marking are an exact match, otherwise false
+     */
+    boolean exactMatch(ExtTrafficMarking marking);
+
+    /**
+     * A traffic marking builder..
+     */
+    interface Builder {
+
+        /**
+         * Assigns the ExtType to this object.
+         *
+         * @param type extended type
+         * @return this the builder object
+         */
+        Builder setType(ExtType type);
+
+        /**
+         * Assigns the traffic marking to this object.
+         *
+         * @param marking the marking value
+         * @return this the builder object
+         */
+        Builder setMarking(byte marking);
+
+        /**
+         * Builds a traffic marking object.
+         *
+         * @return a marking value object.
+         */
+        ExtTrafficMarking build();
+    }
+}
diff --git a/apps/bgpflowspec/flowapi/src/main/java/org/onosproject/flowapi/ExtTrafficRate.java b/apps/bgpflowspec/flowapi/src/main/java/org/onosproject/flowapi/ExtTrafficRate.java
new file mode 100755
index 0000000..a903fb7
--- /dev/null
+++ b/apps/bgpflowspec/flowapi/src/main/java/org/onosproject/flowapi/ExtTrafficRate.java
@@ -0,0 +1,89 @@
+/*
+ * Copyright 2016-present 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.flowapi;
+
+/**
+ * Extended flow traffic rate class.
+ */
+public interface ExtTrafficRate extends ExtFlowTypes {
+
+    /**
+     * Returns the ExtType.
+     *
+     * @return the ExtType
+     */
+    ExtType type();
+
+    /**
+     * Returns the AS number.
+     *
+     * @return the 2 byte ASN
+     */
+    Short asn();
+
+    /**
+     * Returns the traffic rate.
+     *
+     * @return the floating point traffic rate
+     */
+    Float rate();
+
+    /**
+     * Returns whether this traffic rate is an exact match to the traffic rate given
+     * in the argument.
+     *
+     * @param trafficRate other traffic rate to match against
+     * @return true if the traffic rate list are an exact match, otherwise false
+     */
+    boolean exactMatch(ExtTrafficRate trafficRate);
+
+    /**
+     * A traffic rate builder..
+     */
+    interface Builder {
+
+        /**
+         * Assigns the ExtType to this object.
+         *
+         * @param type extended type
+         * @return this the builder object
+         */
+        Builder setType(ExtType type);
+
+        /**
+         * Assigns the AS number to this object.
+         *
+         * @param asn the ASN
+         * @return this the builder object
+         */
+        Builder setAsn(short asn);
+
+        /**
+         * Assigns the traffic rate to this object.
+         *
+         * @param rate in floating point number bytes per second
+         * @return this the builder object
+         */
+        Builder setRate(float rate);
+
+        /**
+         * Builds a traffic rate object.
+         *
+         * @return a traffic rate object.
+         */
+        ExtTrafficRate build();
+    }
+}
diff --git a/apps/bgpflowspec/flowapi/src/main/java/org/onosproject/flowapi/ExtTrafficRedirect.java b/apps/bgpflowspec/flowapi/src/main/java/org/onosproject/flowapi/ExtTrafficRedirect.java
new file mode 100755
index 0000000..861e667
--- /dev/null
+++ b/apps/bgpflowspec/flowapi/src/main/java/org/onosproject/flowapi/ExtTrafficRedirect.java
@@ -0,0 +1,74 @@
+/*
+ * Copyright 2016-present 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.flowapi;
+
+/**
+ * Extended flow traffic redirect class.
+ */
+public interface ExtTrafficRedirect extends ExtFlowTypes {
+
+    /**
+     * Returns the ExtType.
+     *
+     * @return the ExtType
+     */
+    ExtType type();
+
+    /**
+     * Returns the traffic redirect in human readable format.
+     *
+     * @return the redirect rule
+     */
+    String redirect();
+
+    /**
+     * Returns whether this traffic redirect is an exact match to the traffic redirect given
+     * in the argument.
+     *
+     * @param redirect other traffic redirect to match against
+     * @return true if the traffic redirect are an exact match, otherwise false
+     */
+    boolean exactMatch(ExtTrafficRedirect redirect);
+
+    /**
+     * A dscp value list builder..
+     */
+    interface Builder {
+
+        /**
+         * Assigns the ExtType to this object.
+         *
+         * @param type extended type
+         * @return this the builder object
+         */
+        Builder setType(ExtType type);
+
+        /**
+         * Assigns the traffic redirect to this object.
+         *
+         * @param redirect the redirect value
+         * @return this the builder object
+         */
+        Builder setRedirect(String redirect);
+
+        /**
+         * Builds a traffic redirect object.
+         *
+         * @return a redirect value object.
+         */
+        ExtTrafficRedirect build();
+    }
+}
diff --git a/apps/bgpflowspec/flowapi/src/main/java/org/onosproject/flowapi/ExtWideCommunityInt.java b/apps/bgpflowspec/flowapi/src/main/java/org/onosproject/flowapi/ExtWideCommunityInt.java
new file mode 100755
index 0000000..cd23a77
--- /dev/null
+++ b/apps/bgpflowspec/flowapi/src/main/java/org/onosproject/flowapi/ExtWideCommunityInt.java
@@ -0,0 +1,76 @@
+/*
+ * Copyright 2016-present 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.flowapi;
+
+import java.util.List;
+
+/**
+ * Extended wide community integer class.
+ */
+public interface ExtWideCommunityInt extends ExtFlowTypes {
+
+    /**
+     * Returns the ExtType.
+     *
+     * @return the ExtType
+     */
+    ExtType type();
+
+    /**
+     * Returns the wide community integer list.
+     *
+     * @return the wide community integer list
+     */
+    List<Integer> communityInt();
+
+    /**
+     * Returns whether this wide community integer is an exact match to the wide community int given
+     * in the argument.
+     *
+     * @param wCommInt other wide community integer to match against
+     * @return true if the wide community integer are an exact match, otherwise false
+     */
+    boolean exactMatch(ExtWideCommunityInt wCommInt);
+
+    /**
+     * A wide community integer list builder..
+     */
+    interface Builder {
+
+        /**
+         * Assigns the ExtType to this object.
+         *
+         * @param type extended type
+         * @return this the builder object
+         */
+        Builder setType(ExtType type);
+
+        /**
+         * Assigns the wide community integer to this object.
+         *
+         * @param wCommInt the wide community integer
+         * @return this the builder object
+         */
+        Builder setwCommInt(Integer wCommInt);
+
+        /**
+         * Builds a wide community integer object.
+         *
+         * @return a wide community integer value object.
+         */
+        ExtWideCommunityInt build();
+    }
+}
diff --git a/apps/bgpflowspec/flowapi/src/main/java/org/onosproject/flowapi/package-info.java b/apps/bgpflowspec/flowapi/src/main/java/org/onosproject/flowapi/package-info.java
new file mode 100755
index 0000000..9abf0be
--- /dev/null
+++ b/apps/bgpflowspec/flowapi/src/main/java/org/onosproject/flowapi/package-info.java
@@ -0,0 +1,20 @@
+/*
+ * Copyright 2016-present 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.
+ */
+
+/**
+ * API bundle.
+ */
+package org.onosproject.flowapi;
diff --git a/apps/bgpflowspec/flowapi/src/test/java/org/onosproject/flowapi/DefaultExtDscpValueTest.java b/apps/bgpflowspec/flowapi/src/test/java/org/onosproject/flowapi/DefaultExtDscpValueTest.java
new file mode 100644
index 0000000..bd2fca5
--- /dev/null
+++ b/apps/bgpflowspec/flowapi/src/test/java/org/onosproject/flowapi/DefaultExtDscpValueTest.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2016-present 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.flowapi;
+
+import com.google.common.testing.EqualsTester;
+import org.junit.Test;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Test for extended dscp value attribute.
+ */
+public class DefaultExtDscpValueTest {
+
+    private List<ExtOperatorValue> dscpValue = new ArrayList<>();
+    private List<ExtOperatorValue> dscpValue1 = new ArrayList<>();
+    private ExtOperatorValue opVal = new ExtOperatorValue((byte) 1, new byte[100]);
+    private ExtOperatorValue opVal1 = new ExtOperatorValue((byte) 1, new byte[200]);
+    private ExtFlowTypes.ExtType type = ExtFlowTypes.ExtType.DSCP_VALUE_LIST;
+
+    @Test
+    public void basics() {
+        dscpValue.add(opVal);
+        dscpValue1.add(opVal1);
+        DefaultExtDscpValue data = new DefaultExtDscpValue(dscpValue, type);
+        DefaultExtDscpValue sameAsData = new DefaultExtDscpValue(dscpValue, type);
+        DefaultExtDscpValue diffData = new DefaultExtDscpValue(dscpValue1, type);
+        new EqualsTester().addEqualityGroup(data, sameAsData)
+                .addEqualityGroup(diffData).testEquals();
+    }
+}
\ No newline at end of file
diff --git a/apps/bgpflowspec/flowapi/src/test/java/org/onosproject/flowapi/DefaultExtFragmentTest.java b/apps/bgpflowspec/flowapi/src/test/java/org/onosproject/flowapi/DefaultExtFragmentTest.java
new file mode 100644
index 0000000..df7893c
--- /dev/null
+++ b/apps/bgpflowspec/flowapi/src/test/java/org/onosproject/flowapi/DefaultExtFragmentTest.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2016-present 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.flowapi;
+
+import com.google.common.testing.EqualsTester;
+import org.junit.Test;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Test for extended fragment value attribute.
+ */
+public class DefaultExtFragmentTest {
+
+    private List<ExtOperatorValue> fragment = new ArrayList<>();
+    private List<ExtOperatorValue> fragment1 = new ArrayList<>();
+    private ExtOperatorValue opVal = new ExtOperatorValue((byte) 1, new byte[100]);
+    private ExtOperatorValue opVal1 = new ExtOperatorValue((byte) 1, new byte[200]);
+    private ExtFlowTypes.ExtType type = ExtFlowTypes.ExtType.FRAGMENT_LIST;
+
+    @Test
+    public void basics() {
+        fragment.add(opVal);
+        fragment1.add(opVal1);
+        DefaultExtFragment data = new DefaultExtFragment(fragment, type);
+        DefaultExtFragment sameAsData = new DefaultExtFragment(fragment, type);
+        DefaultExtFragment diffData = new DefaultExtFragment(fragment1, type);
+        new EqualsTester().addEqualityGroup(data, sameAsData)
+                .addEqualityGroup(diffData).testEquals();
+    }
+}
\ No newline at end of file
diff --git a/apps/bgpflowspec/flowapi/src/test/java/org/onosproject/flowapi/DefaultExtIcmpCodeTest.java b/apps/bgpflowspec/flowapi/src/test/java/org/onosproject/flowapi/DefaultExtIcmpCodeTest.java
new file mode 100644
index 0000000..105d5bc
--- /dev/null
+++ b/apps/bgpflowspec/flowapi/src/test/java/org/onosproject/flowapi/DefaultExtIcmpCodeTest.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2016-present 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.flowapi;
+
+import com.google.common.testing.EqualsTester;
+import org.junit.Test;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Test for extended icmp code value attribute.
+ */
+public class DefaultExtIcmpCodeTest {
+
+    private List<ExtOperatorValue> icmpCode = new ArrayList<>();
+    private List<ExtOperatorValue> icmpCode1 = new ArrayList<>();
+    private ExtOperatorValue opVal = new ExtOperatorValue((byte) 1, new byte[100]);
+    private ExtOperatorValue opVal1 = new ExtOperatorValue((byte) 1, new byte[200]);
+    private ExtFlowTypes.ExtType type = ExtFlowTypes.ExtType.ICMP_CODE_LIST;
+
+    @Test
+    public void basics() {
+        icmpCode.add(opVal);
+        icmpCode1.add(opVal1);
+        DefaultExtIcmpCode data = new DefaultExtIcmpCode(icmpCode, type);
+        DefaultExtIcmpCode sameAsData = new DefaultExtIcmpCode(icmpCode, type);
+        DefaultExtIcmpCode diffData = new DefaultExtIcmpCode(icmpCode1, type);
+        new EqualsTester().addEqualityGroup(data, sameAsData)
+                .addEqualityGroup(diffData).testEquals();
+    }
+}
\ No newline at end of file
diff --git a/apps/bgpflowspec/flowapi/src/test/java/org/onosproject/flowapi/DefaultExtIcmpTypeTest.java b/apps/bgpflowspec/flowapi/src/test/java/org/onosproject/flowapi/DefaultExtIcmpTypeTest.java
new file mode 100644
index 0000000..3c313e9
--- /dev/null
+++ b/apps/bgpflowspec/flowapi/src/test/java/org/onosproject/flowapi/DefaultExtIcmpTypeTest.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2016-present 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.flowapi;
+
+        import com.google.common.testing.EqualsTester;
+        import org.junit.Test;
+
+        import java.util.ArrayList;
+        import java.util.List;
+
+/**
+ * Test for extended icmp type value attribute.
+ */
+public class DefaultExtIcmpTypeTest {
+
+    private List<ExtOperatorValue> icmpType = new ArrayList<>();
+    private List<ExtOperatorValue> icmpType1 = new ArrayList<>();
+    private ExtOperatorValue opVal = new ExtOperatorValue((byte) 1, new byte[100]);
+    private ExtOperatorValue opVal1 = new ExtOperatorValue((byte) 1, new byte[200]);
+    private ExtFlowTypes.ExtType type = ExtFlowTypes.ExtType.ICMP_TYPE_LIST;
+
+    @Test
+    public void basics() {
+        icmpType.add(opVal);
+        icmpType1.add(opVal1);
+        DefaultExtIcmpType data = new DefaultExtIcmpType(icmpType, type);
+        DefaultExtIcmpType sameAsData = new DefaultExtIcmpType(icmpType, type);
+        DefaultExtIcmpType diffData = new DefaultExtIcmpType(icmpType1, type);
+        new EqualsTester().addEqualityGroup(data, sameAsData)
+                .addEqualityGroup(diffData).testEquals();
+    }
+}
\ No newline at end of file
diff --git a/apps/bgpflowspec/flowapi/src/test/java/org/onosproject/flowapi/DefaultExtIpProtocolTest.java b/apps/bgpflowspec/flowapi/src/test/java/org/onosproject/flowapi/DefaultExtIpProtocolTest.java
new file mode 100644
index 0000000..4ac3685
--- /dev/null
+++ b/apps/bgpflowspec/flowapi/src/test/java/org/onosproject/flowapi/DefaultExtIpProtocolTest.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2016-present 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.flowapi;
+
+import com.google.common.testing.EqualsTester;
+import org.junit.Test;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Test for extended icmp type value attribute.
+ */
+public class DefaultExtIpProtocolTest {
+
+    private List<ExtOperatorValue> ipProtocol = new ArrayList<>();
+    private List<ExtOperatorValue> ipProtocol1 = new ArrayList<>();
+    private ExtOperatorValue opVal = new ExtOperatorValue((byte) 1, new byte[100]);
+    private ExtOperatorValue opVal1 = new ExtOperatorValue((byte) 1, new byte[200]);
+    private ExtFlowTypes.ExtType type = ExtFlowTypes.ExtType.IP_PROTO_LIST;
+
+    @Test
+    public void basics() {
+        ipProtocol.add(opVal);
+        ipProtocol1.add(opVal1);
+        DefaultExtIpProtocol data = new DefaultExtIpProtocol(ipProtocol, type);
+        DefaultExtIpProtocol sameAsData = new DefaultExtIpProtocol(ipProtocol, type);
+        DefaultExtIpProtocol diffData = new DefaultExtIpProtocol(ipProtocol1, type);
+        new EqualsTester().addEqualityGroup(data, sameAsData)
+                .addEqualityGroup(diffData).testEquals();
+    }
+}
\ No newline at end of file
diff --git a/apps/bgpflowspec/flowapi/src/test/java/org/onosproject/flowapi/DefaultExtKeyNameTest.java b/apps/bgpflowspec/flowapi/src/test/java/org/onosproject/flowapi/DefaultExtKeyNameTest.java
new file mode 100644
index 0000000..64a4b97
--- /dev/null
+++ b/apps/bgpflowspec/flowapi/src/test/java/org/onosproject/flowapi/DefaultExtKeyNameTest.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2016-present 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.flowapi;
+
+import com.google.common.testing.EqualsTester;
+import org.junit.Test;
+
+/**
+ * Test for extended key name value attribute.
+ */
+public class DefaultExtKeyNameTest {
+
+    private String keyName = new String("hello");
+    private String keyName1 = new String("Hi");
+
+    private ExtFlowTypes.ExtType type = ExtFlowTypes.ExtType.EXT_FLOW_RULE_KEY;
+
+    @Test
+    public void basics() {
+
+        DefaultExtKeyName data = new DefaultExtKeyName(keyName, type);
+        DefaultExtKeyName sameAsData = new DefaultExtKeyName(keyName, type);
+        DefaultExtKeyName diffData = new DefaultExtKeyName(keyName1, type);
+        new EqualsTester().addEqualityGroup(data, sameAsData)
+                .addEqualityGroup(diffData).testEquals();
+    }
+}
\ No newline at end of file
diff --git a/apps/bgpflowspec/flowapi/src/test/java/org/onosproject/flowapi/DefaultExtPacketLengthTest.java b/apps/bgpflowspec/flowapi/src/test/java/org/onosproject/flowapi/DefaultExtPacketLengthTest.java
new file mode 100644
index 0000000..d0d2f9c
--- /dev/null
+++ b/apps/bgpflowspec/flowapi/src/test/java/org/onosproject/flowapi/DefaultExtPacketLengthTest.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2016-present 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.flowapi;
+
+import com.google.common.testing.EqualsTester;
+import org.junit.Test;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Test for extended packet length value attribute.
+ */
+public class DefaultExtPacketLengthTest {
+
+    private List<ExtOperatorValue> packetLength = new ArrayList<>();
+    private List<ExtOperatorValue> packetLength1 = new ArrayList<>();
+    private ExtOperatorValue opVal = new ExtOperatorValue((byte) 1, new byte[100]);
+    private ExtOperatorValue opVal1 = new ExtOperatorValue((byte) 1, new byte[200]);
+    private ExtFlowTypes.ExtType type = ExtFlowTypes.ExtType.PACKET_LENGTH_LIST;
+
+    @Test
+    public void basics() {
+        packetLength.add(opVal);
+        packetLength1.add(opVal1);
+        DefaultExtPacketLength data = new DefaultExtPacketLength(packetLength, type);
+        DefaultExtPacketLength sameAsData = new DefaultExtPacketLength(packetLength, type);
+        DefaultExtPacketLength diffData = new DefaultExtPacketLength(packetLength1, type);
+        new EqualsTester().addEqualityGroup(data, sameAsData)
+                .addEqualityGroup(diffData).testEquals();
+    }
+}
\ No newline at end of file
diff --git a/apps/bgpflowspec/flowapi/src/test/java/org/onosproject/flowapi/DefaultExtPortTest.java b/apps/bgpflowspec/flowapi/src/test/java/org/onosproject/flowapi/DefaultExtPortTest.java
new file mode 100644
index 0000000..9e41e6c
--- /dev/null
+++ b/apps/bgpflowspec/flowapi/src/test/java/org/onosproject/flowapi/DefaultExtPortTest.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2016-present 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.flowapi;
+
+        import com.google.common.testing.EqualsTester;
+        import org.junit.Test;
+
+        import java.util.ArrayList;
+        import java.util.List;
+
+/**
+ * Test for extended icmp type value attribute.
+ */
+public class DefaultExtPortTest {
+
+    private List<ExtOperatorValue> port = new ArrayList<>();
+    private List<ExtOperatorValue> port1 = new ArrayList<>();
+    private ExtOperatorValue opVal = new ExtOperatorValue((byte) 1, new byte[100]);
+    private ExtOperatorValue opVal1 = new ExtOperatorValue((byte) 1, new byte[200]);
+    private ExtFlowTypes.ExtType type = ExtFlowTypes.ExtType.IN_PORT_LIST;
+
+    @Test
+    public void basics() {
+        port.add(opVal);
+        port1.add(opVal1);
+        DefaultExtPort data = new DefaultExtPort(port, type);
+        DefaultExtPort sameAsData = new DefaultExtPort(port, type);
+        DefaultExtPort diffData = new DefaultExtPort(port1, type);
+        new EqualsTester().addEqualityGroup(data, sameAsData)
+                .addEqualityGroup(diffData).testEquals();
+    }
+}
\ No newline at end of file
diff --git a/apps/bgpflowspec/flowapi/src/test/java/org/onosproject/flowapi/DefaultExtPrefixTest.java b/apps/bgpflowspec/flowapi/src/test/java/org/onosproject/flowapi/DefaultExtPrefixTest.java
new file mode 100644
index 0000000..71eb9e8
--- /dev/null
+++ b/apps/bgpflowspec/flowapi/src/test/java/org/onosproject/flowapi/DefaultExtPrefixTest.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2016-present 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.flowapi;
+
+        import com.google.common.testing.EqualsTester;
+        import org.junit.Test;
+        import org.onlab.packet.IpAddress;
+        import org.onlab.packet.IpPrefix;
+
+        import java.util.ArrayList;
+        import java.util.List;
+
+/**
+ * Test for extended prefix value attribute.
+ */
+public class DefaultExtPrefixTest {
+
+    private List<IpPrefix> prefix = new ArrayList<>();
+    private List<IpPrefix> prefix1 = new ArrayList<>();
+    private IpAddress address = IpAddress.valueOf("192.168.1.1");
+    private IpPrefix opVal = IpPrefix.valueOf(address, 16);
+    private IpPrefix opVal1 = IpPrefix.valueOf(address, 20);
+    private ExtFlowTypes.ExtType type = ExtFlowTypes.ExtType.IPV4_DST_PFX;
+
+    @Test
+    public void basics() {
+        prefix.add(opVal);
+        prefix1.add(opVal1);
+        DefaultExtPrefix data = new DefaultExtPrefix(prefix, type);
+        DefaultExtPrefix sameAsData = new DefaultExtPrefix(prefix, type);
+        DefaultExtPrefix diffData = new DefaultExtPrefix(prefix1, type);
+        new EqualsTester().addEqualityGroup(data, sameAsData)
+                .addEqualityGroup(diffData).testEquals();
+    }
+}
\ No newline at end of file
diff --git a/apps/bgpflowspec/flowapi/src/test/java/org/onosproject/flowapi/DefaultExtTargetTest.java b/apps/bgpflowspec/flowapi/src/test/java/org/onosproject/flowapi/DefaultExtTargetTest.java
new file mode 100644
index 0000000..2f8c37c
--- /dev/null
+++ b/apps/bgpflowspec/flowapi/src/test/java/org/onosproject/flowapi/DefaultExtTargetTest.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2016-present 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.flowapi;
+
+import com.google.common.testing.EqualsTester;
+import org.junit.Test;
+import org.onlab.packet.IpAddress;
+import org.onlab.packet.IpPrefix;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Test for extended t value target ttribute.
+ */
+public class DefaultExtTargetTest {
+    private List<IpPrefix> prefix = new ArrayList<>();
+    private List<IpPrefix> prefix1 = new ArrayList<>();
+    private IpAddress address = IpAddress.valueOf("192.168.1.1");
+    private IpPrefix opVal = IpPrefix.valueOf(address, 16);
+    private IpPrefix opVal1 = IpPrefix.valueOf(address, 20);
+    private ExtFlowTypes.ExtType type = ExtFlowTypes.ExtType.IPV4_DST_PFX;
+    private ExtFlowTypes.ExtType typeThis = ExtFlowTypes.ExtType.WIDE_COMM_TARGET;
+
+    @Test
+    public void basics() {
+        prefix.add(opVal);
+        prefix1.add(opVal1);
+        DefaultExtPrefix localSpeaker = new DefaultExtPrefix(prefix, type);
+        DefaultExtPrefix remoteSpeaker = new DefaultExtPrefix(prefix, type);
+        DefaultExtPrefix localSpeaker1 = new DefaultExtPrefix(prefix1, type);
+        DefaultExtPrefix remoteSpeaker1 = new DefaultExtPrefix(prefix1, type);
+
+        DefaultExtTarget data = new DefaultExtTarget(localSpeaker, remoteSpeaker, typeThis);
+        DefaultExtTarget sameAsData = new DefaultExtTarget(localSpeaker, remoteSpeaker, typeThis);
+        DefaultExtTarget diffData = new DefaultExtTarget(localSpeaker1, remoteSpeaker1, typeThis);
+        new EqualsTester().addEqualityGroup(data, sameAsData)
+                .addEqualityGroup(diffData).testEquals();
+    }
+}
\ No newline at end of file
diff --git a/apps/bgpflowspec/flowapi/src/test/java/org/onosproject/flowapi/DefaultExtTcpFlagTest.java b/apps/bgpflowspec/flowapi/src/test/java/org/onosproject/flowapi/DefaultExtTcpFlagTest.java
new file mode 100644
index 0000000..3ecedc1
--- /dev/null
+++ b/apps/bgpflowspec/flowapi/src/test/java/org/onosproject/flowapi/DefaultExtTcpFlagTest.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2016-present 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.flowapi;
+
+import com.google.common.testing.EqualsTester;
+import org.junit.Test;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Test for extended tcp flag value attribute.
+ */
+public class DefaultExtTcpFlagTest {
+
+    private List<ExtOperatorValue> tcpFlag = new ArrayList<>();
+    private List<ExtOperatorValue> tcpFlag1 = new ArrayList<>();
+    private ExtOperatorValue opVal = new ExtOperatorValue((byte) 1, new byte[100]);
+    private ExtOperatorValue opVal1 = new ExtOperatorValue((byte) 1, new byte[200]);
+    private ExtFlowTypes.ExtType type = ExtFlowTypes.ExtType.TCP_FLAG_LIST;
+
+    @Test
+    public void basics() {
+        tcpFlag.add(opVal);
+        tcpFlag1.add(opVal1);
+        DefaultExtTcpFlag data = new DefaultExtTcpFlag(tcpFlag, type);
+        DefaultExtTcpFlag sameAsData = new DefaultExtTcpFlag(tcpFlag, type);
+        DefaultExtTcpFlag diffData = new DefaultExtTcpFlag(tcpFlag1, type);
+        new EqualsTester().addEqualityGroup(data, sameAsData)
+                .addEqualityGroup(diffData).testEquals();
+    }
+}
\ No newline at end of file
diff --git a/apps/bgpflowspec/flowapi/src/test/java/org/onosproject/flowapi/DefaultExtTrafficActionTest.java b/apps/bgpflowspec/flowapi/src/test/java/org/onosproject/flowapi/DefaultExtTrafficActionTest.java
new file mode 100644
index 0000000..4f42a39
--- /dev/null
+++ b/apps/bgpflowspec/flowapi/src/test/java/org/onosproject/flowapi/DefaultExtTrafficActionTest.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright 2016-present 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.flowapi;
+
+import com.google.common.testing.EqualsTester;
+import org.junit.Test;
+
+/**
+ * Test for extended traffic action value attribute.
+ */
+public class DefaultExtTrafficActionTest {
+
+    private boolean terminal = true;
+    private boolean sample = true;
+    private boolean rpd = true;
+    private boolean terminal1 = false;
+    private boolean sample1 = false;
+    private boolean rpd1 = false;
+    private ExtFlowTypes.ExtType type = ExtFlowTypes.ExtType.TRAFFIC_ACTION;
+
+    @Test
+    public void basics() {
+
+        DefaultExtTrafficAction data = new DefaultExtTrafficAction(terminal, sample, rpd, type);
+        DefaultExtTrafficAction sameAsData = new DefaultExtTrafficAction(terminal, sample, rpd, type);
+        DefaultExtTrafficAction diffData = new DefaultExtTrafficAction(terminal1, sample1, rpd1, type);
+        new EqualsTester().addEqualityGroup(data, sameAsData)
+                .addEqualityGroup(diffData).testEquals();
+    }
+}
\ No newline at end of file
diff --git a/apps/bgpflowspec/flowapi/src/test/java/org/onosproject/flowapi/DefaultExtTrafficMarkingTest.java b/apps/bgpflowspec/flowapi/src/test/java/org/onosproject/flowapi/DefaultExtTrafficMarkingTest.java
new file mode 100644
index 0000000..adee1ac
--- /dev/null
+++ b/apps/bgpflowspec/flowapi/src/test/java/org/onosproject/flowapi/DefaultExtTrafficMarkingTest.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright 2016-present 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.flowapi;
+
+import com.google.common.testing.EqualsTester;
+import org.junit.Test;
+
+/**
+ * Test for extended traffic marking value attribute.
+ */
+public class DefaultExtTrafficMarkingTest {
+
+    private byte marking = 01;
+    private byte marking1 = 02;
+    private ExtFlowTypes.ExtType type = ExtFlowTypes.ExtType.TRAFFIC_MARKING;
+
+    @Test
+    public void basics() {
+        DefaultExtTrafficMarking data = new DefaultExtTrafficMarking(marking, type);
+        DefaultExtTrafficMarking sameAsData = new DefaultExtTrafficMarking(marking, type);
+        DefaultExtTrafficMarking diffData = new DefaultExtTrafficMarking(marking1, type);
+        new EqualsTester().addEqualityGroup(data, sameAsData)
+                .addEqualityGroup(diffData).testEquals();
+    }
+}
\ No newline at end of file
diff --git a/apps/bgpflowspec/flowapi/src/test/java/org/onosproject/flowapi/DefaultExtTrafficRateTest.java b/apps/bgpflowspec/flowapi/src/test/java/org/onosproject/flowapi/DefaultExtTrafficRateTest.java
new file mode 100644
index 0000000..f772e11
--- /dev/null
+++ b/apps/bgpflowspec/flowapi/src/test/java/org/onosproject/flowapi/DefaultExtTrafficRateTest.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2016-present 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.flowapi;
+
+import com.google.common.testing.EqualsTester;
+import org.junit.Test;
+
+/**
+ * Test for extended traffic rate value attribute.
+ */
+public class DefaultExtTrafficRateTest {
+
+    private Short asn = new Short((short) 1);
+    private Float rate = new Float(1.0);
+    private Short asn1 = new Short((short) 2);
+    private Float rate1 = new Float(1.0);
+    private ExtFlowTypes.ExtType type = ExtFlowTypes.ExtType.TRAFFIC_RATE;
+
+    @Test
+    public void basics() {
+        DefaultExtTrafficRate data = new DefaultExtTrafficRate(asn, rate, type);
+        DefaultExtTrafficRate sameAsData = new DefaultExtTrafficRate(asn, rate, type);
+        DefaultExtTrafficRate diffData = new DefaultExtTrafficRate(asn1, rate1, type);
+        new EqualsTester().addEqualityGroup(data, sameAsData)
+                .addEqualityGroup(diffData).testEquals();
+    }
+}
\ No newline at end of file
diff --git a/apps/bgpflowspec/flowapi/src/test/java/org/onosproject/flowapi/DefaultExtTrafficRedirectTest.java b/apps/bgpflowspec/flowapi/src/test/java/org/onosproject/flowapi/DefaultExtTrafficRedirectTest.java
new file mode 100644
index 0000000..00ee162
--- /dev/null
+++ b/apps/bgpflowspec/flowapi/src/test/java/org/onosproject/flowapi/DefaultExtTrafficRedirectTest.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright 2016-present 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.flowapi;
+
+import com.google.common.testing.EqualsTester;
+import org.junit.Test;
+
+/**
+ * Test for extended traffic redirect value attribute.
+ */
+public class DefaultExtTrafficRedirectTest {
+
+    String redirect = new String("vpnid1");
+    String redirect1 = new String("vpnid2");
+    private ExtFlowTypes.ExtType type = ExtFlowTypes.ExtType.TRAFFIC_REDIRECT;
+
+    @Test
+    public void basics() {
+
+        DefaultExtTrafficRedirect data = new DefaultExtTrafficRedirect(redirect, type);
+        DefaultExtTrafficRedirect sameAsData = new DefaultExtTrafficRedirect(redirect, type);
+        DefaultExtTrafficRedirect diffData = new DefaultExtTrafficRedirect(redirect1, type);
+        new EqualsTester().addEqualityGroup(data, sameAsData)
+                .addEqualityGroup(diffData).testEquals();
+    }
+}
\ No newline at end of file
diff --git a/apps/bgpflowspec/flowapi/src/test/java/org/onosproject/flowapi/DefaultExtWideCommunityIntTest.java b/apps/bgpflowspec/flowapi/src/test/java/org/onosproject/flowapi/DefaultExtWideCommunityIntTest.java
new file mode 100644
index 0000000..f209217
--- /dev/null
+++ b/apps/bgpflowspec/flowapi/src/test/java/org/onosproject/flowapi/DefaultExtWideCommunityIntTest.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2016-present 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.flowapi;
+
+import com.google.common.testing.EqualsTester;
+import org.junit.Test;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Test for extended wide community value attribute.
+ */
+public class DefaultExtWideCommunityIntTest {
+
+    private List<Integer> wCommInt = new ArrayList<>();
+    private List<Integer> wCommInt1 = new ArrayList<>();
+    private Integer opVal = new Integer(1);
+    private Integer opVal1 = new Integer(2);
+    private ExtFlowTypes.ExtType type = ExtFlowTypes.ExtType.WIDE_COMM_COMMUNITY;
+
+    @Test
+    public void basics() {
+        wCommInt.add(opVal);
+        wCommInt1.add(opVal1);
+        DefaultExtWideCommunityInt data = new DefaultExtWideCommunityInt(wCommInt, type);
+        DefaultExtWideCommunityInt sameAsData = new DefaultExtWideCommunityInt(wCommInt, type);
+        DefaultExtWideCommunityInt diffData = new DefaultExtWideCommunityInt(wCommInt1, type);
+        new EqualsTester().addEqualityGroup(data, sameAsData)
+                .addEqualityGroup(diffData).testEquals();
+    }
+}
\ No newline at end of file
diff --git a/apps/bgpflowspec/flowapi/src/test/java/org/onosproject/flowapi/ExtFlowContainerTest.java b/apps/bgpflowspec/flowapi/src/test/java/org/onosproject/flowapi/ExtFlowContainerTest.java
new file mode 100644
index 0000000..e8113ce
--- /dev/null
+++ b/apps/bgpflowspec/flowapi/src/test/java/org/onosproject/flowapi/ExtFlowContainerTest.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2016-present 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.flowapi;
+
+import com.google.common.testing.EqualsTester;
+import org.junit.Test;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Test for extended flow container value attribute.
+ */
+public class ExtFlowContainerTest {
+
+    private List<ExtFlowTypes> container = new ArrayList<>();
+    private List<ExtFlowTypes> container1 = new ArrayList<>();
+    private ExtFlowTypes.ExtType type = ExtFlowTypes.ExtType.EXT_FLOW_RULE_KEY;
+    ExtFlowTypes val = new DefaultExtKeyName("Name", type);
+    ExtFlowTypes val1 = new DefaultExtKeyName("Name1", type);
+
+    @Test
+    public void basics() {
+        container.add(val);
+        container1.add(val1);
+        ExtFlowContainer data = new ExtFlowContainer(container);
+        ExtFlowContainer sameAsData = new ExtFlowContainer(container);
+        ExtFlowContainer diffData = new ExtFlowContainer(container1);
+        new EqualsTester().addEqualityGroup(data, sameAsData)
+                .addEqualityGroup(diffData).testEquals();
+    }
+}
\ No newline at end of file
diff --git a/apps/bgpflowspec/flowapi/src/test/java/org/onosproject/flowapi/ExtOperatorValueTest.java b/apps/bgpflowspec/flowapi/src/test/java/org/onosproject/flowapi/ExtOperatorValueTest.java
new file mode 100644
index 0000000..8e9e3b7
--- /dev/null
+++ b/apps/bgpflowspec/flowapi/src/test/java/org/onosproject/flowapi/ExtOperatorValueTest.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2016-present 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.flowapi;
+
+import org.junit.Test;
+
+import com.google.common.testing.EqualsTester;
+
+/**
+ * Test for ExtOperatorValue flow specification component.
+ */
+public class ExtOperatorValueTest {
+    ExtOperatorValue tlv1 = new ExtOperatorValue((byte) 1, new byte[100]);
+    ExtOperatorValue sameAsTlv1 = new ExtOperatorValue((byte) 1, new byte[100]);
+    ExtOperatorValue tlv2 = new ExtOperatorValue((byte) 1, new byte[200]);
+
+    @Test
+    public void testEquality() {
+        new EqualsTester()
+                .addEqualityGroup(tlv1, sameAsTlv1)
+                .addEqualityGroup(tlv2)
+                .testEquals();
+    }
+}