diff --git a/source/Lib/EncoderLib/EncAdaptiveLoopFilter.cpp b/source/Lib/EncoderLib/EncAdaptiveLoopFilter.cpp
index b168a1e33f177bdafe045d0aa12d4c78fac7a646..c063f710319dcdb9e10246e76ca21c7df91eacfd 100644
--- a/source/Lib/EncoderLib/EncAdaptiveLoopFilter.cpp
+++ b/source/Lib/EncoderLib/EncAdaptiveLoopFilter.cpp
@@ -3386,11 +3386,22 @@ void EncAdaptiveLoopFilter::deriveStatsForFiltering( PelUnitBuf& orgYuv, PelUnit
     }
   }
 
-  initDistortion(
+  if (m_alfWSSD)
+  {
+    initDistortion<true>(
 #if ALF_IMPROVEMENT
-    cs
+      cs
 #endif
-  );
+      );
+  }
+  else
+  {
+    initDistortion<false>(
+#if ALF_IMPROVEMENT
+      cs
+#endif
+      );
+  }
 }
 
 #if ALF_IMPROVEMENT
@@ -3837,6 +3848,8 @@ std::vector<int> EncAdaptiveLoopFilter::getAvaiApsIdsLuma(CodingStructure& cs, i
   CHECK(newApsId >= ALF_CTB_MAX_NUM_APS, "Wrong APS index assignment in getAvaiApsIdsLuma");
   return result;
 }
+
+template<bool alfWSSD>
 void  EncAdaptiveLoopFilter::initDistortion(
 #if ALF_IMPROVEMENT
   CodingStructure& cs
@@ -3896,11 +3909,19 @@ void  EncAdaptiveLoopFilter::initDistortion(
           {
             for (int x = 0; x < width; x++)
             {
-              m_ctbDistortionFixedFilter[classifierIdx][filterSetIdx][ctbIdx] += (org[x] - m_fixFilterResult[fixedFilter][y + yPos][x + xPos]) *  (org[x] - m_fixFilterResult[fixedFilter][y + yPos][x + xPos]);
+              if (alfWSSD)
+              {
+                double weight = m_lumaLevelToWeightPLUT[org[x]];
+                m_ctbDistortionFixedFilter[classifierIdx][filterSetIdx][ctbIdx] += weight * (org[x] - m_fixFilterResult[fixedFilter][y + yPos][x + xPos]) *  (org[x] - m_fixFilterResult[fixedFilter][y + yPos][x + xPos]);
+              }
+              else
+              {
+                m_ctbDistortionFixedFilter[classifierIdx][filterSetIdx][ctbIdx] += (org[x] - m_fixFilterResult[fixedFilter][y + yPos][x + xPos]) *  (org[x] - m_fixFilterResult[fixedFilter][y + yPos][x + xPos]);
+              }
             }
             org += orgStride;
           }
-}
+        }
       }
       ctbIdx++;
     }
diff --git a/source/Lib/EncoderLib/EncAdaptiveLoopFilter.h b/source/Lib/EncoderLib/EncAdaptiveLoopFilter.h
index 7b738f6a4d7776c6994213884f1d1d33997250a8..a664c756827a9c53cada83423e184419b2318bf9 100644
--- a/source/Lib/EncoderLib/EncAdaptiveLoopFilter.h
+++ b/source/Lib/EncoderLib/EncAdaptiveLoopFilter.h
@@ -311,6 +311,8 @@ private:
 public:
   EncAdaptiveLoopFilter( int& apsIdStart );
   virtual ~EncAdaptiveLoopFilter() {}
+
+  template<bool alfWSSD>
   void  initDistortion(
 #if ALF_IMPROVEMENT
     CodingStructure& cs