diff --git a/source/Lib/CommonLib/Slice.cpp b/source/Lib/CommonLib/Slice.cpp
index 2c671b5cc58a9f70a4c79b09a03eeefa2d258e39..1ddace57f163aabdd17a1db0b46db717588c8da6 100644
--- a/source/Lib/CommonLib/Slice.cpp
+++ b/source/Lib/CommonLib/Slice.cpp
@@ -4787,4 +4787,9 @@ void xTraceAccessUnitDelimiter()
 {
   DTRACE( g_trace_ctx, D_HEADER, "=========== Access Unit Delimiter ===========\n" );
 }
+
+void xTraceFillerData ()
+{
+  DTRACE( g_trace_ctx, D_HEADER, "=========== Filler Data ===========\n" );
+}
 #endif
diff --git a/source/Lib/CommonLib/Slice.h b/source/Lib/CommonLib/Slice.h
index adb09fdd2148ec8175753d4e3c3477e6e52592e4..b64534c3d68dd69398f73ac1a67197c4a4528c78 100644
--- a/source/Lib/CommonLib/Slice.h
+++ b/source/Lib/CommonLib/Slice.h
@@ -3288,6 +3288,7 @@ void xTraceAPSHeader();
 void xTracePictureHeader();
 void xTraceSliceHeader();
 void xTraceAccessUnitDelimiter();
+void xTraceFillerData();
 #endif
 
 #endif // __SLICE__
diff --git a/source/Lib/DecoderLib/DecLib.cpp b/source/Lib/DecoderLib/DecLib.cpp
index 6bbdd11d7661ce6a43e2b6d0467cfc9b3846b9f9..2f3b8d538018b3ad6a360eb9e77340bc572d94f7 100644
--- a/source/Lib/DecoderLib/DecLib.cpp
+++ b/source/Lib/DecoderLib/DecLib.cpp
@@ -3049,6 +3049,15 @@ bool DecLib::decode(InputNALUnit& nalu, int& iSkipFrame, int& iPOCLastDisplay, i
     case NAL_UNIT_EOB:
       return false;
 
+    case NAL_UNIT_FD:
+    {
+      FDReader fdReader;
+      uint32_t fdSize;
+      fdReader.parseFillerData(&(nalu.getBitstream()), fdSize);
+      msg( NOTICE, "Note: found NAL_UNIT_FD with %u bytes payload.\n", fdSize);
+      return false;
+    }
+
     case NAL_UNIT_RESERVED_IRAP_VCL_11:
     case NAL_UNIT_RESERVED_IRAP_VCL_12:
       msg( NOTICE, "Note: found reserved VCL NAL unit.\n");
diff --git a/source/Lib/DecoderLib/VLCReader.cpp b/source/Lib/DecoderLib/VLCReader.cpp
index f1747d3d7ae7a2a01d0b3097ac43ae2c615876c0..63a09ad3adbda53182345fd8f7738c1630eccba5 100644
--- a/source/Lib/DecoderLib/VLCReader.cpp
+++ b/source/Lib/DecoderLib/VLCReader.cpp
@@ -96,11 +96,6 @@ void  VLCReader::xReadFlagTr(uint32_t& rValue, const char *pSymbolName)
   DTRACE( g_trace_ctx, D_HEADER, "%-50s u(1)  : %d\n", pSymbolName, rValue );
 }
 
-void xTraceFillerData ()
-{
-  DTRACE( g_trace_ctx, D_HEADER, "=========== Filler Data ===========\n");
-}
-
 #endif
 
 #if RExt__DECODER_DEBUG_BIT_STATISTICS || ENABLE_TRACING
diff --git a/source/Lib/EncoderLib/EncGOP.cpp b/source/Lib/EncoderLib/EncGOP.cpp
index 91a453c49f3842df08dce7431e5803945b113966..61e596116892fa689c206089eb3dfca495fc27d5 100644
--- a/source/Lib/EncoderLib/EncGOP.cpp
+++ b/source/Lib/EncoderLib/EncGOP.cpp
@@ -428,6 +428,25 @@ void EncGOP::xWriteAccessUnitDelimiter (AccessUnit &accessUnit, Slice *slice)
   accessUnit.push_front(new NALUnitEBSP(nalu));
 }
 
+void EncGOP::xWriteFillerData (AccessUnit &accessUnit, Slice *slice, uint32_t &fdSize)
+{
+  FDWriter fdWriter;
+  OutputNALUnit nalu(NAL_UNIT_FD);
+  nalu.m_temporalId = slice->getTLayer();
+  int vpsId = slice->getSPS()->getVPSId();
+  if (vpsId == 0)
+  {
+    nalu.m_nuhLayerId = 0;
+  }
+  else
+  {
+    nalu.m_nuhLayerId = slice->getVPS()->getLayerId(0);
+  }
+  CHECK( nalu.m_temporalId != accessUnit.temporalId, "TemporalId shall be equal to the TemporalId of the AU containing the NAL unit" );
+  fdWriter.codeFD(nalu.m_Bitstream, fdSize);
+  accessUnit.push_back(new NALUnitEBSP(nalu));
+}
+
 // write SEI list into one NAL unit and add it to the Access unit at auPos
 void EncGOP::xWriteSEI (NalUnitType naluType, SEIMessages& seiMessages, AccessUnit &accessUnit, AccessUnit::iterator &auPos, int temporalId)
 {
diff --git a/source/Lib/EncoderLib/EncGOP.h b/source/Lib/EncoderLib/EncGOP.h
index d514474e3be6f20bb761dcd3a41b286ec624b3b2..50c1339e4e2e13f48061c8950159ccf84f068c5d 100644
--- a/source/Lib/EncoderLib/EncGOP.h
+++ b/source/Lib/EncoderLib/EncGOP.h
@@ -300,6 +300,8 @@ protected:
 
   void xWriteAccessUnitDelimiter (AccessUnit &accessUnit, Slice *slice);
 
+  void xWriteFillerData (AccessUnit &accessUnit, Slice *slice, uint32_t &fdSize);
+
   void xCreateIRAPLeadingSEIMessages (SEIMessages& seiMessages, const SPS *sps, const PPS *pps);
   void xCreatePerPictureSEIMessages (int picInGOP, SEIMessages& seiMessages, SEIMessages& nestedSeiMessages, Slice *slice);
   void xCreateFrameFieldInfoSEI (SEIMessages& seiMessages, Slice *slice, bool isField);
diff --git a/source/Lib/EncoderLib/VLCWriter.cpp b/source/Lib/EncoderLib/VLCWriter.cpp
index 30e06f6f348590d022eb751fadaa3c6e4ce1158c..6bba61eb1dcde92f82932705cc83153c84ce373a 100644
--- a/source/Lib/EncoderLib/VLCWriter.cpp
+++ b/source/Lib/EncoderLib/VLCWriter.cpp
@@ -180,6 +180,21 @@ void AUDWriter::codeAUD(OutputBitstream& bs, const bool audIrapOrGdrAuFlag, cons
   xWriteRbspTrailingBits();
 }
 
+void FDWriter::codeFD(OutputBitstream& bs, uint32_t &fdSize)
+{
+#if ENABLE_TRACING
+  xTraceFillerData();
+#endif
+  setBitstream(&bs);
+  uint32_t ffByte = 0xff;
+  while( fdSize )
+  {
+    WRITE_CODE (ffByte, 8, "ff_byte");
+    fdSize--;
+  }
+  xWriteRbspTrailingBits();
+}
+
 void HLSWriter::xCodeRefPicList( const ReferencePictureList* rpl, bool isLongTermPresent, uint32_t ltLsbBitsCount, const bool isForbiddenZeroDeltaPoc, int rplIdx)
 {
   uint32_t numRefPic = rpl->getNumberOfShorttermPictures() + rpl->getNumberOfLongtermPictures() + rpl->getNumberOfInterLayerPictures();
diff --git a/source/Lib/EncoderLib/VLCWriter.h b/source/Lib/EncoderLib/VLCWriter.h
index 45e7cb2010b0fb711266789e22f5d95c036c68af..20ed36ffeb24d11a1e7b8ed3b5351ec275048778 100644
--- a/source/Lib/EncoderLib/VLCWriter.h
+++ b/source/Lib/EncoderLib/VLCWriter.h
@@ -107,6 +107,14 @@ public:
   void  codeAUD(OutputBitstream& bs, const bool audIrapOrGdrAuFlag, const int pictureType);
 };
 
+class FDWriter : public VLCWriter
+{
+public:
+  FDWriter() {};
+  virtual ~FDWriter() {};
+
+  void  codeFD(OutputBitstream& bs, uint32_t &fdSize);
+};
 
 
 class HLSWriter : public VLCWriter