diff --git a/src/gtpV2Codec/ieClasses/servingPlmnRateControlIe.cpp b/src/gtpV2Codec/ieClasses/servingPlmnRateControlIe.cpp
new file mode 100644
index 0000000..c4ff183
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/servingPlmnRateControlIe.cpp
@@ -0,0 +1,93 @@
+/*
+ * 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 "servingPlmnRateControlIe.h"
+#include "dataTypeCodecUtils.h"
+
+ServingPlmnRateControlIe::ServingPlmnRateControlIe() 
+{
+    ieType = 198;
+    // TODO
+
+}
+
+ServingPlmnRateControlIe::~ServingPlmnRateControlIe() {
+    // TODO Auto-generated destructor stub
+}
+
+bool ServingPlmnRateControlIe::encodeServingPlmnRateControlIe(MsgBuffer &buffer, ServingPlmnRateControlIeData const &data)
+{
+    if (!(buffer.writeUint16(data.uplinkRateLimit)))
+    {
+        errorStream.add((char *)"Encoding of uplinkRateLimit failed\n");
+        return false;
+    }
+    if (!(buffer.writeUint16(data.downlinkRateLimit)))
+    {
+        errorStream.add((char *)"Encoding of downlinkRateLimit failed\n");
+        return false;
+    }
+
+    return true;
+}
+
+bool ServingPlmnRateControlIe::decodeServingPlmnRateControlIe(MsgBuffer &buffer, ServingPlmnRateControlIeData &data, Uint16 length)
+{     
+    // TODO optimize the length checks
+    
+    Uint16 ieBoundary = buffer.getCurrentIndex() + length;
+
+    buffer.readUint16(data.uplinkRateLimit);
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: uplinkRateLimit\n");
+        return false;
+    }
+
+    buffer.readUint16(data.downlinkRateLimit);
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: downlinkRateLimit\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 ServingPlmnRateControlIe\n");
+        return false;
+    }
+}
+void ServingPlmnRateControlIe::displayServingPlmnRateControlIe_v(ServingPlmnRateControlIeData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"ServingPlmnRateControlIeData:");
+    stream.incrIndent();
+    stream.endOfLine();
+  
+    stream.add((char *)"uplinkRateLimit: ");
+    stream.add(data.uplinkRateLimit);
+    stream.endOfLine();
+  
+    stream.add((char *)"downlinkRateLimit: ");
+    stream.add(data.downlinkRateLimit);
+    stream.endOfLine();
+    stream.decrIndent();
+    stream.decrIndent();
+}
