diff --git a/src/gtpV2Codec/ieClasses/apnAndRelativeCapacityIe.cpp b/src/gtpV2Codec/ieClasses/apnAndRelativeCapacityIe.cpp
new file mode 100644
index 0000000..fe6d129
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/apnAndRelativeCapacityIe.cpp
@@ -0,0 +1,120 @@
+/*
+ * 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 "apnAndRelativeCapacityIe.h"
+#include "dataTypeCodecUtils.h"
+
+ApnAndRelativeCapacityIe::ApnAndRelativeCapacityIe() 
+{
+    ieType = 184;
+    // TODO
+
+}
+
+ApnAndRelativeCapacityIe::~ApnAndRelativeCapacityIe() {
+    // TODO Auto-generated destructor stub
+}
+
+bool ApnAndRelativeCapacityIe::encodeApnAndRelativeCapacityIe(MsgBuffer &buffer, ApnAndRelativeCapacityIeData const &data)
+{
+    if (!(data.relativeCapacity>= 1 && data.relativeCapacity<= 100))
+    {
+        errorStream.add((char *)"Data validation failure: relativeCapacity\n");
+        return false; 
+    }
+    if (!(buffer.writeUint8(data.relativeCapacity)))
+    {
+        errorStream.add((char *)"Encoding of relativeCapacity failed\n");
+        return false;
+    }
+    if (!(buffer.writeUint8(data.apnLength)))
+    {
+        errorStream.add((char *)"Encoding of apnLength failed\n");
+        return false;
+    }
+    if (!(DataTypeCodecUtils::encodeUint8Array32(buffer, data.apn)))
+    {
+    errorStream.add((char *)"Encoding of apn failed\n");
+    return false;
+    }
+
+    return true;
+}
+
+bool ApnAndRelativeCapacityIe::decodeApnAndRelativeCapacityIe(MsgBuffer &buffer, ApnAndRelativeCapacityIeData &data, Uint16 length)
+{     
+    // TODO optimize the length checks
+    
+    Uint16 ieBoundary = buffer.getCurrentIndex() + length;
+
+    buffer.readUint8(data.relativeCapacity);
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: relativeCapacity\n");
+        return false;
+    }
+    if (!(data.relativeCapacity>= 1 && data.relativeCapacity<= 100))
+    {
+        errorStream.add((char *)"Data validation failure : relativeCapacity\n");
+        return false; //TODO need to add validations
+    }
+
+    buffer.readUint8(data.apnLength);
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: apnLength\n");
+        return false;
+    }
+
+    Uint16 lengthLeft = length;
+    lengthLeft = ieBoundary - buffer.getCurrentIndex();
+    if (!(DataTypeCodecUtils::decodeUint8Array32(buffer, data.apn, lengthLeft, 0)))
+    {
+        errorStream.add((char *)"Failed to decode: apn\n");
+        return false;
+    }
+
+    // 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 ApnAndRelativeCapacityIe\n");
+        return false;
+    }
+}
+void ApnAndRelativeCapacityIe::displayApnAndRelativeCapacityIe_v(ApnAndRelativeCapacityIeData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"ApnAndRelativeCapacityIeData:");
+    stream.incrIndent();
+    stream.endOfLine();
+  
+    stream.add((char *)"relativeCapacity: ");
+    stream.add(data.relativeCapacity);
+    stream.endOfLine();
+  
+    stream.add((char *)"apnLength: ");
+    stream.add(data.apnLength);
+    stream.endOfLine();
+  
+    stream.add((char *)"apn:");
+    stream.endOfLine();
+    DataTypeCodecUtils::displayUint8Array32_v(data.apn, stream);
+    stream.decrIndent();
+    stream.decrIndent();
+}
