diff --git a/src/gtpV2Codec/ieClasses/gtpV2IeFactory.cpp b/src/gtpV2Codec/ieClasses/gtpV2IeFactory.cpp
new file mode 100644
index 0000000..f10109f
--- /dev/null
+++ b/src/gtpV2Codec/ieClasses/gtpV2IeFactory.cpp
@@ -0,0 +1,329 @@
+/*
+ * 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/iefactorytemplate.cpp.tt>
+ ******************************************************************************/
+
+#include <map>
+#include "gtpV2IeFactory.h"
+#include "manual/gtpV2Ie.h"
+#include "gtpV2GrpIeDataTypes.h"
+#include "imsiIe.h"
+#include "causeIe.h"
+#include "msisdnIe.h"
+#include "meiIe.h"
+#include "uliIe.h"
+#include "servingNetworkIe.h"
+#include "ratTypeIe.h"
+#include "indicationIe.h"
+#include "fTeidIe.h"
+#include "apnIe.h"
+#include "selectionModeIe.h"
+#include "pdnTypeIe.h"
+#include "paaIe.h"
+#include "apnRestrictionIe.h"
+#include "ambrMmbrIe.h"
+#include "ambrIe.h"
+#include "ebiIe.h"
+#include "pcoIe.h"
+#include "traceInformationIe.h"
+#include "recoveryIe.h"
+#include "ueTimeZoneIe.h"
+#include "uciIe.h"
+#include "chargingCharacteristicsIe.h"
+#include "localDistinguishedNameIe.h"
+#include "signallingPriorityIndicationIe.h"
+#include "additionalProtocolConfigurationOptionsIe.h"
+#include "fqCsidIe.h"
+#include "bearerTftIe.h"
+#include "bearerQosIe.h"
+#include "changeReportingActionIe.h"
+#include "csgInformationReportingActionIe.h"
+#include "fqdnIe.h"
+#include "epcTimerIe.h"
+#include "chargingIdIe.h"
+#include "bearerFlagsIe.h"
+#include "ipAddressIe.h"
+#include "delayValueIe.h"
+#include "portNumberIe.h"
+#include "cnOperatorSelectionEntityIe.h"
+#include "servingPlmnRateControlIe.h"
+#include "counterIe.h"
+#include "twanIdentifierIe.h"
+#include "twanIdentifierTimestampIe.h"
+#include "secondaryRatUsageDataReportIe.h"
+#include "ranNasCauseIe.h"
+#include "epcoIe.h"
+#include "maximumPacketLossRateIe.h"
+#include "fContainerIe.h"
+#include "nodeIdentifierIe.h"
+#include "upFunctionSelectionIndicationFlagsIe.h"
+#include "henbInformationReportingIe.h"
+#include "ip4cpIe.h"
+#include "presenceReportingAreaActionIe.h"
+#include "nodeTypeIe.h"
+#include "ptiIe.h"
+#include "twmiIe.h"
+#include "millisecondTimeStampIe.h"
+#include "integerNumberIe.h"
+#include "mappedUeUsageTypeIe.h"
+#include "uliTimestampIe.h"
+#include "metricIe.h"
+#include "remoteUserIdIe.h"
+#include "remoteUeIpInformationIe.h"
+#include "sequenceNumberIe.h"
+#include "apnAndRelativeCapacityIe.h"
+#include "arpIe.h"
+#include "throttlingIe.h"
+#include "pagingAndServiceInformationIe.h"
+#include "bearerContextIe.h"
+#include "overloadControlInformationIe.h"
+#include "loadControlInformationIe.h"
+#include "remoteUeContextIe.h"
+
+GtpV2IeFactory::GtpV2IeFactory() 
+{
+    //Create Message Objects    
+    ImsiIe* imsiIe_p = new (ImsiIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(ImsiIeType, imsiIe_p));
+
+    CauseIe* causeIe_p = new (CauseIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(CauseIeType, causeIe_p));
+
+    MsisdnIe* msisdnIe_p = new (MsisdnIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(MsisdnIeType, msisdnIe_p));
+
+    MeiIe* meiIe_p = new (MeiIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(MeiIeType, meiIe_p));
+
+    UliIe* uliIe_p = new (UliIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(UliIeType, uliIe_p));
+
+    ServingNetworkIe* servingNetworkIe_p = new (ServingNetworkIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(ServingNetworkIeType, servingNetworkIe_p));
+
+    RatTypeIe* ratTypeIe_p = new (RatTypeIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(RatTypeIeType, ratTypeIe_p));
+
+    IndicationIe* indicationIe_p = new (IndicationIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(IndicationIeType, indicationIe_p));
+
+    FTeidIe* fTeidIe_p = new (FTeidIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(FTeidIeType, fTeidIe_p));
+
+    ApnIe* apnIe_p = new (ApnIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(ApnIeType, apnIe_p));
+
+    SelectionModeIe* selectionModeIe_p = new (SelectionModeIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(SelectionModeIeType, selectionModeIe_p));
+
+    PdnTypeIe* pdnTypeIe_p = new (PdnTypeIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(PdnTypeIeType, pdnTypeIe_p));
+
+    PaaIe* paaIe_p = new (PaaIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(PaaIeType, paaIe_p));
+
+    ApnRestrictionIe* apnRestrictionIe_p = new (ApnRestrictionIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(ApnRestrictionIeType, apnRestrictionIe_p));
+
+    AmbrMmbrIe* ambrMmbrIe_p = new (AmbrMmbrIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(AmbrMmbrIeType, ambrMmbrIe_p));
+
+    AmbrIe* ambrIe_p = new (AmbrIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(AmbrIeType, ambrIe_p));
+
+    EbiIe* ebiIe_p = new (EbiIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(EbiIeType, ebiIe_p));
+
+    PcoIe* pcoIe_p = new (PcoIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(PcoIeType, pcoIe_p));
+
+    TraceInformationIe* traceInformationIe_p = new (TraceInformationIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(TraceInformationIeType, traceInformationIe_p));
+
+    RecoveryIe* recoveryIe_p = new (RecoveryIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(RecoveryIeType, recoveryIe_p));
+
+    UeTimeZoneIe* ueTimeZoneIe_p = new (UeTimeZoneIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(UeTimeZoneIeType, ueTimeZoneIe_p));
+
+    UciIe* uciIe_p = new (UciIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(UciIeType, uciIe_p));
+
+    ChargingCharacteristicsIe* chargingCharacteristicsIe_p = new (ChargingCharacteristicsIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(ChargingCharacteristicsIeType, chargingCharacteristicsIe_p));
+
+    LocalDistinguishedNameIe* localDistinguishedNameIe_p = new (LocalDistinguishedNameIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(LocalDistinguishedNameIeType, localDistinguishedNameIe_p));
+
+    SignallingPriorityIndicationIe* signallingPriorityIndicationIe_p = new (SignallingPriorityIndicationIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(SignallingPriorityIndicationIeType, signallingPriorityIndicationIe_p));
+
+    AdditionalProtocolConfigurationOptionsIe* additionalProtocolConfigurationOptionsIe_p = new (AdditionalProtocolConfigurationOptionsIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(AdditionalProtocolConfigurationOptionsIeType, additionalProtocolConfigurationOptionsIe_p));
+
+    FqCsidIe* fqCsidIe_p = new (FqCsidIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(FqCsidIeType, fqCsidIe_p));
+
+    BearerTftIe* bearerTftIe_p = new (BearerTftIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(BearerTftIeType, bearerTftIe_p));
+
+    BearerQosIe* bearerQosIe_p = new (BearerQosIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(BearerQosIeType, bearerQosIe_p));
+
+    ChangeReportingActionIe* changeReportingActionIe_p = new (ChangeReportingActionIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(ChangeReportingActionIeType, changeReportingActionIe_p));
+
+    CsgInformationReportingActionIe* csgInformationReportingActionIe_p = new (CsgInformationReportingActionIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(CsgInformationReportingActionIeType, csgInformationReportingActionIe_p));
+
+    FqdnIe* fqdnIe_p = new (FqdnIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(FqdnIeType, fqdnIe_p));
+
+    EpcTimerIe* epcTimerIe_p = new (EpcTimerIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(EpcTimerIeType, epcTimerIe_p));
+
+    ChargingIdIe* chargingIdIe_p = new (ChargingIdIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(ChargingIdIeType, chargingIdIe_p));
+
+    BearerFlagsIe* bearerFlagsIe_p = new (BearerFlagsIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(BearerFlagsIeType, bearerFlagsIe_p));
+
+    IpAddressIe* ipAddressIe_p = new (IpAddressIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(IpAddressIeType, ipAddressIe_p));
+
+    DelayValueIe* delayValueIe_p = new (DelayValueIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(DelayValueIeType, delayValueIe_p));
+
+    PortNumberIe* portNumberIe_p = new (PortNumberIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(PortNumberIeType, portNumberIe_p));
+
+    CnOperatorSelectionEntityIe* cnOperatorSelectionEntityIe_p = new (CnOperatorSelectionEntityIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(CnOperatorSelectionEntityIeType, cnOperatorSelectionEntityIe_p));
+
+    ServingPlmnRateControlIe* servingPlmnRateControlIe_p = new (ServingPlmnRateControlIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(ServingPlmnRateControlIeType, servingPlmnRateControlIe_p));
+
+    CounterIe* counterIe_p = new (CounterIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(CounterIeType, counterIe_p));
+
+    TwanIdentifierIe* twanIdentifierIe_p = new (TwanIdentifierIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(TwanIdentifierIeType, twanIdentifierIe_p));
+
+    TwanIdentifierTimestampIe* twanIdentifierTimestampIe_p = new (TwanIdentifierTimestampIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(TwanIdentifierTimestampIeType, twanIdentifierTimestampIe_p));
+
+    SecondaryRatUsageDataReportIe* secondaryRatUsageDataReportIe_p = new (SecondaryRatUsageDataReportIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(SecondaryRatUsageDataReportIeType, secondaryRatUsageDataReportIe_p));
+
+    RanNasCauseIe* ranNasCauseIe_p = new (RanNasCauseIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(RanNasCauseIeType, ranNasCauseIe_p));
+
+    EpcoIe* epcoIe_p = new (EpcoIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(EpcoIeType, epcoIe_p));
+
+    MaximumPacketLossRateIe* maximumPacketLossRateIe_p = new (MaximumPacketLossRateIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(MaximumPacketLossRateIeType, maximumPacketLossRateIe_p));
+
+    FContainerIe* fContainerIe_p = new (FContainerIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(FContainerIeType, fContainerIe_p));
+
+    NodeIdentifierIe* nodeIdentifierIe_p = new (NodeIdentifierIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(NodeIdentifierIeType, nodeIdentifierIe_p));
+
+    UpFunctionSelectionIndicationFlagsIe* upFunctionSelectionIndicationFlagsIe_p = new (UpFunctionSelectionIndicationFlagsIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(UpFunctionSelectionIndicationFlagsIeType, upFunctionSelectionIndicationFlagsIe_p));
+
+    HenbInformationReportingIe* henbInformationReportingIe_p = new (HenbInformationReportingIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(HenbInformationReportingIeType, henbInformationReportingIe_p));
+
+    Ip4cpIe* ip4cpIe_p = new (Ip4cpIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(Ip4cpIeType, ip4cpIe_p));
+
+    PresenceReportingAreaActionIe* presenceReportingAreaActionIe_p = new (PresenceReportingAreaActionIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(PresenceReportingAreaActionIeType, presenceReportingAreaActionIe_p));
+
+    NodeTypeIe* nodeTypeIe_p = new (NodeTypeIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(NodeTypeIeType, nodeTypeIe_p));
+
+    PtiIe* ptiIe_p = new (PtiIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(PtiIeType, ptiIe_p));
+
+    TwmiIe* twmiIe_p = new (TwmiIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(TwmiIeType, twmiIe_p));
+
+    MillisecondTimeStampIe* millisecondTimeStampIe_p = new (MillisecondTimeStampIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(MillisecondTimeStampIeType, millisecondTimeStampIe_p));
+
+    IntegerNumberIe* integerNumberIe_p = new (IntegerNumberIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(IntegerNumberIeType, integerNumberIe_p));
+
+    MappedUeUsageTypeIe* mappedUeUsageTypeIe_p = new (MappedUeUsageTypeIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(MappedUeUsageTypeIeType, mappedUeUsageTypeIe_p));
+
+    UliTimestampIe* uliTimestampIe_p = new (UliTimestampIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(UliTimestampIeType, uliTimestampIe_p));
+
+    MetricIe* metricIe_p = new (MetricIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(MetricIeType, metricIe_p));
+
+    RemoteUserIdIe* remoteUserIdIe_p = new (RemoteUserIdIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(RemoteUserIdIeType, remoteUserIdIe_p));
+
+    RemoteUeIpInformationIe* remoteUeIpInformationIe_p = new (RemoteUeIpInformationIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(RemoteUeIpInformationIeType, remoteUeIpInformationIe_p));
+
+    SequenceNumberIe* sequenceNumberIe_p = new (SequenceNumberIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(SequenceNumberIeType, sequenceNumberIe_p));
+
+    ApnAndRelativeCapacityIe* apnAndRelativeCapacityIe_p = new (ApnAndRelativeCapacityIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(ApnAndRelativeCapacityIeType, apnAndRelativeCapacityIe_p));
+
+    ArpIe* arpIe_p = new (ArpIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(ArpIeType, arpIe_p));
+
+    ThrottlingIe* throttlingIe_p = new (ThrottlingIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(ThrottlingIeType, throttlingIe_p));
+
+    PagingAndServiceInformationIe* pagingAndServiceInformationIe_p = new (PagingAndServiceInformationIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(PagingAndServiceInformationIeType, pagingAndServiceInformationIe_p));
+
+    BearerContextIe* bearerContextIe_p = new (BearerContextIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(BearerContextIeType, bearerContextIe_p));
+
+    OverloadControlInformationIe* overloadControlInformationIe_p = new (OverloadControlInformationIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(OverloadControlInformationIeType, overloadControlInformationIe_p));
+
+    LoadControlInformationIe* loadControlInformationIe_p = new (LoadControlInformationIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(LoadControlInformationIeType, loadControlInformationIe_p));
+
+    RemoteUeContextIe* remoteUeContextIe_p = new (RemoteUeContextIe);
+    ieObjectContainer.insert(std::pair<Uint8, GtpV2Ie*>(RemoteUeContextIeType, remoteUeContextIe_p));
+
+
+}
+
+GtpV2IeFactory::~GtpV2IeFactory() {
+    // TODO clean up the allocated memory for message objects
+}
+
+GtpV2IeFactory& GtpV2IeFactory::getInstance()
+{
+    static GtpV2IeFactory gtpV2IeFactory;
+    return gtpV2IeFactory;
+}
+
+GtpV2Ie& GtpV2IeFactory::getIeObject(Uint8 ieType)
+{
+    std::map<Uint8, GtpV2Ie*>::iterator it;
+    it = ieObjectContainer.find(ieType);
+    return *(it->second);
+}
\ No newline at end of file
