diff --git a/source/Lib/CommonLib/TypeDef.h b/source/Lib/CommonLib/TypeDef.h
index 04de41c875df11c5ede678b82888df1f84fa3304..2ecd2395da4ae324172bb28d2cf4d9c254b9e3b6 100644
--- a/source/Lib/CommonLib/TypeDef.h
+++ b/source/Lib/CommonLib/TypeDef.h
@@ -81,7 +81,7 @@
 #define FIX_DB_MAX_TRANSFORM_SIZE                         1
 #define JVET_M0908_CIIP_DB                                1
 #define JVET_M0471_LONG_DEBLOCKING_FILTERS                1
-#define JVET_M0427_INLOOP_RESHAPER                        1
+#define JVET_M0427_INLOOP_RESHAPER                        0
 #define JVET_M0470                                        1 // Fixed GR/TU+EG-k transition point, use limited prefix length for escape codes
 
 #define JVET_M0253_HASH_ME                                1
@@ -185,7 +185,7 @@ typedef std::pair<int, int>  TrCost;
 
 #define ENABLE_JVET_L0283_MRL                             1 // 1: Enable MRL, 0: Disable MRL
 #define JVET_L0090_PAIR_AVG                               1 // Add pairwise average candidates, replace HEVC combined candidates
-#define REUSE_CU_RESULTS                                  1
+#define REUSE_CU_RESULTS                                  0
 #if REUSE_CU_RESULTS && JVET_M0102_INTRA_SUBPARTITIONS
 #define REUSE_CU_RESULTS_WITH_MULTIPLE_TUS                1
 #define MAX_NUM_TUS                                       4
@@ -221,7 +221,7 @@ typedef std::pair<int, int>  TrCost;
 
 #endif
 #ifndef ENABLE_SPLIT_PARALLELISM
-#define ENABLE_SPLIT_PARALLELISM                          0
+#define ENABLE_SPLIT_PARALLELISM                          1
 #endif
 #if ENABLE_SPLIT_PARALLELISM
 #define PARL_SPLIT_MAX_NUM_JOBS                           6                             // number of parallel jobs that can be defined and need memory allocated
diff --git a/source/Lib/EncoderLib/EncCu.cpp b/source/Lib/EncoderLib/EncCu.cpp
index 946c2f434063298d3e2e442cba9fcdb0f717d926..5669fcaf8f0c75b7b09775a7c3cf7bf1609d8414 100644
--- a/source/Lib/EncoderLib/EncCu.cpp
+++ b/source/Lib/EncoderLib/EncCu.cpp
@@ -324,13 +324,30 @@ void EncCu::compressCtu( CodingStructure& cs, const UnitArea& area, const unsign
     {
       EncCu*            jobEncCu  = m_pcEncLib->getCuEncoder( cs.picture->scheduler.getSplitDataId( jId ) );
       CacheBlkInfoCtrl* cacheCtrl = dynamic_cast< CacheBlkInfoCtrl* >( jobEncCu->m_modeCtrl );
+#if REUSE_CU_RESULTS
+      BestEncInfoCache* bestCache = dynamic_cast< BestEncInfoCache* >( jobEncCu->m_modeCtrl );
+#endif
+      SaveLoadEncInfoSbt *sbtCache = dynamic_cast< SaveLoadEncInfoSbt* >( jobEncCu->m_modeCtrl );
       if( cacheCtrl )
       {
         cacheCtrl->init( *cs.slice );
       }
+#if REUSE_CU_RESULTS
+      if (bestCache)
+      {
+        bestCache->init(*cs.slice);
+      }
+#endif
+      if (sbtCache)
+      {
+        sbtCache->init(*cs.slice);
+      }
     }
   }
 
+#if REUSE_CU_RESULTS
+  if( auto* cacheCtrl = dynamic_cast<BestEncInfoCache*>( m_modeCtrl ) ) { cacheCtrl->tick(); }
+#endif
   if( auto* cacheCtrl = dynamic_cast<CacheBlkInfoCtrl*>( m_modeCtrl ) ) { cacheCtrl->tick(); }
 #endif
   // init the partitioning manager
@@ -658,6 +675,16 @@ void EncCu::xCompressCU( CodingStructure *&tempCS, CodingStructure *&bestCS, Par
     int maxSLSize = sps.getUseSBT() ? tempCS->slice->getSPS()->getMaxSbtSize() : EMT_INTER_MAX_CU_WITH_QTBT;
 #endif
     slsSbt->resetSaveloadSbt( maxSLSize );
+#if ENABLE_SPLIT_PARALLELISM
+    if (m_pcEncCfg->getNumSplitThreads() > 1)
+    {
+      for (int jId = 1; jId < NUM_RESERVERD_SPLIT_JOBS; jId++)
+      {
+        auto slsSbt = dynamic_cast<SaveLoadEncInfoSbt *>(m_pcEncLib->getCuEncoder(jId)->m_modeCtrl);
+        slsSbt->resetSaveloadSbt(maxSLSize);
+      }
+    }
+#endif
   }
   m_sbtCostSave[0] = m_sbtCostSave[1] = MAX_DOUBLE;
 #endif
@@ -1010,12 +1037,14 @@ void EncCu::xCompressCUParallel( CodingStructure *&tempCS, CodingStructure *&bes
   const int      wppTId   = picture->scheduler.getWppThreadId();
 #endif
   const bool doParallel   = !m_pcEncCfg->getForceSingleSplitThread();
+#if 1
 #if _MSC_VER && ENABLE_WPP_PARALLELISM
 #pragma omp parallel for schedule(dynamic,1) num_threads(NUM_SPLIT_THREADS_IF_MSVC) if(doParallel)
 #else
   omp_set_num_threads( m_pcEncCfg->getNumSplitThreads() );
 
 #pragma omp parallel for schedule(dynamic,1) if(doParallel)
+#endif
 #endif
   for( int jId = 1; jId <= numJobs; jId++ )
   {
@@ -1029,6 +1058,9 @@ void EncCu::xCompressCUParallel( CodingStructure *&tempCS, CodingStructure *&bes
     Partitioner* jobPartitioner = PartitionerFactory::get( *tempCS->slice );
     EncCu*       jobCuEnc       = m_pcEncLib->getCuEncoder( picture->scheduler.getSplitDataId( jId ) );
     auto*        jobBlkCache    = dynamic_cast<CacheBlkInfoCtrl*>( jobCuEnc->m_modeCtrl );
+#if REUSE_CU_RESULTS
+    auto*        jobBestCache   = dynamic_cast<BestEncInfoCache*>( jobCuEnc->m_modeCtrl );
+#endif
 
     jobPartitioner->copyState( partitioner );
     jobCuEnc      ->copyState( this, *jobPartitioner, currArea, true );
@@ -1038,6 +1070,13 @@ void EncCu::xCompressCUParallel( CodingStructure *&tempCS, CodingStructure *&bes
       jobBlkCache->tick();
     }
 
+#if REUSE_CU_RESULTS
+    if( jobBestCache )
+    {
+      jobBestCache->tick();
+    }
+
+#endif
     CodingStructure *&jobBest = jobCuEnc->m_pBestCS[wIdx][hIdx];
     CodingStructure *&jobTemp = jobCuEnc->m_pTempCS[wIdx][hIdx];
 
@@ -1094,7 +1133,22 @@ void EncCu::xCompressCUParallel( CodingStructure *&tempCS, CodingStructure *&bes
 
     blkCache->tick();
   }
+#if REUSE_CU_RESULTS
+
+  if( auto *blkCache = dynamic_cast<BestEncInfoCache*>( m_modeCtrl ) )
+  {
+    for( int jId = 1; jId <= numJobs; jId++ )
+    {
+      if( !jobUsed[jId] || jId == bestJId ) continue;
 
+      auto *jobBlkCache = dynamic_cast<BestEncInfoCache*>( m_pcEncLib->getCuEncoder( picture->scheduler.getSplitDataId( jId ) )->m_modeCtrl );
+      CHECK( !jobBlkCache, "If own mode controller has blk info cache capability so should all other mode controllers!" );
+      blkCache->BestEncInfoCache::copyState( *jobBlkCache, partitioner.currArea() );
+    }
+
+    blkCache->tick();
+  }
+#endif
 }
 
 void EncCu::copyState( EncCu* other, Partitioner& partitioner, const UnitArea& currArea, const bool isDist )
@@ -1110,7 +1164,7 @@ void EncCu::copyState( EncCu* other, Partitioner& partitioner, const UnitArea& c
   else
   {
           CodingStructure* dst =        m_pBestCS[wIdx][hIdx];
-    const CodingStructure *src = other->m_pBestCS[wIdx][hIdx];
+    const CodingStructure* src = other->m_pBestCS[wIdx][hIdx];
     bool keepResi = KEEP_PRED_AND_RESI_SIGNALS;
 
     dst->useSubStructure( *src, partitioner.chType, currArea, KEEP_PRED_AND_RESI_SIGNALS, true, keepResi, keepResi );
@@ -1129,6 +1183,7 @@ void EncCu::copyState( EncCu* other, Partitioner& partitioner, const UnitArea& c
   m_modeCtrl     ->copyState( *other->m_modeCtrl, partitioner.currArea() );
   m_pcRdCost     ->copyState( *other->m_pcRdCost );
   m_pcTrQuant    ->copyState( *other->m_pcTrQuant );
+  //m_pcReshape    ->copyState( *other->m_pcReshape );
 
   m_CABACEstimator->getCtx() = other->m_CABACEstimator->getCtx();
 }
diff --git a/source/Lib/EncoderLib/EncLib.cpp b/source/Lib/EncoderLib/EncLib.cpp
index d402c7be9296321cba9ebe03e09168e54e534703..ed5e137c1f4452da75c5b825097fdd66ad44e60e 100644
--- a/source/Lib/EncoderLib/EncLib.cpp
+++ b/source/Lib/EncoderLib/EncLib.cpp
@@ -147,7 +147,16 @@ void EncLib::create ()
 #if JVET_M0427_INLOOP_RESHAPER
   if (m_lumaReshapeEnable)
   {
+#if ENABLE_SPLIT_PARALLELISM || ENABLE_WPP_PARALLELISM
+    m_cReshaper = new EncReshape[m_numCuEncStacks];
+
+    for (int jId = 0; jId < m_numCuEncStacks; jId++)
+    {
+      m_cReshaper[jId].createEnc(getSourceWidth(), getSourceHeight(), m_maxCUWidth, m_maxCUHeight, m_bitDepth[COMPONENT_Y]);
+    }
+#else
     m_cReshaper.createEnc( getSourceWidth(), getSourceHeight(), m_maxCUWidth, m_maxCUHeight, m_bitDepth[COMPONENT_Y]);
+#endif
   }
 #endif
   if ( m_RCEnableRateControl )
@@ -180,8 +189,15 @@ void EncLib::destroy ()
   m_cLoopFilter.        destroy();
   m_cRateCtrl.          destroy();
 #if JVET_M0427_INLOOP_RESHAPER
+#if ENABLE_SPLIT_PARALLELISM || ENABLE_WPP_PARALLELISM
+  for (int jId = 0; jId < m_numCuEncStacks; jId++)
+  {
+    m_cReshaper[jId].   destroy();
+  }
+#else
   m_cReshaper.          destroy();
 #endif
+#endif
 #if ENABLE_SPLIT_PARALLELISM || ENABLE_WPP_PARALLELISM
   for( int jId = 0; jId < m_numCuEncStacks; jId++ )
   {
@@ -315,13 +331,22 @@ void EncLib::init( bool isFieldCoding, AUWriterIf* auWriterIf )
                               &m_cTrQuant[jId],
                               &m_cRdCost[jId],
                               cabacEstimator,
-                              getCtxCache( jId ), m_maxCUWidth, m_maxCUHeight, m_maxTotalCUDepth );
+                              getCtxCache( jId ), m_maxCUWidth, m_maxCUHeight, m_maxTotalCUDepth
+#if JVET_M0427_INLOOP_RESHAPER
+                            , &m_cReshaper[jId]
+#endif
+    );
     m_cInterSearch[jId].init( this,
                               &m_cTrQuant[jId],
                               m_iSearchRange,
                               m_bipredSearchRange,
                               m_motionEstimationSearchMethod,
-                              m_maxCUWidth, m_maxCUHeight, m_maxTotalCUDepth, &m_cRdCost[jId], cabacEstimator, getCtxCache( jId ) );
+                              getUseCompositeRef(),
+                              m_maxCUWidth, m_maxCUHeight, m_maxTotalCUDepth, &m_cRdCost[jId], cabacEstimator, getCtxCache( jId )
+#if JVET_M0427_INLOOP_RESHAPER
+                           , &m_cReshaper[jId]
+#endif
+    );
 
     // link temporary buffets from intra search with inter search to avoid unnecessary memory overhead
     m_cInterSearch[jId].setTempBuffers( m_cIntraSearch[jId].getSplitCSBuf(), m_cIntraSearch[jId].getFullCSBuf(), m_cIntraSearch[jId].getSaveCSBuf() );
diff --git a/source/Lib/EncoderLib/EncLib.h b/source/Lib/EncoderLib/EncLib.h
index d7f52bf87ca9456104649d3f77f5110d71e5bfbf..d579e219d4b806bc72056bc2904e40fd8e1d0b19 100644
--- a/source/Lib/EncoderLib/EncLib.h
+++ b/source/Lib/EncoderLib/EncLib.h
@@ -102,7 +102,11 @@ private:
 #endif
 
 #if JVET_M0427_INLOOP_RESHAPER
+#if ENABLE_SPLIT_PARALLELISM || ENABLE_WPP_PARALLELISM
+  EncReshape               *m_cReshaper;                        ///< reshaper class
+#else
   EncReshape                m_cReshaper;                        ///< reshaper class
+#endif
 #endif
 
   // processing unit
@@ -242,7 +246,11 @@ public:
 #endif
 
 #if JVET_M0427_INLOOP_RESHAPER
+#if ENABLE_SPLIT_PARALLELISM || ENABLE_WPP_PARALLELISM
+  EncReshape*            getReshaper( int jId = 0 )             { return  &m_cReshaper[jId]; }
+#else
   EncReshape*            getReshaper()                          { return  &m_cReshaper; }
+#endif
 #endif
   // -------------------------------------------------------------------------------------------------------------------
   // encoder function
diff --git a/source/Lib/EncoderLib/EncModeCtrl.cpp b/source/Lib/EncoderLib/EncModeCtrl.cpp
index b96f82989e318a2bd1d74698bcbc04bc94992bf1..557e145bad2ad9333864388b9acbd560b33f853e 100644
--- a/source/Lib/EncoderLib/EncModeCtrl.cpp
+++ b/source/Lib/EncoderLib/EncModeCtrl.cpp
@@ -621,6 +621,13 @@ bool SaveLoadEncInfoSbt::saveBestSbt( const UnitArea& area, const uint32_t curPu
   return true;
 }
 
+#if ENABLE_SPLIT_PARALLELISM
+void SaveLoadEncInfoSbt::copyState(const SaveLoadEncInfoSbt &other)
+{
+  m_sliceSbt = other.m_sliceSbt;
+}
+#endif
+
 void SaveLoadEncInfoSbt::resetSaveloadSbt( int maxSbtSize )
 {
   int numSizeIdx = gp_sizeIdxInfo->idxFrom( maxSbtSize ) - MIN_CU_LOG2 + 1;
@@ -917,6 +924,10 @@ void BestEncInfoCache::init( const Slice &slice )
       }
     }
   }
+#if ENABLE_SPLIT_PARALLELISM
+
+  m_currTemporalId = 0;
+#endif
 }
 
 bool BestEncInfoCache::setFromCs( const CodingStructure& cs, const Partitioner& partitioner )
@@ -1062,6 +1073,70 @@ bool BestEncInfoCache::setCsFrom( CodingStructure& cs, EncTestMode& testMode, co
   return true;
 }
 
+#if ENABLE_SPLIT_PARALLELISM
+void BestEncInfoCache::copyState(const BestEncInfoCache &other, const UnitArea &area)
+{
+  m_slice_bencinf = other.m_slice_bencinf;
+
+  m_currTemporalId = other.m_currTemporalId;
+
+  if( m_slice_bencinf->isIntra() ) return;
+
+  const int cuSizeMask = m_slice_bencinf->getSPS()->getMaxCUWidth() - 1;
+
+  const int minPosX = ( area.lx() & cuSizeMask ) >> MIN_CU_LOG2;
+  const int minPosY = ( area.ly() & cuSizeMask ) >> MIN_CU_LOG2;
+  const int maxPosX = ( area.Y().bottomRight().x & cuSizeMask ) >> MIN_CU_LOG2;
+  const int maxPosY = ( area.Y().bottomRight().y & cuSizeMask ) >> MIN_CU_LOG2;
+
+  for( unsigned x = minPosX; x <= maxPosX; x++ )
+  {
+    for( unsigned y = minPosY; y <= maxPosY; y++ )
+    {
+      for( int wIdx = 0; wIdx < gp_sizeIdxInfo->numWidths(); wIdx++ )
+      {
+        const int width = gp_sizeIdxInfo->sizeFrom( wIdx );
+
+        if( m_bestEncInfo[x][y][wIdx] && width <= area.lwidth() && x + ( width >> MIN_CU_LOG2 ) <= ( maxPosX + 1 ) )
+        {
+          for( int hIdx = 0; hIdx < gp_sizeIdxInfo->numHeights(); hIdx++ )
+          {
+            const int height = gp_sizeIdxInfo->sizeFrom( hIdx );
+
+            if( gp_sizeIdxInfo->isCuSize( height ) && height <= area.lheight() && y + ( height >> MIN_CU_LOG2 ) <= ( maxPosY + 1 ) )
+            {
+              if( other.m_bestEncInfo[x][y][wIdx][hIdx]->temporalId > m_bestEncInfo[x][y][wIdx][hIdx]->temporalId )
+              {
+                memcpy( m_bestEncInfo[x][y][wIdx][hIdx], other.m_bestEncInfo[x][y][wIdx][hIdx], sizeof( BestEncodingInfo ) );
+                m_bestEncInfo[x][y][wIdx][hIdx]->temporalId = m_currTemporalId;
+              }
+            }
+            else if( y + ( height >> MIN_CU_LOG2 ) > maxPosY + 1 )
+            {
+              break;;
+            }
+          }
+        }
+        else if( x + ( width >> MIN_CU_LOG2 ) > maxPosX + 1 )
+        {
+          break;
+        }
+      }
+    }
+  }
+}
+
+void BestEncInfoCache::touch(const UnitArea &area)
+{
+  unsigned idx1, idx2, idx3, idx4;
+  getAreaIdx(area.Y(), *m_slice_bencinf->getPPS()->pcv, idx1, idx2, idx3, idx4);
+  BestEncodingInfo &encInfo = *m_bestEncInfo[idx1][idx2][idx3][idx4];
+
+  encInfo.temporalId   = m_currTemporalId;
+}
+
+#endif
+
 #endif
 
 static bool interHadActive( const ComprCUCtx& ctx )
@@ -1961,7 +2036,10 @@ bool EncModeCtrlMTnoRQT::tryMode( const EncTestMode& encTestmode, const CodingSt
           relatedCU.isIntra   = true;
         }
 #if ENABLE_SPLIT_PARALLELISM
-        touch( partitioner.currArea() );
+#if REUSE_CU_RESULTS
+        BestEncInfoCache::touch(partitioner.currArea());
+#endif
+        CacheBlkInfoCtrl::touch(partitioner.currArea());
 #endif
         cuECtx.set( IS_BEST_NOSPLIT_SKIP, bestCU->skip );
       }
@@ -2109,6 +2187,10 @@ void EncModeCtrlMTnoRQT::copyState( const EncModeCtrl& other, const UnitArea& ar
 
   this->EncModeCtrl        ::copyState( *pOther, area );
   this->CacheBlkInfoCtrl   ::copyState( *pOther, area );
+#if REUSE_CU_RESULTS
+  this->BestEncInfoCache   ::copyState( *pOther, area );
+#endif
+  this->SaveLoadEncInfoSbt ::copyState( *pOther );
 
   m_skipThreshold = pOther->m_skipThreshold;
 }
diff --git a/source/Lib/EncoderLib/EncModeCtrl.h b/source/Lib/EncoderLib/EncModeCtrl.h
index 553c9e8118dc9610cdcc7ce34b82508bb00ab8d9..f7d6c11e4bd23fe57ff86c24f14d3e4068ffa339 100644
--- a/source/Lib/EncoderLib/EncModeCtrl.h
+++ b/source/Lib/EncoderLib/EncModeCtrl.h
@@ -369,7 +369,13 @@ struct SaveLoadStructSbt
 class SaveLoadEncInfoSbt
 {
 protected:
+#if ENABLE_SPLIT_PARALLELISM
+public:
+#endif
   void init( const Slice &slice );
+#if ENABLE_SPLIT_PARALLELISM
+protected:
+#endif
   void create();
   void destroy();
 
@@ -382,6 +388,9 @@ public:
   void     resetSaveloadSbt( int maxSbtSize );
   uint16_t findBestSbt( const UnitArea& area, const uint32_t curPuSse );
   bool     saveBestSbt( const UnitArea& area, const uint32_t curPuSse, const uint8_t curPuSbt, const uint8_t curPuTrs );
+#if ENABLE_SPLIT_PARALLELISM
+  void     copyState(const SaveLoadEncInfoSbt& other);
+#endif
 };
 #endif
 
@@ -467,6 +476,10 @@ struct BestEncodingInfo
   EncTestMode    testMode;
 
   int            poc;
+
+#if ENABLE_SPLIT_PARALLELISM
+  int64_t        temporalId;
+#endif
 };
 
 class BestEncInfoCache
@@ -480,23 +493,31 @@ private:
   Pel                *m_pPcmBuf;
   CodingStructure     m_dummyCS;
   XUCache             m_dummyCache;
+#if ENABLE_SPLIT_PARALLELISM
+  int64_t m_currTemporalId;
+#endif
 
 protected:
 
   void create   ( const ChromaFormat chFmt );
   void destroy  ();
-  void init     ( const Slice &slice );
 
   bool setFromCs( const CodingStructure& cs, const Partitioner& partitioner );
-  bool isValid  ( const CodingStructure& cs, const Partitioner& partitioner, int qp );
-
-  // TODO: implement copyState
+  bool isValid  ( const CodingStructure &cs, const Partitioner &partitioner, int qp );
 
+#if ENABLE_SPLIT_PARALLELISM
+  void touch    ( const UnitArea& area );
+#endif
 public:
 
   BestEncInfoCache() : m_slice_bencinf( nullptr ), m_dummyCS( m_dummyCache.cuCache, m_dummyCache.puCache, m_dummyCache.tuCache ) {}
   virtual ~BestEncInfoCache() {}
 
+#if ENABLE_SPLIT_PARALLELISM
+  void     copyState( const BestEncInfoCache &other, const UnitArea &area );
+  void     tick     () { m_currTemporalId++; CHECK( m_currTemporalId <= 0, "Problem with integer overflow!" ); }
+#endif
+  void     init     ( const Slice &slice );
   bool     setCsFrom( CodingStructure& cs, EncTestMode& testMode, const Partitioner& partitioner ) const;
 };
 
diff --git a/source/Lib/EncoderLib/EncReshape.cpp b/source/Lib/EncoderLib/EncReshape.cpp
index 6c316c135af5b45ae329fc1fc11ad0f864621c60..0240ef0a09c7a5f053d13879c4741c20e9773ccd 100644
--- a/source/Lib/EncoderLib/EncReshape.cpp
+++ b/source/Lib/EncoderLib/EncReshape.cpp
@@ -1267,6 +1267,43 @@ void EncReshape::constructReshaperSDR()
   updateChromaScaleLUT();
 }
 
+#if ENABLE_SPLIT_PARALLELISM || ENABLE_WPP_PARALLELISM
+void EncReshape::copyState(const EncReshape &other)
+{
+  m_srcReshaped     = other.m_srcReshaped;
+  m_picWidth        = other.m_picWidth;
+  m_picHeight       = other.m_picHeight;
+  m_maxCUWidth      = other.m_maxCUWidth;
+  m_maxCUHeight     = other.m_maxCUHeight;
+  m_widthInCtus     = other.m_widthInCtus;
+  m_heightInCtus    = other.m_heightInCtus;
+  m_numCtuInFrame   = other.m_numCtuInFrame;
+  m_exceedSTD       = other.m_exceedSTD;
+  m_binImportance   = other.m_binImportance;
+  m_tcase           = other.m_tcase;
+  m_rateAdpMode     = other.m_rateAdpMode;
+  m_useAdpCW        = other.m_useAdpCW;
+  m_initCWAnalyze   = other.m_initCWAnalyze;
+  m_dQPModel        = other.m_dQPModel;
+  m_reshapeCW       = other.m_reshapeCW;
+  memcpy( m_cwLumaWeight, other.m_cwLumaWeight, sizeof( m_cwLumaWeight ) );
+  m_chromaWeight    = other.m_chromaWeight;
+  m_chromaAdj       = other.m_chromaAdj;
+
+  m_sliceReshapeInfo = other.m_sliceReshapeInfo;
+  m_CTUFlag          = other.m_CTUFlag;
+  m_recReshaped      = other.m_recReshaped;
+  m_invLUT           = other.m_invLUT;
+  m_fwdLUT           = other.m_fwdLUT;
+  m_chromaAdjHelpLUT = other.m_chromaAdjHelpLUT;
+  m_binCW            = other.m_binCW;
+  m_initCW           = other.m_initCW;
+  m_reshape          = other.m_reshape;
+  m_reshapePivot     = other.m_reshapePivot;
+  m_lumaBD           = other.m_lumaBD;
+  m_reshapeLUTSize   = other.m_reshapeLUTSize;
+}
+#endif
 #endif
 //
 //! \}
diff --git a/source/Lib/EncoderLib/EncReshape.h b/source/Lib/EncoderLib/EncReshape.h
index 3ecdd2107eaeaf6518562ee0472c07bb3e692917..f570a7867d4945cfe0b67f0ceba742ed7757208c 100644
--- a/source/Lib/EncoderLib/EncReshape.h
+++ b/source/Lib/EncoderLib/EncReshape.h
@@ -99,6 +99,10 @@ public:
   ReshapeCW * getReshapeCW() { return &m_reshapeCW; }
   Pel * getWeightTable() { return m_cwLumaWeight; }
   double getCWeight() { return m_chromaWeight; }
+
+#if ENABLE_SPLIT_PARALLELISM || ENABLE_WPP_PARALLELISM
+  void copyState(const EncReshape& other);
+#endif
 };// END CLASS DEFINITION EncReshape
 
 //! \}
diff --git a/source/Lib/EncoderLib/InterSearch.cpp b/source/Lib/EncoderLib/InterSearch.cpp
index c7425aab0e3508fa21a7109d08ba79f80e38e0e0..5126a46370a55ce73ba2ba116e6230d527882b3e 100644
--- a/source/Lib/EncoderLib/InterSearch.cpp
+++ b/source/Lib/EncoderLib/InterSearch.cpp
@@ -175,11 +175,6 @@ void InterSearch::setTempBuffers( CodingStructure ****pSplitCS, CodingStructure
 #if ENABLE_SPLIT_PARALLELISM
 void InterSearch::copyState( const InterSearch& other )
 {
-  if( !m_pcEncCfg->getQTBT() )
-  {
-    memcpy( m_integerMv2Nx2N, other.m_integerMv2Nx2N, sizeof( m_integerMv2Nx2N ) );
-  }
-
   memcpy( m_aaiAdaptSR, other.m_aaiAdaptSR, sizeof( m_aaiAdaptSR ) );
 }
 #endif