Index: /branches/HM-10.0-dev-SHM/source/App/TAppEncoder/TAppEncTop.cpp
===================================================================
--- /branches/HM-10.0-dev-SHM/source/App/TAppEncoder/TAppEncTop.cpp	(revision 111)
+++ /branches/HM-10.0-dev-SHM/source/App/TAppEncoder/TAppEncTop.cpp	(revision 112)
@@ -704,5 +704,13 @@
     }
   }
-
+#if VPS_EXTN_PROFILE_INFO
+  vps->getPTLForExtnPtr()->resize(vps->getNumLayerSets());
+  for(Int setId = 1; setId < vps->getNumLayerSets(); setId++)
+  {
+    vps->setProfilePresentFlag(setId, true);
+    // Note - may need to be changed for other layer structures.
+    *(vps->getPTLForExtn(setId)) = *(m_acTEncTop[setId].getSPS()->getPTL());
+  }
+#endif
   // Target output layer
   vps->setNumOutputLayerSets(1);
Index: /branches/HM-10.0-dev-SHM/source/Lib/TLibCommon/TComSlice.cpp
===================================================================
--- /branches/HM-10.0-dev-SHM/source/Lib/TLibCommon/TComSlice.cpp	(revision 111)
+++ /branches/HM-10.0-dev-SHM/source/Lib/TLibCommon/TComSlice.cpp	(revision 112)
@@ -1485,4 +1485,8 @@
     m_uiMaxLatencyIncrease[i] = 0;
   }
+#if VPS_EXTN_PROFILE_INFO
+  ::memset(m_profilePresentFlag, 0, sizeof(m_profilePresentFlag));
+  ::memset(m_profileLayerSetRef, 0, sizeof(m_profileLayerSetRef));
+#endif
 #if VPS_EXTN_OP_LAYER_SETS
   ::memset(m_layerIdIncludedFlag, 0, sizeof(m_layerIdIncludedFlag));
@@ -2277,4 +2281,20 @@
   ::memset(m_profileCompatibilityFlag, 0, sizeof(m_profileCompatibilityFlag));
 }
+#if VPS_EXTN_PROFILE_INFO
+Void ProfileTierLevel::copyProfileInfo(ProfileTierLevel *ptl)
+{
+  this->setProfileSpace          ( ptl->getProfileSpace()      );
+  this->setTierFlag              ( ptl->getTierFlag()          );
+  this->setProfileIdc            ( ptl->getProfileIdc()        );
+  for(Int j = 0; j < 32; j++)
+  {
+    this->setProfileCompatibilityFlag(j, ptl->getProfileCompatibilityFlag(j));
+  }
+  this->setProgressiveSourceFlag  ( ptl->getProgressiveSourceFlag()  );
+  this->setInterlacedSourceFlag   ( ptl->getInterlacedSourceFlag()   );
+  this->setNonPackedConstraintFlag( ptl->getNonPackedConstraintFlag());
+  this->setFrameOnlyConstraintFlag( ptl->getFrameOnlyConstraintFlag());  
+}
+#endif
 
 TComPTL::TComPTL()
@@ -2283,4 +2303,11 @@
   ::memset(m_subLayerLevelPresentFlag,   0, sizeof(m_subLayerLevelPresentFlag  ));
 }
+#if VPS_EXTN_PROFILE_INFO
+Void TComPTL::copyProfileInfo(TComPTL *ptl)
+{
+  // Copy all information related to general profile
+  this->getGeneralPTL()->copyProfileInfo(ptl->getGeneralPTL());
+}
+#endif
 #if SIGNAL_BITRATE_PICRATE_IN_VPS
 TComBitRatePicRateInfo::TComBitRatePicRateInfo()
Index: /branches/HM-10.0-dev-SHM/source/Lib/TLibCommon/TComSlice.h
===================================================================
--- /branches/HM-10.0-dev-SHM/source/Lib/TLibCommon/TComSlice.h	(revision 111)
+++ /branches/HM-10.0-dev-SHM/source/Lib/TLibCommon/TComSlice.h	(revision 112)
@@ -229,4 +229,7 @@
   Void setFrameOnlyConstraintFlag(Bool b) { m_frameOnlyConstraintFlag = b; }
 #endif
+#if VPS_EXTN_PROFILE_INFO
+  Void copyProfileInfo(ProfileTierLevel *ptl);
+#endif
 };
 
@@ -249,4 +252,7 @@
   ProfileTierLevel* getGeneralPTL()  { return &m_generalPTL; }
   ProfileTierLevel* getSubLayerPTL(Int i)  { return &m_subLayerPTL[i]; }
+#if VPS_EXTN_PROFILE_INFO
+  Void copyProfileInfo(TComPTL *ptl);
+#endif
 };
 /// VPS class
@@ -510,4 +516,10 @@
   // Variables related to VPS extensions
   // ------------------------------------------
+#if VPS_EXTN_PROFILE_INFO
+  // Profile-tier-level signalling related
+  Bool       m_profilePresentFlag[MAX_VPS_LAYER_SETS_PLUS1];    // The value with index 0 will not be used.
+  UInt       m_profileLayerSetRef[MAX_VPS_LAYER_SETS_PLUS1];    // The value with index 0 will not be used.
+  std::vector<TComPTL>    m_pcPTLForExtn;  
+#endif
 #if VPS_EXTN_OP_LAYER_SETS
   // .. More declarations here
@@ -583,5 +595,14 @@
   TimingInfo* getTimingInfo() { return &m_timingInfo; }
 #endif
-
+#if VPS_EXTN_PROFILE_INFO
+  Bool   getProfilePresentFlag(Int id)                          { return m_profilePresentFlag[id]; }
+  Void   setProfilePresentFlag(Int id, Bool x)                  { m_profilePresentFlag[id] = x;    }
+
+  UInt   getProfileLayerSetRef(Int id)                          { return m_profileLayerSetRef[id]; }
+  Void   setProfileLayerSetRef(Int id, Bool x)                  { m_profileLayerSetRef[id] = x;    }
+
+  std::vector<TComPTL>* getPTLForExtnPtr()                      { return &m_pcPTLForExtn;          }
+  TComPTL* getPTLForExtn(Int id)                                { return &m_pcPTLForExtn[id];      }
+#endif
 #if VPS_EXTN_OP_LAYER_SETS
   // Target output layer signalling related
Index: /branches/HM-10.0-dev-SHM/source/Lib/TLibCommon/TypeDef.h
===================================================================
--- /branches/HM-10.0-dev-SHM/source/Lib/TLibCommon/TypeDef.h	(revision 111)
+++ /branches/HM-10.0-dev-SHM/source/Lib/TLibCommon/TypeDef.h	(revision 112)
@@ -48,4 +48,5 @@
 #if VPS_EXTNS
 #define VPS_EXTN_OP_LAYER_SETS           1      ///< Include output layer sets in VPS extension
+#define VPS_EXTN_PROFILE_INFO            1      ///< Include profile information for layer sets in VPS extension
 #endif
 #define MAX_LAYERS                       2      ///< max number of layers the codec is supposed to handle
Index: /branches/HM-10.0-dev-SHM/source/Lib/TLibDecoder/TDecCAVLC.cpp
===================================================================
--- /branches/HM-10.0-dev-SHM/source/Lib/TLibDecoder/TDecCAVLC.cpp	(revision 111)
+++ /branches/HM-10.0-dev-SHM/source/Lib/TLibDecoder/TDecCAVLC.cpp	(revision 112)
@@ -841,4 +841,21 @@
   UInt uiCode;
   // ... More syntax elements to be parsed here
+#if VPS_EXTN_PROFILE_INFO
+  // Profile-tier-level signalling
+  vps->getPTLForExtnPtr()->resize(vps->getNumLayerSets());
+  for(Int idx = 1; idx <= vps->getNumLayerSets() - 1; idx++)
+  {
+    READ_FLAG( uiCode, "vps_profile_present_flag[i]" ); vps->setProfilePresentFlag(idx, uiCode ? true : false);
+    if( !vps->getProfilePresentFlag(idx) )
+    {
+      READ_UVLC( uiCode, "vps_profile_layer_set_ref_minus1[i]" ); vps->setProfileLayerSetRef(idx, uiCode + 1);
+      assert( vps->getProfileLayerSetRef(idx) < idx );
+      // Copy profile information as indicated 
+      vps->getPTLForExtn(idx)->copyProfileInfo( vps->getPTLForExtn( vps->getProfileLayerSetRef(idx) ) );
+    }    
+    parsePTL( vps->getPTLForExtn(idx), vps->getProfilePresentFlag(idx), vps->getMaxTLayers() - 1 );
+  }
+#endif
+
 #if VPS_EXTN_OP_LAYER_SETS
   // Target output layer signalling
Index: /branches/HM-10.0-dev-SHM/source/Lib/TLibEncoder/TEncCavlc.cpp
===================================================================
--- /branches/HM-10.0-dev-SHM/source/Lib/TLibEncoder/TEncCavlc.cpp	(revision 111)
+++ /branches/HM-10.0-dev-SHM/source/Lib/TLibEncoder/TEncCavlc.cpp	(revision 112)
@@ -669,5 +669,16 @@
 {
   // ... More syntax elements to be written here
-
+#if VPS_EXTN_PROFILE_INFO
+  // Profile-tier-level signalling
+  for(Int idx = 1; idx <= vps->getNumLayerSets() - 1; idx++)
+  {
+    WRITE_FLAG( vps->getProfilePresentFlag(idx),       "vps_profile_present_flag[i]" );
+    if( !vps->getProfilePresentFlag(idx) )
+    {
+      WRITE_UVLC( vps->getProfileLayerSetRef(idx) - 1, "vps_profile_layer_set_ref_minus1[i]" );
+    }
+    codePTL( vps->getPTLForExtn(idx), vps->getProfilePresentFlag(idx), vps->getMaxTLayers() - 1 );
+  }
+#endif
 #if VPS_EXTN_OP_LAYER_SETS
   // Target output layer signalling
