diff --git a/source/App/BitstreamExtractorApp/BitstreamExtractorApp.cpp b/source/App/BitstreamExtractorApp/BitstreamExtractorApp.cpp
index 8515d99c5eab994abe3e11086091f518ec7813fc..8e4bf3ca10f146d62498d7a4c61f7f589b38edc9 100644
--- a/source/App/BitstreamExtractorApp/BitstreamExtractorApp.cpp
+++ b/source/App/BitstreamExtractorApp/BitstreamExtractorApp.cpp
@@ -223,6 +223,8 @@ void BitstreamExtractorApp::xRewritePPS (PPS &targetPPS, const PPS &sourcePPS, S
   std::vector<uint32_t> tileRowHeight;
   std::vector<uint32_t> tileColBd;
   std::vector<uint32_t> tileRowBd;
+  int                   subpicTopLeftTileX = -1;
+  int                   subpicTopLeftTileY = -1;
 
   for (int i=0; i<= sourcePPS.getNumTileColumns(); i++)
   {
@@ -230,6 +232,10 @@ void BitstreamExtractorApp::xRewritePPS (PPS &targetPPS, const PPS &sourcePPS, S
     if ((currentColBd >= subPic.getSubPicCtuTopLeftX()) && (currentColBd <= (subPic.getSubPicCtuTopLeftX() + subPic.getSubPicWidthInCTUs())))
     {
       tileColBd.push_back(currentColBd - subPic.getSubPicCtuTopLeftX());
+      if (subpicTopLeftTileX == -1)
+      {
+        subpicTopLeftTileX = i;
+      }
     }
   }
   numTileCols=(int)tileColBd.size() - 1;
@@ -249,6 +255,10 @@ void BitstreamExtractorApp::xRewritePPS (PPS &targetPPS, const PPS &sourcePPS, S
     if ((currentRowBd >= subPic.getSubPicCtuTopLeftY()) && (currentRowBd <= (subPic.getSubPicCtuTopLeftY() + subPic.getSubPicHeightInCTUs())))
     {
       tileRowBd.push_back(currentRowBd - subPic.getSubPicCtuTopLeftY());
+      if(subpicTopLeftTileY == -1)
+      {
+        subpicTopLeftTileY = i;
+      }
     }
   }
   numTileRows=(int)tileRowBd.size() - 1;
@@ -295,6 +305,11 @@ void BitstreamExtractorApp::xRewritePPS (PPS &targetPPS, const PPS &sourcePPS, S
   {
     int targetNumSlices = subPic.getNumSlicesInSubPic();
     targetPPS.setNumSlicesInPic(targetNumSlices);
+    // To avoid the bitstream writer writing tile_idx_delta in the bitstream
+    if ( (targetPPS.getNumSlicesInPic() - 1) <= 1)
+    {
+      targetPPS.setTileIdxDeltaPresentFlag(0);
+    }
 
     for (int i=0, cnt=0; i<sourcePPS.getNumSlicesInPic(); i++)
     {
@@ -310,23 +325,14 @@ void BitstreamExtractorApp::xRewritePPS (PPS &targetPPS, const PPS &sourcePPS, S
         cnt++;
       }
     }
-    // renumber tiles to close gaps
+    // Find out new slices tile index after removal of some tiles
     for (int i=0; i<targetPPS.getNumSlicesInPic(); i++)
     {
-      int minVal = MAX_INT;
-      int minPos = -1;
-      for (int j=0; j<targetPPS.getNumSlicesInPic(); j++)
-      {
-        if ((targetPPS.getSliceTileIdx(j) < minVal) && (targetPPS.getSliceTileIdx(j) >= i))
-        {
-          minVal = targetPPS.getSliceTileIdx(j);
-          minPos = j;
-        }
-      }
-      if ( minPos != -1)
-      {
-        targetPPS.setSliceTileIdx(minPos, i);
-      }
+      int tileInPicX = targetPPS.getSliceTileIdx(i) % sourcePPS.getNumTileColumns();
+      int tileInPicY = targetPPS.getSliceTileIdx(i) / sourcePPS.getNumTileColumns();
+      int tileInSubpicX = tileInPicX - subpicTopLeftTileX;
+      int tileInSubpicY = tileInPicY - subpicTopLeftTileY;
+      targetPPS.setSliceTileIdx(i, tileInSubpicY * numTileCols + tileInSubpicX);
     }
 
   }