diff --git a/cfg/sei_processing_order.cfg b/cfg/sei_processing_order.cfg
new file mode 100644
index 0000000000000000000000000000000000000000..ee9d570cadc917ef7d422e111ef182fca0b09710
--- /dev/null
+++ b/cfg/sei_processing_order.cfg
@@ -0,0 +1,29 @@
+#======== SEI messages processing order ===============
+
+SEIPOEnabled                 : 1 			  #Enabling SEI processing order flag
+SEIPOPayLoadType             : 19 142 211     #SEI PayloadTypes to be processed
+SEIPOProcessingOrder         : 2  1   0       #Processing order of SEI payload types
+
+
+#I chose 3 SEIs in the attached cfg: (see below). Please check it.
+#19: FGC SEI
+#142: CTI SEI
+#211: NNPFA
+#The order: CTI is before FGC. For NNPFA, order is not defined.
+
+
+###================Two more illustrations========================### 
+
+#The order: CTI and NNPFA are before FGC. The preferred order of CTI and NNPFA, order is not defined.
+#
+##======== SEI messages processing order ===============
+#SEIPOEnabled                 : 1             #Enabling SEI processing order flag
+#SEIPOPayLoadType             : 19 142 211    #SEI PayloadTypes to be processed
+#SEIPOProcessingOrder         : 2  1   1      #Processing order of SEI payload types
+#
+#The order: CTI is before FGC. 
+#
+##======== SEI messages processing order ===============
+#SEIPOEnabled                 : 1         #Enabling SEI processing order flag
+#SEIPOPayLoadType             : 19 142    #SEI PayloadTypes to be processed
+#SEIPOProcessingOrder         : 2  1      #Processing order of SEI payload types
diff --git a/doc/software-manual.tex b/doc/software-manual.tex
index 003198251482ebd7f3bc7111e78446f9322be3e4..7390f04751d67ddc60ecd6fde54250cec15e1884 100644
--- a/doc/software-manual.tex
+++ b/doc/software-manual.tex
@@ -3734,6 +3734,7 @@ The table below lists the SEI messages defined for Version 1 and Range-Extension
   210 & Neural network post-filter characteristics & Table \ref{tab:sei-nn-post-filter-characteristics} \\
   211 & Neural netowrk post-filter activation & Table \ref{tab:sei-nn-post-filter-activation} \\
   212 & Phase indication                         & Table \ref{tab:sei-phase-indication} \\
+  213 & Processing order SEI messages            & Table \ref{tab:sei-processing order}\\
 \end{SEIListTable}
 %%
 %% SEI messages
@@ -5620,6 +5621,21 @@ Specifies the Vertical Phase Denominator minus 1 of Phase Indication SEI message
 \\
 \end{OptionTableNoShorthand}
 
+\begin{OptionTableNoShorthand}{Processing order SEI message encoder parameters}{tab:sei-processing order}
+\Option{SEIPOEnabled} &
+\Default{false} &
+Enables (true) or disables (false) the insertion of processing order SEI message.
+\\
+\Option{SEIPOPayLoadType\emph{i}} &
+\Default{0} &
+Specifies the value of payloadType for the \emph{i}-th SEI message for which information is provided in the SEI processing order SEI message.
+\\
+\Option{SEIPOProcessingOrder\emph{i}} &
+\Default{0} &
+Specifies the preferred order of processing any SEI message with payloadType equal to SEIPOPayLoadType\emph{i}.
+\\
+\end{OptionTableNoShorthand}
+
 %\Option{SEITimeCode} &
 %\Default{false} &
 %When true, generate time code SEI messages.
diff --git a/source/App/EncoderApp/EncApp.cpp b/source/App/EncoderApp/EncApp.cpp
index 3480c6b14cf6d05aa788d625824d7e29a168d957..8bd045b16db2a7adbf046667b822ca7a9ad6f7ea 100644
--- a/source/App/EncoderApp/EncApp.cpp
+++ b/source/App/EncoderApp/EncApp.cpp
@@ -1270,6 +1270,14 @@ void EncApp::xInitLibCfg()
   m_cEncLib.setSiiSEINumUnitsInShutterInterval(m_siiSEINumUnitsInShutterInterval);
   m_cEncLib.setSiiSEITimeScale(m_siiSEITimeScale);
   m_cEncLib.setSiiSEISubLayerNumUnitsInSI(m_siiSEISubLayerNumUnitsInSI);
+
+#if JVET_AA0102_JVET_AA2027_SEI_PROCESSING_ORDER
+  m_cEncLib.setPoSEIEnabled                                      (m_poSEIEnabled);
+  m_cEncLib.setPoSEIPayloadType                                  (m_poSEIPayloadType);
+  m_cEncLib.setPoSEIProcessingOrder                              (m_poSEIProcessingOrder);
+  m_cEncLib.setPoSEINumofSeiMessages                             (m_numofSEIMessages);
+#endif
+
   m_cEncLib.setVuiParametersPresentFlag                          ( m_vuiParametersPresentFlag );
   m_cEncLib.setSamePicTimingInAllOLS                             (m_samePicTimingInAllOLS);
   m_cEncLib.setAspectRatioInfoPresentFlag                        ( m_aspectRatioInfoPresentFlag);
diff --git a/source/App/EncoderApp/EncAppCfg.cpp b/source/App/EncoderApp/EncAppCfg.cpp
index 62f5a22f3ebbd663972d017c9ce59c04c7016113..fe4895621f66f3eb47e00d1209f8ed5b4d1a72f5 100644
--- a/source/App/EncoderApp/EncAppCfg.cpp
+++ b/source/App/EncoderApp/EncAppCfg.cpp
@@ -745,6 +745,11 @@ bool EncAppCfg::parseCfg( int argc, char* argv[] )
   SMultiValueInput<uint32_t>   cfg_FgcSEICompModelValueComp2              (0, 65535,  0, 256 * 6);
   SMultiValueInput<unsigned>   cfg_siiSEIInputNumUnitsInSI(0, std::numeric_limits<uint32_t>::max(), 0, 7);
 
+#if JVET_AA0102_JVET_AA2027_SEI_PROCESSING_ORDER
+  SMultiValueInput<uint16_t>   cfg_poSEIPayloadType     (0, 65535, 0, 256*2);
+  SMultiValueInput<uint16_t>   cfg_poSEIProcessingOrder (0, 255, 0, 256);
+#endif
+
 #if ENABLE_TRACING
   string sTracingRule;
   string sTracingFile;
@@ -1590,6 +1595,13 @@ bool EncAppCfg::parseCfg( int argc, char* argv[] )
   ("SEIDRINonlinearModel",                            cfg_driSEINonlinearModel,       cfg_driSEINonlinearModel, "List of the piece-wise linear segments for mapping of decoded luma sample values of an auxiliary picture to a scale that is uniformly quantized in terms of disparity in the depth representation information SEI message")
   ("SEIConstrainedRASL",                              m_constrainedRaslEncoding,                         false, "Control generation of constrained RASL encoding SEI message")
   
+#if JVET_AA0102_JVET_AA2027_SEI_PROCESSING_ORDER
+  //Processing order of SEI (pos)
+  ("SEIPOEnabled",                                    m_poSEIEnabled,                                    false, "Specifies whether SEI processing order is applied or not")
+  ("SEIPOPayLoadType",                                cfg_poSEIPayloadType,               cfg_poSEIPayloadType, "List of payloadType for processing")
+  ("SEIPOProcessingOrder",                            cfg_poSEIProcessingOrder,       cfg_poSEIProcessingOrder, "List of payloadType processing order")
+#endif
+
   ("DebugBitstream",                                  m_decodeBitstreams[0],             string( "" ), "Assume the frames up to POC DebugPOC will be the same as in this bitstream. Load those frames from the bitstream instead of encoding them." )
   ("DebugPOC",                                        m_switchPOC,                                 -1, "If DebugBitstream is present, load frames up to this POC from this bitstream. Starting with DebugPOC, return to normal encoding." )
   ("DecodeBitstream1",                                m_decodeBitstreams[0],             string( "" ), "Assume the frames up to POC DebugPOC will be the same as in this bitstream. Load those frames from the bitstream instead of encoding them." )
@@ -3263,6 +3275,32 @@ bool EncAppCfg::parseCfg( int argc, char* argv[] )
   }
 
 
+#if JVET_AA0102_JVET_AA2027_SEI_PROCESSING_ORDER
+  if (m_poSEIEnabled)
+  {
+    assert(cfg_poSEIPayloadType.values.size() > 0);
+    assert(cfg_poSEIProcessingOrder.values.size() == cfg_poSEIPayloadType.values.size());
+    m_numofSEIMessages = (uint32_t)cfg_poSEIPayloadType.values.size();
+    m_poSEIPayloadType.resize(m_numofSEIMessages);
+    m_poSEIProcessingOrder.resize(m_numofSEIMessages);
+    for (uint32_t i = 0; i < m_numofSEIMessages; i++)
+    {
+      m_poSEIPayloadType[i]  = cfg_poSEIPayloadType.values[i];
+      m_poSEIProcessingOrder[i] = (uint8_t)cfg_poSEIProcessingOrder.values[i];
+      //Error check, to avoid same PayloadType with different PayloadOrder
+      for (uint32_t j = 0; j < i; j++)
+      {
+        if (m_poSEIPayloadType[j] == m_poSEIPayloadType[i])
+        {
+          assert(m_poSEIProcessingOrder[j]== m_poSEIProcessingOrder[i]);
+        }
+      }
+    }
+    assert(m_poSEIPayloadType.size() > 0);
+    assert(m_poSEIProcessingOrder.size() == m_poSEIPayloadType.size());
+  }
+#endif
+
   if( m_costMode == COST_LOSSLESS_CODING )
   {
     bool firstSliceLossless = false;
@@ -5120,6 +5158,10 @@ void EncAppCfg::xPrintParameter()
   msg(VERBOSE, "BIM:%d ", m_bimEnabled);
   msg(VERBOSE, "SEI FGC:%d ", m_fgcSEIEnabled);
 
+#if JVET_AA0102_JVET_AA2027_SEI_PROCESSING_ORDER
+  msg(VERBOSE, "SEI processing Order:%d ", m_poSEIEnabled);
+#endif
+
 #if EXTENSION_360_VIDEO
   m_ext360.outputConfigurationSummary();
 #endif
diff --git a/source/App/EncoderApp/EncAppCfg.h b/source/App/EncoderApp/EncAppCfg.h
index 677166d99240330fbc659e4bf44bf615879f8821..e3f016493cf448820eb8f774c659f381d1d384e0 100644
--- a/source/App/EncoderApp/EncAppCfg.h
+++ b/source/App/EncoderApp/EncAppCfg.h
@@ -774,6 +774,13 @@ protected:
   bool                  m_nnPostFilterSEIActivationEnabled;
   uint32_t              m_nnPostFilterSEIActivationId;
 
+#if JVET_AA0102_JVET_AA2027_SEI_PROCESSING_ORDER
+  bool                  m_poSEIEnabled;
+  std::vector<uint16_t> m_poSEIPayloadType;
+  std::vector<uint8_t>  m_poSEIProcessingOrder;
+  uint32_t              m_numofSEIMessages;
+#endif
+
   bool                  m_constrainedRaslEncoding;
 
   bool                  m_sampleAspectRatioInfoSEIEnabled;
diff --git a/source/Lib/CommonLib/SEI.cpp b/source/Lib/CommonLib/SEI.cpp
index dbc60dd81ff5fad2bad2cb8f652b68da7563e46e..49f7240158b3cd6e551ef09d4a88be8dbd11dd53 100644
--- a/source/Lib/CommonLib/SEI.cpp
+++ b/source/Lib/CommonLib/SEI.cpp
@@ -483,6 +483,10 @@ const char *SEI::getSEIMessageString(SEI::PayloadType payloadType)
 #if JVET_AA0110_PHASE_INDICATION_SEI_MESSAGE
     case SEI::PHASE_INDICATION:                     return "Phase Indication";
 #endif
+
+#if JVET_AA0102_JVET_AA2027_SEI_PROCESSING_ORDER
+    case SEI::SEI_PROCESSING_ORDER:                 return "SEI messages Processing order";
+#endif
     default:                                        return "Unknown";
   }
 }
diff --git a/source/Lib/CommonLib/SEI.h b/source/Lib/CommonLib/SEI.h
index f5c86e0cda4f613ce9ad477e221880b9c264c9f0..b002e9087b8b89853628f03ada2ba6c247c00ee3 100644
--- a/source/Lib/CommonLib/SEI.h
+++ b/source/Lib/CommonLib/SEI.h
@@ -97,6 +97,10 @@ public:
 #if JVET_AA0110_PHASE_INDICATION_SEI_MESSAGE
     PHASE_INDICATION                     = 212,
 #endif
+
+#if JVET_AA0102_JVET_AA2027_SEI_PROCESSING_ORDER
+    SEI_PROCESSING_ORDER                 = 213,
+#endif
   };
 
   SEI() {}
@@ -122,6 +126,21 @@ public:
   std::vector<unsigned> m_siiSubLayerNumUnitsInSI;
 };
 
+#if JVET_AA0102_JVET_AA2027_SEI_PROCESSING_ORDER
+class SEIProcessingOrderInfo : public SEI
+{
+public:
+  PayloadType payloadType() const { return SEI_PROCESSING_ORDER; }
+  SEIProcessingOrderInfo() {}
+  virtual ~SEIProcessingOrderInfo() {}
+
+  bool                   m_posEnabled;
+  std::vector<uint16_t>  m_posPayloadType;
+  std::vector<uint8_t>   m_posProcessingOrder;
+  uint32_t               m_posNumofSeiMessages;
+};
+#endif
+
 class SEIEquirectangularProjection : public SEI
 {
 public:
diff --git a/source/Lib/CommonLib/TypeDef.h b/source/Lib/CommonLib/TypeDef.h
index 7e15952cb21b3f0a8f6c2d6fd7a7255e5db4c63d..ca5bd314182422bd27037f0f054f152fa99b6652 100644
--- a/source/Lib/CommonLib/TypeDef.h
+++ b/source/Lib/CommonLib/TypeDef.h
@@ -60,6 +60,7 @@
 #define JVET_AA0110_PHASE_INDICATION_SEI_MESSAGE          1 //  Software support of Phase Indication SEI message
 #define JVET_AA0054_CHROMA_FORMAT_FLAG                    1 // JVET-AA0054 PROPOSAL2: Signalling improvements to specify output chroma information
 #define JVET_AA0054_CHROMA_UPSAMPLING_CONSTRAINT          1 // JVET-AA0054 PROPOSAL3: Constraint to prevent chroma upsampling when input chroma format is monochrome or YUV444
+#define JVET_AA0102_JVET_AA2027_SEI_PROCESSING_ORDER      1 // JVET-AA0102 and JVET-AA2027: SEI processing order SEI message in VVC (Draft 1) (SEI processing order SEI message carries information indicating the preferred processing order, as determined by the encoder)
 
 //########### place macros to be be kept below this line ###############
 #define JVET_X0143_ALF_APS_ID_OFFSET                      0 // A value between 0 to 7 inclusive. This macro should be kept, or to be defined as a configuration parameter if possible.
diff --git a/source/Lib/DecoderLib/SEIread.cpp b/source/Lib/DecoderLib/SEIread.cpp
index d4c0b0e82c22f4e3be1c048253227533a3406ed1..6afd8d990d07914c46b411d0e36df956adbe5448 100644
--- a/source/Lib/DecoderLib/SEIread.cpp
+++ b/source/Lib/DecoderLib/SEIread.cpp
@@ -423,6 +423,12 @@ void SEIReader::xReadSEImessage(SEIMessages& seis, const NalUnitType nalUnitType
       sei = new SEIPhaseIndication;
       xParseSEIPhaseIndication((SEIPhaseIndication&)*sei, payloadSize, pDecodedMessageOutputStream);
       break;
+#endif
+#if JVET_AA0102_JVET_AA2027_SEI_PROCESSING_ORDER
+    case SEI::SEI_PROCESSING_ORDER:
+      sei = new SEIProcessingOrderInfo;
+      xParseSEIProcessingOrder((SEIProcessingOrderInfo&) *sei, payloadSize, pDecodedMessageOutputStream);
+      break;
 #endif
     default:
       for (uint32_t i = 0; i < payloadSize; i++)
@@ -577,6 +583,27 @@ void SEIReader::xParseSEIShutterInterval(SEIShutterIntervalInfo& sei, uint32_t p
   }
 }
 
+#if JVET_AA0102_JVET_AA2027_SEI_PROCESSING_ORDER
+void SEIReader::xParseSEIProcessingOrder(SEIProcessingOrderInfo& sei, uint32_t payloadSize, std::ostream *decodedMessageOutputStream)
+{
+  uint32_t i,b;
+  uint32_t NumSEIMessages, val;
+  output_sei_message_header(sei, decodedMessageOutputStream, payloadSize);
+  //Here payload is in Bytes, Since "sei_payloadType" is 2 Bytes + "sei_payloadOrder" is 1 Byte so total = 3 Bytes
+  //To get Number of SEI messages, just do payloadSize/3
+  NumSEIMessages = payloadSize / 3;
+  sei.m_posPayloadType.resize(NumSEIMessages);
+  sei.m_posProcessingOrder.resize(NumSEIMessages);
+  for(i=0,b=0; b < payloadSize; i++,b+=3)
+  {
+    sei_read_code(decodedMessageOutputStream, 16, val, "sei_payloadType[i]");
+    sei.m_posPayloadType[i] = val;
+    sei_read_code(decodedMessageOutputStream, 8, val, "sei_processingOrder[i]");
+    sei.m_posProcessingOrder[i] = val;
+  }
+}
+#endif
+
 /**
  * parse bitstream bs and unpack a decoded picture hash SEI message
  * of payloadSize bytes into sei.
diff --git a/source/Lib/DecoderLib/SEIread.h b/source/Lib/DecoderLib/SEIread.h
index 4efccbc4fad0292b754cea1111762ab3300a7b4e..d15f8b27ca34e2b5292b675d3ac5f38376143541 100644
--- a/source/Lib/DecoderLib/SEIread.h
+++ b/source/Lib/DecoderLib/SEIread.h
@@ -112,6 +112,9 @@ protected:
 #if JVET_AA0110_PHASE_INDICATION_SEI_MESSAGE
   void xParseSEIPhaseIndication(SEIPhaseIndication& sei, uint32_t payloadSize, std::ostream* pDecodedMessageOutputStream);
 #endif
+#if JVET_AA0102_JVET_AA2027_SEI_PROCESSING_ORDER
+  void xParseSEIProcessingOrder               (SEIProcessingOrderInfo& sei, uint32_t payloadSize, std::ostream *decodedMessageOutputStream);
+#endif
 
   void sei_read_scode(std::ostream *pOS, uint32_t length, int& code, const char *pSymbolName);
   void sei_read_code(std::ostream *pOS, uint32_t length, uint32_t &ruiCode, const char *pSymbolName);
diff --git a/source/Lib/EncoderLib/EncCfg.h b/source/Lib/EncoderLib/EncCfg.h
index f705a6cabfaa8e8a5106750bc30fe3289a2bb45c..cdb346027f5af142a870bb3a6de0efc0ecc908d0 100644
--- a/source/Lib/EncoderLib/EncCfg.h
+++ b/source/Lib/EncoderLib/EncCfg.h
@@ -838,6 +838,15 @@ protected:
   int       m_driSEINonlinearNumMinus1;
   std::vector<uint32_t> m_driSEINonlinearModel;
   std::string           m_arSEIFileRoot;  // Annotated region SEI - initialized from external file
+
+#if JVET_AA0102_JVET_AA2027_SEI_PROCESSING_ORDER
+  //SEI message processing order
+  bool                  m_poSEIEnabled;
+  std::vector<uint16_t> m_poSEIPayloadType;
+  std::vector<uint8_t>  m_poSEIProcessingOrder;
+  uint32_t              m_numofSEIMessages;
+#endif
+
   bool      m_constrainedRaslEncoding;
 
   //====== Weighted Prediction ========
@@ -2330,6 +2339,18 @@ public:
   void     setRprRASLtoolSwitch(bool b)                              { m_rprRASLtoolSwitch = b; }
   bool     getRprRASLtoolSwitch()                                    { return m_rprRASLtoolSwitch; }
 
+#if JVET_AA0102_JVET_AA2027_SEI_PROCESSING_ORDER
+  //SEI messages processing order
+  void     setPoSEIEnabled(bool b)                                   { m_poSEIEnabled = b; }
+  bool     getPoSEIEnabled()                                         { return m_poSEIEnabled; }
+  void     setPoSEIPayloadType(const std::vector<uint16_t>& b)       { m_poSEIPayloadType = b; }
+  uint16_t getPoSEIPayloadType(uint16_t idx)                   const { return m_poSEIPayloadType[idx]; }
+  void     setPoSEIProcessingOrder(const std::vector<uint8_t>& b)    { m_poSEIProcessingOrder = b; }
+  uint8_t  getPoSEIProcessingOrder(uint8_t idx)                const { return m_poSEIProcessingOrder[idx]; }
+  void     setPoSEINumofSeiMessages(uint32_t i)                      { m_numofSEIMessages = i; }
+  uint32_t getPoSEINumofSeiMessages()                          const { return m_numofSEIMessages; }
+#endif
+
   void         setUseWP               ( bool b )                     { m_useWeightedPred   = b;    }
   void         setWPBiPred            ( bool b )                     { m_useWeightedBiPred = b;    }
   bool         getUseWP               ()                             { return m_useWeightedPred;   }
diff --git a/source/Lib/EncoderLib/EncGOP.cpp b/source/Lib/EncoderLib/EncGOP.cpp
index 4a893aff0c68d2ef0b8ae5f326f4519c172985da..b46de9c895ed09ab3e694c1bc9aa7bd500b22b8f 100644
--- a/source/Lib/EncoderLib/EncGOP.cpp
+++ b/source/Lib/EncoderLib/EncGOP.cpp
@@ -877,6 +877,14 @@ void EncGOP::xCreateIRAPLeadingSEIMessages (SEIMessages& seiMessages, const SPS
       seiMessages.push_back(seiNNPostFilterCharacteristics);
     }
   }
+#if JVET_AA0102_JVET_AA2027_SEI_PROCESSING_ORDER
+  if (m_pcCfg->getPoSEIEnabled())
+  {
+    SEIProcessingOrderInfo *seiProcessingOrder = new SEIProcessingOrderInfo;
+    m_seiEncoder.initSEIProcessingOrderInfo(seiProcessingOrder);
+    seiMessages.push_back(seiProcessingOrder);
+  }
+#endif
 }
 
 void EncGOP::xCreatePerPictureSEIMessages (int picInGOP, SEIMessages& seiMessages, SEIMessages& nestedSeiMessages, Slice *slice)
diff --git a/source/Lib/EncoderLib/SEIEncoder.cpp b/source/Lib/EncoderLib/SEIEncoder.cpp
index 76d96354c86f6df88cf0955c0b176963d453fbaf..2a706588f27d2371d222ca6f99e80692f8e0a05e 100644
--- a/source/Lib/EncoderLib/SEIEncoder.cpp
+++ b/source/Lib/EncoderLib/SEIEncoder.cpp
@@ -553,6 +553,26 @@ void SEIEncoder::initSEIShutterIntervalInfo(SEIShutterIntervalInfo *seiShutterIn
   }
 }
 
+#if JVET_AA0102_JVET_AA2027_SEI_PROCESSING_ORDER
+void SEIEncoder::initSEIProcessingOrderInfo(SEIProcessingOrderInfo *seiProcessingOrderInfo)
+{
+  assert(m_isInitialized);
+  assert(seiProcessingOrderInfo != nullptr);
+
+  uint32_t numSEIMessages = m_pcCfg->getPoSEINumofSeiMessages();
+  seiProcessingOrderInfo->m_posNumofSeiMessages = numSEIMessages;
+  seiProcessingOrderInfo->m_posEnabled          = m_pcCfg->getPoSEIEnabled();
+
+  seiProcessingOrderInfo->m_posPayloadType.resize(numSEIMessages);
+  seiProcessingOrderInfo->m_posProcessingOrder.resize(numSEIMessages);
+
+  for (uint32_t i = 0; i < numSEIMessages; i++) {
+    seiProcessingOrderInfo->m_posPayloadType[i]     = m_pcCfg->getPoSEIPayloadType(i);
+    seiProcessingOrderInfo->m_posProcessingOrder[i] = m_pcCfg->getPoSEIProcessingOrder(i);
+  }
+}
+#endif
+
 template <typename T>
 static void readTokenValue(T            &returnedValue, /// value returned
                            bool         &failed,        /// used and updated
diff --git a/source/Lib/EncoderLib/SEIEncoder.h b/source/Lib/EncoderLib/SEIEncoder.h
index 0a99a23a7f16209b821a1ee974cd69e502638842..897096595dfa87c22595219deafb754cdc56f0f6 100644
--- a/source/Lib/EncoderLib/SEIEncoder.h
+++ b/source/Lib/EncoderLib/SEIEncoder.h
@@ -96,6 +96,9 @@ public:
   void initSEIShutterIntervalInfo(SEIShutterIntervalInfo *sei);
   void initSEINeuralNetworkPostFilterCharacteristics(SEINeuralNetworkPostFilterCharacteristics *sei, int filterIdx);
   void initSEINeuralNetworkPostFilterActivation(SEINeuralNetworkPostFilterActivation *sei);
+#if JVET_AA0102_JVET_AA2027_SEI_PROCESSING_ORDER
+  void initSEIProcessingOrderInfo(SEIProcessingOrderInfo *sei);
+#endif
 private:
   EncCfg* m_pcCfg;
   EncLib* m_pcEncLib;
diff --git a/source/Lib/EncoderLib/SEIwrite.cpp b/source/Lib/EncoderLib/SEIwrite.cpp
index 02fb4d4cba509344b52e174fd766f0095131f9d3..ca2e6c07b7b120c2456cc47c6155a79769bad560 100644
--- a/source/Lib/EncoderLib/SEIwrite.cpp
+++ b/source/Lib/EncoderLib/SEIwrite.cpp
@@ -171,6 +171,11 @@ void SEIWriter::xWriteSEIpayloadData(OutputBitstream &bs, const SEI& sei, HRD &h
   case SEI::NEURAL_NETWORK_POST_FILTER_ACTIVATION:
     xWriteSEINeuralNetworkPostFilterActivation(*static_cast<const SEINeuralNetworkPostFilterActivation*>(&sei));
     break;
+#if JVET_AA0102_JVET_AA2027_SEI_PROCESSING_ORDER
+  case SEI::SEI_PROCESSING_ORDER:
+    xWriteSEIProcessingOrder(*static_cast<const SEIProcessingOrderInfo*>(&sei));
+    break;
+#endif
   default:
     THROW("Trying to write unhandled SEI message");
     break;
@@ -1403,6 +1408,17 @@ void SEIWriter::xWriteSEIShutterInterval(const SEIShutterIntervalInfo &sei)
   }
 }
 
+#if JVET_AA0102_JVET_AA2027_SEI_PROCESSING_ORDER
+void SEIWriter::xWriteSEIProcessingOrder(const SEIProcessingOrderInfo &sei)
+{
+  for (uint32_t i=0; i < sei.m_posNumofSeiMessages; i++)
+  {
+    WRITE_CODE(sei.m_posPayloadType[i], 16, "sei_payloadType[i]");
+    WRITE_CODE(sei.m_posProcessingOrder[i], 8, "sei_processingOrder[i]");
+  }
+}
+#endif
+
 void SEIWriter::xWriteSEIConstrainedRaslIndication(const SEIConstrainedRaslIndication& /*sei*/)
 {
   // intentionally empty
diff --git a/source/Lib/EncoderLib/SEIwrite.h b/source/Lib/EncoderLib/SEIwrite.h
index eae18f461ee684d0a8f6fd6a1944ef38ed9c7d8b..31ba7e4e65819093ffb1a6bd60109f769f0d7e4e 100644
--- a/source/Lib/EncoderLib/SEIwrite.h
+++ b/source/Lib/EncoderLib/SEIwrite.h
@@ -100,6 +100,9 @@ protected:
   void xWriteSEINeuralNetworkPostFilterCharacteristics(const SEINeuralNetworkPostFilterCharacteristics& sei);
   void xWriteNNPFCComplexityElement(const SEINeuralNetworkPostFilterCharacteristics& sei);
   void xWriteSEINeuralNetworkPostFilterActivation(const SEINeuralNetworkPostFilterActivation &sei);
+#if JVET_AA0102_JVET_AA2027_SEI_PROCESSING_ORDER
+  void xWriteSEIProcessingOrder(const SEIProcessingOrderInfo &sei);
+#endif
 protected:
   HRD m_nestingHrd;
 };