diff --git a/source/Lib/CommonLib/InterPrediction.cpp b/source/Lib/CommonLib/InterPrediction.cpp
index c679a4b58cf281738afa52baac86a8d28989577b..f6d45ebb1c7fc5dc1bcceb2b1077e174cb4dc315 100644
--- a/source/Lib/CommonLib/InterPrediction.cpp
+++ b/source/Lib/CommonLib/InterPrediction.cpp
@@ -21339,6 +21339,12 @@ void InterPrediction::deriveMVDcandAffine(const PredictionUnit& pu, RefPicList e
     for (int i = 0; i < numPt; i++)
     {
       PictureType pt = (i == 0) ? PIC_RECONSTRUCTION_0 : PIC_RECONSTRUCTION_1;
+#if JVET_AD0123_REF_PICTURE_PADDING_FOR_GDR
+      if (pt == PIC_RECONSTRUCTION_1)
+      {
+        padDirtyArea(pcCurPic, slice, pt);
+      }
+#endif
       mcFramePadOneSide(pcCurPic, slice, PAD_TOP, pPadBuffYUV, &blkDataTmp, pPadYUVContainerDyn, blkUnitAreaBuff,
         pCurBuffYUV, pt);
       mcFramePadOneSide(pcCurPic, slice, PAD_BOTTOM, pPadBuffYUV, &blkDataTmp, pPadYUVContainerDyn, blkUnitAreaBuff,
@@ -22019,3 +22025,31 @@ void InterPrediction::deriveMVDcandAffine(const PredictionUnit& pu, RefPicList e
     }
   }
 #endif
+
+#if JVET_AD0123_REF_PICTURE_PADDING_FOR_GDR
+  void InterPrediction::padDirtyArea(Picture* pcCurPic, Slice& slice, PictureType pt)
+  {
+    if (slice.getPicHeader()->getNumVerVirtualBoundaries() == 1)
+    {
+      const int maxCh = pcCurPic->chromaFormat == CHROMA_400 ? 0 : 2;
+      for (int chan = 0; chan <= maxCh; chan++)
+      {
+        const ComponentID ch = ComponentID(chan);
+        Pel* piTxtRec = pcCurPic->getBuf(ch, pt).bufAt(0, 0);
+        const int iStrideRec = pcCurPic->getBuf(ch, pt).stride;
+        const int iWidthFrm = slice.getPPS()->getPicWidthInLumaSamples() >> getComponentScaleX(ch, CHROMA_420);
+        const int iHeightFrm = slice.getPPS()->getPicHeightInLumaSamples() >> getComponentScaleY(ch, CHROMA_420);
+        const int posVBX = slice.getPicHeader()->getVirtualBoundariesPosX(0) >> getComponentScaleX(ch, CHROMA_420);
+
+        for (int idy = 0; idy < iHeightFrm; idy++)
+        {
+          for (int idx = posVBX; idx < iWidthFrm; idx++)
+          {
+            piTxtRec[idx] = piTxtRec[posVBX - 1];
+          }
+          piTxtRec += iStrideRec;
+        }
+      }
+    }
+  }
+#endif
diff --git a/source/Lib/CommonLib/InterPrediction.h b/source/Lib/CommonLib/InterPrediction.h
index 3e8afea62d90b94593d1e10fc52a39d8e4fad893..5df028806685149fd7f4995b538aaa3bbc307db4 100644
--- a/source/Lib/CommonLib/InterPrediction.h
+++ b/source/Lib/CommonLib/InterPrediction.h
@@ -1008,6 +1008,9 @@ public:
                          PredictionUnit *blkDataTmp, PelStorage *pPadYUVContainerDyn, const UnitArea blkUnitAreaBuff,
                          PelStorage *pCurBuffYUV, PictureType pt);
   void mcFramePadRepExt(Picture *pcCurPic, Slice &slice, PictureType pt);
+#if JVET_AD0123_REF_PICTURE_PADDING_FOR_GDR
+  void padDirtyArea(Picture* pcCurPic, Slice& slice, PictureType pt);
+#endif
 #else
   void mcFramePadOneSide(Picture *pcCurPic, Slice &slice, PadDirection padDir, PelStorage *pPadBuffYUV,
                          PredictionUnit *blkDataTmp, PelStorage *pPadYUVContainerDyn, const UnitArea blkUnitAreaBuff,
diff --git a/source/Lib/CommonLib/TypeDef.h b/source/Lib/CommonLib/TypeDef.h
index bfafcef6676860ca9ad21a4c85a5794c85e4a54e..c1a1f626f1be5c6341c2d1dcaf0104930e592298 100644
--- a/source/Lib/CommonLib/TypeDef.h
+++ b/source/Lib/CommonLib/TypeDef.h
@@ -255,6 +255,7 @@
 #define JVET_AC0144_AFFINE_DMVR_REGRESSION                1 // JVET-AC0144: DMVR for affine with regression refinement
 #define JVET_AC0158_PIXEL_AFFINE_MC                       1 // JVET-AC0158: Pixel based affine motion compensation
 #define JVET_AD0195_HIGH_PRECISION_BDOF_CORE              1 // JVET_AD0195: High-Precision MV Refinement for BDOF
+#define JVET_AD0123_REF_PICTURE_PADDING_FOR_GDR           1 // JVET-AD0123: Reference picture padding for GDR
 
 // Inter template matching tools
 #define ENABLE_INTER_TEMPLATE_MATCHING                    1 // It controls whether template matching is enabled for inter prediction