diff --git a/cfg/multi-layer/two_layers_ELonlyILP.cfg b/cfg/multi-layer/two_layers_ELonlyILP.cfg
index 3bca520408a3c6e28347100c6e9e4d1b6c4924b7..f4310ca78506ecc8767c4259a0b40f275b62a2a8 100644
--- a/cfg/multi-layer/two_layers_ELonlyILP.cfg
+++ b/cfg/multi-layer/two_layers_ELonlyILP.cfg
@@ -3,10 +3,10 @@ MaxLayers                     : 2
 MaxSublayers                  : 1
 AllLayersSameNumSublayersFlag : 0
 AllIndependentLayersFlag      : 0
-AllowablePredDirection 	  	  : 1 1 1 1 1 	  # equal to 0 specifies the picture in the i-th temporal layer is allowed to use both inter-layer and intra-layer preditions
-											  # equal to 1 specifies the picture in the i-th temporal layer is allowed to use inter-layer predition only
-										      # equal to 2 specifies the picture in the i-th temporal layer is allowed to use intra-layer predition only
-											  
+AllowablePredDirection        : 1 1 1 1 1      # equal to 0 specifies the picture in the i-th temporal layer is allowed to use both inter-layer and intra-layer preditions
+                                               # equal to 1 specifies the picture in the i-th temporal layer is allowed to use inter-layer predition only
+                                               # equal to 2 specifies the picture in the i-th temporal layer is allowed to use intra-layer predition only
+
 #======== OLSs ===============
 EachLayerIsAnOlsFlag          : 0
 OlsModeIdc                    : 2
diff --git a/cfg/sei_vui/subpicture_level.cfg b/cfg/sei_vui/subpicture_level.cfg
index 4f38f5110e692b9de2d4f46d11c5eba2eb1e7ce8..39eec9236c89c89646c22c6a0061251139050f53 100644
--- a/cfg/sei_vui/subpicture_level.cfg
+++ b/cfg/sei_vui/subpicture_level.cfg
@@ -1,9 +1,17 @@
-SEISubpicLevelInfoEnabled:             		1
-SEISubpicLevelInfoRefLevels:             	4.1           # list of levels to be included
-SEISubpicLevelInfoExplicitFraction:    		1             # enable sending of explicit fractions
-SEISubpicLevelInfoNumSubpics:          		2             # number of subpictures - needs to be aligned with NumSubpics
-SEISubpicLevelInfoMaxSublayers:			1			  # number of sublayers
-SEISubpicLevelInfoSublayerInfoPresentFlag: 0			  # 1: the level information for subpicture sequences is present for sublayer representation(s) in the range of 0 to sli_max_sublayers_minus1, inclusive
-													        0: the level information for subpicture sequences is present for the sli_max_sublayers_minus1-th sublayer representation
-SEISubpicLevelInfoRefLevelFractions:   		40 30         # list of fractions: iterates over subpictures and levels and sublayers (subpictures first)
+SEISubpicLevelInfoEnabled:                   1
+SEISubpicLevelInfoExplicitFraction:          1             # enable sending of explicit fractions
+SEISubpicLevelInfoNumSubpics:                2             # number of subpictures - needs to be equal to NumSubpics
+SEISubpicLevelInfoMaxSublayers:              7             # number of sublayers - needs to be equal to vps_max_sublayers_minus1 + 1
+SEISubpicLevelInfoSublayerInfoPresentFlag:   0             # 0: all sublayers use the same level information, 1: each sublayer shall specify its own level information
+
+SEISubpicLevelInfoRefLevels:                 4.1           # list of reference level indices
+                                                           # when sli_sublayer_info_present_flag = 0, the number of input elements shall be equal to numReflevels (iterate over levels)
+                                                           # when sli_sublayer_info_present_flag = 1, the number of input elements shall be equal to numReflevels * maxSublayers (iterates over levels and sublayers (levels first)). For example, let Amn denotes the reference level indices for the m-th sublayer and and n-th reference level, then the first N elements (A00...A0n-1) denotes the refLevelIdcs for N levels in the 0-th sublayer, and the following N elements (A10...A1n-1) denotes the refLevelIdcs for N levels in the 1st sublayer, and so on, untill all MxN elements specified
+
+SEISubpicLevelInfoRefLevelFractions:         40 30         # list of reference level fractions
+                                                           # when sli_sublayer_info_present_flag = 0, the number of input elements shall be equal to numSubpics * numReflevels (iterate over subpictures and levels (subpictures first))
+                                                           # when sli_sublayer_info_present_flag = 1, the number of elements shall be equal to numSubpics * numReflevels * maxSublayers (iterates over subpictures and levels and sublayers (subpictures first, followed by levels)). For example, let Bmnk  denotes the reference level fractions for the m-th sublayer and n-th reference level and k-th subpicture, then the first K elements (B000...B00k-1) denotes the refLevelFractions for K subpictures in the 0-th levels and 0-th sublayer, and followed by K elements (B010...B0n-1k-1) denotes the refLevelFractions for K subpictures in the 1st level and 0-th sublayer, and so on, untill all M*N*K elements specified
+
+
+
 
diff --git a/source/App/EncoderApp/EncAppCfg.cpp b/source/App/EncoderApp/EncAppCfg.cpp
index 0dc3dbd666ac21cae3ee019e2f6b4f90fb8c88f7..325faee9a4542763912352b2a6e3992d0d88e9f4 100644
--- a/source/App/EncoderApp/EncAppCfg.cpp
+++ b/source/App/EncoderApp/EncAppCfg.cpp
@@ -661,7 +661,11 @@ bool EncAppCfg::parseCfg( int argc, char* argv[] )
   SMultiValueInput<uint32_t>  cfg_subPicId(0, std::numeric_limits<uint16_t>::max(), 0, MAX_NUM_SUB_PICS);
 
   SMultiValueInput<int>          cfg_sliFractions(0, 100, 0, std::numeric_limits<int>::max());
+#if  JVET_S0176_SLI_SEI
+  SMultiValueInput<Level::Name>  cfg_sliRefLevels(Level::NONE, Level::LEVEL15_5, 0, 8 * MAX_VPS_SUBLAYERS);
+#else
   SMultiValueInput<Level::Name>  cfg_sliRefLevels(Level::NONE, Level::LEVEL15_5,  0, 8);
+#endif
 
   int warnUnknowParameter = 0;
 
@@ -1689,19 +1693,33 @@ bool EncAppCfg::parseCfg( int argc, char* argv[] )
   {
     CHECK (m_numSubPics != m_cfgSubpictureLevelInfoSEI.m_numSubpictures, "NumSubPics must be equal to SEISubpicLevelInfoNumSubpics" );
 #if JVET_S0176_SLI_SEI
-    CHECK (m_cfgSubpictureLevelInfoSEI.m_sliMaxSublayers > m_maxSublayers, "SEISubpicLevelInfoMaxSublayers must be no greater than vps_max_sublayers");
-#endif
+    CHECK (m_cfgSubpictureLevelInfoSEI.m_sliMaxSublayers != m_maxSublayers, "SEISubpicLevelInfoMaxSublayers must be equal to vps_max_sublayers");
+    if (m_cfgSubpictureLevelInfoSEI.m_sliSublayerInfoPresentFlag)
+    {
+      CHECK(cfg_sliRefLevels.values.size() < m_maxSublayers, "when sliSublayerInfoPresentFlag = 1, the number of reference levels must be greater than or equal to sublayers");
+    }
     if (m_cfgSubpictureLevelInfoSEI.m_explicitFraction)
     {
       m_cfgSubpictureLevelInfoSEI.m_fractions = cfg_sliFractions.values;
       m_cfgSubpictureLevelInfoSEI.m_refLevels = cfg_sliRefLevels.values;
-#if JVET_S0176_SLI_SEI
-      CHECK (cfg_sliRefLevels.values.size() * m_cfgSubpictureLevelInfoSEI.m_numSubpictures * m_cfgSubpictureLevelInfoSEI.m_sliMaxSublayers != cfg_sliFractions.values.size(),
-        "Number of subpicture level fractions must be equal to the numer of subpictures times the number of reference levels times the number of sublayers");
+      if (m_cfgSubpictureLevelInfoSEI.m_sliSublayerInfoPresentFlag)
+      {
+        CHECK((int)cfg_sliRefLevels.values.size() / m_maxSublayers * m_cfgSubpictureLevelInfoSEI.m_numSubpictures * m_cfgSubpictureLevelInfoSEI.m_sliMaxSublayers != cfg_sliFractions.values.size(),
+          "when sliSublayerInfoPresentFlag = 1, the number  of subpicture level fractions must be equal to the numer of subpictures times the number of reference levels times the number of sublayers");
+      }
+      else
+      {
+        CHECK((int)cfg_sliRefLevels.values.size() * m_cfgSubpictureLevelInfoSEI.m_numSubpictures != cfg_sliFractions.values.size(), "when sliSublayerInfoPresentFlag = 0, the number  of subpicture level fractions must be equal to the numer of subpictures times the number of reference levels");
+      }
+    }
 #else
-      CHECK (cfg_sliRefLevels.values.size() * m_cfgSubpictureLevelInfoSEI.m_numSubpictures != cfg_sliFractions.values.size(), "Number of subpicture level fractions must be equal to the numer of subpictures times the number of reference levels.");
-#endif
+    if (m_cfgSubpictureLevelInfoSEI.m_explicitFraction)
+    {
+        m_cfgSubpictureLevelInfoSEI.m_fractions = cfg_sliFractions.values;
+        m_cfgSubpictureLevelInfoSEI.m_refLevels = cfg_sliRefLevels.values;
+      CHECK (cfg_sliRefLevels.values.size() * m_cfgSubpictureLevelInfoSEI.m_numSubpictures != cfg_sliFractions.values.size(), "when sliSublayerInfoPresentFlag = 0, the number  of subpicture level fractions must be equal to the numer of subpictures times the number of reference levels.");
     }
+#endif
   }
 
   if (m_costMode != COST_LOSSLESS_CODING && m_mixedLossyLossless)
diff --git a/source/Lib/DecoderLib/SEIread.cpp b/source/Lib/DecoderLib/SEIread.cpp
index 432e939597ed9f89a9a87fee332afe1170371395..cc693ed88d98e6cb5d72ea548a828003dee1ee78 100644
--- a/source/Lib/DecoderLib/SEIread.cpp
+++ b/source/Lib/DecoderLib/SEIread.cpp
@@ -1507,9 +1507,14 @@ void SEIReader::xParseSEISubpictureLevelInfo(SEISubpicureLevelInfo& sei, uint32_
 
   sei.m_refLevelIdc.resize(sei.m_numRefLevels);
 #if JVET_S0176_SLI_SEI
+  // sei parameters initialization
   for (int i = 0; i < sei.m_numRefLevels; i++)
   {
-    sei.m_refLevelIdc[i].resize(sei.m_sliSublayerInfoPresentFlag ? sei.m_sliMaxSublayers : 1);
+    sei.m_refLevelIdc[i].resize(sei.m_sliMaxSublayers);
+    for (int k = 0; k < sei.m_sliMaxSublayers; k++)
+    {
+      sei.m_refLevelIdc[i][k] = Level::LEVEL15_5;
+    }
   }
   if (sei.m_explicitFractionPresentFlag)
   {
@@ -1519,11 +1524,16 @@ void SEIReader::xParseSEISubpictureLevelInfo(SEISubpicureLevelInfo& sei, uint32_
       sei.m_refLevelFraction[i].resize(sei.m_numSubpics);
       for (int j = 0; j < sei.m_numSubpics; j++)
       {
-        sei.m_refLevelFraction[i][j].resize(sei.m_sliSublayerInfoPresentFlag ? sei.m_sliMaxSublayers : 1);
+        sei.m_refLevelFraction[i][j].resize(sei.m_sliMaxSublayers);
+        for (int k = 0; k < sei.m_sliMaxSublayers; k++)
+        {
+          sei.m_refLevelFraction[i][j][k] = 0;
+        }
       }
     }
   }
 
+  // parsing
   for (int k = sei.m_sliSublayerInfoPresentFlag ? 0 : sei.m_sliMaxSublayers - 1; k < sei.m_sliMaxSublayers; k++)
   {
     for (int i = 0; i < sei.m_numRefLevels; i++)
@@ -1539,6 +1549,25 @@ void SEIReader::xParseSEISubpictureLevelInfo(SEISubpicureLevelInfo& sei, uint32_
       }
     }
   }
+
+  // update the inference of m_refLevelIdc[][] and m_refLevelFraction[][][]
+  if (!sei.m_sliSublayerInfoPresentFlag)
+  {
+    for (int k = sei.m_sliMaxSublayers - 2; k >= 0; k--)
+    {
+      for (int i = 0; i < sei.m_numRefLevels; i++)
+      {
+        sei.m_refLevelIdc[i][k] = sei.m_refLevelIdc[i][sei.m_sliMaxSublayers - 1];
+        if (sei.m_explicitFractionPresentFlag)
+        {
+          for (int j = 0; j < sei.m_numSubpics; j++)
+          {
+            sei.m_refLevelFraction[i][j][k] = sei.m_refLevelFraction[i][j][sei.m_sliMaxSublayers - 1];
+          }
+        }
+      }
+    }
+  }
 #else
   if (sei.m_explicitFractionPresentFlag)
   {
diff --git a/source/Lib/EncoderLib/SEIEncoder.cpp b/source/Lib/EncoderLib/SEIEncoder.cpp
index 02601a18f2f379727506dd917429578dc218fbd4..c147b69311bee5df4794cb5f547770a40356414a 100644
--- a/source/Lib/EncoderLib/SEIEncoder.cpp
+++ b/source/Lib/EncoderLib/SEIEncoder.cpp
@@ -647,53 +647,83 @@ void SEIEncoder::initSEISubpictureLevelInfo(SEISubpicureLevelInfo *sei, const SP
 {
   const EncCfgParam::CfgSEISubpictureLevel &cfgSubPicLevel = m_pcCfg->getSubpicureLevelInfoSEICfg();
 
-  sei->m_numRefLevels = (int) cfgSubPicLevel.m_refLevels.size();
 #if JVET_S0176_SLI_SEI
   sei->m_sliSublayerInfoPresentFlag = cfgSubPicLevel.m_sliSublayerInfoPresentFlag;
   sei->m_sliMaxSublayers = cfgSubPicLevel.m_sliMaxSublayers;
+  sei->m_numRefLevels = cfgSubPicLevel.m_sliSublayerInfoPresentFlag ? (int)cfgSubPicLevel.m_refLevels.size() / cfgSubPicLevel.m_sliMaxSublayers : (int)cfgSubPicLevel.m_refLevels.size();
+  sei->m_numSubpics = cfgSubPicLevel.m_numSubpictures;
+  sei->m_explicitFractionPresentFlag = cfgSubPicLevel.m_explicitFraction;
+
+  // sei parameters initialization
   sei->m_refLevelIdc.resize(sei->m_numRefLevels);
   for (int level = 0; level < sei->m_numRefLevels; level++)
   {
-    sei->m_refLevelIdc[level].resize(sei->m_sliSublayerInfoPresentFlag ? sei->m_sliMaxSublayers : 1);
-  }
-
-  for (int k = sei->m_sliSublayerInfoPresentFlag ? 0 : sei->m_sliMaxSublayers - 1, cnt = 0; k < sei->m_sliMaxSublayers; k++)
-  {
-    for (int level = 0; level < sei->m_numRefLevels; level++)
+    sei->m_refLevelIdc[level].resize(sei->m_sliMaxSublayers);
+    for (int sublayer = 0; sublayer < sei->m_sliMaxSublayers; sublayer++)
     {
-      sei->m_refLevelIdc[level][k] = cfgSubPicLevel.m_refLevels[cnt++];
+      sei->m_refLevelIdc[level][sublayer] = Level::LEVEL15_5;
     }
   }
-#else
-  sei->m_refLevelIdc  = cfgSubPicLevel.m_refLevels;
-#endif
-  sei->m_explicitFractionPresentFlag = cfgSubPicLevel.m_explicitFraction;
-  if (cfgSubPicLevel.m_explicitFraction)
+  if (sei->m_explicitFractionPresentFlag)
   {
-    CHECK (sps->getNumSubPics() != cfgSubPicLevel.m_numSubpictures, "Number of subpictures must be equal in SPS and subpicture level information SEI" );
-    sei->m_numSubpics = cfgSubPicLevel.m_numSubpictures;
     sei->m_refLevelFraction.resize(sei->m_numRefLevels);
-#if JVET_S0176_SLI_SEI
     for (int level = 0; level < sei->m_numRefLevels; level++)
     {
       sei->m_refLevelFraction[level].resize(sei->m_numSubpics);
       for (int subpic = 0; subpic < sei->m_numSubpics; subpic++)
       {
-        sei->m_refLevelFraction[level][subpic].resize(sei->m_sliSublayerInfoPresentFlag ? sei->m_sliMaxSublayers : 1);
+        sei->m_refLevelFraction[level][subpic].resize(sei->m_sliMaxSublayers);
+        for (int sublayer = 0; sublayer < sei->m_sliMaxSublayers; sublayer++)
+        {
+          sei->m_refLevelFraction[level][subpic][sublayer] = 0;
+        }
+      }
+    }
+  }
+
+  // set sei parameters according to the configured values
+  for (int sublayer = sei->m_sliSublayerInfoPresentFlag ? 0 : sei->m_sliMaxSublayers - 1, cnta = 0, cntb = 0; sublayer < sei->m_sliMaxSublayers; sublayer++)
+  {
+    for (int level = 0; level < sei->m_numRefLevels; level++)
+    {
+      sei->m_refLevelIdc[level][sublayer] = cfgSubPicLevel.m_refLevels[cnta++];
+      if (sei->m_explicitFractionPresentFlag)
+      {
+        for (int subpic = 0; subpic < sei->m_numSubpics; subpic++)
+        {
+          sei->m_refLevelFraction[level][subpic][sublayer] = cfgSubPicLevel.m_fractions[cntb++];
+        }
       }
     }
+  }
 
-    for (int k = sei->m_sliSublayerInfoPresentFlag ? 0 : sei->m_sliMaxSublayers - 1, cnt = 0; k < sei->m_sliMaxSublayers; k++)
+  // update the inference of m_refLevelIdc[][] and m_refLevelFraction[][][]
+  if (!sei->m_sliSublayerInfoPresentFlag)
+  {
+    for (int sublayer = sei->m_sliMaxSublayers - 2; sublayer >= 0; sublayer--)
     {
       for (int level = 0; level < sei->m_numRefLevels; level++)
       {
-        for (int subpic = 0; subpic < sei->m_numSubpics; subpic++)
+        sei->m_refLevelIdc[level][sublayer] = sei->m_refLevelIdc[level][sei->m_sliMaxSublayers - 1];
+        if (sei->m_explicitFractionPresentFlag)
         {
-          sei->m_refLevelFraction[level][subpic][k] = cfgSubPicLevel.m_fractions[cnt++];
+          for (int subpic = 0; subpic < sei->m_numSubpics; subpic++)
+          {
+            sei->m_refLevelFraction[level][subpic][sublayer] = sei->m_refLevelFraction[level][subpic][sei->m_sliMaxSublayers - 1];
+          }
         }
       }
     }
+  }
 #else
+    sei->m_numRefLevels = (int)cfgSubPicLevel.m_refLevels.size();
+    sei->m_refLevelIdc = cfgSubPicLevel.m_refLevels;
+    sei->m_explicitFractionPresentFlag = cfgSubPicLevel.m_explicitFraction;
+    if (cfgSubPicLevel.m_explicitFraction)
+    {
+      CHECK(sps->getNumSubPics() != cfgSubPicLevel.m_numSubpictures, "Number of subpictures must be equal in SPS and subpicture level information SEI");
+      sei->m_numSubpics = cfgSubPicLevel.m_numSubpictures;
+      sei->m_refLevelFraction.resize(sei->m_numRefLevels);
     for (int level=0, cnt=0; level < sei->m_numRefLevels; level++)
     {
       sei->m_refLevelFraction[level].resize(sei->m_numSubpics);
@@ -702,8 +732,8 @@ void SEIEncoder::initSEISubpictureLevelInfo(SEISubpicureLevelInfo *sei, const SP
         sei->m_refLevelFraction[level][subpic] = cfgSubPicLevel.m_fractions[cnt++];
       }
     }
-#endif
   }
+#endif
 }