diff --git a/source/App/EncoderApp/EncAppCfg.cpp b/source/App/EncoderApp/EncAppCfg.cpp
index 673eb6141870c9a23a9c6c20e0d4f4105059ae4d..77e36faa40f013d326d951fcd32fc51a2e4e74d3 100644
--- a/source/App/EncoderApp/EncAppCfg.cpp
+++ b/source/App/EncoderApp/EncAppCfg.cpp
@@ -3123,11 +3123,7 @@ bool EncAppCfg::xCheckParameter()
     // rectangular slices
     if( !m_rasterSliceFlag )
     {
-      if (m_singleSlicePerSubPicFlag)
-      {
-        xConfirmPara( m_subPicInfoPresentFlag == 0 || m_numSubPics < 2, "SingleSlicePerSubPic requires more than one subpicture.");
-      }
-      else
+      if (!m_singleSlicePerSubPicFlag)
       {
         uint32_t sliceIdx;
         bool     needTileIdxDelta = false;
diff --git a/source/Lib/CommonLib/Slice.cpp b/source/Lib/CommonLib/Slice.cpp
index 7de09c48eb384a64a3011f42a4d6f08b980c4f85..5dad8d206ddc06994bbf46beead4d14306dc6c25 100644
--- a/source/Lib/CommonLib/Slice.cpp
+++ b/source/Lib/CommonLib/Slice.cpp
@@ -2849,58 +2849,74 @@ void PPS::initRectSliceMap(const SPS  *sps)
     CHECK(m_numSlicesInPic > MAX_SLICES, "Number of slices in picture exceeds valid range");
     m_sliceMap.resize( m_numSlicesInPic );
 
-    // Q2001 v15 equation 29
-    std::vector<uint32_t> subpicWidthInTiles;
-    std::vector<uint32_t> subpicHeightInTiles;
-    std::vector<uint32_t> subpicHeightLessThanOneTileFlag;
-    subpicWidthInTiles.resize(sps->getNumSubPics());
-    subpicHeightInTiles.resize(sps->getNumSubPics());
-    subpicHeightLessThanOneTileFlag.resize(sps->getNumSubPics());
-    for (uint32_t i = 0; i <sps->getNumSubPics(); i++)
+    if (sps->getNumSubPics() > 1)
     {
-      uint32_t leftX = sps->getSubPicCtuTopLeftX(i);
-      uint32_t rightX = leftX + sps->getSubPicWidth(i) - 1;
-      subpicWidthInTiles[i] = m_ctuToTileCol[rightX] + 1 - m_ctuToTileCol[leftX];
+      // Q2001 v15 equation 29
+      std::vector<uint32_t> subpicWidthInTiles;
+      std::vector<uint32_t> subpicHeightInTiles;
+      std::vector<uint32_t> subpicHeightLessThanOneTileFlag;
+      subpicWidthInTiles.resize(sps->getNumSubPics());
+      subpicHeightInTiles.resize(sps->getNumSubPics());
+      subpicHeightLessThanOneTileFlag.resize(sps->getNumSubPics());
+      for (uint32_t i = 0; i <sps->getNumSubPics(); i++)
+      {
+        uint32_t leftX = sps->getSubPicCtuTopLeftX(i);
+        uint32_t rightX = leftX + sps->getSubPicWidth(i) - 1;
+        subpicWidthInTiles[i] = m_ctuToTileCol[rightX] + 1 - m_ctuToTileCol[leftX];
 
-      uint32_t topY = sps->getSubPicCtuTopLeftY(i);
-      uint32_t bottomY = topY + sps->getSubPicHeight(i) - 1;
-      subpicHeightInTiles[i] = m_ctuToTileRow[bottomY] + 1 - m_ctuToTileRow[topY];
+        uint32_t topY = sps->getSubPicCtuTopLeftY(i);
+        uint32_t bottomY = topY + sps->getSubPicHeight(i) - 1;
+        subpicHeightInTiles[i] = m_ctuToTileRow[bottomY] + 1 - m_ctuToTileRow[topY];
 
-      if (subpicHeightInTiles[i] == 1 && sps->getSubPicHeight(i) < m_tileRowHeight[m_ctuToTileRow[topY]] )
-      {
-        subpicHeightLessThanOneTileFlag[i] = 1;
+        if (subpicHeightInTiles[i] == 1 && sps->getSubPicHeight(i) < m_tileRowHeight[m_ctuToTileRow[topY]] )
+        {
+          subpicHeightLessThanOneTileFlag[i] = 1;
+        }
+        else
+        {
+          subpicHeightLessThanOneTileFlag[i] = 0;
+        }
       }
-      else
+
+      for( int i = 0; i < m_numSlicesInPic; i++ )
       {
-        subpicHeightLessThanOneTileFlag[i] = 0;
+        CHECK(m_numSlicesInPic != sps->getNumSubPics(), "in single slice per subpic mode, number of slice and subpic shall be equal");
+        m_sliceMap[ i ].initSliceMap();
+        if (subpicHeightLessThanOneTileFlag[i])
+        {
+          m_sliceMap[i].addCtusToSlice(sps->getSubPicCtuTopLeftX(i), sps->getSubPicCtuTopLeftX(i) + sps->getSubPicWidth(i),
+                                       sps->getSubPicCtuTopLeftY(i), sps->getSubPicCtuTopLeftY(i) + sps->getSubPicHeight(i), m_picWidthInCtu);
+        }
+        else
+        {
+          tileX = m_ctuToTileCol[sps->getSubPicCtuTopLeftX(i)];
+          tileY = m_ctuToTileRow[sps->getSubPicCtuTopLeftY(i)];
+          for (uint32_t j = 0; j< subpicHeightInTiles[i]; j++)
+          {
+            for (uint32_t k = 0; k < subpicWidthInTiles[i]; k++)
+            {
+              m_sliceMap[i].addCtusToSlice(getTileColumnBd(tileX + k), getTileColumnBd(tileX + k + 1), getTileRowBd(tileY + j), getTileRowBd(tileY + j + 1), m_picWidthInCtu);
+            }
+          }
+        }
       }
+      subpicWidthInTiles.clear();
+      subpicHeightInTiles.clear();
+      subpicHeightLessThanOneTileFlag.clear();
     }
-
-    for( int i = 0; i < m_numSlicesInPic; i++ )
+    else
     {
-      CHECK(m_numSlicesInPic != sps->getNumSubPics(), "in single slice per subpic mode, number of slice and subpic shall be equal");
-      m_sliceMap[ i ].initSliceMap();
-      if (subpicHeightLessThanOneTileFlag[i])
-      {
-        m_sliceMap[i].addCtusToSlice(sps->getSubPicCtuTopLeftX(i), sps->getSubPicCtuTopLeftX(i) + sps->getSubPicWidth(i),
-                                     sps->getSubPicCtuTopLeftY(i), sps->getSubPicCtuTopLeftY(i) + sps->getSubPicHeight(i), m_picWidthInCtu);
-      }
-      else
+      m_sliceMap[0].initSliceMap();
+      for (int tileY=0; tileY<m_numTileRows; tileY++)
       {
-        tileX = m_ctuToTileCol[sps->getSubPicCtuTopLeftX(i)];
-        tileY = m_ctuToTileRow[sps->getSubPicCtuTopLeftY(i)];
-        for (uint32_t j = 0; j< subpicHeightInTiles[i]; j++)
+        for (int tileX=0; tileX<m_numTileCols; tileX++)
         {
-          for (uint32_t k = 0; k < subpicWidthInTiles[i]; k++)
-          {
-            m_sliceMap[i].addCtusToSlice(getTileColumnBd(tileX + k), getTileColumnBd(tileX + k + 1), getTileRowBd(tileY + j), getTileRowBd(tileY + j + 1), m_picWidthInCtu);
-          }
+          m_sliceMap[0].addCtusToSlice(getTileColumnBd(tileX), getTileColumnBd(tileX + 1),
+                                       getTileRowBd(tileY), getTileRowBd(tileY + 1), m_picWidthInCtu);
         }
       }
+      m_sliceMap[0].setSliceID(0);
     }
-    subpicWidthInTiles.clear();
-    subpicHeightInTiles.clear();
-    subpicHeightLessThanOneTileFlag.clear();
   }
   else
   {