Index: source/App/TAppEncoder/TAppEncCfg.cpp
===================================================================
--- source/App/TAppEncoder/TAppEncCfg.cpp       (revision 4995)
+++ source/App/TAppEncoder/TAppEncCfg.cpp       (working copy)
@@ -726,6 +726,16 @@
   SMultiValueInput<Bool>   cfg_rwpSEIRwpGuardBandNotUsedForPredFlag   (0, 1,   0, std::numeric_limits<UChar>::max());
   SMultiValueInput<UInt>   cfg_rwpSEIRwpGuardBandType                 (0, 7,   0, 4*std::numeric_limits<UChar>::max());
 #endif
+  /************************** SEI MANIFEST SEI MESSAGES **************************/
+  SMultiValueInput<UInt>     cfg_smSeiManifestSeiPayloadType        (0, std::numeric_limits<UShort>::max(), 0, std::numeric_limits<UShort>::max());
+  SMultiValueInput<UInt>     cfg_smSeiManifestSeiDescription        (0, 3, 0, std::numeric_limits<UChar>::max());
+  /*******************************************************************************/
+  
+  /************************** SEI PREFIX INDICATION SEI MESSAGES **************************/
+  SMultiValueInput<UInt>     cfg_spiSeiNumBitsInPrefixIndicationMinus1  (0, std::numeric_limits<UShort>::max(), 0, std::numeric_limits<UShort>::max());
+  SMultiValueInput<UInt>     cfg_spiSeiSeiPrefixDataBit                        (0, std::numeric_limits<UShort>::max(), 0, std::numeric_limits<UShort>::max());
+  /*******************************************************************************/
+  
   Int warnUnknowParameter = 0;
   po::Options opts;
   opts.addOptions()
@@ -1233,6 +1243,21 @@
 #if RNSEI
   ("SEIRegionalNestingFileRoot,-rns",                 m_regionalNestingSEIFileRoot,                    string(""), "Regional nesting SEI parameters root file name (wo num ext); only the file name base is to be added. Underscore and POC would be automatically addded to . E.g. \"-rns rns\" will search for files rns_0.txt, rns_1.txt, ...")
 #endif
+  /************************** SEI MANIFEST SEI MESSAGES **************************/
+  ("SEISmEnabled",                                    m_smSeiManifestSeiEnabled,                false,                                    "Controls if SEI Manifest SEI messages enabled")
+  ("SEISmSeiManifestNumSeiMsgTypes",                  m_smSeiManifestNumSeiMsgTypes,            0,                                        "Specifies the number of SEI Manifest SEI message types")
+  ("SEISmSeiManifestSeiPayloadType",                  cfg_smSeiManifestSeiPayloadType,          cfg_smSeiManifestSeiPayloadType,          "Specifies the payload type of the SEI message in the manifest")
+  ("SEISmSeiManifestSeiDescription",                  cfg_smSeiManifestSeiDescription,          cfg_smSeiManifestSeiDescription,          "Specifies the description of the SEI message in the manifest")
+  /*******************************************************************************/
+  
+  /************************** SEI PREFIX INDICATIONS SEI MESSAGES **************************/
+  ("SEISpiEnabled",                                   m_spiSeiPrefixIndicationSeiEnabled,       false,                                    "Controls if SEI Prefix Indications SEI messages enabled")
+  ("SEISpiSeiPrefixSeiPayloadType",                   m_spiSeiPrefixSeiPayloadType,             0,                                        "Specifies the payload type of the SEI messages")
+  ("SEISpiNumSeiPrefixIndicationsMinus1",             m_spiSeiNumSeiPrefixIndicationsMinus1,    0,                                        "Specifies the number of SEI prefix indications")
+  ("SEISpiNumBitsInPrefixIndicationMinus1",           cfg_spiSeiNumBitsInPrefixIndicationMinus1,cfg_spiSeiNumBitsInPrefixIndicationMinus1,"Specifies the number of bits in the SEI prefix indications")
+  ("SEISpiSeiPrefixDataBit",                          cfg_spiSeiSeiPrefixDataBit,               cfg_spiSeiSeiPrefixDataBit,               "Specifies the bits of the SEI prefix indications")
+  ("SEISpiByteAlignmentBitEqualToOne",                m_spiSeiByteAlignmentBitEqualToOne,       0,                                       "Specifies the byte alignment in the SEI prefix indications (shall be equal to 1)")
+  /*******************************************************************************/
   ;
 
 #if EXTENSION_360_VIDEO
@@ -1906,7 +1931,77 @@
       m_timeSetArray[i].timeOffsetValue       = cfg_timeCodeSeiTimeOffsetValue      .values.size()>i ? cfg_timeCodeSeiTimeOffsetValue      .values [i] : 0;
     }
   }
+  
+  /************************** SEI MANIFEST SEI MESSAGES **************************/
+  if(m_smSeiManifestSeiEnabled)
+  {
+    assert ( m_smSeiManifestNumSeiMsgTypes > 0 && m_smSeiManifestNumSeiMsgTypes <= std::numeric_limits<UShort>::max() );
+    assert ( cfg_smSeiManifestSeiPayloadType.values.size() == m_smSeiManifestNumSeiMsgTypes && cfg_smSeiManifestSeiDescription.values.size() == m_smSeiManifestNumSeiMsgTypes );
+    m_smSeiManifestSeiPayloadType.resize(m_smSeiManifestNumSeiMsgTypes);
+    m_smSeiManifestSeiDescription.resize(m_smSeiManifestNumSeiMsgTypes);
+    
+    for( Int i=0; i < m_smSeiManifestNumSeiMsgTypes; i++ )
+    {
+      m_smSeiManifestSeiPayloadType[i] = cfg_smSeiManifestSeiPayloadType.values.size() > i ? cfg_smSeiManifestSeiPayloadType.values[i] : 0;
+      m_smSeiManifestSeiDescription[i] = cfg_smSeiManifestSeiDescription.values.size() > i ? cfg_smSeiManifestSeiDescription.values[i] : 0;
+      assert ( m_smSeiManifestSeiDescription[i] >= 0 && m_smSeiManifestSeiDescription[i] <= 3 );
+    }
+    
+    for( Int i=0; i < m_smSeiManifestNumSeiMsgTypes; i++ )
+    {
+      for ( Int j=i+1; j < m_smSeiManifestNumSeiMsgTypes; j++ )
+      {
+        if( i != j )
+          assert ( m_smSeiManifestSeiPayloadType[i] != m_smSeiManifestSeiPayloadType[j] );
+      }
+    }
+  }
+  /*******************************************************************************/
 
+  /************************** SEI PREFIX INDICATION SEI MESSAGES **************************/
+  if(m_spiSeiPrefixIndicationSeiEnabled)
+  {
+    assert ( m_spiSeiNumSeiPrefixIndicationsMinus1 >= 0 && m_spiSeiNumSeiPrefixIndicationsMinus1 < std::numeric_limits<UShort>::max() );
+    assert ( cfg_spiSeiNumBitsInPrefixIndicationMinus1.values.size() == m_spiSeiNumSeiPrefixIndicationsMinus1 + 1);
+    m_spiSeiNumBitsInPrefixIndicationMinus1.resize(m_spiSeiNumSeiPrefixIndicationsMinus1+1);
+    m_spiSeiSeiPrefixDataBit.resize(m_spiSeiNumSeiPrefixIndicationsMinus1+1);
+    
+    Int idx = 0;
+    Int size_j_prefixDataBit = 0;
+    for( Int i=0; i <= m_spiSeiNumSeiPrefixIndicationsMinus1; i++ )
+    {
+      m_spiSeiNumBitsInPrefixIndicationMinus1[i] = cfg_spiSeiNumBitsInPrefixIndicationMinus1.values.size() > i ? cfg_spiSeiNumBitsInPrefixIndicationMinus1.values[i] : 0;
+      m_spiSeiSeiPrefixDataBit[i].resize(m_spiSeiNumBitsInPrefixIndicationMinus1[i]+1);
+      
+      size_j_prefixDataBit = cfg_spiSeiSeiPrefixDataBit.values[idx];
+      for( Int j=0; j <= m_spiSeiNumBitsInPrefixIndicationMinus1[i]; j++ )
+      {
+       assert ( size_j_prefixDataBit == m_spiSeiNumBitsInPrefixIndicationMinus1[i]+1);
+       m_spiSeiSeiPrefixDataBit[i][j] = cfg_spiSeiSeiPrefixDataBit.values[idx] > 0 ? cfg_spiSeiSeiPrefixDataBit.values[idx+1] : 0;
+       idx++;
+      }
+      
+      idx++;
+      assert(m_spiSeiByteAlignmentBitEqualToOne == 1);
+    }
+    
+    // Checks related to sei prefix indication sei messages' relation with sei manifest sei messages
+    if(m_smSeiManifestSeiEnabled)
+    {
+      Bool payloaTypeMatchFound = false;
+      for( Int i=0; i < m_smSeiManifestNumSeiMsgTypes; i++ )
+      {
+       if( m_spiSeiPrefixSeiPayloadType == m_smSeiManifestSeiPayloadType[i] )
+       {
+         payloaTypeMatchFound = true;
+         break;
+       }
+      }
+      assert(payloaTypeMatchFound == true);
+    }
+  }
+  /*******************************************************************************/
+  
   // check validity of input parameters
   xCheckParameter();
 
Index: source/App/TAppEncoder/TAppEncCfg.h
===================================================================
--- source/App/TAppEncoder/TAppEncCfg.h (revision 4995)
+++ source/App/TAppEncoder/TAppEncCfg.h (working copy)
@@ -507,6 +507,22 @@
   friend class TExt360AppEncCfg;
   friend class TExt360AppEncTop;
 #endif
+  
+  /************************** SEI MANIFEST SEI MESSAGES **************************/
+  Bool                  m_smSeiManifestSeiEnabled;
+  Int                   m_smSeiManifestNumSeiMsgTypes;
+  std::vector<UShort>   m_smSeiManifestSeiPayloadType;
+  std::vector<UChar>    m_smSeiManifestSeiDescription;
+  /*******************************************************************************/
+  
+  /************************** SEI PREFIX INDICATIONS SEI MESSAGES **************************/
+  Bool                              m_spiSeiPrefixIndicationSeiEnabled;
+  Int                               m_spiSeiPrefixSeiPayloadType;
+  Int                               m_spiSeiNumSeiPrefixIndicationsMinus1;
+  std::vector<UShort>               m_spiSeiNumBitsInPrefixIndicationMinus1;
+  std::vector<std::vector<UInt>>     m_spiSeiSeiPrefixDataBit;
+  Int                               m_spiSeiByteAlignmentBitEqualToOne;
+  /*******************************************************************************/
 
   // internal member functions
   Void  xCheckParameter ();                                   ///< check validity of configuration values
Index: source/App/TAppEncoder/TAppEncTop.cpp
===================================================================
--- source/App/TAppEncoder/TAppEncTop.cpp       (revision 4995)
+++ source/App/TAppEncoder/TAppEncTop.cpp       (working copy)
@@ -520,6 +520,22 @@
   m_cTEncTop.setSummaryOutFilename                                ( m_summaryOutFilename );
   m_cTEncTop.setSummaryPicFilenameBase                            ( m_summaryPicFilenameBase );
   m_cTEncTop.setSummaryVerboseness                                ( m_summaryVerboseness );
+  
+  /************************** SEI MANIFEST SEI MESSAGES **************************/
+  m_cTEncTop.setSmSEIManifestSeiEnabled                           (m_smSeiManifestSeiEnabled);
+  m_cTEncTop.setSmSEIManifestNumSeiMsgTypes                       (m_smSeiManifestNumSeiMsgTypes);
+  m_cTEncTop.setSmSEIManifestSeiPayloadType                       (m_smSeiManifestSeiPayloadType);
+  m_cTEncTop.setSmSEIManifestSeiDescription                       (m_smSeiManifestSeiDescription);
+  /*******************************************************************************/
+  
+  /************************** SEI PREFIX INDICATIONS SEI MESSAGES **************************/
+  m_cTEncTop.setSpiPrefixIndicationSeiEnabled                     (m_spiSeiPrefixIndicationSeiEnabled);
+  m_cTEncTop.setSpiPrefixSeiPayloadType                           (m_spiSeiPrefixSeiPayloadType);
+  m_cTEncTop.setSpiNumSeiPrefixIndicationsMinus1                  (m_spiSeiNumSeiPrefixIndicationsMinus1);
+  m_cTEncTop.setSpiNumBitsInPrefixIndicationMinus1                (m_spiSeiNumBitsInPrefixIndicationMinus1);
+  m_cTEncTop.setSpiSeiPrefixDataBit                               (m_spiSeiSeiPrefixDataBit);
+  m_cTEncTop.setSpiByteAlignmentBitEqualToOne                     (m_spiSeiByteAlignmentBitEqualToOne);
+  /*******************************************************************************/
 }
 
 Void TAppEncTop::xCreateLib()
Index: source/Lib/TLibCommon/SEI.cpp
===================================================================
--- source/Lib/TLibCommon/SEI.cpp       (revision 4995)
+++ source/Lib/TLibCommon/SEI.cpp       (working copy)
@@ -76,7 +76,9 @@
   SEI::DEPENDENT_RAP_INDICATION,
   SEI::CODED_REGION_COMPLETION,
   SEI::ALTERNATIVE_TRANSFER_CHARACTERISTICS,
-  SEI::AMBIENT_VIEWING_ENVIRONMENT
+  SEI::AMBIENT_VIEWING_ENVIRONMENT,
+  SEI::SEI_MANIFEST,
+  SEI::SEI_PREFIX_INDICATION
 #if CCV_SEI_MESSAGE
   , SEI::CONTENT_COLOUR_VOLUME
 #endif
@@ -304,6 +306,8 @@
     case SEI::CODED_REGION_COMPLETION:              return "Coded region completion";
     case SEI::ALTERNATIVE_TRANSFER_CHARACTERISTICS: return "Alternative transfer characteristics";
     case SEI::AMBIENT_VIEWING_ENVIRONMENT:          return "Ambient viewing environment";
+    case SEI::SEI_MANIFEST:                         return "Sei manifest";
+    case SEI::SEI_PREFIX_INDICATION:               return "Sei prefix indication";
 #if CCV_SEI_MESSAGE
     case SEI::CONTENT_COLOUR_VOLUME:                return "Content Colour Volume";
 #endif
Index: source/Lib/TLibCommon/SEI.h
===================================================================
--- source/Lib/TLibCommon/SEI.h (revision 4995)
+++ source/Lib/TLibCommon/SEI.h (working copy)
@@ -112,6 +112,8 @@
 #if MCTS_EXTRACTION
     MCTS_EXTRACTION_INFO_SET             = 158,
 #endif
+    SEI_MANIFEST                         = 200,
+    SEI_PREFIX_INDICATION               = 201,
   };
 
   SEI() {}
@@ -1125,4 +1127,32 @@
   std::vector< SEIListOfIndices > m_rnSeiMessages;
 };
 #endif
+
+class SEIManifest : public SEI
+{
+public:
+  PayloadType payloadType() const { return SEI_MANIFEST; }
+
+  SEIManifest() {}
+  virtual ~SEIManifest() {}
+
+  UShort m_manifestNumSeiMsgTypes;
+  std::vector<UShort> m_manifestSeiPayloadType;
+  std::vector<UChar>  m_manifestSeiDescription;
+};
+
+class SEIPrefixIndication : public SEI
+{
+public:
+  PayloadType payloadType() const { return SEI_PREFIX_INDICATION; }
+
+  SEIPrefixIndication() {}
+  virtual ~SEIPrefixIndication() {}
+
+  UShort m_prefixSeiPayloadType;
+  UChar m_numSeiPrefixIndicationsMinus1;
+  std::vector<UShort> m_numBitsInPrefixIndicationMinus1;
+  std::vector<std::vector<Int>> m_seiPrefixDataBit;
+  Int m_byteAlignmentBitEqualToOne;
+};
 //! \}
Index: source/Lib/TLibDecoder/SEIread.cpp
===================================================================
--- source/Lib/TLibDecoder/SEIread.cpp  (revision 4995)
+++ source/Lib/TLibDecoder/SEIread.cpp  (working copy)
@@ -384,6 +384,14 @@
       xParseSEIRegionalNesting((SEIRegionalNesting&) *sei, payloadSize, sps, pDecodedMessageOutputStream);
       break;
 #endif
+    case SEI::SEI_MANIFEST:
+      sei = new SEIManifest;
+      xParseSEISeiManifest((SEIManifest&) *sei, payloadSize, pDecodedMessageOutputStream);
+      break;
+    case SEI::SEI_PREFIX_INDICATION:
+      sei = new SEIPrefixIndication;
+      xParseSEISeiPrefixIndication((SEIPrefixIndication&) *sei, payloadSize, pDecodedMessageOutputStream);
+      break;
     default:
       for (UInt i = 0; i < payloadSize; i++)
       {
@@ -1905,5 +1913,58 @@
 }
 #endif
 
+Void SEIReader::xParseSEISeiManifest(SEIManifest& sei, UInt payloadSize, std::ostream *pDecodedMessageOutputStream)
+{
+  output_sei_message_header(sei, pDecodedMessageOutputStream, payloadSize);
+  UInt val;
 
+  sei_read_code( pDecodedMessageOutputStream,       16,  val,    "manifest_num_sei_msg_types" );          sei.m_manifestNumSeiMsgTypes = val;
+  
+  if (sei.m_manifestNumSeiMsgTypes > 0)
+  {
+    sei.m_manifestSeiPayloadType.resize(sei.m_manifestNumSeiMsgTypes);
+    sei.m_manifestSeiDescription.resize(sei.m_manifestNumSeiMsgTypes);
+
+    for( Int i=0; i < sei.m_manifestNumSeiMsgTypes; i++ )
+    {
+      sei_read_code( pDecodedMessageOutputStream,   16, val,    "manifest_sei_payload_types" );           sei.m_manifestSeiPayloadType[i] = val;
+      sei_read_code( pDecodedMessageOutputStream,    8, val,    "manifest_sei_description" );             sei.m_manifestSeiDescription[i] = val;
+    }
+  }
+}
+
+Void SEIReader::xParseSEISeiPrefixIndication(SEIPrefixIndication& sei, UInt payloadSize, std::ostream *pDecodedMessageOutputStream)
+{
+  output_sei_message_header(sei, pDecodedMessageOutputStream, payloadSize);
+  UInt val;
+  UInt bitsRead = 0;
+  
+  sei_read_code( pDecodedMessageOutputStream,       16,  val,    "prefix_sei_payload_type" );                sei.m_prefixSeiPayloadType = val;
+  sei_read_code( pDecodedMessageOutputStream,        8,  val,    "num_sei_prefix_indications_minus1" );      sei.m_numSeiPrefixIndicationsMinus1 = val;
+  
+  if(sei.m_numSeiPrefixIndicationsMinus1 >= 0)
+  {
+    sei.m_numBitsInPrefixIndicationMinus1.resize(sei.m_numSeiPrefixIndicationsMinus1+1);
+    sei.m_seiPrefixDataBit.resize(sei.m_numSeiPrefixIndicationsMinus1+1);
+    
+    for( Int i=0; i <= sei.m_numSeiPrefixIndicationsMinus1; i++ )
+    {
+      sei_read_code( pDecodedMessageOutputStream,   16,  val,    "num_bits_in_prefix_indication_minus1" );   sei.m_numBitsInPrefixIndicationMinus1[i] = val;
+      sei.m_seiPrefixDataBit[i].resize(sei.m_numBitsInPrefixIndicationMinus1[i]+1);
+      
+      for( Int j=0; j <= sei.m_numBitsInPrefixIndicationMinus1[i]; j++ )
+      {
+       sei_read_code( pDecodedMessageOutputStream,  1,  val,    "sei_prefix_data_bit" );   sei.m_seiPrefixDataBit[i][j] = val;
+       bitsRead += 1;
+      }
+      
+      while(bitsRead %8 != 0)
+      {
+       sei_read_code( pDecodedMessageOutputStream,  1,  val,    "byte_alignment_bit_equal_to_one" );   sei.m_byteAlignmentBitEqualToOne = val;
+       bitsRead += 1;
+      }
+    }
+  }
+}
+
 //! \}
Index: source/Lib/TLibDecoder/SEIread.h
===================================================================
--- source/Lib/TLibDecoder/SEIread.h    (revision 4995)
+++ source/Lib/TLibDecoder/SEIread.h    (working copy)
@@ -118,6 +118,8 @@
 #if RNSEI
   Void xParseSEIRegionalNesting               ( SEIRegionalNesting& sei,              UInt payloadSize, const TComSPS* sps, std::ostream *pDecodedMessageOutputStream );
 #endif
+  Void xParseSEISeiManifest                   (SEIManifest& sei,                      UInt payloadSize,                     std::ostream *pDecodedMessageOutputStream);
+  Void xParseSEISeiPrefixIndication           (SEIPrefixIndication& sei,              UInt payloadSize,                     std::ostream *pDecodedMessageOutputStream);
   Void sei_read_scode(std::ostream *pOS, UInt uiLength, Int& ruiCode, const TChar *pSymbolName);
   Void sei_read_code(std::ostream *pOS, UInt uiLength, UInt& ruiCode, const TChar *pSymbolName);
   Void sei_read_uvlc(std::ostream *pOS,                UInt& ruiCode, const TChar *pSymbolName);
Index: source/Lib/TLibEncoder/SEIEncoder.cpp
===================================================================
--- source/Lib/TLibEncoder/SEIEncoder.cpp       (revision 4995)
+++ source/Lib/TLibEncoder/SEIEncoder.cpp       (working copy)
@@ -1316,5 +1316,45 @@
     seiGreenMetadataInfo->m_xsdMetricValue = u;
 }
 
+/************************** SEI MANIFEST SEI MESSAGES **************************/
+Void SEIEncoder::initSEISeiManifest(SEIManifest *seiSeiManifest)
+{
+  assert (m_isInitialized);
+  assert (seiSeiManifest!=NULL);
+  seiSeiManifest->m_manifestNumSeiMsgTypes = m_pcCfg->getSmSEIManifestNumSeiMsgTypes();
+  seiSeiManifest->m_manifestSeiPayloadType.resize(seiSeiManifest->m_manifestNumSeiMsgTypes);
+  seiSeiManifest->m_manifestSeiDescription.resize(seiSeiManifest->m_manifestNumSeiMsgTypes);
+  for( Int i=0; i < seiSeiManifest->m_manifestNumSeiMsgTypes; i++ )
+  {
+    seiSeiManifest->m_manifestSeiPayloadType[i]                  = m_pcCfg->getSmSEIManifestSeiPayloadType(i);
+    seiSeiManifest->m_manifestSeiDescription[i]                  = m_pcCfg->getSmSEIManifestSeiDescription(i);
+  }
+}
+/*******************************************************************************/
 
+/************************** SEI PREFIX INDICATIONS SEI MESSAGES **************************/
+Void SEIEncoder::initSEISeiPrefixIndication(SEIPrefixIndication *seiSeiPrefixIndications)
+{
+  assert (m_isInitialized);
+  assert (seiSeiPrefixIndications!=NULL);
+  seiSeiPrefixIndications->m_prefixSeiPayloadType = m_pcCfg->getSpiPrefixSeiPayloadType();
+  seiSeiPrefixIndications->m_numSeiPrefixIndicationsMinus1 = m_pcCfg->getSpiNumSeiPrefixIndicationsMinus1();
+  seiSeiPrefixIndications->m_numBitsInPrefixIndicationMinus1.resize(seiSeiPrefixIndications->m_numSeiPrefixIndicationsMinus1+1);
+  seiSeiPrefixIndications->m_seiPrefixDataBit.resize(seiSeiPrefixIndications->m_numSeiPrefixIndicationsMinus1+1);
+  
+  for( Int i=0; i <= seiSeiPrefixIndications->m_numSeiPrefixIndicationsMinus1; i++ )
+  {
+    seiSeiPrefixIndications->m_numBitsInPrefixIndicationMinus1[i] = m_pcCfg->getSpiNumBitsInPrefixIndicationMinus1(i);
+    seiSeiPrefixIndications->m_seiPrefixDataBit[i].resize(seiSeiPrefixIndications->m_numBitsInPrefixIndicationMinus1[i]+1);
+    
+    for( Int j=0; j <= seiSeiPrefixIndications->m_numBitsInPrefixIndicationMinus1[i]; j++ )
+    {
+      seiSeiPrefixIndications->m_seiPrefixDataBit[i][j] = m_pcCfg->getSpiSeiPrefixDataBit(i,j);
+    }
+    
+    seiSeiPrefixIndications->m_byteAlignmentBitEqualToOne = m_pcCfg->getSpiByteAlignmentBitEqualToOne();
+  }
+}
+/*******************************************************************************/
+
 //! \}
Index: source/Lib/TLibEncoder/SEIEncoder.h
===================================================================
--- source/Lib/TLibEncoder/SEIEncoder.h (revision 4995)
+++ source/Lib/TLibEncoder/SEIEncoder.h (working copy)
@@ -113,6 +113,14 @@
   Void initDecodedPictureHashSEI(SEIDecodedPictureHash *sei, TComPic *pcPic, std::string &rHashString, const BitDepths &bitDepths);
   Void initTemporalLevel0IndexSEI(SEITemporalLevel0Index *sei, TComSlice *slice);
   Void initSEIGreenMetadataInfo(SEIGreenMetadataInfo *sei, UInt u);
+  
+  /************************** SEI MANIFEST SEI MESSAGES **************************/
+  Void initSEISeiManifest(SEIManifest *seiSeiManifest);
+  /*******************************************************************************/
+  
+  /************************** SEI PREFIX INDICATIONS SEI MESSAGES **************************/
+  Void initSEISeiPrefixIndication(SEIPrefixIndication *seiSeiPrefixIndications);
+  /*******************************************************************************/
 
 private:
   TEncCfg* m_pcCfg;
Index: source/Lib/TLibEncoder/SEIwrite.cpp
===================================================================
--- source/Lib/TLibEncoder/SEIwrite.cpp (revision 4995)
+++ source/Lib/TLibEncoder/SEIwrite.cpp (working copy)
@@ -207,6 +207,12 @@
     xWriteSEIRegionalNesting(bs, *static_cast<const SEIRegionalNesting*>(&sei), sps);
     break;
 #endif
+  case SEI::SEI_MANIFEST:
+    xWriteSEIManifest(*static_cast<const SEIManifest*>(&sei));
+    break;
+  case SEI::SEI_PREFIX_INDICATION:
+    xWriteSEIPrefixIndication(*static_cast<const SEIPrefixIndication*>(&sei));
+    break;
   default:
     assert(!"Trying to write unhandled SEI message");
     break;
@@ -1367,6 +1373,36 @@
   }
 }
 #endif
+
+Void SEIWriter::xWriteSEIManifest(const SEIManifest &sei)
+{
+  WRITE_CODE( sei.m_manifestNumSeiMsgTypes,                   16,            "manifest_num_sei_msg_types" );
+  for( Int i=0; i < sei.m_manifestNumSeiMsgTypes; i++ )
+  {
+    WRITE_CODE( sei.m_manifestSeiPayloadType[i],              16,            "manifest_sei_payload_types" );
+    WRITE_CODE( sei.m_manifestSeiDescription[i],              8,             "manifest_sei_description" );
+  }
+}
+
+Void SEIWriter::xWriteSEIPrefixIndication(const SEIPrefixIndication &sei)
+{
+  WRITE_CODE( sei.m_prefixSeiPayloadType,                    16,            "prefix_sei_payload_type" );
+  WRITE_CODE( sei.m_numSeiPrefixIndicationsMinus1,                   8,            "num_sei_prefix_indications_minus1" );
+  for( Int i=0; i <= sei.m_numSeiPrefixIndicationsMinus1; i++ )
+  {
+    WRITE_CODE( sei.m_numBitsInPrefixIndicationMinus1[i],    16,            "num_bits_in_prefix_indication_minus1" );
+    for( Int j=0; j <= sei.m_numBitsInPrefixIndicationMinus1[i]; j++ )
+    {
+      WRITE_CODE( sei.m_seiPrefixDataBit[i][j],               1,            "sei_prefix_data_bit" );
+    }
+    
+    while(m_pcBitIf->getNumberOfWrittenBits() % 8 != 0)
+    {
+      WRITE_FLAG( 1, "byte_alignment_bit_equal_to_one" );
+    }
+  }
+}
+
 Void SEIWriter::xWriteByteAlign()
 {
   if( m_pcBitIf->getNumberOfWrittenBits() % 8 != 0)
Index: source/Lib/TLibEncoder/SEIwrite.h
===================================================================
--- source/Lib/TLibEncoder/SEIwrite.h   (revision 4995)
+++ source/Lib/TLibEncoder/SEIwrite.h   (working copy)
@@ -112,7 +112,9 @@
 #if RNSEI
   Void xWriteSEIRegionalNesting                   (TComBitIf& bs, const SEIRegionalNesting& sei, const TComSPS *sps);
 #endif
-
+  Void xWriteSEIManifest                          (const SEIManifest& sei);
+  Void xWriteSEIPrefixIndication                  (const SEIPrefixIndication& sei);
+  
   Void xWriteSEIpayloadData(TComBitIf& bs, const SEI& sei, const TComSPS *sps);
   Void xWriteByteAlign();
 };
Index: source/Lib/TLibEncoder/TEncCfg.h
===================================================================
--- source/Lib/TLibEncoder/TEncCfg.h    (revision 4995)
+++ source/Lib/TLibEncoder/TEncCfg.h    (working copy)
@@ -522,6 +522,22 @@
   std::string m_summaryOutFilename;                           ///< filename to use for producing summary output file.
   std::string m_summaryPicFilenameBase;                       ///< Base filename to use for producing summary picture output files. The actual filenames used will have I.txt, P.txt and B.txt appended.
   UInt        m_summaryVerboseness;                           ///< Specifies the level of the verboseness of the text output.
+  
+  /************************** SEI MANIFEST SEI MESSAGES **************************/
+  Bool                  m_smSeiManifestSeiEnabled;
+  Int                   m_smSeiManifestNumSeiMsgTypes;
+  std::vector<UShort>   m_smSeiManifestSeiPayloadType;
+  std::vector<UChar>    m_smSeiManifestSeiDescription;
+  /*******************************************************************************/
+  
+  /************************** SEI PREFIX INDICATION SEI MESSAGES **************************/
+  Bool                           m_spiSeiPrefixIndicationSeiEnabled;
+  Int                            m_spiSeiPrefixSeiPayloadType;
+  Int                            m_spiSeiNumSeiPrefixIndicationsMinus1;
+  std::vector<UShort>            m_spiSeiNumBitsInPrefixIndicationMinus1;
+  std::vector<std::vector<UInt>>  m_spiSeiSeiPrefixDataBit;
+  Int                            m_spiSeiByteAlignmentBitEqualToOne;
+  /*******************************************************************************/
 
 public:
   TEncCfg()
@@ -1294,6 +1310,32 @@
 
   Void      setSummaryVerboseness(UInt v)                            { m_summaryVerboseness = v; }
   UInt      getSummaryVerboseness( ) const                           { return m_summaryVerboseness; }
+  
+  /************************** SEI MANIFEST SEI MESSAGES **************************/
+  Void     setSmSEIManifestSeiEnabled(Bool b)                                                           { m_smSeiManifestSeiEnabled = b; }
+  Bool     getSmSeiManifestSeiEnabled()                                                                 { return m_smSeiManifestSeiEnabled; }
+  Void     setSmSEIManifestNumSeiMsgTypes(Int manifestNumSeiMsgTypes)                                   { m_smSeiManifestNumSeiMsgTypes = manifestNumSeiMsgTypes; }
+  Int      getSmSEIManifestNumSeiMsgTypes()                                                             { return m_smSeiManifestNumSeiMsgTypes; }
+  Void     setSmSEIManifestSeiPayloadType(const std::vector<UShort>& manifestSeiPayloadType)            { m_smSeiManifestSeiPayloadType = manifestSeiPayloadType; }
+  UShort   getSmSEIManifestSeiPayloadType(UInt idx) const                                               { return m_smSeiManifestSeiPayloadType[idx]; }
+  Void     setSmSEIManifestSeiDescription(const std::vector<UChar>& manifestSeiDescription)             { m_smSeiManifestSeiDescription = manifestSeiDescription; }
+  UChar    getSmSEIManifestSeiDescription(UInt idx) const                                               { return m_smSeiManifestSeiDescription[idx]; }
+  /*******************************************************************************/
+  
+  /************************** SEI PREFIX INDICATION SEI MESSAGES **************************/
+  Void     setSpiPrefixIndicationSeiEnabled(Bool b)                                                          { m_spiSeiPrefixIndicationSeiEnabled = b; }
+  Bool     getSpiPrefixIndicationSeiEnabled()                                                                { return m_spiSeiPrefixIndicationSeiEnabled; }
+  Void     setSpiPrefixSeiPayloadType(Int prefixSeiPayloadType)                                              { m_spiSeiPrefixSeiPayloadType = prefixSeiPayloadType; }
+  Int      getSpiPrefixSeiPayloadType()                                                                      { return m_spiSeiPrefixSeiPayloadType; }
+  Void     setSpiNumSeiPrefixIndicationsMinus1(Int numSeiPrefixIndicationsMinus1)                            { m_spiSeiNumSeiPrefixIndicationsMinus1 = numSeiPrefixIndicationsMinus1; }
+  Int    getSpiNumSeiPrefixIndicationsMinus1()                                                               { return m_spiSeiNumSeiPrefixIndicationsMinus1; }
+  Void     setSpiNumBitsInPrefixIndicationMinus1(const std::vector<UShort>& numBitsInPrefixIndicationMinus1) { m_spiSeiNumBitsInPrefixIndicationMinus1 = numBitsInPrefixIndicationMinus1; }
+  UShort   getSpiNumBitsInPrefixIndicationMinus1(UInt idx) const                                             { return m_spiSeiNumBitsInPrefixIndicationMinus1[idx]; }
+  Void     setSpiSeiPrefixDataBit(const std::vector<std::vector<UInt>>& seiPrefixDataBit)                    { m_spiSeiSeiPrefixDataBit = seiPrefixDataBit; }
+  UInt     getSpiSeiPrefixDataBit(UInt idx, UInt idy)                                                        { return m_spiSeiSeiPrefixDataBit[idx][idy]; }
+  Void     setSpiByteAlignmentBitEqualToOne(Int i)                                                           { m_spiSeiByteAlignmentBitEqualToOne = i; }
+  Int      getSpiByteAlignmentBitEqualToOne()                                                                { return m_spiSeiByteAlignmentBitEqualToOne; }
+  /*******************************************************************************/
 };
 
 //! \}
Index: source/Lib/TLibEncoder/TEncGOP.cpp
===================================================================
--- source/Lib/TLibEncoder/TEncGOP.cpp  (revision 4995)
+++ source/Lib/TLibEncoder/TEncGOP.cpp  (working copy)
@@ -297,6 +297,23 @@
 #endif
   // The case that a specific SEI is not present is handled in xWriteSEI (empty list)
 
+  // When SEI Manifest SEI message is present in an SEI NAL unit, the SEI Manifest SEI message shall be the first SEI message in the SEI NAL unit (D3.45 in ISO/IEC 23008-2).
+  if(m_pcCfg->getSmSeiManifestSeiEnabled())
+  {
+    currentMessages = extractSeisByType(localMessages, SEI::SEI_MANIFEST);
+    assert (currentMessages.size() <= 1);
+    xWriteSEI(NAL_UNIT_PREFIX_SEI, currentMessages, accessUnit, itNalu, temporalId, sps);
+    xClearSEIs(currentMessages, !testWrite);
+  }
+  // When SEI Manifest SEI message is present in an SEI NAL unit, the SEI Manifest SEI message shall be the first SEI message in the SEI NAL unit (D3.45 in ISO/IEC 23008-2).
+  if(m_pcCfg->getSpiPrefixIndicationSeiEnabled())
+  {
+    currentMessages = extractSeisByType(localMessages, SEI::SEI_PREFIX_INDICATION);
+    assert (currentMessages.size() <= 1);
+    xWriteSEI(NAL_UNIT_PREFIX_SEI, currentMessages, accessUnit, itNalu, temporalId, sps);
+    xClearSEIs(currentMessages, !testWrite);
+  }
+  
   // Active parameter sets SEI must always be the first SEI
   currentMessages = extractSeisByType(localMessages, SEI::ACTIVE_PARAMETER_SETS);
   assert (currentMessages.size() <= 1);
@@ -551,6 +568,18 @@
     m_seiEncoder.initSEIAlternativeTransferCharacteristics(seiAlternativeTransferCharacteristics);
     seiMessages.push_back(seiAlternativeTransferCharacteristics);
   }
+  if (m_pcCfg->getSmSeiManifestSeiEnabled())
+  {
+    SEIManifest *seiSEIManifest = new SEIManifest;
+    m_seiEncoder.initSEISeiManifest(seiSEIManifest);
+    seiMessages.push_back(seiSEIManifest);
+  }
+  if (m_pcCfg->getSpiPrefixIndicationSeiEnabled())
+  {
+    SEIPrefixIndication *seiSEIPrefixIndication = new SEIPrefixIndication;
+    m_seiEncoder.initSEISeiPrefixIndication(seiSEIPrefixIndication);
+    seiMessages.push_back(seiSEIPrefixIndication);
+  }
 }
 
 Void TEncGOP::xCreatePerPictureSEIMessages (Int picInGOP, SEIMessages& seiMessages, SEIMessages& nestedSeiMessages, TComSlice *slice)