diff --git a/source/Lib/CommonLib/TypeDef.h b/source/Lib/CommonLib/TypeDef.h
index 48083d419de71f4a7cbc1730f9c4899c4a1c18b9..724b63aec3f7a97491a2b2a2214f6df80851532a 100644
--- a/source/Lib/CommonLib/TypeDef.h
+++ b/source/Lib/CommonLib/TypeDef.h
@@ -175,6 +175,8 @@
 
 #define JVET_Q0517_RPR_AFFINE_DS                          1 // JVET-Q0517: affine down-sampling filters for RPR
 
+#define JVET_Q0203_MULTI_SLICE_IN_TILE                    1 // JVET-Q0203: Signalling of multiple rectangular slices within a tile
+
 #define JVET_O1143_SUBPIC_BOUNDARY                        1 // treat subpicture boundary as picture boundary
 #if JVET_O1143_SUBPIC_BOUNDARY
 #define JVET_O1143_LPF_ACROSS_SUBPIC_BOUNDARY             1 
diff --git a/source/Lib/DecoderLib/VLCReader.cpp b/source/Lib/DecoderLib/VLCReader.cpp
index adf296755691a7a1b3c353f8fb6e4ccf5ea73245..a745bf77d13dc34b5d577c07c3dec99783989d8e 100644
--- a/source/Lib/DecoderLib/VLCReader.cpp
+++ b/source/Lib/DecoderLib/VLCReader.cpp
@@ -544,6 +544,61 @@ void HLSyntaxReader::parsePPS( PPS* pcPPS )
 #endif
 
         // multiple slices within a single tile special case
+#if JVET_Q0203_MULTI_SLICE_IN_TILE
+        if( pcPPS->getSliceWidthInTiles(i) == 1 && pcPPS->getSliceHeightInTiles(i) == 1 && pcPPS->getTileRowHeight(tileIdx / pcPPS->getNumTileColumns()) > 1 )
+        {
+          READ_UVLC(uiCode, "num_exp_slices_in_tile[i]");
+          uint32_t numExpSliceInTile = uiCode;
+          uint32_t numSliceInTile    = 0;
+          uint32_t remTileRowHeight  = pcPPS->getTileRowHeight(tileIdx / pcPPS->getNumTileColumns());
+          for( int j = 0; j < numExpSliceInTile - 1; j++ )
+          {
+            READ_UVLC(uiCode, "exp_slice_height_in_ctus_minus1[i]");
+            pcPPS->setSliceHeightInCtu(i, uiCode + 1);
+            remTileRowHeight -= (uiCode + 1);
+            i++;
+            pcPPS->setSliceWidthInTiles(i, 1);
+            pcPPS->setSliceHeightInTiles(i, 1);
+            pcPPS->setSliceTileIdx(i, tileIdx);
+            numSliceInTile++;
+          }
+          READ_UVLC(uiCode, "exp_slice_height_in_ctus_minus1[i]");
+          pcPPS->setSliceHeightInCtu(i, uiCode + 1);
+          remTileRowHeight -= (uiCode + 1);
+          i++;
+          pcPPS->setSliceWidthInTiles(i, 1);
+          pcPPS->setSliceHeightInTiles(i, 1);
+          pcPPS->setSliceTileIdx(i, tileIdx);
+          numSliceInTile++;
+          uint32_t uniformSliceHeight = pcPPS->getSliceHeightInCtu(i - 1);
+
+          CHECK(remTileRowHeight < 0, "The height of the last slice in a tile cannot be less than 0");
+          if( remTileRowHeight == 0 )
+          {
+            i--;
+          }
+
+          while( remTileRowHeight > uniformSliceHeight )
+          {
+            pcPPS->setSliceHeightInCtu(i, uniformSliceHeight);
+            remTileRowHeight -= uniformSliceHeight;
+            i++;
+            pcPPS->setSliceWidthInTiles(i, 1);
+            pcPPS->setSliceHeightInTiles(i, 1);
+            pcPPS->setSliceTileIdx(i, tileIdx);
+            numSliceInTile++;
+          }
+          if( remTileRowHeight > 0 )
+          {
+            pcPPS->setSliceHeightInCtu(i, remTileRowHeight);
+            numSliceInTile++;
+          }
+          for( int j = 0; j < numSliceInTile; j++ )
+          {
+            pcPPS->setNumSlicesInTile(i - 1 - j, numSliceInTile);
+          }
+        }
+#else
         if( pcPPS->getSliceWidthInTiles( i ) == 1 && pcPPS->getSliceHeightInTiles( i ) == 1 ) 
         {
           READ_UVLC( uiCode, "num_slices_in_tile_minus1[i]" );        pcPPS->setNumSlicesInTile( i, uiCode + 1 );
@@ -558,6 +613,7 @@ void HLSyntaxReader::parsePPS( PPS* pcPPS )
             pcPPS->setSliceTileIdx      ( i, tileIdx );
           }
         }
+#endif
 
         // tile index offset to start of next slice
         if( i < pcPPS->getNumSlicesInPic()-1 )
diff --git a/source/Lib/EncoderLib/VLCWriter.cpp b/source/Lib/EncoderLib/VLCWriter.cpp
index 3372400581a8f2905f80590fe26e7b88bd54c9d0..72d7dacc6f236915a944fbba3e6e1ed7c3ed7b91 100644
--- a/source/Lib/EncoderLib/VLCWriter.cpp
+++ b/source/Lib/EncoderLib/VLCWriter.cpp
@@ -348,6 +348,28 @@ void HLSWriter::codePPS( const PPS* pcPPS )
 #endif
 
         // multiple slices within a single tile special case
+#if JVET_Q0203_MULTI_SLICE_IN_TILE
+        if( pcPPS->getSliceWidthInTiles(i) == 1 && pcPPS->getSliceHeightInTiles(i) == 1 && pcPPS->getTileRowHeight(pcPPS->getSliceTileIdx(i) / pcPPS->getNumTileColumns()) > 1 )
+        {
+          uint32_t numExpSliceInTile = pcPPS->getNumSlicesInTile(i) - 1;
+          if( pcPPS->getSliceHeightInCtu(i + numExpSliceInTile - 2) >= pcPPS->getSliceHeightInCtu(i + numExpSliceInTile - 1) )
+          {
+            for( int j = numExpSliceInTile - 2; j >= 0; j-- )
+            {
+              if( pcPPS->getSliceHeightInCtu(i + j) == pcPPS->getSliceHeightInCtu(i + j + 1) )
+              {
+                numExpSliceInTile--;
+              }
+            }
+          }
+          WRITE_UVLC(numExpSliceInTile, "num_exp_slices_in_tile[i]");
+          for( int j = 0; j < numExpSliceInTile; j++ )
+          {
+            WRITE_UVLC(pcPPS->getSliceHeightInCtu(i + j) - 1, "exp_slice_height_in_ctus_minus1[i]");
+          }
+          i += (pcPPS->getNumSlicesInTile(i) - 1);
+        }
+#else
         if( pcPPS->getSliceWidthInTiles( i ) == 1 && pcPPS->getSliceHeightInTiles( i ) == 1 ) 
         {
           WRITE_UVLC( pcPPS->getNumSlicesInTile( i ) - 1,  "num_slices_in_tile_minus1[i]" );
@@ -358,6 +380,7 @@ void HLSWriter::codePPS( const PPS* pcPPS )
             i++;
           }
         }
+#endif
 
         // tile index offset to start of next slice
         if( i < pcPPS->getNumSlicesInPic()-1 )