diff --git a/src/gtpV2Codec/ieClasses/manual/dataTypeCodecUtils_manual.cpp b/src/gtpV2Codec/ieClasses/manual/dataTypeCodecUtils_manual.cpp
new file mode 100644
index 0000000..b15a798
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/manual/dataTypeCodecUtils_manual.cpp
@@ -0,0 +1,99 @@
+ /*
+Copyright 2019-present Infosys Limited  
+   
+SPDX-License-Identifier: Apache-2.0  
+  
+*/ 
+
+
+#include "../../../gtpV2Codec/ieClasses/dataTypeCodecUtils.h"
+#include "../../../gtpV2Codec/ieClasses/manual/gtpV2DataTypes_Manual.h"
+
+bool
+DataTypeCodecUtils::encodeDigitRegister (MsgBuffer & buffer,
+                                     DigitRegister const & data)
+{
+  Uint8 i;
+  for (i = 0; i< data.length; i+= 2)
+  {
+    Uint8 digit1 = data.digits[i];
+    Uint8 digit2 = data.digits[i+1];
+   
+    if (digit1 >9 || (digit2 > 9 && digit2 != 0x0F))
+    {
+      errorStream.add((char *)"Data validation failure: Non BCD digit encountered in DigitRegister\n");
+      return false;
+    }
+    else
+    {
+      buffer.writeBits(digit2, 4);
+      buffer.writeBits(digit1, 4);
+    }
+  }
+  return true;
+}
+
+bool
+DataTypeCodecUtils::decodeDigitRegister (MsgBuffer & buffer,
+                                     DigitRegister & data, 
+                                     Uint16 length)
+{
+  Uint8 i;
+  Uint8 digitLength = 0;
+  if (length > 8)
+  { 
+    errorStream.add((char *)"Data validation failure:DigitRegister.Length\n");
+    return false;
+  }
+  for (i = 0; i < length; i ++)
+  {
+     Uint8 digit1;
+     Uint8 digit2;
+     digit2 = buffer.readBits(4);
+     digit1 = buffer.readBits(4);
+     if (digit1 >9 || (digit2 > 9 && digit2 != 0x0F))
+     {
+       errorStream.add((char *)"Data validation failure: Non BCD Digit in DigitRegister\n");
+       return false;
+     }
+     else
+     {
+       data.digits[i*2] = digit1;
+       data.digits[i*2+1] = digit2;
+     }
+     digitLength += 2;
+     if (digit2 == 0x0F)
+     { 
+       // Reached the last digit stop here
+       digitLength--;
+       break;
+     }
+  }
+  data.length = digitLength;
+  return true;
+
+}
+
+void
+DataTypeCodecUtils::displayDigitRegister_v (DigitRegister const & data,
+                                            Debug & stream)
+{
+  stream.incrIndent();
+  stream.add((char *)"DigitRegister:");
+  stream.endOfLine();
+  stream.incrIndent();
+  stream.add((char *)"Length:");
+  stream.add(data.length);
+  stream.endOfLine();
+  Uint8 i;
+  for (i = 0; i < data.length; i++)
+  {
+    stream.add(data.digits[i]);
+    stream.add((char *)"  ");
+  }
+  stream.endOfLine();
+  stream.decrIndent();
+  stream.decrIndent();
+}
+
+
diff --git a/src/gtpV2Codec/ieClasses/manual/gtpV2DataTypes_Manual.h b/src/gtpV2Codec/ieClasses/manual/gtpV2DataTypes_Manual.h
new file mode 100644
index 0000000..2c7e5f9
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/manual/gtpV2DataTypes_Manual.h
@@ -0,0 +1,40 @@
+ /*
+Copyright 2019-present Infosys Limited  
+   
+SPDX-License-Identifier: Apache-2.0  
+  
+*/ 
+
+
+
+
+#ifndef GTPV2DATATYPES_MANUAL_H_
+#define GTPV2DATATYPES_MANUAL_H_
+
+typedef struct
+{
+  Uint8 length;
+  Uint8 digits[16];
+}DigitRegister;
+
+typedef struct
+{
+  Uint16 length;
+  Uint8 octets[16];
+}OctetArraySmall;
+
+
+typedef struct
+{
+  Uint16 length;
+  Uint8 octets[64];
+}OctetArrayMedium;
+
+typedef struct
+{
+  Uint16 length;
+  Uint8 octets[256];
+}OctetArrayLarge;
+
+
+#endif /*GTPV2DATATYPES_MANUAL_H_*/
diff --git a/src/gtpV2Codec/ieClasses/manual/gtpV2GroupedIe.cpp b/src/gtpV2Codec/ieClasses/manual/gtpV2GroupedIe.cpp
new file mode 100644
index 0000000..ee0c2c1
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/manual/gtpV2GroupedIe.cpp
@@ -0,0 +1,20 @@
+ /*
+Copyright 2019-present Infosys Limited  
+   
+SPDX-License-Identifier: Apache-2.0  
+  
+*/ 
+
+
+
+#include "../../../gtpV2Codec/ieClasses/manual/gtpV2GroupedIe.h"
+
+GtpV2GroupedIe::GtpV2GroupedIe() {
+	// TODO Auto-generated constructor stub
+
+}
+
+GtpV2GroupedIe::~GtpV2GroupedIe() {
+	// TODO Auto-generated destructor stub
+}
+
diff --git a/src/gtpV2Codec/ieClasses/manual/gtpV2GroupedIe.h b/src/gtpV2Codec/ieClasses/manual/gtpV2GroupedIe.h
new file mode 100644
index 0000000..df4da85
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/manual/gtpV2GroupedIe.h
@@ -0,0 +1,18 @@
+ /*
+Copyright 2019-present Infosys Limited  
+   
+SPDX-License-Identifier: Apache-2.0  
+  
+*/ 
+
+
+#ifndef GTPV2GROUPEDIE_H_
+#define GTPV2GROUPEDIE_H_
+
+class GtpV2GroupedIe {
+public:
+	GtpV2GroupedIe();
+	virtual ~GtpV2GroupedIe();
+};
+
+#endif /* GTPV2GROUPEDIE_H_ */
diff --git a/src/gtpV2Codec/ieClasses/manual/gtpV2Ie.cpp b/src/gtpV2Codec/ieClasses/manual/gtpV2Ie.cpp
new file mode 100644
index 0000000..a82512e
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/manual/gtpV2Ie.cpp
@@ -0,0 +1,45 @@
+ /*
+Copyright 2019-present Infosys Limited  
+   
+SPDX-License-Identifier: Apache-2.0  
+  
+*/ 
+ 
+
+
+#include "../../../gtpV2Codec/ieClasses/manual/gtpV2Ie.h"
+
+#include "msgBuffer.h"
+
+#define GTP_V2_IE_HEADER_LENGTH 4
+GtpV2Ie::GtpV2Ie() {
+	// TODO Auto-generated constructor stub
+
+}
+
+GtpV2Ie::~GtpV2Ie() {
+	// TODO Auto-generated destructor stub
+}
+
+void GtpV2Ie::decodeGtpV2IeHeader(MsgBuffer &buffer, GtpV2IeHeader &data)
+{
+	// Assume that the pointer in the MsgBuffer is pointing to the start of the IE
+	buffer.readUint8(data.ieType);
+	buffer.readUint16(data.length);
+	buffer.skipBits(4);
+	data.instance = buffer.readBits(4);
+}
+
+void GtpV2Ie::encodeGtpV2IeHeader(MsgBuffer &buffer, GtpV2IeHeader const &data)
+{
+	// Assume that the pointer in the MsgBuffer is pointing to the start of the IE
+	buffer.writeUint8(data.ieType, false);
+	buffer.writeUint16(data.length, false);
+	buffer.skipBits(4);
+	buffer.writeBits(data.instance, 4, false);
+}
+
+void GtpV2Ie::reserveHeaderSpace(MsgBuffer &buffer)
+{
+	buffer.skipBytes(GTP_V2_IE_HEADER_LENGTH);
+}
diff --git a/src/gtpV2Codec/ieClasses/manual/gtpV2Ie.h b/src/gtpV2Codec/ieClasses/manual/gtpV2Ie.h
new file mode 100644
index 0000000..6de3172
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/manual/gtpV2Ie.h
@@ -0,0 +1,39 @@
+ /*
+Copyright 2019-present Infosys Limited  
+   
+SPDX-License-Identifier: Apache-2.0  
+  
+*/ 
+
+
+
+#ifndef GTPV2IE_H_
+#define GTPV2IE_H_
+
+#include "basicTypes.h"
+#include "msgBuffer.h"
+#include "../gtpV2IeDataTypes.h"
+
+#define IE_HEADER_SIZE 4
+
+typedef struct
+{
+  Uint8  ieType;
+  Uint16 length;
+  Uint8  instance;
+}GtpV2IeHeader;
+
+class GtpV2Ie {
+public:
+	GtpV2Ie();
+	virtual ~GtpV2Ie();
+
+	static void encodeGtpV2IeHeader(MsgBuffer &buffer, GtpV2IeHeader const &data);
+	static void decodeGtpV2IeHeader(MsgBuffer &buffer, GtpV2IeHeader &data);
+	static void reserveHeaderSpace(MsgBuffer &buffer);
+
+protected:
+	Uint8 ieType;
+};
+
+#endif /* GTPV2IE_H_ */
