diff --git a/source/Lib/CommonLib/InterPrediction.cpp b/source/Lib/CommonLib/InterPrediction.cpp
index b911faf9410ac493aab564cb2981258c2130ad04..aefe92a7e65b202245c6503c2a27d2e037a42620 100644
--- a/source/Lib/CommonLib/InterPrediction.cpp
+++ b/source/Lib/CommonLib/InterPrediction.cpp
@@ -330,7 +330,11 @@ void InterPrediction::xSubPuMC( PredictionUnit& pu, PelUnitBuf& predBuf, const R
 
   pu.cu->affine = isAffine;
 }
+#if JVET_O0108_DIS_DMVR_BDOF_CIIP
+void InterPrediction::xSubPuBio(PredictionUnit& pu, PelUnitBuf& predBuf, const RefPicList &eRefPicList /*= REF_PIC_LIST_X*/, PelUnitBuf* yuvDstTmp /*= NULL*/)
+#else
 void InterPrediction::xSubPuBio(PredictionUnit& pu, PelUnitBuf& predBuf, const RefPicList &eRefPicList /*= REF_PIC_LIST_X*/)
+#endif
 {
   // compute the location of the current PU
   Position puPos = pu.lumaPos();
@@ -344,6 +348,9 @@ void InterPrediction::xSubPuBio(PredictionUnit& pu, PelUnitBuf& predBuf, const R
   subPu.mmvdMergeFlag = pu.mmvdMergeFlag;
   subPu.mmvdEncOptMode = pu.mmvdEncOptMode;
   subPu.mergeFlag = pu.mergeFlag;
+#if JVET_O0108_DIS_DMVR_BDOF_CIIP
+  subPu.mhIntraFlag = pu.mhIntraFlag;
+#endif
   subPu.mvRefine = pu.mvRefine;
   subPu.refIdx[0] = pu.refIdx[0];
   subPu.refIdx[1] = pu.refIdx[1];
@@ -368,6 +375,14 @@ void InterPrediction::xSubPuBio(PredictionUnit& pu, PelUnitBuf& predBuf, const R
       subPu = curMi;
       PelUnitBuf subPredBuf = predBuf.subBuf(UnitAreaRelative(pu, subPu));
 
+#if JVET_O0108_DIS_DMVR_BDOF_CIIP
+      if (yuvDstTmp)
+      {
+        PelUnitBuf subPredBufTmp = yuvDstTmp->subBuf(UnitAreaRelative(pu, subPu));
+        motionCompensation(subPu, subPredBuf, eRefPicList, true, true, &subPredBufTmp);
+      }
+      else
+#endif
       motionCompensation(subPu, subPredBuf, eRefPicList);
     }
   }
@@ -463,7 +478,11 @@ void InterPrediction::xPredInterUni(const PredictionUnit& pu, const RefPicList&
   }
 }
 
+#if JVET_O0108_DIS_DMVR_BDOF_CIIP
+void InterPrediction::xPredInterBi(PredictionUnit& pu, PelUnitBuf &pcYuvPred, PelUnitBuf* yuvPredTmp /*= NULL*/)
+#else
 void InterPrediction::xPredInterBi(PredictionUnit& pu, PelUnitBuf &pcYuvPred)
+#endif
 {
   const PPS   &pps   = *pu.cs->pps;
   const Slice &slice = *pu.cs->slice;
@@ -496,6 +515,11 @@ void InterPrediction::xPredInterBi(PredictionUnit& pu, PelUnitBuf &pcYuvPred)
       }
     }
 
+#if JVET_O0108_DIS_DMVR_BDOF_CIIP
+    if (bioApplied && pu.mhIntraFlag)
+      bioApplied = false;
+#endif
+
     if (bioApplied && pu.cu->smvdMode)
     {
       bioApplied = false;
@@ -532,7 +556,15 @@ void InterPrediction::xPredInterBi(PredictionUnit& pu, PelUnitBuf &pcYuvPred)
     if (pu.refIdx[0] >= 0 && pu.refIdx[1] >= 0)
     {
       if (dmvrApplied)
+#if JVET_O0108_DIS_DMVR_BDOF_CIIP
+      {
+        if (yuvPredTmp)
+          xPredInterUni(pu, eRefPicList, pcMbBuf, true, false, true, true);
+        continue;
+      }
+#else
         continue; // mc will happen in processDMVR
+#endif
       xPredInterUni ( pu, eRefPicList, pcMbBuf, true
         , bioApplied
         , true, true
@@ -565,20 +597,38 @@ void InterPrediction::xPredInterBi(PredictionUnit& pu, PelUnitBuf &pcYuvPred)
   if( (!dmvrApplied) && (!bioApplied) && pps.getWPBiPred() && slice.getSliceType() == B_SLICE && pu.cu->GBiIdx==GBI_DEFAULT)
   {
     xWeightedPredictionBi( pu, srcPred0, srcPred1, pcYuvPred, m_maxCompIDToPred );
+#if JVET_O0108_DIS_DMVR_BDOF_CIIP
+    if (yuvPredTmp)
+      yuvPredTmp->copyFrom(pcYuvPred);
+#endif
   }
   else if( pps.getUseWP() && slice.getSliceType() == P_SLICE )
   {
     xWeightedPredictionUni( pu, srcPred0, REF_PIC_LIST_0, pcYuvPred, -1, m_maxCompIDToPred );
+#if JVET_O0108_DIS_DMVR_BDOF_CIIP
+    if (yuvPredTmp)
+      yuvPredTmp->copyFrom(pcYuvPred);
+#endif
   }
   else
   {
     if (dmvrApplied)
     {
+#if JVET_O0108_DIS_DMVR_BDOF_CIIP
+      if (yuvPredTmp)
+      {
+        yuvPredTmp->addAvg(srcPred0, srcPred1, slice.clpRngs(), false);
+      }
+#endif
       xProcessDMVR(pu, pcYuvPred, slice.clpRngs(), bioApplied);
     }
     else
     {
+#if JVET_O0108_DIS_DMVR_BDOF_CIIP
+      xWeightedAverage( pu, srcPred0, srcPred1, pcYuvPred, slice.getSPS()->getBitDepths(), slice.clpRngs(), bioApplied, yuvPredTmp);
+#else
       xWeightedAverage( pu, srcPred0, srcPred1, pcYuvPred, slice.getSPS()->getBitDepths(), slice.clpRngs(), bioApplied );
+#endif
     }
   }
 }
@@ -1117,7 +1167,11 @@ void InterPrediction::xCalcBlkGradient(int sx, int sy, int    *arraysGx2, int
   g_pelBufOP.calcBlkGradient(sx, sy, arraysGx2, arraysGxGy, arraysGxdI, arraysGy2, arraysGydI, sGx2, sGy2, sGxGy, sGxdI, sGydI, width, height, unitSize);
 }
 
+#if JVET_O0108_DIS_DMVR_BDOF_CIIP
+void InterPrediction::xWeightedAverage(const PredictionUnit& pu, const CPelUnitBuf& pcYuvSrc0, const CPelUnitBuf& pcYuvSrc1, PelUnitBuf& pcYuvDst, const BitDepths& clipBitDepths, const ClpRngs& clpRngs, const bool& bioApplied, PelUnitBuf* yuvDstTmp /*= NULL*/)
+#else
 void InterPrediction::xWeightedAverage(const PredictionUnit& pu, const CPelUnitBuf& pcYuvSrc0, const CPelUnitBuf& pcYuvSrc1, PelUnitBuf& pcYuvDst, const BitDepths& clipBitDepths, const ClpRngs& clpRngs, const bool& bioApplied )
+#endif
 {
   const int iRefIdx0 = pu.refIdx[0];
   const int iRefIdx1 = pu.refIdx[1];
@@ -1128,6 +1182,10 @@ void InterPrediction::xWeightedAverage(const PredictionUnit& pu, const CPelUnitB
     {
       CHECK(bioApplied, "GBi is disallowed with BIO");
       pcYuvDst.addWeightedAvg(pcYuvSrc0, pcYuvSrc1, clpRngs, pu.cu->GBiIdx);
+#if JVET_O0108_DIS_DMVR_BDOF_CIIP
+      if (yuvDstTmp)
+        yuvDstTmp->copyFrom(pcYuvDst);
+#endif
       return;
     }
     if (bioApplied)
@@ -1145,10 +1203,18 @@ void InterPrediction::xWeightedAverage(const PredictionUnit& pu, const CPelUnitB
       if (bioEnabled)
       {
         applyBiOptFlow(pu, pcYuvSrc0, pcYuvSrc1, iRefIdx0, iRefIdx1, pcYuvDst, clipBitDepths);
+#if JVET_O0108_DIS_DMVR_BDOF_CIIP
+        if (yuvDstTmp)
+          yuvDstTmp->bufs[0].addAvg(CPelBuf(pSrcY0, src0Stride, pu.lumaSize()), CPelBuf(pSrcY1, src1Stride, pu.lumaSize()), clpRngs.comp[0]);
+#endif
       }
       else
       {
         pcYuvDst.bufs[0].addAvg(CPelBuf(pSrcY0, src0Stride, pu.lumaSize()), CPelBuf(pSrcY1, src1Stride, pu.lumaSize()), clpRngs.comp[0]);
+#if JVET_O0108_DIS_DMVR_BDOF_CIIP
+        if (yuvDstTmp)
+          yuvDstTmp->bufs[0].copyFrom(pcYuvDst.bufs[0]);
+#endif
       }
     }
     if (pu.cs->pps->getWPBiPred())
@@ -1169,6 +1235,18 @@ void InterPrediction::xWeightedAverage(const PredictionUnit& pu, const CPelUnitB
     {
       pcYuvDst.addAvg(pcYuvSrc0, pcYuvSrc1, clpRngs, bioApplied);
     }
+#if JVET_O0108_DIS_DMVR_BDOF_CIIP
+    if (yuvDstTmp)
+    {
+      if (bioApplied)
+      {
+        yuvDstTmp->bufs[1].copyFrom(pcYuvDst.bufs[1]);
+        yuvDstTmp->bufs[2].copyFrom(pcYuvDst.bufs[2]);
+      }
+      else
+        yuvDstTmp->copyFrom(pcYuvDst);
+    }
+#endif
   }
   else if( iRefIdx0 >= 0 && iRefIdx1 < 0 )
   {
@@ -1178,6 +1256,10 @@ void InterPrediction::xWeightedAverage(const PredictionUnit& pu, const CPelUnitB
     }
     else
     pcYuvDst.copyClip( pcYuvSrc0, clpRngs );
+#if JVET_O0108_DIS_DMVR_BDOF_CIIP
+    if (yuvDstTmp)
+      yuvDstTmp->copyFrom(pcYuvDst);
+#endif
   }
   else if( iRefIdx0 < 0 && iRefIdx1 >= 0 )
   {
@@ -1187,13 +1269,24 @@ void InterPrediction::xWeightedAverage(const PredictionUnit& pu, const CPelUnitB
     }
     else
     pcYuvDst.copyClip( pcYuvSrc1, clpRngs );
+#if JVET_O0108_DIS_DMVR_BDOF_CIIP
+    if (yuvDstTmp)
+      yuvDstTmp->copyFrom(pcYuvDst);
+#endif
   }
 }
 
 void InterPrediction::motionCompensation( PredictionUnit &pu, PelUnitBuf &predBuf, const RefPicList &eRefPicList
   , const bool luma, const bool chroma
+#if JVET_O0108_DIS_DMVR_BDOF_CIIP
+  , PelUnitBuf* predBufWOBIO /*= NULL*/
+#endif
 )
 {
+#if JVET_O0108_DIS_DMVR_BDOF_CIIP
+  CHECK(predBufWOBIO && pu.mhIntraFlag, "the case should not happen!");
+#endif
+
   // dual tree handling for IBC as the only ref
   if ((!luma || !chroma) && eRefPicList == REF_PIC_LIST_0)
   {
@@ -1217,6 +1310,9 @@ void InterPrediction::motionCompensation( PredictionUnit &pu, PelUnitBuf &predBu
 
   if( eRefPicList != REF_PIC_LIST_X )
   {
+#if JVET_O0108_DIS_DMVR_BDOF_CIIP
+    CHECK(predBufWOBIO != NULL, "the case should not happen!");
+#endif
     if( ( ( sliceType == P_SLICE && pps.getUseWP() ) || ( sliceType == B_SLICE && pps.getWPBiPred() ) ) )
     {
       xPredInterUni         ( pu,          eRefPicList, predBuf, true
@@ -1266,6 +1362,13 @@ void InterPrediction::motionCompensation( PredictionUnit &pu, PelUnitBuf &predBu
         }
       }
 
+#if JVET_O0108_DIS_DMVR_BDOF_CIIP
+      if (bioApplied && pu.mhIntraFlag)
+      {
+        bioApplied = false;
+      }
+#endif
+
       if (bioApplied && pu.cu->smvdMode)
       {
         bioApplied = false;
@@ -1283,11 +1386,18 @@ void InterPrediction::motionCompensation( PredictionUnit &pu, PelUnitBuf &predBu
     dmvrApplied = (pu.mvRefine) && PU::checkDMVRCondition(pu);
     if ((pu.lumaSize().width > MAX_BDOF_APPLICATION_REGION || pu.lumaSize().height > MAX_BDOF_APPLICATION_REGION) && pu.mergeType != MRG_TYPE_SUBPU_ATMVP && (bioApplied && !dmvrApplied))
     {
+#if JVET_O0108_DIS_DMVR_BDOF_CIIP
+      xSubPuBio(pu, predBuf, eRefPicList, predBufWOBIO);
+#else
       xSubPuBio(pu, predBuf, eRefPicList);
+#endif
     }
     else
     if (pu.mergeType != MRG_TYPE_DEFAULT_N && pu.mergeType != MRG_TYPE_IBC)
     {
+#if JVET_O0108_DIS_DMVR_BDOF_CIIP
+      CHECK(predBufWOBIO != NULL, "the case should not happen!");
+#endif 
       xSubPuMC( pu, predBuf, eRefPicList );
     }
     else if( xCheckIdenticalMotion( pu ) )
@@ -1296,10 +1406,18 @@ void InterPrediction::motionCompensation( PredictionUnit &pu, PelUnitBuf &predBu
         , false
         , true, true
       );
+#if JVET_O0108_DIS_DMVR_BDOF_CIIP
+      if (predBufWOBIO)
+        predBufWOBIO->copyFrom(predBuf);
+#endif
     }
     else
     {
+#if JVET_O0108_DIS_DMVR_BDOF_CIIP
+      xPredInterBi(pu, predBuf, predBufWOBIO);
+#else
       xPredInterBi( pu, predBuf );
+#endif
     }
   }
   return;
diff --git a/source/Lib/CommonLib/InterPrediction.h b/source/Lib/CommonLib/InterPrediction.h
index bf30d6e3f7195c0007f93a33b638bd9723226815..3f22258b7012b6067cde1325de6c7bf922d38e11 100644
--- a/source/Lib/CommonLib/InterPrediction.h
+++ b/source/Lib/CommonLib/InterPrediction.h
@@ -121,7 +121,11 @@ protected:
                                   , const bool& bioApplied
                                   , const bool luma, const bool chroma
   );
+#if JVET_O0108_DIS_DMVR_BDOF_CIIP
+  void xPredInterBi             ( PredictionUnit& pu, PelUnitBuf &pcYuvPred, PelUnitBuf* yuvPredTmp = NULL );
+#else
   void xPredInterBi             ( PredictionUnit& pu, PelUnitBuf &pcYuvPred );
+#endif
   void xPredInterBlk            ( const ComponentID& compID, const PredictionUnit& pu, const Picture* refPic, const Mv& _mv, PelUnitBuf& dstPic, const bool& bi, const ClpRng& clpRng
                                  , const bool& bioApplied
                                  , bool isIBC
@@ -136,7 +140,11 @@ protected:
   void xBioGradFilter           (Pel* pSrc, int srcStride, int width, int height, int gradStride, Pel* gradX, Pel* gradY, int bitDepth);
   void xCalcBIOPar              (const Pel* srcY0Temp, const Pel* srcY1Temp, const Pel* gradX0, const Pel* gradX1, const Pel* gradY0, const Pel* gradY1, int* dotProductTemp1, int* dotProductTemp2, int* dotProductTemp3, int* dotProductTemp5, int* dotProductTemp6, const int src0Stride, const int src1Stride, const int gradStride, const int widthG, const int heightG, int bitDepth);
   void xCalcBlkGradient         (int sx, int sy, int    *arraysGx2, int     *arraysGxGy, int     *arraysGxdI, int     *arraysGy2, int     *arraysGydI, int     &sGx2, int     &sGy2, int     &sGxGy, int     &sGxdI, int     &sGydI, int width, int height, int unitSize);
-  void xWeightedAverage         ( const PredictionUnit& pu, const CPelUnitBuf& pcYuvSrc0, const CPelUnitBuf& pcYuvSrc1, PelUnitBuf& pcYuvDst, const BitDepths& clipBitDepths, const ClpRngs& clpRngs, const bool& bioApplied );  
+#if JVET_O0108_DIS_DMVR_BDOF_CIIP
+  void xWeightedAverage         ( const PredictionUnit& pu, const CPelUnitBuf& pcYuvSrc0, const CPelUnitBuf& pcYuvSrc1, PelUnitBuf& pcYuvDst, const BitDepths& clipBitDepths, const ClpRngs& clpRngs, const bool& bioApplied, PelUnitBuf* yuvDstTmp = NULL );
+#else
+  void xWeightedAverage         ( const PredictionUnit& pu, const CPelUnitBuf& pcYuvSrc0, const CPelUnitBuf& pcYuvSrc1, PelUnitBuf& pcYuvDst, const BitDepths& clipBitDepths, const ClpRngs& clpRngs, const bool& bioApplied );
+#endif
   void xPredAffineBlk( const ComponentID& compID, const PredictionUnit& pu, const Picture* refPic, const Mv* _mv, PelUnitBuf& dstPic, const bool& bi, const ClpRng& clpRng );
 
   void xWeightedTriangleBlk     ( const PredictionUnit &pu, const uint32_t width, const uint32_t height, const ComponentID compIdx, const bool splitDir, PelUnitBuf& predDst, PelUnitBuf& predSrc0, PelUnitBuf& predSrc1 );
@@ -144,7 +152,11 @@ protected:
   static bool xCheckIdenticalMotion( const PredictionUnit& pu );
 
   void xSubPuMC(PredictionUnit& pu, PelUnitBuf& predBuf, const RefPicList &eRefPicList = REF_PIC_LIST_X);
+#if JVET_O0108_DIS_DMVR_BDOF_CIIP
+  void xSubPuBio(PredictionUnit& pu, PelUnitBuf& predBuf, const RefPicList &eRefPicList = REF_PIC_LIST_X, PelUnitBuf* yuvDstTmp = NULL);
+#else
   void xSubPuBio(PredictionUnit& pu, PelUnitBuf& predBuf, const RefPicList &eRefPicList = REF_PIC_LIST_X);
+#endif
   void destroy();
 
 
@@ -162,6 +174,9 @@ public:
   // inter
   void    motionCompensation  (PredictionUnit &pu, PelUnitBuf& predBuf, const RefPicList &eRefPicList = REF_PIC_LIST_X
     , const bool luma = true, const bool chroma = true
+#if JVET_O0108_DIS_DMVR_BDOF_CIIP
+    , PelUnitBuf* predBufWOBIO = NULL
+#endif 
   );
   void    motionCompensation  (PredictionUnit &pu, const RefPicList &eRefPicList = REF_PIC_LIST_X
     , const bool luma = true, const bool chroma = true
diff --git a/source/Lib/CommonLib/TypeDef.h b/source/Lib/CommonLib/TypeDef.h
index 20b82d923439f451507eac6ce8835edfedf5ac55..4339638ffe63ba4a4d36249ee2e5288e621f50ae 100644
--- a/source/Lib/CommonLib/TypeDef.h
+++ b/source/Lib/CommonLib/TypeDef.h
@@ -116,6 +116,8 @@
 
 #define JVET_O0592_ENC_ME_IMP                             1 // JVET-O0592 encoder ME improvement
 
+#define JVET_O0108_DIS_DMVR_BDOF_CIIP                     1 // JVET_O0108 CE9-2.2: disable DMVR and BDOF for CIIP
+
 #define FIX_DB_MAX_TRANSFORM_SIZE                         1
 
 #define MRG_SHARELIST_SHARSIZE                            32
diff --git a/source/Lib/CommonLib/UnitTools.cpp b/source/Lib/CommonLib/UnitTools.cpp
index 58c3b2f15922b56125427f33751cb3a9dbf8452d..9b7b08be43a07b6128b95c762f77b2d55c7b3a81 100644
--- a/source/Lib/CommonLib/UnitTools.cpp
+++ b/source/Lib/CommonLib/UnitTools.cpp
@@ -1607,6 +1607,9 @@ bool PU::checkDMVRCondition(const PredictionUnit& pu)
   {
     return pu.mergeFlag
       && pu.mergeType == MRG_TYPE_DEFAULT_N
+#if JVET_O0108_DIS_DMVR_BDOF_CIIP
+      && !pu.mhIntraFlag
+#endif
       && !pu.cu->affine
       && !pu.mmvdMergeFlag
       && !pu.cu->mmvdSkip
diff --git a/source/Lib/EncoderLib/EncCu.cpp b/source/Lib/EncoderLib/EncCu.cpp
index 167cc79355c8bc1a27cf313a4b8420a74395fdba..32e624a85187a894b6e8d1fa3c14547d32ea43ca 100644
--- a/source/Lib/EncoderLib/EncCu.cpp
+++ b/source/Lib/EncoderLib/EncCu.cpp
@@ -130,6 +130,9 @@ void EncCu::create( EncCfg* encCfg )
   for (unsigned ui = 0; ui < MRG_MAX_NUM_CANDS; ui++)
   {
     m_acRealMergeBuffer[ui].create(chromaFormat, Area(0, 0, uiMaxWidth, uiMaxHeight));
+#if JVET_O0108_DIS_DMVR_BDOF_CIIP
+    m_acMergeTmpBuffer[ui].create(chromaFormat, Area(0, 0, uiMaxWidth, uiMaxHeight));
+#endif 
   }
   const unsigned maxNumTriangleCand = encCfg->getMaxNumTriangleCand();
   for (unsigned i = 0; i < maxNumTriangleCand; i++)
@@ -218,6 +221,9 @@ void EncCu::destroy()
   for (unsigned ui = 0; ui < MRG_MAX_NUM_CANDS; ui++)
   {
     m_acRealMergeBuffer[ui].destroy();
+#if JVET_O0108_DIS_DMVR_BDOF_CIIP
+    m_acMergeTmpBuffer[ui].destroy();
+#endif 
   }
   for( unsigned ui = 0; ui < TRIANGLE_MAX_NUM_CANDS; ui++ )
   {
@@ -1881,6 +1887,9 @@ void EncCu::xCheckRDCostMerge2Nx2N( CodingStructure *&tempCS, CodingStructure *&
   bool                                        bestIsSkip = false;
   bool                                        bestIsMMVDSkip = true;
   PelUnitBuf                                  acMergeBuffer[MRG_MAX_NUM_CANDS];
+#if JVET_O0108_DIS_DMVR_BDOF_CIIP
+  PelUnitBuf                                  acMergeTmpBuffer[MRG_MAX_NUM_CANDS];
+#endif
   PelUnitBuf                                  acMergeRealBuffer[MMVD_MRG_MAX_RD_BUF_NUM];
   PelUnitBuf *                                acMergeTempBuffer[MMVD_MRG_MAX_RD_NUM];
   PelUnitBuf *                                singleMergeTempBuffer;
@@ -2002,7 +2011,12 @@ void EncCu::xCheckRDCostMerge2Nx2N( CodingStructure *&tempCS, CodingStructure *&
         PU::spanMotionInfo( pu, mergeCtx );
         pu.mvRefine = true;
         distParam.cur = singleMergeTempBuffer->Y();
+#if JVET_O0108_DIS_DMVR_BDOF_CIIP
+        acMergeTmpBuffer[uiMergeCand] = m_acMergeTmpBuffer[uiMergeCand].getBuf(localUnitArea);
+        m_pcInterSearch->motionCompensation(pu, *singleMergeTempBuffer, REF_PIC_LIST_X, true, true, &(acMergeTmpBuffer[uiMergeCand]));
+#else
         m_pcInterSearch->motionCompensation(pu, *singleMergeTempBuffer);
+#endif
         acMergeBuffer[uiMergeCand] = m_acRealMergeBuffer[uiMergeCand].getBuf(localUnitArea);
         acMergeBuffer[uiMergeCand].copyFrom(*singleMergeTempBuffer);
         pu.mvRefine = false;
@@ -2066,7 +2080,11 @@ void EncCu::xCheckRDCostMerge2Nx2N( CodingStructure *&tempCS, CodingStructure *&
         for (uint32_t mergeCnt = 0; mergeCnt < std::min(std::min(NUM_MRG_SATD_CAND, (const int)mergeCtx.numValidMergeCand), 4); mergeCnt++)
         {
           uint32_t mergeCand = MHIntraMergeCand[mergeCnt];
+#if JVET_O0108_DIS_DMVR_BDOF_CIIP
+          acMergeTmpBuffer[mergeCand] = m_acMergeTmpBuffer[mergeCand].getBuf(localUnitArea);
+#else
           acMergeBuffer[mergeCand] = m_acRealMergeBuffer[mergeCand].getBuf(localUnitArea);
+#endif
 
           // estimate merge bits
           mergeCtx.setMergeInfo(pu, mergeCand);
@@ -2081,7 +2099,11 @@ void EncCu::xCheckRDCostMerge2Nx2N( CodingStructure *&tempCS, CodingStructure *&
             m_pcIntraSearch->predIntraAng(COMPONENT_Y, pu.cs->getPredBuf(pu).Y(), pu);
             m_pcIntraSearch->switchBuffer(pu, COMPONENT_Y, pu.cs->getPredBuf(pu).Y(), m_pcIntraSearch->getPredictorPtr2(COMPONENT_Y, intraCnt));
           }
+#if JVET_O0108_DIS_DMVR_BDOF_CIIP
+          pu.cs->getPredBuf(pu).copyFrom(acMergeTmpBuffer[mergeCand]);
+#else
           pu.cs->getPredBuf(pu).copyFrom(acMergeBuffer[mergeCand]);
+#endif
           if (pu.cs->slice->getLmcsEnabledFlag() && m_pcReshape->getCTUFlag())
           {
             pu.cs->getPredBuf(pu).Y().rspSignal(m_pcReshape->getFwdLUT());
@@ -2304,17 +2326,29 @@ void EncCu::xCheckRDCostMerge2Nx2N( CodingStructure *&tempCS, CodingStructure *&
         {
           uint32_t bufIdx = 0;
           PelBuf tmpBuf = tempCS->getPredBuf(pu).Y();
+#if JVET_O0108_DIS_DMVR_BDOF_CIIP
+          tmpBuf.copyFrom(acMergeTmpBuffer[uiMergeCand].Y());
+#else
           tmpBuf.copyFrom(acMergeBuffer[uiMergeCand].Y());
+#endif
           if (pu.cs->slice->getLmcsEnabledFlag() && m_pcReshape->getCTUFlag())
           {
             tmpBuf.rspSignal(m_pcReshape->getFwdLUT());
           }
           m_pcIntraSearch->geneWeightedPred(COMPONENT_Y, tmpBuf, pu, m_pcIntraSearch->getPredictorPtr2(COMPONENT_Y, bufIdx));
           tmpBuf = tempCS->getPredBuf(pu).Cb();
+#if JVET_O0108_DIS_DMVR_BDOF_CIIP
+          tmpBuf.copyFrom(acMergeTmpBuffer[uiMergeCand].Cb());
+#else
           tmpBuf.copyFrom(acMergeBuffer[uiMergeCand].Cb());
+#endif
           m_pcIntraSearch->geneWeightedPred(COMPONENT_Cb, tmpBuf, pu, m_pcIntraSearch->getPredictorPtr2(COMPONENT_Cb, bufIdx));
           tmpBuf = tempCS->getPredBuf(pu).Cr();
+#if JVET_O0108_DIS_DMVR_BDOF_CIIP
+          tmpBuf.copyFrom(acMergeTmpBuffer[uiMergeCand].Cr());
+#else
           tmpBuf.copyFrom(acMergeBuffer[uiMergeCand].Cr());
+#endif
           m_pcIntraSearch->geneWeightedPred(COMPONENT_Cr, tmpBuf, pu, m_pcIntraSearch->getPredictorPtr2(COMPONENT_Cr, bufIdx));
         }
         else
diff --git a/source/Lib/EncoderLib/EncCu.h b/source/Lib/EncoderLib/EncCu.h
index 8cf343cd68f30dd9a6ddcbaf369441e28a4b5aa0..67ef7f05fe518c8696cd083004a1919fccc4e2c9 100644
--- a/source/Lib/EncoderLib/EncCu.h
+++ b/source/Lib/EncoderLib/EncCu.h
@@ -123,6 +123,9 @@ private:
 
   PelStorage            m_acMergeBuffer[MMVD_MRG_MAX_RD_BUF_NUM];
   PelStorage            m_acRealMergeBuffer[MRG_MAX_NUM_CANDS];
+#if JVET_O0108_DIS_DMVR_BDOF_CIIP
+  PelStorage            m_acMergeTmpBuffer[MRG_MAX_NUM_CANDS];
+#endif
   PelStorage            m_acTriangleWeightedBuffer[TRIANGLE_MAX_NUM_CANDS]; // to store weighted prediction pixles
   double                m_mergeBestSATDCost;
   MotionInfo            m_SubPuMiBuf      [( MAX_CU_SIZE * MAX_CU_SIZE ) >> ( MIN_CU_LOG2 << 1 )];