diff --git a/src/gtpV2Codec/ieClasses/causeIe.cpp b/src/gtpV2Codec/ieClasses/causeIe.cpp
new file mode 100644
index 0000000..7629c05
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/causeIe.cpp
@@ -0,0 +1,162 @@
+/*
+ * Copyright 2019-present Infosys Limited  
+ *   
+ * SPDX-License-Identifier: Apache-2.0    
+ */
+/******************************************************************************
+ *
+ * This is an auto generated file.
+ * Please do not edit this file.
+ * All edits to be made through template source file
+ * <TOP-DIR/scripts/GtpV2StackCodeGen/tts/ietemplate.cpp.tt>
+ ******************************************************************************/
+
+#include "causeIe.h"
+#include "dataTypeCodecUtils.h"
+
+CauseIe::CauseIe() 
+{
+    ieType = 2;
+    // TODO
+
+}
+
+CauseIe::~CauseIe() {
+    // TODO Auto-generated destructor stub
+}
+
+bool CauseIe::encodeCauseIe(MsgBuffer &buffer, CauseIeData const &data)
+{
+    if (!(buffer.writeUint8(data.causeValue)))
+    {
+        errorStream.add((char *)"Encoding of causeValue failed\n");
+        return false;
+    }
+    buffer.skipBits(5);
+
+    if(!(buffer.writeBits(data.pce, 1)))
+    {
+        errorStream.add((char *)"Encoding of pce failed\n");
+        return false;
+    }
+    if(!(buffer.writeBits(data.pbe, 1)))
+    {
+        errorStream.add((char *)"Encoding of pbe failed\n");
+        return false;
+    }
+    if(!(buffer.writeBits(data.cs, 1)))
+    {
+        errorStream.add((char *)"Encoding of cs failed\n");
+        return false;
+    }
+    if (data.offendingIeDataPresent)
+    {
+        if (!(DataTypeCodecUtils::encodeOffendingIeData(buffer, data.offendingIeData)))
+        {
+            errorStream.add((char *)"Encoding of offendingIeData failed\n");
+            return false;
+        }
+    }
+
+    return true;
+}
+
+bool CauseIe::decodeCauseIe(MsgBuffer &buffer, CauseIeData &data, Uint16 length)
+{     
+    // TODO optimize the length checks
+    
+    Uint16 ieBoundary = buffer.getCurrentIndex() + length;
+
+    buffer.readUint8(data.causeValue);
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: causeValue\n");
+        return false;
+    }
+    buffer.skipBits(5);
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: \n");
+        return false;
+    }
+
+    data.pce = buffer.readBits(1);
+    // confirm that we are not reading beyond the IE boundary
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: pce\n");
+        return false;
+    }
+    data.pbe = buffer.readBits(1);
+    // confirm that we are not reading beyond the IE boundary
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: pbe\n");
+        return false;
+    }
+    data.cs = buffer.readBits(1);
+    // confirm that we are not reading beyond the IE boundary
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: cs\n");
+        return false;
+    }
+
+    Uint16 lengthLeft = length;
+
+    if (length == 6)
+    {
+        lengthLeft = ieBoundary - buffer.getCurrentIndex();
+        if (!(DataTypeCodecUtils::decodeOffendingIeData(buffer, data.offendingIeData, lengthLeft)))
+        {
+            errorStream.add((char *)"Failed to decode: offendingIeData\n");
+            return false;
+        }
+        data.offendingIeDataPresent = true;
+    }
+
+    // The IE is decoded now. The buffer index should be pointing to the 
+    // IE Boundary. If not, we have some more data left for the IE which we don't know
+    // how to decode
+    if (ieBoundary == buffer.getCurrentIndex())
+    {
+        return true;
+    }
+    else
+    {
+        errorStream.add((char *)"Unable to decode IE CauseIe\n");
+        return false;
+    }
+}
+void CauseIe::displayCauseIe_v(CauseIeData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"CauseIeData:");
+    stream.incrIndent();
+    stream.endOfLine();
+  
+    stream.add((char *)"causeValue: ");
+    stream.add(data.causeValue);
+    stream.endOfLine();
+  
+    stream.add( (char *)"pce: "); 
+    stream.add((Uint8)data.pce);
+    stream.endOfLine();
+  
+    stream.add( (char *)"pbe: "); 
+    stream.add((Uint8)data.pbe);
+    stream.endOfLine();
+  
+    stream.add( (char *)"cs: "); 
+    stream.add((Uint8)data.cs);
+    stream.endOfLine();
+  
+    if (data.offendingIeDataPresent)
+    {
+        stream.add((char *)"offendingIeData:");
+        stream.endOfLine();
+        DataTypeCodecUtils::displayOffendingIeData_v(data.offendingIeData, stream);
+    }   
+    stream.decrIndent();
+    stream.decrIndent();
+}
