diff --git a/source/Lib/CommonLib/AdaptiveLoopFilter.cpp b/source/Lib/CommonLib/AdaptiveLoopFilter.cpp
index 5eb7c0224c430020c585135b660ef213804250bc..631a841fce30a14173cefaa8babe82f1d39e0eb7 100644
--- a/source/Lib/CommonLib/AdaptiveLoopFilter.cpp
+++ b/source/Lib/CommonLib/AdaptiveLoopFilter.cpp
@@ -104,7 +104,9 @@ void AdaptiveLoopFilter::ALFProcess( CodingStructure& cs, AlfSliceParam& alfSlic
       {
         Area blk( xPos, yPos, width, height );
         deriveClassification( m_classifier, tmpYuv.get( COMPONENT_Y ), blk );
-
+#if JVET_L0664_ALF_REMOVE_LUMA_5x5
+        m_filter7x7Blk(m_classifier, recYuv, tmpYuv, blk, COMPONENT_Y, m_coeffFinal, m_clpRngs.comp[COMPONENT_Y]);
+#else
         if( alfSliceParam.lumaFilterType == ALF_FILTER_5 )
         {
           m_filter5x5Blk( m_classifier, recYuv, tmpYuv, blk, COMPONENT_Y, m_coeffFinal, m_clpRngs.comp[COMPONENT_Y] );
@@ -117,6 +119,7 @@ void AdaptiveLoopFilter::ALFProcess( CodingStructure& cs, AlfSliceParam& alfSlic
         {
           CHECK( 0, "Wrong ALF filter type" );
         }
+#endif
       }
 
       for( int compIdx = 1; compIdx < MAX_NUM_COMPONENT; compIdx++ )
@@ -140,8 +143,11 @@ void AdaptiveLoopFilter::ALFProcess( CodingStructure& cs, AlfSliceParam& alfSlic
 void AdaptiveLoopFilter::reconstructCoeff( AlfSliceParam& alfSliceParam, ChannelType channel, const bool bRedo )
 {
   int factor = ( 1 << ( m_NUM_BITS - 1 ) );
-
+#if JVET_L0664_ALF_REMOVE_LUMA_5x5
+  AlfFilterType filterType = isLuma( channel ) ? ALF_FILTER_7 : ALF_FILTER_5;
+#else
   AlfFilterType filterType = isLuma( channel ) ? alfSliceParam.lumaFilterType : ALF_FILTER_5;
+#endif
   int numClasses = isLuma( channel ) ? MAX_NUM_ALF_CLASSES : 1;
   int numCoeff = filterType == ALF_FILTER_5 ? 7 : 13;
   int numCoeffMinus1 = numCoeff - 1;
@@ -205,8 +211,9 @@ void AdaptiveLoopFilter::create( const int picWidth, const int picHeight, const
   m_numCTUsInWidth = ( m_picWidth / m_maxCUWidth ) + ( ( m_picWidth % m_maxCUWidth ) ? 1 : 0 );
   m_numCTUsInHeight = ( m_picHeight / m_maxCUHeight ) + ( ( m_picHeight % m_maxCUHeight ) ? 1 : 0 );
   m_numCTUsInPic = m_numCTUsInHeight * m_numCTUsInWidth;
-
+#if !JVET_L0664_ALF_REMOVE_LUMA_5x5
   m_filterShapes[CHANNEL_TYPE_LUMA].push_back( AlfFilterShape( 5 ) );
+#endif
   m_filterShapes[CHANNEL_TYPE_LUMA].push_back( AlfFilterShape( 7 ) );
   m_filterShapes[CHANNEL_TYPE_CHROMA].push_back( AlfFilterShape( 5 ) );
 
diff --git a/source/Lib/CommonLib/TypeDef.h b/source/Lib/CommonLib/TypeDef.h
index 9dd655b78be9685001fa8d8aee7ffb17330e03f5..e8336707e430f784b1c5a80c11e462976915b56a 100644
--- a/source/Lib/CommonLib/TypeDef.h
+++ b/source/Lib/CommonLib/TypeDef.h
@@ -50,6 +50,8 @@
 #include <assert.h>
 #include <cassert>
 
+#define JVET_L0664_ALF_REMOVE_LUMA_5x5                    1
+
 #define JVET_L0083_ALF_FRAC_BIT                           1 // Reduce number of ALF fractional bit to 7   
 
 #define JVET_L0082_ALF_COEF_BITS                          1 // ALF filter coefficient bitwidth constraints
@@ -1409,7 +1411,9 @@ struct AlfFilterShape
 struct AlfSliceParam
 {
   bool                         enabledFlag[MAX_NUM_COMPONENT];                          // alf_slice_enable_flag, alf_chroma_idc
+#if !JVET_L0664_ALF_REMOVE_LUMA_5x5
   AlfFilterType                lumaFilterType;                                          // filter_type_flag
+#endif
   bool                         chromaCtbPresentFlag;                                    // alf_chroma_ctb_present_flag
   short                        lumaCoeff[MAX_NUM_ALF_CLASSES * MAX_NUM_ALF_LUMA_COEFF]; // alf_coeff_luma_delta[i][j]
   short                        chromaCoeff[MAX_NUM_ALF_CHROMA_COEFF];                   // alf_coeff_chroma[i]
@@ -1423,7 +1427,9 @@ struct AlfSliceParam
   void reset()
   {
     std::memset( enabledFlag, false, sizeof( enabledFlag ) );
+#if !JVET_L0664_ALF_REMOVE_LUMA_5x5
     lumaFilterType = ALF_FILTER_5;
+#endif
     std::memset( lumaCoeff, 0, sizeof( lumaCoeff ) );
     std::memset( chromaCoeff, 0, sizeof( chromaCoeff ) );
     std::memset( filterCoeffDeltaIdx, 0, sizeof( filterCoeffDeltaIdx ) );
@@ -1437,7 +1443,9 @@ struct AlfSliceParam
   const AlfSliceParam& operator = ( const AlfSliceParam& src )
   {
     std::memcpy( enabledFlag, src.enabledFlag, sizeof( enabledFlag ) );
+#if !JVET_L0664_ALF_REMOVE_LUMA_5x5
     lumaFilterType = src.lumaFilterType;
+#endif
     std::memcpy( lumaCoeff, src.lumaCoeff, sizeof( lumaCoeff ) );
     std::memcpy( chromaCoeff, src.chromaCoeff, sizeof( chromaCoeff ) );
     std::memcpy( filterCoeffDeltaIdx, src.filterCoeffDeltaIdx, sizeof( filterCoeffDeltaIdx ) );
diff --git a/source/Lib/DecoderLib/VLCReader.cpp b/source/Lib/DecoderLib/VLCReader.cpp
index d6fb31df22c0cc30ce33710a9052b897ee778e5c..de6b9dc231d656fb738fb9e33940f6c0379beb6f 100644
--- a/source/Lib/DecoderLib/VLCReader.cpp
+++ b/source/Lib/DecoderLib/VLCReader.cpp
@@ -2269,10 +2269,10 @@ void HLSyntaxReader::alf( AlfSliceParam& alfSliceParam )
 
   xReadTruncBinCode( code, MAX_NUM_ALF_CLASSES );  //number_of_filters_minus1
   alfSliceParam.numLumaFilters = code + 1;
-
+#if !JVET_L0664_ALF_REMOVE_LUMA_5x5
   READ_FLAG( code, "filter_type_flag" );
   alfSliceParam.lumaFilterType = code ? ALF_FILTER_5 : ALF_FILTER_7;
-
+#endif
   if( alfSliceParam.numLumaFilters > 1 )
   {
     for( int i = 0; i < MAX_NUM_ALF_CLASSES; i++ )
@@ -2369,7 +2369,11 @@ void HLSyntaxReader::alfFilter( AlfSliceParam& alfSliceParam, const bool isChrom
   }
 
   // derive maxGolombIdx
+#if JVET_L0664_ALF_REMOVE_LUMA_5x5
+  AlfFilterShape alfShape( isChroma ? 5 : 7 );
+#else
   AlfFilterShape alfShape( isChroma ? 5 : ( alfSliceParam.lumaFilterType == ALF_FILTER_5 ? 5 : 7 ) );
+#endif
   const int maxGolombIdx = AdaptiveLoopFilter::getMaxGolombIdx( alfShape.filterType );
   READ_UVLC( code, "min_golomb_order" );
 
diff --git a/source/Lib/EncoderLib/EncAdaptiveLoopFilter.cpp b/source/Lib/EncoderLib/EncAdaptiveLoopFilter.cpp
index 2e16517680a0ab88234933460f4ed046d1855845..4be9e927099055a92c6bfb9e773fee7dddfb1877 100644
--- a/source/Lib/EncoderLib/EncAdaptiveLoopFilter.cpp
+++ b/source/Lib/EncoderLib/EncAdaptiveLoopFilter.cpp
@@ -340,11 +340,12 @@ void EncAdaptiveLoopFilter::alfEncoder( CodingStructure& cs, AlfSliceParam& alfS
   for( int iShapeIdx = 0; iShapeIdx < alfFilterShape.size(); iShapeIdx++ )
   {
     m_alfSliceParamTemp = alfSliceParam;
+#if !JVET_L0664_ALF_REMOVE_LUMA_5x5
     if( isLuma( channel ) )
     {
       m_alfSliceParamTemp.lumaFilterType = alfFilterShape[iShapeIdx].filterType;
     }
-
+#endif
     //1. get unfiltered distortion
     double cost = getUnfilteredDistortion( m_alfCovarianceFrame[channel][iShapeIdx], channel );
     cost /= 1.001; // slight preference for unfiltered choice
@@ -382,7 +383,11 @@ void EncAdaptiveLoopFilter::alfEncoder( CodingStructure& cs, AlfSliceParam& alfS
 
     //3. CTU decision
     double distUnfilter = 0;
+#if JVET_L0664_ALF_REMOVE_LUMA_5x5
+    const int iterNum = isLuma(channel) ? (2 * 4 + 1) : (2 * 2 + 1);
+#else
     const int iterNum = 2 * 2 + 1;
+#endif
 
     for( int iter = 0; iter < iterNum; iter++ )
     {
@@ -421,7 +426,11 @@ void EncAdaptiveLoopFilter::alfEncoder( CodingStructure& cs, AlfSliceParam& alfS
       int ctuIdx = 0;
       const int chromaScaleX = getComponentScaleX( compID, recBuf.chromaFormat );
       const int chromaScaleY = getComponentScaleY( compID, recBuf.chromaFormat );
+#if JVET_L0664_ALF_REMOVE_LUMA_5x5
+      AlfFilterType filterType = isLuma( compID ) ? ALF_FILTER_7 : ALF_FILTER_5;
+#else
       AlfFilterType filterType = isLuma( compID ) ? alfSliceParam.lumaFilterType : ALF_FILTER_5;
+#endif
       short* coeff = isLuma( compID ) ? m_coeffFinal : alfSliceParam.chromaCoeff;
 
       for( int yPos = 0; yPos < pcv.lumaHeight; yPos += pcv.maxCUHeight )
@@ -535,7 +544,11 @@ int EncAdaptiveLoopFilter::getCoeffRate( AlfSliceParam& alfSliceParam, bool isCh
   }
 
   memset( m_bitsCoeffScan, 0, sizeof( m_bitsCoeffScan ) );
+#if JVET_L0664_ALF_REMOVE_LUMA_5x5
+  AlfFilterShape alfShape( isChroma ? 5 : 7 );
+#else
   AlfFilterShape alfShape( isChroma ? 5 : ( alfSliceParam.lumaFilterType == ALF_FILTER_5 ? 5 : 7 ) );
+#endif
   const int maxGolombIdx = AdaptiveLoopFilter::getMaxGolombIdx( alfShape.filterType );
   const short* coeff = isChroma ? alfSliceParam.chromaCoeff : alfSliceParam.lumaCoeff;
   const int numFilters = isChroma ? 1 : alfSliceParam.numLumaFilters;
diff --git a/source/Lib/EncoderLib/VLCWriter.cpp b/source/Lib/EncoderLib/VLCWriter.cpp
index 31d205d12e0b73173c23ec2217a0abcb0d107b7c..f29ec0b3f6771e6874f832657be6f58ceab3991f 100644
--- a/source/Lib/EncoderLib/VLCWriter.cpp
+++ b/source/Lib/EncoderLib/VLCWriter.cpp
@@ -1569,8 +1569,9 @@ void HLSWriter::alf( const AlfSliceParam& alfSliceParam )
   truncatedUnaryEqProb( alfChromaIdc, 3 );   // alf_chroma_idc
 
   xWriteTruncBinCode( alfSliceParam.numLumaFilters - 1, MAX_NUM_ALF_CLASSES );  //number_of_filters_minus1
+#if !JVET_L0664_ALF_REMOVE_LUMA_5x5
   WRITE_FLAG( alfSliceParam.lumaFilterType == ALF_FILTER_5 ? 1 : 0, "filter_type_flag" );
-
+#endif
   if( alfSliceParam.numLumaFilters > 1 )
   {
     for( int i = 0; i < MAX_NUM_ALF_CLASSES; i++ )
@@ -1631,7 +1632,11 @@ void HLSWriter::alfFilter( const AlfSliceParam& alfSliceParam, const bool isChro
 
   static int bitsCoeffScan[EncAdaptiveLoopFilter::m_MAX_SCAN_VAL][EncAdaptiveLoopFilter::m_MAX_EXP_GOLOMB];
   memset( bitsCoeffScan, 0, sizeof( bitsCoeffScan ) );
+#if JVET_L0664_ALF_REMOVE_LUMA_5x5
+  AlfFilterShape alfShape( isChroma ? 5 : 7 );
+#else
   AlfFilterShape alfShape( isChroma ? 5 : ( alfSliceParam.lumaFilterType == ALF_FILTER_5 ? 5 : 7 ) );
+#endif
   const int maxGolombIdx = AdaptiveLoopFilter::getMaxGolombIdx( alfShape.filterType );
   const short* coeff = isChroma ? alfSliceParam.chromaCoeff : alfSliceParam.lumaCoeff;
   const int numFilters = isChroma ? 1 : alfSliceParam.numLumaFilters;