diff --git a/source/Lib/CommonLib/Picture.h b/source/Lib/CommonLib/Picture.h
index 6bae4640da1b3d96f63a9933a7b293cdc13b0b87..931e72868db1aedec902563fd7641961ca2c4847 100644
--- a/source/Lib/CommonLib/Picture.h
+++ b/source/Lib/CommonLib/Picture.h
@@ -331,6 +331,7 @@ public:
 #if JVET_N0415_CTB_ALF
   std::vector<short> m_alfCtbFilterIndex;
   short* getAlfCtbFilterIndex() { return m_alfCtbFilterIndex.data(); }
+  std::vector<short>& getAlfCtbFilterIndexVec() { return m_alfCtbFilterIndex; }
   void resizeAlfCtbFilterIndex(int numEntries)
   {
     m_alfCtbFilterIndex.resize(numEntries);
diff --git a/source/Lib/CommonLib/Slice.cpp b/source/Lib/CommonLib/Slice.cpp
index 7d94f34c97a52dc7b10d530a41362f63d1fd5b45..cf805614f21826458552d02e8226421e395919f5 100644
--- a/source/Lib/CommonLib/Slice.cpp
+++ b/source/Lib/CommonLib/Slice.cpp
@@ -867,6 +867,20 @@ void Slice::copySliceInfo(Slice *pSrc, bool cpyAlmostAll)
   }
 
   m_cabacInitFlag                 = pSrc->m_cabacInitFlag;
+#if JVET_N0415_CTB_ALF
+  memcpy(m_apss, pSrc->m_apss, sizeof(m_apss)); // this might be quite unsafe
+  memcpy( m_tileGroupAlfEnabledFlag, pSrc->m_tileGroupAlfEnabledFlag, sizeof(m_tileGroupAlfEnabledFlag));
+  m_tileGroupNumAps               = pSrc->m_tileGroupNumAps;
+  m_tileGroupLumaApsId            = pSrc->m_tileGroupLumaApsId;
+  m_tileGroupChromaApsId          = pSrc->m_tileGroupChromaApsId;
+#else
+  m_apsId;
+  m_aps;
+  m_tileGroupAlfEnabledFlag;
+#endif
+#if JVET_N0329_IBC_SEARCH_IMP 
+  m_disableSATDForRd              = pSrc->m_disableSATDForRd;
+#endif
 
   m_bLMvdL1Zero                   = pSrc->m_bLMvdL1Zero;
   m_LFCrossSliceBoundaryFlag      = pSrc->m_LFCrossSliceBoundaryFlag;
diff --git a/source/Lib/DecoderLib/DecLib.cpp b/source/Lib/DecoderLib/DecLib.cpp
index 537e84d9641be6a5a34fadef6546538fdf9939a8..5225e37f1df085808446200e7c15621d725902d5 100644
--- a/source/Lib/DecoderLib/DecLib.cpp
+++ b/source/Lib/DecoderLib/DecLib.cpp
@@ -201,6 +201,9 @@ bool tryDecodePicture( Picture* pcEncPic, const int expectedPoc, const std::stri
 
                 if( pic->cs->sps->getALFEnabledFlag() )
                 {
+#if JVET_N0415_CTB_ALF
+                  std::copy(pic->getAlfCtbFilterIndexVec().begin(), pic->getAlfCtbFilterIndexVec().end(), pcEncPic->getAlfCtbFilterIndexVec().begin());
+#endif
                   for( int compIdx = 0; compIdx < MAX_NUM_COMPONENT; compIdx++ )
                   {
                     std::copy( pic->getAlfCtuEnableFlag()[compIdx].begin(), pic->getAlfCtuEnableFlag()[compIdx].end(), pcEncPic->getAlfCtuEnableFlag()[compIdx].begin() );
diff --git a/source/Lib/EncoderLib/EncGOP.cpp b/source/Lib/EncoderLib/EncGOP.cpp
index b8c9adc0699a8be180a5947bfc94ce7a2547259e..f7bd00073894005c8d8a7a685ac675cc6c482963 100644
--- a/source/Lib/EncoderLib/EncGOP.cpp
+++ b/source/Lib/EncoderLib/EncGOP.cpp
@@ -2575,7 +2575,14 @@ void EncGOP::compressGOP( int iPOCLast, int iNumPicRcvd, PicList& rcListPic,
         {
           ParameterSetMap<APS> *apsMap = m_pcEncLib->getApsMap();
           APS* aps = apsMap->getPS(apsId);
-          if (aps && apsMap->getChangedFlag(apsId))
+          bool writeAPS = aps && apsMap->getChangedFlag(apsId);
+          if( !aps && pcSlice->getAPSs() && pcSlice->getAPSs()[apsId] )
+          {
+            writeAPS = true;
+            aps = pcSlice->getAPSs()[apsId]; // use asp from slice header
+            *apsMap->allocatePS( apsId ) = *aps; //allocate and cpy
+          }
+          if (writeAPS )
           {
             actualTotalBits += xWriteAPS(accessUnit, aps);
             apsMap->clearChangedFlag(apsId);