diff --git a/source/Lib/CommonLib/DepQuant.cpp b/source/Lib/CommonLib/DepQuant.cpp
index 96bf315ea65f216df939c1829844f3028fcfbff9..7d2903c8ddc10018c4bb52fc622379910b00c83d 100644
--- a/source/Lib/CommonLib/DepQuant.cpp
+++ b/source/Lib/CommonLib/DepQuant.cpp
@@ -1586,7 +1586,11 @@ void DepQuant::quant( TransformUnit &tu, const ComponentID &compID, const CCoeff
     CHECK(scalingListType >= SCALING_LIST_NUM, "Invalid scaling list");
     const uint32_t    log2TrWidth     = floorLog2(width);
     const uint32_t    log2TrHeight    = floorLog2(height);
+#if JVET_Q0346_SCALING_LIST_USED_IN_SH
+    const bool        disableSMForLFNST = tu.cs->slice->getExplicitScalingListUsed() ? tu.cs->picHeader->getScalingListAPS()->getScalingList().getDisableScalingMatrixForLfnstBlks() : false;
+#else
     const bool        disableSMForLFNST = tu.cs->picHeader->getScalingListPresentFlag() ? tu.cs->picHeader->getScalingListAPS()->getScalingList().getDisableScalingMatrixForLfnstBlks() : false;
+#endif
 #if JVET_Q0784_LFNST_COMBINATION
     const bool        isLfnstApplied = tu.cu->lfnstIdx > 0 && (tu.cu->isSepTree() ? true : isLuma(compID));
     const bool        enableScalingLists = getUseScalingList(width, height, (tu.mtsIdx[compID] == MTS_SKIP), isLfnstApplied, disableSMForLFNST);
@@ -1615,7 +1619,11 @@ void DepQuant::dequant( const TransformUnit &tu, CoeffBuf &dstCoeff, const Compo
     CHECK(scalingListType >= SCALING_LIST_NUM, "Invalid scaling list");
     const uint32_t    log2TrWidth  = floorLog2(width);
     const uint32_t    log2TrHeight = floorLog2(height);
+#if JVET_Q0346_SCALING_LIST_USED_IN_SH
+    const bool disableSMForLFNST = tu.cs->slice->getExplicitScalingListUsed() ? tu.cs->picHeader->getScalingListAPS()->getScalingList().getDisableScalingMatrixForLfnstBlks() : false;
+#else
     const bool disableSMForLFNST = tu.cs->picHeader->getScalingListPresentFlag() ? tu.cs->picHeader->getScalingListAPS()->getScalingList().getDisableScalingMatrixForLfnstBlks() : false;
+#endif
 #if JVET_Q0784_LFNST_COMBINATION
     const bool isLfnstApplied = tu.cu->lfnstIdx > 0 && (tu.cu->isSepTree() ? true : isLuma(compID));
     const bool enableScalingLists = getUseScalingList(width, height, (tu.mtsIdx[compID] == MTS_SKIP), isLfnstApplied, disableSMForLFNST);
diff --git a/source/Lib/CommonLib/Quant.cpp b/source/Lib/CommonLib/Quant.cpp
index de7b73323a85638b4d4f4fcc27a4d4199a06b26e..87fa5aa7c0524a99e863fdb29d878a3f77924668 100644
--- a/source/Lib/CommonLib/Quant.cpp
+++ b/source/Lib/CommonLib/Quant.cpp
@@ -381,8 +381,11 @@ void Quant::dequant(const TransformUnit &tu,
   const TCoeff          transformMinimum   = -(1 << maxLog2TrDynamicRange);
   const TCoeff          transformMaximum   =  (1 << maxLog2TrDynamicRange) - 1;
   const bool            isTransformSkip = (tu.mtsIdx[compID] == MTS_SKIP);
-
+#if JVET_Q0346_SCALING_LIST_USED_IN_SH
+  const bool            disableSMForLFNST = tu.cs->slice->getExplicitScalingListUsed() ? tu.cs->picHeader->getScalingListAPS()->getScalingList().getDisableScalingMatrixForLfnstBlks() : false;
+#else
   const bool            disableSMForLFNST = tu.cs->picHeader->getScalingListPresentFlag() ? tu.cs->picHeader->getScalingListAPS()->getScalingList().getDisableScalingMatrixForLfnstBlks() : false;
+#endif
 #if JVET_Q0784_LFNST_COMBINATION
   const bool            isLfnstApplied = tu.cu->lfnstIdx > 0 && (tu.cu->isSepTree() ? true : isLuma(compID));
   const bool            enableScalingLists = getUseScalingList(uiWidth, uiHeight, isTransformSkip, isLfnstApplied, disableSMForLFNST);
@@ -999,8 +1002,11 @@ void Quant::quant(TransformUnit &tu, const ComponentID &compID, const CCoeffBuf
     const uint32_t uiLog2TrWidth = floorLog2(uiWidth);
     const uint32_t uiLog2TrHeight = floorLog2(uiHeight);
     int *piQuantCoeff = getQuantCoeff(scalingListType, cQP.rem(useTransformSkip), uiLog2TrWidth, uiLog2TrHeight);
-
+#if JVET_Q0346_SCALING_LIST_USED_IN_SH
+    const bool disableSMForLFNST = tu.cs->slice->getExplicitScalingListUsed() ? tu.cs->picHeader->getScalingListAPS()->getScalingList().getDisableScalingMatrixForLfnstBlks() : false;
+#else
     const bool disableSMForLFNST = tu.cs->picHeader->getScalingListPresentFlag() ? tu.cs->picHeader->getScalingListAPS()->getScalingList().getDisableScalingMatrixForLfnstBlks() : false;
+#endif
 #if JVET_Q0784_LFNST_COMBINATION
     const bool isLfnstApplied = tu.cu->lfnstIdx > 0 && (tu.cu->isSepTree() ? true : isLuma(compID));
     const bool enableScalingLists = getUseScalingList(uiWidth, uiHeight, useTransformSkip, isLfnstApplied, disableSMForLFNST);
@@ -1079,7 +1085,11 @@ bool Quant::xNeedRDOQ(TransformUnit &tu, const ComponentID &compID, const CCoeff
   const uint32_t uiLog2TrHeight = floorLog2(uiHeight);
   int *piQuantCoeff         = getQuantCoeff(scalingListType, cQP.rem(useTransformSkip), uiLog2TrWidth, uiLog2TrHeight);
 
+#if JVET_Q0346_SCALING_LIST_USED_IN_SH
+  const bool disableSMForLFNST = tu.cs->slice->getExplicitScalingListUsed() ? tu.cs->picHeader->getScalingListAPS()->getScalingList().getDisableScalingMatrixForLfnstBlks() : false;
+#else
   const bool disableSMForLFNST = tu.cs->picHeader->getScalingListPresentFlag() ? tu.cs->picHeader->getScalingListAPS()->getScalingList().getDisableScalingMatrixForLfnstBlks() : false;
+#endif
 #if JVET_Q0784_LFNST_COMBINATION
   const bool isLfnstApplied = tu.cu->lfnstIdx > 0 && (tu.cu->isSepTree() ? true : isLuma(compID));
   const bool enableScalingLists = getUseScalingList(uiWidth, uiHeight, (useTransformSkip != 0), isLfnstApplied, disableSMForLFNST);
@@ -1134,7 +1144,11 @@ void Quant::transformSkipQuantOneSample(TransformUnit &tu, const ComponentID &co
   const int            channelBitDepth                = sps.getBitDepth(toChannelType(compID));
   const int            iTransformShift                = getTransformShift(channelBitDepth, rect.size(), maxLog2TrDynamicRange);
   const int            scalingListType                = getScalingListType(tu.cu->predMode, compID);
+#if JVET_Q0346_SCALING_LIST_USED_IN_SH
+  const bool           disableSMForLFNST = tu.cs->slice->getExplicitScalingListUsed() ? tu.cs->picHeader->getScalingListAPS()->getScalingList().getDisableScalingMatrixForLfnstBlks() : false;
+#else
   const bool           disableSMForLFNST = tu.cs->picHeader->getScalingListPresentFlag() ? tu.cs->picHeader->getScalingListAPS()->getScalingList().getDisableScalingMatrixForLfnstBlks() : false;
+#endif
 #if JVET_Q0784_LFNST_COMBINATION
   const bool           isLfnstApplied = tu.cu->lfnstIdx > 0 && (tu.cu->isSepTree() ? true : isLuma(compID));
   const bool           enableScalingLists = getUseScalingList(uiWidth, uiHeight, true, isLfnstApplied, disableSMForLFNST);
@@ -1198,7 +1212,11 @@ void Quant::invTrSkipDeQuantOneSample(TransformUnit &tu, const ComponentID &comp
   const int            channelBitDepth        = sps.getBitDepth(toChannelType(compID));
   const int            iTransformShift        = getTransformShift(channelBitDepth, rect.size(), maxLog2TrDynamicRange);
   const int            scalingListType        = getScalingListType(tu.cu->predMode, compID);
+#if JVET_Q0346_SCALING_LIST_USED_IN_SH
+  const bool           disableSMForLFNST = tu.cs->slice->getExplicitScalingListUsed() ? tu.cs->picHeader->getScalingListAPS()->getScalingList().getDisableScalingMatrixForLfnstBlks() : false;
+#else
   const bool           disableSMForLFNST = tu.cs->picHeader->getScalingListPresentFlag() ? tu.cs->picHeader->getScalingListAPS()->getScalingList().getDisableScalingMatrixForLfnstBlks() : false;
+#endif
 #if JVET_Q0784_LFNST_COMBINATION
   const bool           isLfnstApplied = tu.cu->lfnstIdx > 0 && (tu.cu->isSepTree() ? true : isLuma(compID));
   const bool           enableScalingLists = getUseScalingList(uiWidth, uiHeight, true, isLfnstApplied, disableSMForLFNST);
diff --git a/source/Lib/CommonLib/QuantRDOQ.cpp b/source/Lib/CommonLib/QuantRDOQ.cpp
index a258d7665c4bdd540568094d750326530d65aa75..a811c59b29f0ee05db5adef222ffabcdbed06a9d 100644
--- a/source/Lib/CommonLib/QuantRDOQ.cpp
+++ b/source/Lib/CommonLib/QuantRDOQ.cpp
@@ -629,7 +629,11 @@ void QuantRDOQ::xRateDistOptQuant(TransformUnit &tu, const ComponentID &compID,
   const bool   isTransformSkip = (tu.mtsIdx[compID] == MTS_SKIP);
   const double *const pdErrScale = xGetErrScaleCoeffSL(scalingListType, uiLog2BlockWidth, uiLog2BlockHeight, cQP.rem(isTransformSkip));
   const int    *const piQCoef    = getQuantCoeff(scalingListType, cQP.rem(isTransformSkip), uiLog2BlockWidth, uiLog2BlockHeight);
+#if JVET_Q0346_SCALING_LIST_USED_IN_SH
+  const bool   disableSMForLFNST = tu.cs->slice->getExplicitScalingListUsed() ? tu.cs->picHeader->getScalingListAPS()->getScalingList().getDisableScalingMatrixForLfnstBlks() : false;
+#else
   const bool   disableSMForLFNST = tu.cs->picHeader->getScalingListPresentFlag() ? tu.cs->picHeader->getScalingListAPS()->getScalingList().getDisableScalingMatrixForLfnstBlks() : false;
+#endif
 #if JVET_Q0784_LFNST_COMBINATION
   const bool   isLfnstApplied = tu.cu->lfnstIdx > 0 && (tu.cu->isSepTree() ? true : isLuma(compID));
   const bool   enableScalingLists = getUseScalingList(uiWidth, uiHeight, isTransformSkip, isLfnstApplied, disableSMForLFNST);
diff --git a/source/Lib/CommonLib/Slice.cpp b/source/Lib/CommonLib/Slice.cpp
index 9bcec39dc8a690887525c26f98664c571a42a21e..c1e6b92cad2b60f6a982cbfdbcda967ffea1e822 100644
--- a/source/Lib/CommonLib/Slice.cpp
+++ b/source/Lib/CommonLib/Slice.cpp
@@ -66,6 +66,9 @@ Slice::Slice()
 #if JVET_Q0346_LMCS_ENABLE_IN_SH
 , m_lmcsEnabledFlag               ( 0 )
 #endif
+#if JVET_Q0346_SCALING_LIST_USED_IN_SH
+, m_explicitScalingListUsed       ( 0 )
+#endif
 , m_deblockingFilterDisable       ( false )
 , m_deblockingFilterOverrideFlag  ( false )
 , m_deblockingFilterBetaOffsetDiv2( 0 )
@@ -179,6 +182,9 @@ void Slice::initSlice()
   m_colRefIdx = 0;
 #if JVET_Q0346_LMCS_ENABLE_IN_SH
   m_lmcsEnabledFlag = 0;
+#endif
+#if JVET_Q0346_SCALING_LIST_USED_IN_SH
+  m_explicitScalingListUsed = 0;
 #endif
   initEqualRef();
 
@@ -1047,6 +1053,10 @@ void Slice::copySliceInfo(Slice *pSrc, bool cpyAlmostAll)
 #if JVET_Q0346_LMCS_ENABLE_IN_SH
   m_lmcsEnabledFlag               = pSrc->m_lmcsEnabledFlag;
 #endif
+#if JVET_Q0346_SCALING_LIST_USED_IN_SH
+  m_explicitScalingListUsed       = pSrc->m_explicitScalingListUsed;
+#endif
+
   m_pendingRasInit                = pSrc->m_pendingRasInit;
 
   for ( uint32_t e=0 ; e<NUM_REF_PIC_LIST_01 ; e++ )
@@ -2304,7 +2314,11 @@ PicHeader::PicHeader()
 , m_lmcsApsId                                     ( -1 )
 , m_lmcsAps                                       ( nullptr )
 , m_lmcsChromaResidualScaleFlag                   ( 0 )
+#if JVET_Q0346_SCALING_LIST_USED_IN_SH
+, m_explicitScalingListEnabledFlag                ( 0 )
+#else
 , m_scalingListPresentFlag                        ( 0 )
+#endif
 , m_scalingListApsId                              ( -1 )
 , m_scalingListAps                                ( nullptr )
 #if JVET_Q0819_PH_CHANGES 
@@ -2437,7 +2451,11 @@ void PicHeader::initPicHeader()
   m_lmcsApsId                                     = -1;
   m_lmcsAps                                       = nullptr;
   m_lmcsChromaResidualScaleFlag                   = 0;
+#if JVET_Q0346_SCALING_LIST_USED_IN_SH
+  m_explicitScalingListEnabledFlag                = 0;
+#else
   m_scalingListPresentFlag                        = 0;
+#endif
   m_scalingListApsId                              = -1;
   m_scalingListAps                                = nullptr;
 #if JVET_Q0819_PH_CHANGES 
diff --git a/source/Lib/CommonLib/Slice.h b/source/Lib/CommonLib/Slice.h
index 57bcfb5dda2d4852d07db8ad2f3f5cfc2646a39c..f9aebb6599c0f75d51275c9c745be64adde7a9a4 100644
--- a/source/Lib/CommonLib/Slice.h
+++ b/source/Lib/CommonLib/Slice.h
@@ -2548,7 +2548,11 @@ private:
   int                         m_lmcsApsId;                                              //!< lmcs APS ID
   APS*                        m_lmcsAps;                                                //!< lmcs APS
   bool                        m_lmcsChromaResidualScaleFlag;                            //!< lmcs chroma residual scale flag  
+#if JVET_Q0346_SCALING_LIST_USED_IN_SH
+  bool                        m_explicitScalingListEnabledFlag;                         //!< explicit quantization scaling list enabled
+#else
   bool                        m_scalingListPresentFlag;                                 //!< quantization scaling lists present
+#endif
   int                         m_scalingListApsId;                                       //!< quantization scaling list APS ID
   APS*                        m_scalingListAps;                                         //!< quantization scaling list APS
   unsigned                    m_minQT[3];                                               //!< minimum quad-tree size  0: I slice luma; 1: P/B slice; 2: I slice chroma
@@ -2770,10 +2774,16 @@ public:
   APS*                        getScalingListAPS() const                                 { return m_scalingListAps;                                                                     }
   void                        setScalingListAPSId( int id )                             { m_scalingListApsId = id;                                                                     }
   int                         getScalingListAPSId() const                               { return m_scalingListApsId;                                                                   }
+#if JVET_Q0346_SCALING_LIST_USED_IN_SH
+  void                        setExplicitScalingListEnabledFlag( bool b )               { m_explicitScalingListEnabledFlag = b;                                                        }
+  bool                        getExplicitScalingListEnabledFlag()                       { return m_explicitScalingListEnabledFlag;                                                     }
+  const bool                  getExplicitScalingListEnabledFlag() const                 { return m_explicitScalingListEnabledFlag;                                                     }
+#else
   void                        setScalingListPresentFlag( bool b )                       { m_scalingListPresentFlag = b;                                                                }
   bool                        getScalingListPresentFlag()                               { return m_scalingListPresentFlag;                                                             }
   const bool                  getScalingListPresentFlag() const                         { return m_scalingListPresentFlag;                                                             }
-  
+#endif
+
   unsigned*                   getMinQTSizes() const                                     { return (unsigned *)m_minQT;                                                                  }
   unsigned*                   getMaxMTTHierarchyDepths() const                          { return (unsigned *)m_maxMTTHierarchyDepth;                                                   }
   unsigned*                   getMaxBTSizes() const                                     { return (unsigned *)m_maxBTSize;                                                              }
@@ -2867,6 +2877,9 @@ private:
   bool                       m_ChromaQpAdjEnabled;
 #if JVET_Q0346_LMCS_ENABLE_IN_SH
   bool                       m_lmcsEnabledFlag;
+#endif
+#if JVET_Q0346_SCALING_LIST_USED_IN_SH
+  bool                       m_explicitScalingListUsed;
 #endif
   bool                       m_deblockingFilterDisable;
   bool                       m_deblockingFilterOverrideFlag;      //< offsets for deblocking filter inherit from PPS
@@ -3037,6 +3050,11 @@ public:
   const bool                  getLmcsEnabledFlag() const                              { return m_lmcsEnabledFlag;                                    }
 #endif
 
+#if JVET_Q0346_SCALING_LIST_USED_IN_SH
+  void                        setExplicitScalingListUsed(bool b)                      { m_explicitScalingListUsed = b;                               }
+  bool                        getExplicitScalingListUsed()                            { return m_explicitScalingListUsed;                            }
+#endif
+
   int                         getNumRefIdx( RefPicList e ) const                     { return m_aiNumRefIdx[e];                                      }
   Picture*                    getPic()                                               { return m_pcPic;                                               }
   const Picture*              getPic() const                                         { return m_pcPic;                                               }
diff --git a/source/Lib/CommonLib/TypeDef.h b/source/Lib/CommonLib/TypeDef.h
index 24122063e80be1b7d591a10cd543eff38c1c9ac6..bb84d197851dcaf05f2df02898fd39501e175295 100644
--- a/source/Lib/CommonLib/TypeDef.h
+++ b/source/Lib/CommonLib/TypeDef.h
@@ -211,6 +211,10 @@
 
 #define JVET_Q0346_LMCS_ENABLE_IN_SH                      1 // JVET-Q0346 aspect 1: LMCS enabled flag in SH
 
+#if JVET_Q0819_PH_CHANGES
+#define JVET_Q0346_SCALING_LIST_USED_IN_SH               1 // JVET-Q0346 aspect 2: Scaling list used flag in SH
+#endif
+
 #define JVET_Q0267_RESET_CHROMA_QP_OFFSET                 1 // JVET-Q0267: Reset chroma QP offsets at the start of each chroma QP offset group
 
 #define JVET_Q0293_REMOVAL_PDPC_CHROMA_NX2                1 // JVET-Q0293: Removal of chroma Nx2 blocks in PDPC 
diff --git a/source/Lib/DecoderLib/DecLib.cpp b/source/Lib/DecoderLib/DecLib.cpp
index bcc6ada10fc8faf30fee5c6f279b2be8bd601b6f..7435af695d14a0e8f607c5aada14e7984ce0f1f8 100644
--- a/source/Lib/DecoderLib/DecLib.cpp
+++ b/source/Lib/DecoderLib/DecLib.cpp
@@ -480,9 +480,10 @@ DecLib::DecLib()
   , m_debugPOC( -1 )
   , m_debugCTU( -1 )
   , m_vps( nullptr )
+#if !JVET_Q0346_SCALING_LIST_USED_IN_SH
   , m_scalingListUpdateFlag(true)
   , m_PreScalingListAPSId(-1)
-
+#endif
 #if JVET_Q0044_SLICE_IDX_WITH_SUBPICS
   , m_maxDecSubPicIdx(0)
   , m_maxDecSliceAddrInSubPic(-1)
@@ -1174,7 +1175,11 @@ void activateAPS(PicHeader* picHeader, Slice* pSlice, ParameterSetManager& param
   }
   picHeader->setLmcsAPS(lmcsAPS);
 
+#if JVET_Q0346_SCALING_LIST_USED_IN_SH
+  if( picHeader->getExplicitScalingListEnabledFlag() && scalingListAPS == nullptr)
+#else
   if( picHeader->getScalingListPresentFlag() && scalingListAPS == nullptr)
+#endif
   {
     scalingListAPS = parameterSetManager.getAPS( picHeader->getScalingListAPSId(), SCALING_LIST_APS );
     CHECK( scalingListAPS == nullptr, "No SCALING LIST APS present" );
@@ -2278,6 +2283,15 @@ bool DecLib::xDecodeSlice(InputNALUnit &nalu, int &iSkipFrame, int iPOCLastDispl
 
   Quant *quant = m_cTrQuant.getQuant();
 
+#if JVET_Q0346_SCALING_LIST_USED_IN_SH
+  if (pcSlice->getExplicitScalingListUsed())
+  {
+    APS* scalingListAPS = pcSlice->getPicHeader()->getScalingListAPS();
+    ScalingList scalingList = scalingListAPS->getScalingList();
+    quant->setScalingListDec(scalingList);
+    quant->setUseScalingList(true);
+  }
+#else
   if( pcSlice->getSPS()->getScalingListFlag() )
   {
     ScalingList scalingList;
@@ -2299,12 +2313,12 @@ bool DecLib::xDecodeSlice(InputNALUnit &nalu, int &iSkipFrame, int iPOCLastDispl
     }
     quant->setUseScalingList( true );
   }
+#endif
   else
   {
     quant->setUseScalingList( false );
   }
 
-
   if (pcSlice->getSPS()->getUseLmcs())
   {
     if (m_bFirstSliceInPicture)
@@ -2480,10 +2494,12 @@ void DecLib::xDecodeAPS(InputNALUnit& nalu)
   aps->setTemporalId(nalu.m_temporalId);
   aps->setLayerId( nalu.m_nuhLayerId );
   m_parameterSetManager.checkAuApsContent( aps, m_accessUnitApsNals );
+#if !JVET_Q0346_SCALING_LIST_USED_IN_SH
   if (aps->getAPSType() == SCALING_LIST_APS)
   {
     setScalingListUpdateFlag(true);
   }
+#endif
 
   // aps will be deleted if it was already stored (and did not changed),
   // thus, storing it must be last action.
diff --git a/source/Lib/DecoderLib/DecLib.h b/source/Lib/DecoderLib/DecLib.h
index f2cbeb66440b1b1bc6e2b47ca0a5607030544cf1..c9cc7f40e0785f8ba306a1f54afb18be81718b56 100644
--- a/source/Lib/DecoderLib/DecLib.h
+++ b/source/Lib/DecoderLib/DecLib.h
@@ -169,8 +169,10 @@ private:
   std::vector<std::tuple<NalUnitType, int, SEI::PayloadType>> m_accessUnitSeiPayLoadTypes;
 #endif
   VPS*                    m_vps;
+#if !JVET_Q0346_SCALING_LIST_USED_IN_SH
   bool                    m_scalingListUpdateFlag;
   int                     m_PreScalingListAPSId;
+#endif
 #if JVET_Q0044_SLICE_IDX_WITH_SUBPICS
   int                     m_maxDecSubPicIdx;
   int                     m_maxDecSliceAddrInSubPic;
@@ -257,10 +259,12 @@ public:
   {
     m_cTrQuantScalingList.init(nullptr, MAX_TB_SIZEY, false, false, false, false);
   }
+#if !JVET_Q0346_SCALING_LIST_USED_IN_SH
   bool  getScalingListUpdateFlag() { return m_scalingListUpdateFlag; }
   void  setScalingListUpdateFlag(bool b) { m_scalingListUpdateFlag = b; }
   int   getPreScalingListAPSId() { return m_PreScalingListAPSId; }
   void  setPreScalingListAPSId(int id) { m_PreScalingListAPSId = id; }
+#endif
 
 protected:
   void  xUpdateRasInit(Slice* slice);
diff --git a/source/Lib/DecoderLib/VLCReader.cpp b/source/Lib/DecoderLib/VLCReader.cpp
index 73c418c2eb62f74de6691b8eb5a144fc7625d8c6..72e756250eb1793e929e153be4b0f61d30b972a5 100644
--- a/source/Lib/DecoderLib/VLCReader.cpp
+++ b/source/Lib/DecoderLib/VLCReader.cpp
@@ -2212,7 +2212,11 @@ void HLSyntaxReader::parseSPS(SPS* pcSPS)
   pcSPS->setLog2ParallelMergeLevelMinus2(uiCode);
 #endif
 
+#if JVET_Q0346_SCALING_LIST_USED_IN_SH
+  READ_FLAG(uiCode, "sps_explicit_scaling_list_enabled_flag");                 pcSPS->setScalingListFlag(uiCode);
+#else
   READ_FLAG( uiCode, "sps_scaling_list_enabled_flag" );                 pcSPS->setScalingListFlag ( uiCode );
+#endif
 
 #if JVET_Q0246_VIRTUAL_BOUNDARY_ENABLE_FLAG 
   READ_FLAG( uiCode, "sps_virtual_boundaries_enabled_flag" ); pcSPS->setVirtualBoundariesEnabledFlag( uiCode != 0 );
@@ -2870,9 +2874,15 @@ void HLSyntaxReader::parsePictureHeader( PicHeader* picHeader, ParameterSetManag
   // quantization scaling lists
   if (sps->getScalingListFlag())
   {
+#if JVET_Q0346_SCALING_LIST_USED_IN_SH
+    READ_FLAG(uiCode, "ph_explicit_scaling_list_enabled_flag");
+    picHeader->setExplicitScalingListEnabledFlag(uiCode);
+    if (picHeader->getExplicitScalingListEnabledFlag())
+#else
     READ_FLAG(uiCode, "ph_scaling_list_present_flag");
     picHeader->setScalingListPresentFlag(uiCode);
     if (picHeader->getScalingListPresentFlag())
+#endif
     {
       READ_CODE(3, uiCode, "ph_scaling_list_aps_id");
       picHeader->setScalingListAPSId(uiCode);
@@ -2880,7 +2890,11 @@ void HLSyntaxReader::parsePictureHeader( PicHeader* picHeader, ParameterSetManag
   }
   else
   {
+#if JVET_Q0346_SCALING_LIST_USED_IN_SH
+    picHeader->setExplicitScalingListEnabledFlag(false);
+#else
     picHeader->setScalingListPresentFlag(false);
+#endif
   }
 #endif
   
@@ -4927,7 +4941,17 @@ void HLSyntaxReader::parseSliceHeader (Slice* pcSlice, PicHeader* picHeader, Par
     pcSlice->setLmcsEnabledFlag(false);
   }
 #endif
-
+#if JVET_Q0346_SCALING_LIST_USED_IN_SH
+  if (picHeader->getExplicitScalingListEnabledFlag())
+  {
+    READ_FLAG(uiCode, "slice_explicit_scaling_list_used_flag");
+    pcSlice->setExplicitScalingListUsed(uiCode);
+  }
+  else
+  {
+    pcSlice->setExplicitScalingListUsed(false);
+  }
+#endif
   if( pcSlice->getFirstCtuRsAddrInSlice() == 0 )
   {
     pcSlice->setDefaultClpRng( *sps );
diff --git a/source/Lib/EncoderLib/EncGOP.cpp b/source/Lib/EncoderLib/EncGOP.cpp
index 777172787f3f829dcd60d88df381713a1d42598c..fc22c67b1a21a07ba4b83c64ba6c20f1131c32eb 100644
--- a/source/Lib/EncoderLib/EncGOP.cpp
+++ b/source/Lib/EncoderLib/EncGOP.cpp
@@ -2780,7 +2780,12 @@ void EncGOP::compressGOP( int iPOCLast, int iNumPicRcvd, PicList& rcListPic,
 
     if( pcSlice->getSPS()->getScalingListFlag() && m_pcCfg->getUseScalingListId() == SCALING_LIST_FILE_READ )
     {
+#if JVET_Q0346_SCALING_LIST_USED_IN_SH
+      picHeader->setExplicitScalingListEnabledFlag( true );
+      pcSlice->setExplicitScalingListUsed( true );
+#else
       picHeader->setScalingListPresentFlag( true );
+#endif
 
       int apsId = std::min<int>( 7, m_pcEncLib->getVPS() == nullptr ? 0 : m_pcEncLib->getVPS()->getGeneralLayerIdx( m_pcEncLib->getLayerId() ) );
       picHeader->setScalingListAPSId( apsId );
@@ -2894,7 +2899,12 @@ void EncGOP::compressGOP( int iPOCLast, int iNumPicRcvd, PicList& rcListPic,
 
       if( pcSlice->getSPS()->getScalingListFlag() && m_pcCfg->getUseScalingListId() == SCALING_LIST_FILE_READ )
       {
+#if JVET_Q0346_SCALING_LIST_USED_IN_SH
+        picHeader->setExplicitScalingListEnabledFlag(true);
+        pcSlice->setExplicitScalingListUsed(true);
+#else
         picHeader->setScalingListPresentFlag(true);
+#endif
         int apsId = 0;
         picHeader->setScalingListAPSId( apsId );
       }
diff --git a/source/Lib/EncoderLib/VLCWriter.cpp b/source/Lib/EncoderLib/VLCWriter.cpp
index 0d71dc38bf02baf42c8859c39dd340411db97b13..75ca2b7935470df740d884cea1e96ecba4582d53 100644
--- a/source/Lib/EncoderLib/VLCWriter.cpp
+++ b/source/Lib/EncoderLib/VLCWriter.cpp
@@ -1964,15 +1964,24 @@ void HLSWriter::codePictureHeader( PicHeader* picHeader )
   // quantization scaling lists
   if( sps->getScalingListFlag() )
   {
+#if JVET_Q0346_SCALING_LIST_USED_IN_SH
+    WRITE_FLAG( picHeader->getExplicitScalingListEnabledFlag(), "ph_scaling_list_present_flag" );
+    if( picHeader->getExplicitScalingListEnabledFlag() )
+#else
     WRITE_FLAG( picHeader->getScalingListPresentFlag(), "ph_scaling_list_present_flag" );
     if( picHeader->getScalingListPresentFlag() )
+#endif
     {
       WRITE_CODE( picHeader->getScalingListAPSId(), 3, "ph_scaling_list_aps_id" );
     }
   }
   else
   {
+#if JVET_Q0346_SCALING_LIST_USED_IN_SH
+    picHeader->setExplicitScalingListEnabledFlag( false );
+#else
     picHeader->setScalingListPresentFlag( false );
+#endif
   }
 
 #endif
@@ -3291,6 +3300,13 @@ void HLSWriter::codeSliceHeader         ( Slice* pcSlice )
   }
 #endif
 
+#if JVET_Q0346_SCALING_LIST_USED_IN_SH
+  if (picHeader->getExplicitScalingListEnabledFlag())
+  {
+    WRITE_FLAG(pcSlice->getExplicitScalingListUsed(), "slice_explicit_scaling_list_used_flag");
+  }
+#endif
+
   if(pcSlice->getPPS()->getSliceHeaderExtensionPresentFlag())
   {
     WRITE_UVLC(0,"slice_segment_header_extension_length");