diff --git a/source/Lib/EncoderLib/EncAdaptiveLoopFilter.cpp b/source/Lib/EncoderLib/EncAdaptiveLoopFilter.cpp
index 2d2fd56e493d08e7c830f208479cfd63ae063f9b..111872fb01d07910cea2fea261d8577a5b3ad311 100644
--- a/source/Lib/EncoderLib/EncAdaptiveLoopFilter.cpp
+++ b/source/Lib/EncoderLib/EncAdaptiveLoopFilter.cpp
@@ -562,11 +562,13 @@ void EncAdaptiveLoopFilter::create( const EncCfg* encCfg, const int picWidth, co
     }
   }
   m_trainingCovControl   = new uint8_t[m_numCTUsInPic];
+#if !JVET_R0327_ONE_PASS_CCALF
   m_unfilteredDistortion = new uint64_t *[1];
   for (int i = 0; i < 1; i++)
   {
     m_unfilteredDistortion[i] = new uint64_t[m_numCTUsInPic];
   }
+#endif
   for ( int i = 0; i < MAX_NUM_CC_ALF_FILTERS; i++ )
   {
     m_trainingDistortion[i] = new uint64_t[m_numCTUsInPic];
@@ -744,6 +746,7 @@ void EncAdaptiveLoopFilter::destroy()
     m_trainingCovControl = nullptr;
   }
 
+#if !JVET_R0327_ONE_PASS_CCALF
   for (int i = 0; i < 1; i++)
   {
     if (m_unfilteredDistortion[i])
@@ -754,6 +757,7 @@ void EncAdaptiveLoopFilter::destroy()
   }
   delete[] m_unfilteredDistortion;
   m_unfilteredDistortion = nullptr;
+#endif
 
   for ( int i = 0; i < MAX_NUM_CC_ALF_FILTERS; i++ )
   {
@@ -3368,7 +3372,7 @@ void EncAdaptiveLoopFilter::deriveCcAlfFilterCoeff( ComponentID compID, const Pe
   }
 }
 
-
+#if !JVET_R0327_ONE_PASS_CCALF
 void EncAdaptiveLoopFilter::computeLog2BlockSizeDistortion(const Pel *org, int orgStride, const Pel *dec, int decStride,
                                                            int height, int width, uint64_t *distortionBuf,
                                                            int distortionBufStride, int log2BlockWidth,
@@ -3403,7 +3407,21 @@ void EncAdaptiveLoopFilter::computeLog2BlockSizeDistortion(const Pel *org, int o
     dec += (decStride << log2BlockHeight);
   }
 }
+#endif
 
+#if JVET_R0327_ONE_PASS_CCALF
+void EncAdaptiveLoopFilter::determineControlIdcValues(CodingStructure &cs, const ComponentID compID, const PelBuf *buf,
+                                                      const int ctuWidthC, const int ctuHeightC, const int picWidthC,
+                                                      const int picHeightC, double **unfilteredDistortion,
+                                                      uint64_t *trainingDistortion[MAX_NUM_CC_ALF_FILTERS],
+                                                      uint64_t *lumaSwingGreaterThanThresholdCount,
+                                                      uint64_t *chromaSampleCountNearMidPoint,
+                                                      bool reuseTemporalFilterCoeff, uint8_t *trainingCovControl,
+                                                      uint8_t *filterControl, uint64_t &curTotalDistortion,
+                                                      double &curTotalRate, bool filterEnabled[MAX_NUM_CC_ALF_FILTERS],
+                                                      uint8_t  mapFilterIdxToFilterIdc[MAX_NUM_CC_ALF_FILTERS + 1],
+                                                      uint8_t &ccAlfFilterCount)
+#else
 void EncAdaptiveLoopFilter::determineControlIdcValues(CodingStructure &cs, const ComponentID compID, const PelBuf *buf,
                                                       const int ctuWidthC, const int ctuHeightC, const int picWidthC,
                                                       const int picHeightC, uint64_t **unfilteredDistortion,
@@ -3415,6 +3433,7 @@ void EncAdaptiveLoopFilter::determineControlIdcValues(CodingStructure &cs, const
                                                       double &curTotalRate, bool filterEnabled[MAX_NUM_CC_ALF_FILTERS],
                                                       uint8_t  mapFilterIdxToFilterIdc[MAX_NUM_CC_ALF_FILTERS + 1],
                                                       uint8_t &ccAlfFilterCount)
+#endif
 {
   bool curFilterEnabled[MAX_NUM_CC_ALF_FILTERS];
   std::fill_n(curFilterEnabled, MAX_NUM_CC_ALF_FILTERS, false);
@@ -3467,7 +3486,11 @@ void EncAdaptiveLoopFilter::determineControlIdcValues(CodingStructure &cs, const
 
         if (filterIdx == MAX_NUM_CC_ALF_FILTERS)
         {
+#if JVET_R0327_ONE_PASS_CCALF
+          ssd = (uint64_t)unfilteredDistortion[compID][ctuIdx];   // restore saved distortion computation
+#else
           ssd = unfilteredDistortion[0][ctuIdx];   // restore saved distortion computation
+#endif
         }
         else
         {
@@ -3671,18 +3694,26 @@ void EncAdaptiveLoopFilter::deriveCcAlfFilter( CodingStructure& cs, ComponentID
   const TempCtx ctxStartCcAlfFilterControlFlag  ( m_CtxCache, SubCtx( Ctx::CcAlfFilterControlFlag, m_CABACEstimator->getCtx() ) );
 
   // compute cost of not filtering
+#if !JVET_R0327_ONE_PASS_CCALF
   const Pel *org                = orgYuv.get( compID ).bufAt(0,0);
   const Pel *unfiltered         = dstYuv.get( compID ).bufAt(0,0);
   const int orgStride           = orgYuv.get( compID ).stride;
   const int unfilteredStride    = dstYuv.get( compID ).stride;
-#if !JVET_R0327_ONE_PASS_CCALF
   const Pel *filtered           = m_buf->bufAt(0,0);
   const int filteredStride      = m_buf->stride;
 #endif
   uint64_t unfilteredDistortion = 0;
+#if JVET_R0327_ONE_PASS_CCALF
+  for (int ctbIdx = 0; ctbIdx < m_numCTUsInPic; ctbIdx++)
+  {
+    unfilteredDistortion += (uint64_t)m_alfCovarianceCcAlf[compID - 1][0][0][ctbIdx].pixAcc;
+  }
+#else
   computeLog2BlockSizeDistortion(org, orgStride, unfiltered, unfilteredStride, m_buf->height, m_buf->width,
                                  m_unfilteredDistortion[0], m_numCTUsInWidth, cs.pcv->maxCUWidthLog2 - scaleX,
                                  cs.pcv->maxCUHeightLog2 - scaleY, unfilteredDistortion);
+#endif
+
   double bestUnfilteredTotalCost = 1 * m_lambda[compID] + unfilteredDistortion;   // 1 bit is for gating flag
 
   bool             ccAlfFilterIdxEnabled[MAX_NUM_CC_ALF_FILTERS];
@@ -3806,6 +3837,15 @@ void EncAdaptiveLoopFilter::deriveCcAlfFilter( CodingStructure& cs, ComponentID
 
         uint64_t curTotalDistortion = 0;
         double curTotalRate = 0;
+#if JVET_R0327_ONE_PASS_CCALF
+        determineControlIdcValues(cs, compID, m_buf, ctuWidthC, ctuHeightC, picWidthC, picHeightC,
+                                  m_ctbDistortionUnfilter, m_trainingDistortion,
+                                  m_lumaSwingGreaterThanThresholdCount,
+                                  m_chromaSampleCountNearMidPoint,
+                                  (referencingExistingAps == true),
+                                  m_trainingCovControl, m_filterControl, curTotalDistortion, curTotalRate,
+                                  ccAlfFilterIdxEnabled, mapFilterIdxToFilterIdc, ccAlfFilterCount);
+#else
         determineControlIdcValues(cs, compID, m_buf, ctuWidthC, ctuHeightC, picWidthC, picHeightC,
                                   m_unfilteredDistortion, m_trainingDistortion,
                                   m_lumaSwingGreaterThanThresholdCount,
@@ -3813,6 +3853,7 @@ void EncAdaptiveLoopFilter::deriveCcAlfFilter( CodingStructure& cs, ComponentID
                                   (referencingExistingAps == true),
                                   m_trainingCovControl, m_filterControl, curTotalDistortion, curTotalRate,
                                   ccAlfFilterIdxEnabled, mapFilterIdxToFilterIdc, ccAlfFilterCount);
+#endif
 
         // compute coefficient coding bit cost
         if (ccAlfFilterCount > 0)
diff --git a/source/Lib/EncoderLib/EncAdaptiveLoopFilter.h b/source/Lib/EncoderLib/EncAdaptiveLoopFilter.h
index aa399955e16d14b1f96c11675b49c6e83d082951..db4c7d313e4fa410cb1e0db36258d041a265d209 100644
--- a/source/Lib/EncoderLib/EncAdaptiveLoopFilter.h
+++ b/source/Lib/EncoderLib/EncAdaptiveLoopFilter.h
@@ -268,7 +268,9 @@ private:
   uint8_t*               m_trainingCovControl;
   Pel*                   m_bufOrigin;
   PelBuf*                m_buf;
+#if !JVET_R0327_ONE_PASS_CCALF
   uint64_t**             m_unfilteredDistortion;  // for different block size
+#endif
   uint64_t*              m_trainingDistortion[MAX_NUM_CC_ALF_FILTERS];    // for current block size
   uint64_t*              m_lumaSwingGreaterThanThresholdCount;
   uint64_t*              m_chromaSampleCountNearMidPoint;
@@ -360,9 +362,23 @@ private:
   int getMaxNumAlternativesChroma( );
   int  getCoeffRateCcAlf(short chromaCoeff[MAX_NUM_CC_ALF_FILTERS][MAX_NUM_CC_ALF_CHROMA_COEFF], bool filterEnabled[MAX_NUM_CC_ALF_FILTERS], uint8_t filterCount, ComponentID compID);
   void deriveCcAlfFilterCoeff( ComponentID compID, const PelUnitBuf& recYuv, const PelUnitBuf& recYuvExt, short filterCoeff[MAX_NUM_CC_ALF_FILTERS][MAX_NUM_CC_ALF_CHROMA_COEFF], const uint8_t filterIdx );
+#if !JVET_R0327_ONE_PASS_CCALF
   void computeLog2BlockSizeDistortion(const Pel *org, int orgStride, const Pel *dec, int decStride, int height,
                                       int width, uint64_t *distortionBuf, int distortionBufStride, int log2BlockWidth,
                                       int log2BlockHeight, uint64_t &totalDistortion);
+#endif
+#if JVET_R0327_ONE_PASS_CCALF
+  void determineControlIdcValues(CodingStructure &cs, const ComponentID compID, const PelBuf *buf, const int ctuWidthC,
+                                 const int ctuHeightC, const int picWidthC, const int picHeightC,
+                                 double **unfilteredDistortion, uint64_t *trainingDistortion[MAX_NUM_CC_ALF_FILTERS],
+                                 uint64_t *lumaSwingGreaterThanThresholdCount,
+                                 uint64_t *chromaSampleCountNearMidPoint,
+                                 bool reuseFilterCoeff, uint8_t *trainingCovControl, uint8_t *filterControl,
+                                 uint64_t &curTotalDistortion, double &curTotalRate,
+                                 bool     filterEnabled[MAX_NUM_CC_ALF_FILTERS],
+                                 uint8_t  mapFilterIdxToFilterIdc[MAX_NUM_CC_ALF_FILTERS + 1],
+                                 uint8_t &ccAlfFilterCount);
+#else
   void determineControlIdcValues(CodingStructure &cs, const ComponentID compID, const PelBuf *buf, const int ctuWidthC,
                                  const int ctuHeightC, const int picWidthC, const int picHeightC,
                                  uint64_t **unfilteredDistortion, uint64_t *trainingDistortion[MAX_NUM_CC_ALF_FILTERS],
@@ -373,6 +389,7 @@ private:
                                  bool     filterEnabled[MAX_NUM_CC_ALF_FILTERS],
                                  uint8_t  mapFilterIdxToFilterIdc[MAX_NUM_CC_ALF_FILTERS + 1],
                                  uint8_t &ccAlfFilterCount);
+#endif
   void deriveCcAlfFilter( CodingStructure& cs, ComponentID compID, const PelUnitBuf& orgYuv, const PelUnitBuf& tempDecYuvBuf, const PelUnitBuf& dstYuv );
   std::vector<int> getAvailableCcAlfApsIds(CodingStructure& cs, ComponentID compID);
   void xSetupCcAlfAPS( CodingStructure& cs );