diff --git a/src/gtpV2Codec/ieClasses/cnOperatorSelectionEntityIe.cpp b/src/gtpV2Codec/ieClasses/cnOperatorSelectionEntityIe.cpp
new file mode 100644
index 0000000..5cd6480
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/cnOperatorSelectionEntityIe.cpp
@@ -0,0 +1,96 @@
+/*
+ * 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 "cnOperatorSelectionEntityIe.h"
+#include "dataTypeCodecUtils.h"
+
+CnOperatorSelectionEntityIe::CnOperatorSelectionEntityIe() 
+{
+    ieType = 173;
+    // TODO
+
+}
+
+CnOperatorSelectionEntityIe::~CnOperatorSelectionEntityIe() {
+    // TODO Auto-generated destructor stub
+}
+
+bool CnOperatorSelectionEntityIe::encodeCnOperatorSelectionEntityIe(MsgBuffer &buffer, CnOperatorSelectionEntityIeData const &data)
+{
+    buffer.skipBits(6);
+
+    if (!(data.cnOpselectionEntity<= 3))
+    {
+        errorStream.add((char *)"Data validation failure: cnOpselectionEntity\n");
+        return false; 
+    }
+    if(!(buffer.writeBits(data.cnOpselectionEntity, 2)))
+    {
+        errorStream.add((char *)"Encoding of cnOpselectionEntity failed\n");
+        return false;
+    }
+
+    return true;
+}
+
+bool CnOperatorSelectionEntityIe::decodeCnOperatorSelectionEntityIe(MsgBuffer &buffer, CnOperatorSelectionEntityIeData &data, Uint16 length)
+{     
+    // TODO optimize the length checks
+    
+    Uint16 ieBoundary = buffer.getCurrentIndex() + length;
+    buffer.skipBits(6);
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: \n");
+        return false;
+    }
+
+    data.cnOpselectionEntity = buffer.readBits(2);
+    // confirm that we are not reading beyond the IE boundary
+    if (buffer.getCurrentIndex() > ieBoundary)
+    {
+        errorStream.add((char *)"Attempt to read beyond IE boundary: cnOpselectionEntity\n");
+        return false;
+    }
+    if (!(data.cnOpselectionEntity<= 3))
+    {
+        errorStream.add((char *)"Data validation failure : cnOpselectionEntity\n");
+        return false; //TODO need to add validations
+    }
+
+    // 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 CnOperatorSelectionEntityIe\n");
+        return false;
+    }
+}
+void CnOperatorSelectionEntityIe::displayCnOperatorSelectionEntityIe_v(CnOperatorSelectionEntityIeData const &data, Debug &stream)
+{
+    stream.incrIndent();
+    stream.add((char *)"CnOperatorSelectionEntityIeData:");
+    stream.incrIndent();
+    stream.endOfLine();
+  
+    stream.add( (char *)"cnOpselectionEntity: "); 
+    stream.add((Uint8)data.cnOpselectionEntity);
+    stream.endOfLine();
+    stream.decrIndent();
+    stream.decrIndent();
+}
