diff --git a/source/Lib/EncoderLib/EncGOP.cpp b/source/Lib/EncoderLib/EncGOP.cpp
index 6cd6ef39995b97287319b63d2fcb26e26d8d88ab..786e0020c44904fc1dfe906bc4c33104a4d81d13 100644
--- a/source/Lib/EncoderLib/EncGOP.cpp
+++ b/source/Lib/EncoderLib/EncGOP.cpp
@@ -1922,6 +1922,7 @@ void EncGOP::xPicInitLMCS(Picture *pic, PicHeader *picHeader, Slice *slice)
 
       m_pcReshaper->setCTUFlag(false);
 
+#if !JVET_Q0346_LMCS_ENABLE_IN_SH
       //reshape original signal
       if (m_pcReshaper->getSliceReshaperInfo().getUseSliceReshaper())
       {
@@ -1929,6 +1930,7 @@ void EncGOP::xPicInitLMCS(Picture *pic, PicHeader *picHeader, Slice *slice)
         m_pcReshaper->setSrcReshaped(true);
         m_pcReshaper->setRecReshaped(true);
       }
+#endif
     }
     else
     {
@@ -2864,6 +2866,28 @@ void EncGOP::compressGOP( int iPOCLast, int iNumPicRcvd, PicList& rcListPic,
 
           pcSlice->setSliceSubPicId( pcPic->cs->pps->getSubPic( subPicIdx ).getSubPicID() );
         }
+#endif
+#if JVET_Q0346_LMCS_ENABLE_IN_SH
+        if (pcPic->cs->sps->getUseLmcs())
+        {
+          pcSlice->setLmcsEnabledFlag(picHeader->getLmcsEnabledFlag());
+          if (pcSlice->getSliceType() == I_SLICE)
+          {
+            //reshape original signal
+            if (pcSlice->getLmcsEnabledFlag())
+            {
+              pcPic->getOrigBuf(COMPONENT_Y).rspSignal(m_pcReshaper->getFwdLUT());
+              m_pcReshaper->setSrcReshaped(true);
+              m_pcReshaper->setRecReshaped(true);
+            }
+            else
+            {
+              pcPic->getOrigBuf().copyFrom(pcPic->getTrueOrigBuf());
+              m_pcReshaper->setSrcReshaped(false);
+              m_pcReshaper->setRecReshaped(false);
+            }
+          }
+        }
 #endif
         m_pcSliceEncoder->precompressSlice( pcPic );
         m_pcSliceEncoder->compressSlice   ( pcPic, false, false );
@@ -2889,6 +2913,32 @@ void EncGOP::compressGOP( int iPOCLast, int iNumPicRcvd, PicList& rcListPic,
       CodingStructure& cs = *pcPic->cs;
       pcSlice = pcPic->slices[0];
 
+#if JVET_Q0346_LMCS_ENABLE_IN_SH
+      if (cs.sps->getUseLmcs() && m_pcReshaper->getSliceReshaperInfo().getUseSliceReshaper())
+      {
+        picHeader->setLmcsEnabledFlag(true);
+        int apsId = std::min<int>(3, m_pcEncLib->getVPS() == nullptr ? 0 : m_pcEncLib->getVPS()->getGeneralLayerIdx(m_pcEncLib->getLayerId()));
+        picHeader->setLmcsAPSId(apsId);
+
+        const PreCalcValues& pcv = *cs.pcv;
+        for (uint32_t yPos = 0; yPos < pcv.lumaHeight; yPos += pcv.maxCUHeight)
+        {
+          for (uint32_t xPos = 0; xPos < pcv.lumaWidth; xPos += pcv.maxCUWidth)
+          {
+            const CodingUnit* cu = cs.getCU(Position(xPos, yPos), CHANNEL_TYPE_LUMA);
+            if (cu->slice->getLmcsEnabledFlag())
+            {
+              const uint32_t width = (xPos + pcv.maxCUWidth > pcv.lumaWidth) ? (pcv.lumaWidth - xPos) : pcv.maxCUWidth;
+              const uint32_t height = (yPos + pcv.maxCUHeight > pcv.lumaHeight) ? (pcv.lumaHeight - yPos) : pcv.maxCUHeight;
+              const UnitArea area(cs.area.chromaFormat, Area(xPos, yPos, width, height));
+              cs.getRecoBuf(area).get(COMPONENT_Y).rspSignal(m_pcReshaper->getInvLUT());
+            }
+          }
+        }
+        m_pcReshaper->setRecReshaped(false);
+        pcPic->getOrigBuf().copyFrom(pcPic->getTrueOrigBuf());
+      }
+#else
       if (pcSlice->getSPS()->getUseLmcs() && m_pcReshaper->getSliceReshaperInfo().getUseSliceReshaper())
       {
         picHeader->setLmcsEnabledFlag(true);
@@ -2904,6 +2954,7 @@ void EncGOP::compressGOP( int iPOCLast, int iNumPicRcvd, PicList& rcListPic,
 
           pcPic->getOrigBuf().copyFrom(pcPic->getTrueOrigBuf());
       }
+#endif
 
       // create SAO object based on the picture size
       if( pcSlice->getSPS()->getSAOEnabledFlag() )