diff --git a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/protocol/match/MatchField.java b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/protocol/match/MatchField.java
index 3ea9215..55cd59f 100644
--- a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/protocol/match/MatchField.java
+++ b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/protocol/match/MatchField.java
@@ -29,6 +29,7 @@
 import org.projectfloodlight.openflow.types.VRF;
 import org.projectfloodlight.openflow.types.VlanPcp;
 import org.projectfloodlight.openflow.types.CircuitSignalID;
+import org.projectfloodlight.openflow.types.OduSignalID;
 
 @SuppressWarnings("unchecked")
 public class MatchField<F extends OFValueType<F>> {
@@ -289,6 +290,18 @@
     public final static MatchField<MacAddress> BSN_INNER_ETH_SRC =
             new MatchField<MacAddress>("bsn_inner_eth_src", MatchFields.BSN_INNER_ETH_SRC);
 
+    public final static MatchField<OduSignalID> EXP_ODU_SIG_ID =
+            new MatchField<OduSignalID>("exp_odu_sig_id", MatchFields.EXP_ODU_SIG_ID);
+    
+    public final static MatchField<U8> EXP_ODU_SIGTYPE =
+            new MatchField<U8>("exp_odu_sigtype", MatchFields.EXP_ODU_SIGTYPE);
+    
+    public final static MatchField<CircuitSignalID> EXP_OCH_SIG_ID =
+            new MatchField<CircuitSignalID>("exp_och_sig_id", MatchFields.EXP_OCH_SIG_ID);
+    
+    public final static MatchField<U8> EXP_OCH_SIGTYPE =
+            new MatchField<U8>("exp_och_sigtype", MatchFields.EXP_OCH_SIGTYPE);
+
     public String getName() {
         return name;
     }
diff --git a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/protocol/match/MatchFields.java b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/protocol/match/MatchFields.java
index cd5ba32..abfa786 100644
--- a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/protocol/match/MatchFields.java
+++ b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/protocol/match/MatchFields.java
@@ -72,4 +72,8 @@
     OCH_SIGTYPE_BASIC,
     OCH_SIGID,
     OCH_SIGID_BASIC,
+    EXP_ODU_SIG_ID,
+    EXP_ODU_SIGTYPE,
+    EXP_OCH_SIG_ID,
+    EXP_OCH_SIGTYPE,
 }
diff --git a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/OduSignalID.java b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/OduSignalID.java
new file mode 100644
index 0000000..c97c4d0
--- /dev/null
+++ b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/OduSignalID.java
@@ -0,0 +1,182 @@
+/*
+ * Copyright  2015, ECI Telecom, Inc.
+ * 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.projectfloodlight.openflow.types;
+
+
+import java.util.List;
+
+import org.jboss.netty.buffer.ChannelBuffer;
+
+import com.google.common.collect.ComparisonChain;
+import com.google.common.primitives.UnsignedBytes;
+import com.google.common.hash.PrimitiveSink;
+
+import org.projectfloodlight.openflow.exceptions.OFParseError;
+import org.projectfloodlight.openflow.protocol.*;
+import com.google.common.hash.Funnel;
+import org.projectfloodlight.openflow.util.*;
+import java.util.Arrays;
+
+public class OduSignalID implements OFValueType<OduSignalID> {
+
+    // version: 1.3
+    final static byte WIRE_VERSION  = 4;
+    final static int MINIMUM_LENGTH = 4;
+
+        private final static int DEFAULT_TPN = 0x0;
+        private final static int DEFAULT_TSLEN = 80;
+        private final static byte[] DEFAULT_TSMAP = new byte[10];
+
+    // OF message fields
+    private final int tpn;
+    private final int tslen;
+    private final byte[] tsmap;
+ 
+   // Immutable default instance
+    public final static  OduSignalID DEFAULT = new  OduSignalID(
+        DEFAULT_TPN, DEFAULT_TSLEN, DEFAULT_TSMAP
+    );
+
+    // package private constructor - used by readers, builders, and factory
+     public OduSignalID(int tpn, int tslen, byte[] tsmap) {
+        this.tpn = tpn;
+        this.tslen = tslen;
+        this.tsmap = tsmap;
+    }
+
+    public int getTpn() {
+        return tpn;
+    }
+
+    public int getTslen() {
+        return tslen;
+    }
+
+    public byte[] getTsmap() {
+        return tsmap;
+    }
+
+
+    @Override
+    public int getLength() {
+      return MINIMUM_LENGTH + 12; //  tslen == 80 
+    }
+ 
+    public void writeTo(ChannelBuffer c) {
+        c.writeShort(tpn);
+        c.writeShort(tslen);
+        c.writeBytes(tsmap); // 10 bytes
+        c.writeZero(2); // write bytes for add padding alignment (the size of bytes in tsmap must be divided in 4)   
+    }
+
+     public static OduSignalID readFrom(ChannelBuffer c)   {
+        int tpn = U16.f(c.readShort());
+        int tslen = U16.f(c.readShort());
+        byte[] tsmap = null;
+        tsmap =ChannelUtils.readBytes(c, 10);
+        ChannelUtils.readBytes(c, 2); // skip padding 
+        OduSignalID oduSigId = new  OduSignalID(
+                    tpn,
+                      tslen,
+                      tsmap
+                    );
+          return oduSigId;
+    }
+
+
+    public void putTo(PrimitiveSink sink) {
+        FUNNEL.funnel(this, sink);
+    }
+
+    final static  OduSignalIDFunnel FUNNEL = new  OduSignalIDFunnel();
+    static class  OduSignalIDFunnel implements Funnel< OduSignalID> {
+        private static final long serialVersionUID = 1L;
+        @Override
+        public void funnel( OduSignalID message, PrimitiveSink sink) {
+            sink.putInt(message.tpn);
+            sink.putInt(message.tslen);
+            sink.putBytes(message.tsmap);
+        }
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder b = new StringBuilder(" OduSignalID(");
+        b.append("tpn=").append(tpn);
+        b.append(", ");
+        b.append("tslen=").append(tslen);
+        b.append(", ");
+        b.append("tsmap=").append(Arrays.toString(tsmap));
+        b.append(")");
+        return b.toString();
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj)
+            return true;
+        if (obj == null)
+            return false;
+        if (getClass() != obj.getClass())
+            return false;
+         OduSignalID other = (OduSignalID) obj;
+
+        if( tpn != other.tpn)
+            return false;
+        if( tslen != other.tslen)
+            return false;
+        if (!Arrays.equals(tsmap, other.tsmap))
+                return false;
+        return true;
+    }
+
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = 1;
+
+        result = prime * result + tpn;
+        result = prime * result + tslen;
+        result = prime * result + Arrays.hashCode(tsmap);
+        return result;
+    }
+
+    @Override
+    public OduSignalID applyMask(OduSignalID mask) {
+        byte[] maskTsmap = null;
+        if (this.tsmap!=null && this.tsmap.length > 0) {
+	       maskTsmap = new byte[this.tsmap.length];
+           int i = 0;
+       	   for (byte b : this.tsmap){
+		       maskTsmap[i] =(byte)  (b & mask.tsmap[i++]);
+           }
+        }
+        return new OduSignalID(this.tpn & mask.tpn,
+                                   (short) (this.tslen & mask
+                                           .tslen),
+                                    maskTsmap);
+    }
+
+    @Override
+    public int compareTo(OduSignalID o) {
+        return ComparisonChain.start()
+                              .compare(tpn,o.tpn)
+                              .compare(tslen,o.tslen)
+                              .compare(tsmap,o.tsmap, UnsignedBytes.lexicographicalComparator())
+                              .result();
+    }
+
+}
