diff --git a/cfg/per-class/formatRGB.cfg b/cfg/per-class/formatRGB.cfg
index fe065ff2f0920a6d63e87687c136e6dbe9ccfc82..a761a1d399d7f31d22a14c54e53b6aa38a0683e9 100644
--- a/cfg/per-class/formatRGB.cfg
+++ b/cfg/per-class/formatRGB.cfg
@@ -1,2 +1,3 @@
 ColorTransform : 1
-Log2MaxTbSize : 5
\ No newline at end of file
+Log2MaxTbSize : 5
+DualITree: 0
\ No newline at end of file
diff --git a/source/Lib/CommonLib/AdaptiveLoopFilter.cpp b/source/Lib/CommonLib/AdaptiveLoopFilter.cpp
index ab7287b5d22b009d6cc78c66d71e5acdcdb1b288..c82551538f0030392a409acbf836ab11adbc3c5d 100644
--- a/source/Lib/CommonLib/AdaptiveLoopFilter.cpp
+++ b/source/Lib/CommonLib/AdaptiveLoopFilter.cpp
@@ -1262,7 +1262,11 @@ void AdaptiveLoopFilter::filterBlk(AlfClassifier **classifier, const PelUnitBuf
           }
           else
           {
+#if JVET_R0208_ALF_VB_ROUNDING_FIX
+            sum = (sum + (1 << ((shift + 3) - 1))) >> (shift + 3);
+#else
             sum = (sum + offset) >> (shift + 3);
+#endif
           }
           sum += curr;
           pRec1[jj] = ClipPel( sum, clpRng );
@@ -1341,6 +1345,12 @@ void AdaptiveLoopFilter::filterBlkCcAlf(const PelBuf &dstBuf, const CPelUnitBuf
         const Pel *srcCross = lumaPtr + col + row * lumaStride;
 
         int pos = ((startHeight + i + ii) << scaleY) & (vbCTUHeight - 1);
+#if JVET_R0233_CCALF_LINE_BUFFER_REDUCTION
+        if (scaleY == 0 && (pos == vbPos || pos == vbPos + 1))
+        {
+          continue;
+        }
+#endif
         if (pos == (vbPos - 2) || pos == (vbPos + 1))
         {
           offset3 = offset1;
diff --git a/source/Lib/CommonLib/TypeDef.h b/source/Lib/CommonLib/TypeDef.h
index e8fd447a17345ed6918037ea37376d7be3fe1e03..3896965d6461f0fdfd16a322946096806d8f9151 100644
--- a/source/Lib/CommonLib/TypeDef.h
+++ b/source/Lib/CommonLib/TypeDef.h
@@ -52,9 +52,17 @@
 
 //########### place macros to be removed in next cycle below this line ###############
 
-#define JVET_Q0471_CHROMA_QT_SPLIT                        1 // JVET-Q0471: Chroma QT split
+
+
 #define JVET_R0156_ASPECT4_SPS_CLEANUP                    1 // JVET-R0071, R0156 aspect 4, R0284: Condition sps_independent_subpics_flag on "sps_num_subpics_minus1 > 0"
 
+#define JVET_R0233_CCALF_LINE_BUFFER_REDUCTION            1 // JVET-R0233 method 2: Line buffer reduction for CCALF
+
+#define JVET_Q0471_CHROMA_QT_SPLIT                        1 // JVET-Q0471: Chroma QT split
+#define JVET_R0208_ALF_VB_ROUNDING_FIX                    1 // JVET-R0208: Rounding offset fix for ALF virtual boundary processing
+#define JVET_R0232_CCALF_APS_CONSTRAINT                   1 // JVET-R0232 section 3.2: APS contraint for CCALF
+
+
 //########### place macros to be be kept below this line ###############
 
 #define JVET_M0497_MATRIX_MULT                            0 // 0: Fast method; 1: Matrix multiplication
diff --git a/source/Lib/CommonLib/version.h b/source/Lib/CommonLib/version.h
index c25c904c98faecd636a83262a3f3356071b3ddbd..908c57ea0e948777d395bed7ebb2fb9d258df0fc 100644
--- a/source/Lib/CommonLib/version.h
+++ b/source/Lib/CommonLib/version.h
@@ -1,3 +1,3 @@
 #if ! defined( VTM_VERSION )
-#define VTM_VERSION "8.1"
+#define VTM_VERSION "8.2"
 #endif
diff --git a/source/Lib/CommonLib/x86/AdaptiveLoopFilterX86.h b/source/Lib/CommonLib/x86/AdaptiveLoopFilterX86.h
index 295465d592d39ce3132853dc0484f94b85e26c70..12c44a2f87d0d8046c0e10fa31ff4dbbf4ef7467 100644
--- a/source/Lib/CommonLib/x86/AdaptiveLoopFilterX86.h
+++ b/source/Lib/CommonLib/x86/AdaptiveLoopFilterX86.h
@@ -313,6 +313,9 @@ static void simdFilter5x5Blk(AlfClassifier **classifier, const PelUnitBuf &recDs
 
   constexpr int SHIFT = AdaptiveLoopFilter::m_NUM_BITS - 1;
   constexpr int ROUND = 1 << (SHIFT - 1);
+#if JVET_R0208_ALF_VB_ROUNDING_FIX
+  const __m128i mmOffset1 = _mm_set1_epi32((1 << ((SHIFT + 3) - 1)) - ROUND);
+#endif
 
   const size_t width  = blk.width;
   const size_t height = blk.height;
@@ -425,8 +428,13 @@ static void simdFilter5x5Blk(AlfClassifier **classifier, const PelUnitBuf &recDs
         }
         else
         {
+#if JVET_R0208_ALF_VB_ROUNDING_FIX
+          accumA = _mm_srai_epi32(_mm_add_epi32(accumA, mmOffset1), SHIFT + 3);
+          accumB = _mm_srai_epi32(_mm_add_epi32(accumB, mmOffset1), SHIFT + 3);
+#else
           accumA = _mm_srai_epi32(accumA, SHIFT + 3);
           accumB = _mm_srai_epi32(accumB, SHIFT + 3);
+#endif
         }
         accumA = _mm_packs_epi32(accumA, accumB);
         accumA = _mm_add_epi16(accumA, cur);
@@ -507,6 +515,9 @@ static void simdFilter7x7Blk(AlfClassifier **classifier, const PelUnitBuf &recDs
   Pel *      dst = dstBuffer.buf + blkDst.y * dstStride + blkDst.x;
 
   const __m128i mmOffset = _mm_set1_epi32(ROUND);
+#if JVET_R0208_ALF_VB_ROUNDING_FIX
+  const __m128i mmOffset1 = _mm_set1_epi32((1 << ((SHIFT + 3) - 1)) - ROUND);
+#endif
   const __m128i mmMin = _mm_set1_epi16( clpRng.min );
   const __m128i mmMax = _mm_set1_epi16( clpRng.max );
 
@@ -655,8 +666,13 @@ static void simdFilter7x7Blk(AlfClassifier **classifier, const PelUnitBuf &recDs
         }
         else
         {
+#if JVET_R0208_ALF_VB_ROUNDING_FIX
+          accumA = _mm_srai_epi32(_mm_add_epi32(accumA, mmOffset1), SHIFT + 3);
+          accumB = _mm_srai_epi32(_mm_add_epi32(accumB, mmOffset1), SHIFT + 3);
+#else
           accumA = _mm_srai_epi32(accumA, SHIFT + 3);
           accumB = _mm_srai_epi32(accumB, SHIFT + 3);
+#endif 
         }
         accumA = _mm_packs_epi32(accumA, accumB);
         accumA = _mm_add_epi16(accumA, cur);
diff --git a/source/Lib/DecoderLib/DecLib.cpp b/source/Lib/DecoderLib/DecLib.cpp
index 567b1e07633d53dcb5ffe1df7c89f5ca1cf3dff3..81754874b54b0b715d5111717f1090f45e6439a6 100644
--- a/source/Lib/DecoderLib/DecLib.cpp
+++ b/source/Lib/DecoderLib/DecLib.cpp
@@ -980,6 +980,9 @@ bool DecLib::isSliceNaluFirstInAU( bool newPicture, InputNALUnit &nalu )
 
 void activateAPS(PicHeader* picHeader, Slice* pSlice, ParameterSetManager& parameterSetManager, APS** apss, APS* lmcsAPS, APS* scalingListAPS)
 {
+#if JVET_R0232_CCALF_APS_CONSTRAINT
+  const SPS *sps = parameterSetManager.getSPS(picHeader->getSPSId());
+#endif
   //luma APSs
   if (pSlice->getTileGroupAlfEnabledFlag(COMPONENT_Y))
   {
@@ -998,6 +1001,10 @@ void activateAPS(PicHeader* picHeader, Slice* pSlice, ParameterSetManager& param
 
         CHECK( aps->getTemporalId() > pSlice->getTLayer(), "TemporalId shall be less than or equal to the TemporalId of the coded slice NAL unit" );
         //ToDO: APS NAL unit containing the APS RBSP shall have nuh_layer_id either equal to the nuh_layer_id of a coded slice NAL unit that referrs it, or equal to the nuh_layer_id of a direct dependent layer of the layer containing a coded slice NAL unit that referrs it.
+
+#if JVET_R0232_CCALF_APS_CONSTRAINT
+        CHECK(((sps->getCCALFEnabledFlag() == false) && (aps->getCcAlfAPSParam().newCcAlfFilter[0] || aps->getCcAlfAPSParam().newCcAlfFilter[1])), "When sps_ccalf_enabled_flag is 0, the values of alf_cc_cb_filter_signal_flag and alf_cc_cr_filter_signal_flag shall be equal to 0");
+#endif
       }
     }
   }
@@ -1016,6 +1023,10 @@ void activateAPS(PicHeader* picHeader, Slice* pSlice, ParameterSetManager& param
 
       CHECK( aps->getTemporalId() > pSlice->getTLayer(), "TemporalId shall be less than or equal to the TemporalId of the coded slice NAL unit" );
       //ToDO: APS NAL unit containing the APS RBSP shall have nuh_layer_id either equal to the nuh_layer_id of a coded slice NAL unit that referrs it, or equal to the nuh_layer_id of a direct dependent layer of the layer containing a coded slice NAL unit that referrs it.
+
+#if JVET_R0232_CCALF_APS_CONSTRAINT
+      CHECK(((sps->getCCALFEnabledFlag() == false) && (aps->getCcAlfAPSParam().newCcAlfFilter[0] || aps->getCcAlfAPSParam().newCcAlfFilter[1])), "When sps_ccalf_enabled_flag is 0, the values of alf_cc_cb_filter_signal_flag and alf_cc_cr_filter_signal_flag shall be equal to 0");
+#endif
     }
   }
 
diff --git a/source/Lib/EncoderLib/EncAdaptiveLoopFilter.cpp b/source/Lib/EncoderLib/EncAdaptiveLoopFilter.cpp
index 82b2d9027aa76c235779b2a7be6f03506f6e557e..e7d06837ff7f6ce3d069d14efa0453328e8e88f1 100644
--- a/source/Lib/EncoderLib/EncAdaptiveLoopFilter.cpp
+++ b/source/Lib/EncoderLib/EncAdaptiveLoopFilter.cpp
@@ -4014,6 +4014,12 @@ void EncAdaptiveLoopFilter::getBlkStatsCcAlf(AlfCovariance &alfCovariance, const
   for (int i = 0; i < compArea.height; i++)
   {
     int vbDistance = ((i << getComponentScaleY(compID, m_chromaFormat)) % vbCTUHeight) - vbPos;
+#if JVET_R0233_CCALF_LINE_BUFFER_REDUCTION
+    if ((getComponentScaleY(compID, m_chromaFormat) == 0) && (vbDistance == 0 || vbDistance == 1))
+    {
+      continue;
+    }
+#endif
     for (int j = 0; j < compArea.width; j++)
     {
       std::memset(ELocal, 0, sizeof(ELocal));