diff --git a/source/Lib/CommonLib/Slice.cpp b/source/Lib/CommonLib/Slice.cpp
index 4db41ba7..635d0883 100644
--- a/source/Lib/CommonLib/Slice.cpp
+++ b/source/Lib/CommonLib/Slice.cpp
@@ -2238,7 +2238,7 @@ PicHeader::PicHeader()
 , m_numAlfAps                                     ( 0 )
 , m_alfApsId                                      ( 0 )
 , m_alfChromaApsId                                ( 0 )
-#if !JVET_R0271_SLICE_LEVEL_DQ_SDH_RRC
+#if !JVET_R0271_SLICE_LEVEL_DQ_SDH_RRC || JVET_S0093_SH_FLAGS_RESIDUAL_CODING
 , m_depQuantEnabledFlag                           ( 0 )
 , m_signDataHidingEnabledFlag                     ( 0 )
 #endif
@@ -2331,7 +2331,7 @@ void PicHeader::initPicHeader()
   m_qpDelta                                       = 0;
   m_numAlfAps                                     = 0;
   m_alfChromaApsId                                = 0;
-#if !JVET_R0271_SLICE_LEVEL_DQ_SDH_RRC
+#if !JVET_R0271_SLICE_LEVEL_DQ_SDH_RRC || JVET_S0093_SH_FLAGS_RESIDUAL_CODING
   m_depQuantEnabledFlag                           = 0;
   m_signDataHidingEnabledFlag                     = 0;
 #endif
@@ -2463,6 +2463,9 @@ SPS::SPS()
 , m_transformSkipEnabledFlag  (false)
 , m_log2MaxTransformSkipBlockSize (2)
 , m_BDPCMEnabledFlag          (false)
+#if JVET_S0093_SH_FLAGS_RESIDUAL_CODING
+, m_ResidualControlPresentInShFlag (false)
+#endif
 , m_JointCbCrEnabledFlag      (false)
 , m_entropyCodingSyncEnabledFlag(false)
 #if JVET_R0165_OPTIONAL_ENTRY_POINT
diff --git a/source/Lib/CommonLib/Slice.h b/source/Lib/CommonLib/Slice.h
index c7f471ae..3eb5091e 100644
--- a/source/Lib/CommonLib/Slice.h
+++ b/source/Lib/CommonLib/Slice.h
@@ -1363,6 +1363,9 @@ private:
   bool              m_transformSkipEnabledFlag;
   int               m_log2MaxTransformSkipBlockSize;
   bool              m_BDPCMEnabledFlag;
+#if JVET_S0093_SH_FLAGS_RESIDUAL_CODING
+  bool              m_ResidualControlPresentInShFlag;
+#endif
   bool              m_JointCbCrEnabledFlag;
   // Parameter
   BitDepths         m_bitDepths;
@@ -1624,6 +1627,10 @@ public:
   void                    setLog2MaxTransformSkipBlockSize(uint32_t u)                                        { m_log2MaxTransformSkipBlockSize = u;                                 }
   bool                    getBDPCMEnabledFlag() const                                                         { return m_BDPCMEnabledFlag;                                           }
   void                    setBDPCMEnabledFlag( bool b )                                                       { m_BDPCMEnabledFlag = b;                                              }
+#if JVET_S0093_SH_FLAGS_RESIDUAL_CODING
+  bool                    getResidualControlPresentInShFlag() const                                           { return m_ResidualControlPresentInShFlag;                             }
+  void                    setResidualControlPresentInShFlag( bool b )                                         { m_ResidualControlPresentInShFlag = b;                                }
+#endif
   void                    setBitsForPOC( uint32_t u )                                                         { m_uiBitsForPOC = u;                                                  }
   uint32_t                    getBitsForPOC() const                                                           { return m_uiBitsForPOC;                                               }
   void                    setPocMsbFlag(bool b)                                                               { m_pocMsbFlag = b;                                                    }
@@ -2363,7 +2370,7 @@ private:
   bool m_ccalfEnabledFlag[MAX_NUM_COMPONENT];
   int  m_ccalfCbApsId;
   int  m_ccalfCrApsId;
-#if !JVET_R0271_SLICE_LEVEL_DQ_SDH_RRC
+#if !JVET_R0271_SLICE_LEVEL_DQ_SDH_RRC || JVET_S0093_SH_FLAGS_RESIDUAL_CODING
   bool                        m_depQuantEnabledFlag;                                    //!< dependent quantization enabled flag
   bool                        m_signDataHidingEnabledFlag;                              //!< sign data hiding enabled flag
 #endif
@@ -2502,7 +2509,7 @@ public:
   int  getCcAlfCbApsId() const { return m_ccalfCbApsId; }
   void setCcAlfCrApsId(int i) { m_ccalfCrApsId = i; }
   int  getCcAlfCrApsId() const { return m_ccalfCrApsId; }
-#if !JVET_R0271_SLICE_LEVEL_DQ_SDH_RRC
+#if !JVET_R0271_SLICE_LEVEL_DQ_SDH_RRC || JVET_S0093_SH_FLAGS_RESIDUAL_CODING
   void                        setDepQuantEnabledFlag( bool b )                          { m_depQuantEnabledFlag = b;                                                                   }
   bool                        getDepQuantEnabledFlag() const                            { return m_depQuantEnabledFlag;                                                                }  
   void                        setSignDataHidingEnabledFlag( bool b )                    { m_signDataHidingEnabledFlag = b;                                                             }
diff --git a/source/Lib/CommonLib/TypeDef.h b/source/Lib/CommonLib/TypeDef.h
index 9715ee90..81fec2c7 100644
--- a/source/Lib/CommonLib/TypeDef.h
+++ b/source/Lib/CommonLib/TypeDef.h
@@ -100,6 +100,8 @@
 
 #define JVET_R0286_GCI_CLEANUP                            1 // JVET-R0286: Sensibility constraints and general constraints on tools
 
+#define JVET_S0093_SH_FLAGS_RESIDUAL_CODING               1 // JVET-S0093: On slice header flags related to residual coding
+
 #define JVET_R0090_VUI                                    1 // JVET-R0090: Fix parsing dependencies in VUI syntax
 
 #define JVET_R0205                                        1 // JVET-R0205: Condition presence of inter_layer_ref_pics_present_flag on sps_video_parameter_set_id 
diff --git a/source/Lib/DecoderLib/VLCReader.cpp b/source/Lib/DecoderLib/VLCReader.cpp
index 4c565914..d1a5467c 100644
--- a/source/Lib/DecoderLib/VLCReader.cpp
+++ b/source/Lib/DecoderLib/VLCReader.cpp
@@ -1841,6 +1841,9 @@ void HLSyntaxReader::parseSPS(SPS* pcSPS)
     READ_UVLC(uiCode, "log2_transform_skip_max_size_minus2");
     pcSPS->setLog2MaxTransformSkipBlockSize(uiCode + 2);
     READ_FLAG(uiCode, "sps_bdpcm_enabled_flag"); pcSPS->setBDPCMEnabledFlag(uiCode ? true : false);
+#if JVET_S0093_SH_FLAGS_RESIDUAL_CODING
+    READ_FLAG(uiCode, "sps_residual_control_present_in_sh_flag"); pcSPS->setResidualControlPresentInShFlag(uiCode ? true : false);
+#endif
   }
 
 #if JVET_R0332_HLS_ORDER
@@ -3536,7 +3539,7 @@ void HLSyntaxReader::parsePictureHeader( PicHeader* picHeader, ParameterSetManag
   }
 
 
-#if !JVET_R0271_SLICE_LEVEL_DQ_SDH_RRC
+#if !JVET_R0271_SLICE_LEVEL_DQ_SDH_RRC || JVET_S0093_SH_FLAGS_RESIDUAL_CODING
   // dependent quantization
   if (sps->getDepQuantEnabledFlag())
   {
@@ -4648,6 +4651,41 @@ void HLSyntaxReader::parseSliceHeader (Slice* pcSlice, PicHeader* picHeader, Par
       pcSlice->setDeblockingFilterCrTcOffsetDiv2  ( 0 );
     }
 
+#if JVET_S0093_SH_FLAGS_RESIDUAL_CODING
+    if (sps->getResidualControlPresentInShFlag())
+    {
+      // dependent quantization
+      if (picHeader->getDepQuantEnabledFlag())
+      {
+        READ_FLAG(uiCode, "sh_dep_quant_enabled_flag");
+        pcSlice->setDepQuantEnabledFlag(uiCode != 0);
+        pcSlice->setSignDataHidingEnabledFlag(false);
+        pcSlice->setTSResidualCodingDisabledFlag(uiCode == 0);
+      }
+      else if (picHeader->getSignDataHidingEnabledFlag())
+      {
+        // sign data hiding
+        READ_FLAG(uiCode, "slice_sign_data_hiding_enabled_flag");
+        pcSlice->setDepQuantEnabledFlag(false);
+        pcSlice->setSignDataHidingEnabledFlag(uiCode != 0);
+        pcSlice->setTSResidualCodingDisabledFlag(uiCode == 0);
+      }
+      else
+      {
+        // signal TS residual coding disabled flag
+        READ_FLAG(uiCode, "slice_ts_residual_coding_disabled_flag");
+        pcSlice->setDepQuantEnabledFlag(false);
+        pcSlice->setSignDataHidingEnabledFlag(false);
+        pcSlice->setTSResidualCodingDisabledFlag(uiCode != 0);
+      }
+    }
+    else
+    {
+      pcSlice->setDepQuantEnabledFlag(picHeader->getDepQuantEnabledFlag());
+      pcSlice->setSignDataHidingEnabledFlag(picHeader->getSignDataHidingEnabledFlag());
+      pcSlice->setTSResidualCodingDisabledFlag(false);
+    }
+#else
 #if JVET_R0271_SLICE_LEVEL_DQ_SDH_RRC
   // dependent quantization
   if( sps->getDepQuantEnabledFlag() )
@@ -4689,6 +4727,7 @@ void HLSyntaxReader::parseSliceHeader (Slice* pcSlice, PicHeader* picHeader, Par
 	READ_FLAG(uiCode, "slice_ts_residual_coding_disabled_flag");
 	pcSlice->setTSResidualCodingDisabledFlag(uiCode != 0);
 #endif
+#endif
 
 #if !JVET_R0200_MOVE_LMCS_AND_SCALING_LIST_SE
   if (picHeader->getLmcsEnabledFlag())
diff --git a/source/Lib/EncoderLib/EncLib.cpp b/source/Lib/EncoderLib/EncLib.cpp
index a1fa2262..ee659966 100644
--- a/source/Lib/EncoderLib/EncLib.cpp
+++ b/source/Lib/EncoderLib/EncLib.cpp
@@ -1286,6 +1286,9 @@ void EncLib::xInitSPS( SPS& sps )
   sps.setTransformSkipEnabledFlag(m_useTransformSkip);
   sps.setLog2MaxTransformSkipBlockSize(m_log2MaxTransformSkipBlockSize);
   sps.setBDPCMEnabledFlag(m_useBDPCM);
+#if JVET_S0093_SH_FLAGS_RESIDUAL_CODING
+  sps.setResidualControlPresentInShFlag(m_TSRCdisableLL);
+#endif
 
   sps.setSPSTemporalMVPEnabledFlag((getTMVPModeId() == 2 || getTMVPModeId() == 1));
 
@@ -1839,7 +1842,7 @@ void EncLib::xInitPicHeader(PicHeader &picHeader, const SPS &sps, const PPS &pps
   picHeader.setMaxBTSizes( sps.getMaxBTSizes() );
   picHeader.setMaxTTSizes( sps.getMaxTTSizes() );
 
-#if !JVET_R0271_SLICE_LEVEL_DQ_SDH_RRC
+#if !JVET_R0271_SLICE_LEVEL_DQ_SDH_RRC || JVET_S0093_SH_FLAGS_RESIDUAL_CODING
   // quantization
   picHeader.setDepQuantEnabledFlag( sps.getDepQuantEnabledFlag() );
   picHeader.setSignDataHidingEnabledFlag( sps.getSignDataHidingEnabledFlag() );
diff --git a/source/Lib/EncoderLib/EncSlice.cpp b/source/Lib/EncoderLib/EncSlice.cpp
index c9601bb4..7b6c54c7 100644
--- a/source/Lib/EncoderLib/EncSlice.cpp
+++ b/source/Lib/EncoderLib/EncSlice.cpp
@@ -1170,7 +1170,6 @@ void EncSlice::setLosslessSlice(Picture* pcPic, bool islossless)
 #else
      slice->setTSResidualCodingDisabledFlag(true);
 #endif 
-
     }
     else
     {
@@ -1178,6 +1177,18 @@ void EncSlice::setLosslessSlice(Picture* pcPic, bool islossless)
         slice->setTSResidualCodingDisabledFlag(false);
     }
   }
+#if JVET_S0093_SH_FLAGS_RESIDUAL_CODING
+  if (slice->getTSResidualCodingDisabledFlag())
+  {
+    slice->setDepQuantEnabledFlag(false);
+    slice->setSignDataHidingEnabledFlag(false);
+  }
+  else
+  {
+    slice->setDepQuantEnabledFlag(slice->getPicHeader()->getDepQuantEnabledFlag());
+    slice->setSignDataHidingEnabledFlag(slice->getPicHeader()->getSignDataHidingEnabledFlag());
+  }
+#endif
 }
 #endif
 
diff --git a/source/Lib/EncoderLib/VLCWriter.cpp b/source/Lib/EncoderLib/VLCWriter.cpp
index 1d312e73..c5cc0675 100644
--- a/source/Lib/EncoderLib/VLCWriter.cpp
+++ b/source/Lib/EncoderLib/VLCWriter.cpp
@@ -1110,6 +1110,9 @@ void HLSWriter::codeSPS( const SPS* pcSPS )
   {
     WRITE_UVLC(pcSPS->getLog2MaxTransformSkipBlockSize() - 2, "log2_transform_skip_max_size_minus2");
     WRITE_FLAG(pcSPS->getBDPCMEnabledFlag() ? 1 : 0, "sps_bdpcm_enabled_flag");
+#if JVET_S0093_SH_FLAGS_RESIDUAL_CODING
+    WRITE_FLAG(pcSPS->getResidualControlPresentInShFlag() ? 1 : 0, "sps_residual_control_present_in_sh_flag");
+#endif
   }
   else
   {
@@ -2235,7 +2238,7 @@ void HLSWriter::codePictureHeader( PicHeader* picHeader, bool writeRbspTrailingB
   }
 
 
-#if !JVET_R0271_SLICE_LEVEL_DQ_SDH_RRC
+#if !JVET_R0271_SLICE_LEVEL_DQ_SDH_RRC || JVET_S0093_SH_FLAGS_RESIDUAL_CODING
   // dependent quantization
   if (sps->getDepQuantEnabledFlag())
   {
@@ -2776,6 +2779,26 @@ void HLSWriter::codeSliceHeader         ( Slice* pcSlice )
       pcSlice->setDeblockingFilterCrTcOffsetDiv2  ( 0 );
     }
 
+#if JVET_S0093_SH_FLAGS_RESIDUAL_CODING
+    if (pcSlice->getSPS()->getResidualControlPresentInShFlag())
+    {
+      if (picHeader->getDepQuantEnabledFlag())
+      {
+        // dependent quantization
+        WRITE_FLAG(pcSlice->getDepQuantEnabledFlag() ? 1 : 0, "slice_dep_quant_enabled_flag");
+      }
+      else if (picHeader->getSignDataHidingEnabledFlag())
+      {
+        // sign data hiding
+        WRITE_FLAG(pcSlice->getSignDataHidingEnabledFlag() ? 1 : 0, "slice_sign_data_hiding_enabled_flag");
+      }
+      else
+      {
+        // signal TS residual coding disabled flag
+        WRITE_FLAG(pcSlice->getTSResidualCodingDisabledFlag() ? 1 : 0, "slice_ts_residual_coding_disabled_flag");
+      }
+    }
+#else
 #if JVET_R0271_SLICE_LEVEL_DQ_SDH_RRC
   // dependent quantization
   if( pcSlice->getSPS()->getDepQuantEnabledFlag() )
@@ -2809,6 +2832,7 @@ void HLSWriter::codeSliceHeader         ( Slice* pcSlice )
 #else
 	WRITE_FLAG(pcSlice->getTSResidualCodingDisabledFlag() ? 1 : 0, "slice_ts_residual_coding_disabled_flag");
 #endif
+#endif
 
 #if !JVET_R0200_MOVE_LMCS_AND_SCALING_LIST_SE
   if (picHeader->getLmcsEnabledFlag())
