diff --git a/designs/vivado/scalp_firmware/2019.2/src/hdl/scalp_firmware.vhd b/designs/vivado/scalp_firmware/2019.2/src/hdl/scalp_firmware.vhd
index eeb0b8388dbcf2fba8aa515c005f858227e87c78..aceb82ea9b974f12f2f29d36bd3d5deb9f2ef210 100644
--- a/designs/vivado/scalp_firmware/2019.2/src/hdl/scalp_firmware.vhd
+++ b/designs/vivado/scalp_firmware/2019.2/src/hdl/scalp_firmware.vhd
@@ -15,7 +15,7 @@
 -- Tool version: 2019.2
 -- Description: scalp_firmware
 --
--- Last update: 2020-11-07
+-- Last update: 2020-11-08
 --
 ---------------------------------------------------------------------------------
 
@@ -711,114 +711,118 @@ begin
 
             BackPressurexB : block is
 
-                signal NorthSendXOFFxSN : std_ulogic                                             := '0';
-                signal NorthSendXOFFxSP : std_ulogic                                             := '0';
-                signal EastSendXOFFxSN  : std_ulogic                                             := '0';
-                signal EastSendXOFFxSP  : std_ulogic                                             := '0';
-                signal SouthSendXOFFxSN : std_ulogic                                             := '0';
-                signal SouthSendXOFFxSP : std_ulogic                                             := '0';
-                signal WestSendXOFFxSN  : std_ulogic                                             := '0';
-                signal WestSendXOFFxSP  : std_ulogic                                             := '0';
                 -- North
-                signal NorthNFCStatexDN : t_nfc_states                                           := C_NFC_IDLE;
-                signal NorthNFCStatexDP : t_nfc_states                                           := C_NFC_IDLE;
-                signal NorthNFCDataxDN  : std_ulogic_vector((C_AXI4_NFC_DATA_SIZE - 1) downto 0) := (others => '0');
-                signal NorthNFCDataxDP  : std_ulogic_vector((C_AXI4_NFC_DATA_SIZE - 1) downto 0) := (others => '0');
-                signal NorthNFCValidxSN : std_ulogic                                             := '0';
-                signal NorthNFCValidxSP : std_ulogic                                             := '0';
+                signal NorthProgFullxSN  : std_ulogic                                             := '0';
+                signal NorthProgFullxSP  : std_ulogic                                             := '0';
+                signal NorthProgEmptyxSN : std_ulogic                                             := '0';
+                signal NorthProgEmptyxSP : std_ulogic                                             := '0';
+                signal NorthNFCStatexDN  : t_nfc_states                                           := C_NFC_IDLE;
+                signal NorthNFCStatexDP  : t_nfc_states                                           := C_NFC_IDLE;
+                signal NorthNFCDataxDN   : std_ulogic_vector((C_AXI4_NFC_DATA_SIZE - 1) downto 0) := (others => '0');
+                signal NorthNFCDataxDP   : std_ulogic_vector((C_AXI4_NFC_DATA_SIZE - 1) downto 0) := (others => '0');
+                signal NorthNFCValidxSN  : std_ulogic                                             := '0';
+                signal NorthNFCValidxSP  : std_ulogic                                             := '0';
                 -- East
-                signal EastNFCStatexDN  : t_nfc_states                                           := C_NFC_IDLE;
-                signal EastNFCStatexDP  : t_nfc_states                                           := C_NFC_IDLE;
-                signal EastNFCDataxDN   : std_ulogic_vector((C_AXI4_NFC_DATA_SIZE - 1) downto 0) := (others => '0');
-                signal EastNFCDataxDP   : std_ulogic_vector((C_AXI4_NFC_DATA_SIZE - 1) downto 0) := (others => '0');
-                signal EastNFCValidxSN  : std_ulogic                                             := '0';
-                signal EastNFCValidxSP  : std_ulogic                                             := '0';
+                signal EastProgFullxSN   : std_ulogic                                             := '0';
+                signal EastProgFullxSP   : std_ulogic                                             := '0';
+                signal EastProgEmptyxSN  : std_ulogic                                             := '0';
+                signal EastProgEmptyxSP  : std_ulogic                                             := '0';
+                signal EastNFCStatexDN   : t_nfc_states                                           := C_NFC_IDLE;
+                signal EastNFCStatexDP   : t_nfc_states                                           := C_NFC_IDLE;
+                signal EastNFCDataxDN    : std_ulogic_vector((C_AXI4_NFC_DATA_SIZE - 1) downto 0) := (others => '0');
+                signal EastNFCDataxDP    : std_ulogic_vector((C_AXI4_NFC_DATA_SIZE - 1) downto 0) := (others => '0');
+                signal EastNFCValidxSN   : std_ulogic                                             := '0';
+                signal EastNFCValidxSP   : std_ulogic                                             := '0';
                 -- South
-                signal SouthNFCStatexDN : t_nfc_states                                           := C_NFC_IDLE;
-                signal SouthNFCStatexDP : t_nfc_states                                           := C_NFC_IDLE;
-                signal SouthNFCDataxDN  : std_ulogic_vector((C_AXI4_NFC_DATA_SIZE - 1) downto 0) := (others => '0');
-                signal SouthNFCDataxDP  : std_ulogic_vector((C_AXI4_NFC_DATA_SIZE - 1) downto 0) := (others => '0');
-                signal SouthNFCValidxSN : std_ulogic                                             := '0';
-                signal SouthNFCValidxSP : std_ulogic                                             := '0';
+                signal SouthProgFullxSN  : std_ulogic                                             := '0';
+                signal SouthProgFullxSP  : std_ulogic                                             := '0';
+                signal SouthProgEmptyxSN : std_ulogic                                             := '0';
+                signal SouthProgEmptyxSP : std_ulogic                                             := '0';
+                signal SouthNFCStatexDN  : t_nfc_states                                           := C_NFC_IDLE;
+                signal SouthNFCStatexDP  : t_nfc_states                                           := C_NFC_IDLE;
+                signal SouthNFCDataxDN   : std_ulogic_vector((C_AXI4_NFC_DATA_SIZE - 1) downto 0) := (others => '0');
+                signal SouthNFCDataxDP   : std_ulogic_vector((C_AXI4_NFC_DATA_SIZE - 1) downto 0) := (others => '0');
+                signal SouthNFCValidxSN  : std_ulogic                                             := '0';
+                signal SouthNFCValidxSP  : std_ulogic                                             := '0';
                 -- West
-                signal WestNFCStatexDN  : t_nfc_states                                           := C_NFC_IDLE;
-                signal WestNFCStatexDP  : t_nfc_states                                           := C_NFC_IDLE;
-                signal WestNFCDataxDN   : std_ulogic_vector((C_AXI4_NFC_DATA_SIZE - 1) downto 0) := (others => '0');
-                signal WestNFCDataxDP   : std_ulogic_vector((C_AXI4_NFC_DATA_SIZE - 1) downto 0) := (others => '0');
-                signal WestNFCValidxSN  : std_ulogic                                             := '0';
-                signal WestNFCValidxSP  : std_ulogic                                             := '0';
+                signal WestProgFullxSN   : std_ulogic                                             := '0';
+                signal WestProgFullxSP   : std_ulogic                                             := '0';
+                signal WestProgEmptyxSN  : std_ulogic                                             := '0';
+                signal WestProgEmptyxSP  : std_ulogic                                             := '0';
+                signal WestNFCStatexDN   : t_nfc_states                                           := C_NFC_IDLE;
+                signal WestNFCStatexDP   : t_nfc_states                                           := C_NFC_IDLE;
+                signal WestNFCDataxDN    : std_ulogic_vector((C_AXI4_NFC_DATA_SIZE - 1) downto 0) := (others => '0');
+                signal WestNFCDataxDP    : std_ulogic_vector((C_AXI4_NFC_DATA_SIZE - 1) downto 0) := (others => '0');
+                signal WestNFCValidxSN   : std_ulogic                                             := '0';
+                signal WestNFCValidxSP   : std_ulogic                                             := '0';
 
             begin  -- block BackPressurexB
 
-                NorthSendXONxAS : NorthSendXOFFxSN <= '1' when
-                                                      (NorthRXFromFifoS2MxD.ReadyxS = '0') or
-                                                      (NorthFifoStatusxD.ProgFullxS = '1') else
-                                                      '0';
-                EastSendXONxAS : EastSendXOFFxSN <= '1' when
-                                                    (EastRXFromFifoS2MxD.ReadyxS = '0') or
-                                                    (EastFifoStatusxD.ProgFullxS = '1') else
-                                                    '0';
-                SouthSendXONxAS : SouthSendXOFFxSN <= '1' when
-                                                      (SouthRXFromFifoS2MxD.ReadyxS = '0') or
-                                                      (SouthFifoStatusxD.ProgFullxS = '1') else
-                                                      '0';
-                WestSendXONxAS : WestSendXOFFxSN <= '1' when
-                                                    (WestRXFromFifoS2MxD.ReadyxS = '0') or
-                                                    (WestFifoStatusxD.ProgFullxS = '1') else
-                                                    '0';
                 -- NFC Data and valid signals
-                NorthNFCDataxAS  : NorthTXNFCM2SxD.DataxD  <= NorthNFCDataxDP;
-                NorthNFCValidxAS : NorthTXNFCM2SxD.ValidxS <= NorthNFCValidxSP;
-                EastNFCDataxAS   : EastTXNFCM2SxD.DataxD   <= EastNFCDataxDP;
-                EastNFCValidxAS  : EastTXNFCM2SxD.ValidxS  <= EastNFCValidxSP;
-                SouthNFCDataxAS  : SouthTXNFCM2SxD.DataxD  <= SouthNFCDataxDP;
-                SouthNFCValidxAS : SouthTXNFCM2SxD.ValidxS <= SouthNFCValidxSP;
-                WestNFCDataxAS   : WestTXNFCM2SxD.DataxD   <= WestNFCDataxDP;
-                WestNFCValidxAS  : WestTXNFCM2SxD.ValidxS  <= WestNFCValidxSP;
+                NorthNFCDataxAS   : NorthTXNFCM2SxD.DataxD  <= NorthNFCDataxDP;
+                NorthNFCValidxAS  : NorthTXNFCM2SxD.ValidxS <= NorthNFCValidxSP;
+                NorthProgFullxAS  : NorthProgFullxSN        <= NorthFifoStatusxD.ProgFullxS;
+                NorthProgEmptyxAS : NorthProgEmptyxSN       <= NorthFifoStatusxD.ProgEmptyxS;
+                EastNFCDataxAS    : EastTXNFCM2SxD.DataxD   <= EastNFCDataxDP;
+                EastNFCValidxAS   : EastTXNFCM2SxD.ValidxS  <= EastNFCValidxSP;
+                SouthNFCDataxAS   : SouthTXNFCM2SxD.DataxD  <= SouthNFCDataxDP;
+                SouthNFCValidxAS  : SouthTXNFCM2SxD.ValidxS <= SouthNFCValidxSP;
+                WestNFCDataxAS    : WestTXNFCM2SxD.DataxD   <= WestNFCDataxDP;
+                WestNFCValidxAS   : WestTXNFCM2SxD.ValidxS  <= WestNFCValidxSP;
 
                 UpdateRegxP : process (AuroraClkMasterxC.PllNotLockedxS,
                                        AuroraClkMasterxC.UserClkxC) is
                 begin  -- process UpdateRegxP
                     if not AuroraClkMasterxC.PllNotLockedxS then
-                        NorthSendXOFFxSP <= '0';
-                        EastSendXOFFxSP  <= '0';
-                        SouthSendXOFFxSP <= '0';
-                        WestSendXOFFxSP  <= '0';
-                        NorthNFCStatexDP <= C_NFC_IDLE;
-                        NorthNFCDataxDP  <= (others => '0');
-                        NorthNFCValidxSP <= '0';
-                        EastNFCStatexDP  <= C_NFC_IDLE;
-                        EastNFCDataxDP   <= (others => '0');
-                        EastNFCValidxSP  <= '0';
-                        SouthNFCStatexDP <= C_NFC_IDLE;
-                        SouthNFCDataxDP  <= (others => '0');
-                        SouthNFCValidxSP <= '0';
-                        WestNFCStatexDP  <= C_NFC_IDLE;
-                        WestNFCDataxDP   <= (others => '0');
-                        WestNFCValidxSP  <= '0';
+                        NorthProgFullxSP  <= '0';
+                        NorthProgEmptyxSP <= '0';
+                        NorthNFCStatexDP  <= C_NFC_IDLE;
+                        NorthNFCDataxDP   <= (others => '0');
+                        NorthNFCValidxSP  <= '0';
+                        EastProgFullxSP   <= '0';
+                        EastProgEmptyxSP  <= '0';
+                        EastNFCStatexDP   <= C_NFC_IDLE;
+                        EastNFCDataxDP    <= (others => '0');
+                        EastNFCValidxSP   <= '0';
+                        SouthProgFullxSP  <= '0';
+                        SouthProgEmptyxSP <= '0';
+                        SouthNFCStatexDP  <= C_NFC_IDLE;
+                        SouthNFCDataxDP   <= (others => '0');
+                        SouthNFCValidxSP  <= '0';
+                        WestProgFullxSP   <= '0';
+                        WestProgEmptyxSP  <= '0';
+                        WestNFCStatexDP   <= C_NFC_IDLE;
+                        WestNFCDataxDP    <= (others => '0');
+                        WestNFCValidxSP   <= '0';
                     elsif rising_edge(AuroraClkMasterxC.UserClkxC) then
-                        NorthSendXOFFxSP <= NorthSendXOFFxSN;
-                        EastSendXOFFxSP  <= EastSendXOFFxSN;
-                        SouthSendXOFFxSP <= SouthSendXOFFxSN;
-                        WestSendXOFFxSP  <= WestSendXOFFxSN;
-                        NorthNFCStatexDP <= NorthNFCStatexDN;
-                        NorthNFCDataxDP  <= NorthNFCDataxDN;
-                        NorthNFCValidxSP <= NorthNFCValidxSN;
-                        EastNFCStatexDP  <= EastNFCStatexDN;
-                        EastNFCDataxDP   <= EastNFCDataxDN;
-                        EastNFCValidxSP  <= EastNFCValidxSN;
-                        SouthNFCStatexDP <= SouthNFCStatexDN;
-                        SouthNFCDataxDP  <= SouthNFCDataxDN;
-                        SouthNFCValidxSP <= SouthNFCValidxSN;
-                        WestNFCStatexDP  <= WestNFCStatexDN;
-                        WestNFCDataxDP   <= WestNFCDataxDN;
-                        WestNFCValidxSP  <= WestNFCValidxSN;
+                        NorthProgFullxSP  <= NorthProgFullxSN;
+                        NorthProgEmptyxSP <= NorthProgEmptyxSN;
+                        NorthNFCStatexDP  <= NorthNFCStatexDN;
+                        NorthNFCDataxDP   <= NorthNFCDataxDN;
+                        NorthNFCValidxSP  <= NorthNFCValidxSN;
+                        EastProgFullxSP   <= EastProgFullxSN;
+                        EastProgEmptyxSP  <= EastProgEmptyxSN;
+                        EastNFCStatexDP   <= EastNFCStatexDN;
+                        EastNFCDataxDP    <= EastNFCDataxDN;
+                        EastNFCValidxSP   <= EastNFCValidxSN;
+                        SouthProgFullxSP  <= SouthProgFullxSN;
+                        SouthProgEmptyxSP <= SouthProgEmptyxSN;
+                        SouthNFCStatexDP  <= SouthNFCStatexDN;
+                        SouthNFCDataxDP   <= SouthNFCDataxDN;
+                        SouthNFCValidxSP  <= SouthNFCValidxSN;
+                        WestProgFullxSP   <= WestProgFullxSN;
+                        WestProgEmptyxSP  <= WestProgEmptyxSN;
+                        WestNFCStatexDP   <= WestNFCStatexDN;
+                        WestNFCDataxDP    <= WestNFCDataxDN;
+                        WestNFCValidxSP   <= WestNFCValidxSN;
                     end if;
                 end process UpdateRegxP;
 
                 NorthNFCStatexP : process (NorthNFCDataxDP, NorthNFCStatexDP,
-                                           NorthNFCValidxSP, NorthSendXOFFxSN,
-                                           NorthSendXOFFxSP,
+                                           NorthNFCValidxSP, NorthProgEmptyxSN,
+                                           NorthProgEmptyxSP, NorthProgFullxSN,
+                                           NorthProgFullxSP,
+                                           NorthRXFromFifoS2MxD.ReadyxS,
                                            NorthTXUFCS2MxD.ReadyxS) is
                 begin  -- process NorthNFCStatexP
                     -- Default values
@@ -830,14 +834,16 @@ begin
                         when C_NFC_IDLE =>
                                 NorthNFCStatexDN <= C_NFC_IS_XON;
                         when C_NFC_IS_XON =>
-                                if NorthSendXOFFxSP = '0' and NorthSendXOFFxSN = '1' then
+                                if (NorthProgFullxSP = '0' and NorthProgFullxSN = '1') or
+                                    (NorthRXFromFifoS2MxD.ReadyxS = '0') then
                                     NorthNFCDataxDN  <= C_NFC_XOFF;
                                     NorthNFCValidxSN <= '1';
                                     NorthNFCStatexDN <= C_NFC_SEND_XOFF;
                                 end if;
 
                         when C_NFC_IS_XOFF =>
-                                if NorthSendXOFFxSP = '1' and NorthSendXOFFxSN = '0' then
+                                if (NorthProgEmptyxSP = '0' and NorthProgEmptyxSN = '1') and
+                                    (NorthRXFromFifoS2MxD.ReadyxS = '1') then
                                     NorthNFCDataxDN  <= C_NFC_XON;
                                     NorthNFCValidxSN <= '1';
                                     NorthNFCStatexDN <= C_NFC_SEND_XON;
@@ -861,8 +867,10 @@ begin
                 end process NorthNFCStatexP;
 
                 EastNFCStatexP : process (EastNFCDataxDP, EastNFCStatexDP,
-                                          EastNFCValidxSP, EastSendXOFFxSN,
-                                          EastSendXOFFxSP,
+                                          EastNFCValidxSP, EastProgEmptyxSN,
+                                          EastProgEmptyxSP, EastProgFullxSN,
+                                          EastProgFullxSP,
+                                          EastRXFromFifoS2MxD.ReadyxS,
                                           EastTXUFCS2MxD.ReadyxS) is
                 begin  -- process EastNFCStatexP
                     -- Default values
@@ -874,14 +882,16 @@ begin
                         when C_NFC_IDLE =>
                                 EastNFCStatexDN <= C_NFC_IS_XON;
                         when C_NFC_IS_XON =>
-                                if EastSendXOFFxSP = '0' and EastSendXOFFxSN = '1' then
+                                if (EastProgFullxSP = '0' and EastProgFullxSN = '1') or
+                                    (EastRXFromFifoS2MxD.ReadyxS = '0') then
                                     EastNFCDataxDN  <= C_NFC_XOFF;
                                     EastNFCValidxSN <= '1';
                                     EastNFCStatexDN <= C_NFC_SEND_XOFF;
                                 end if;
 
                         when C_NFC_IS_XOFF =>
-                                if EastSendXOFFxSP = '1' and EastSendXOFFxSN = '0' then
+                                if (EastProgEmptyxSP = '0' and EastProgEmptyxSN = '1') and
+                                    (EastRXFromFifoS2MxD.ReadyxS = '1') then
                                     EastNFCDataxDN  <= C_NFC_XON;
                                     EastNFCValidxSN <= '1';
                                     EastNFCStatexDN <= C_NFC_SEND_XON;
@@ -905,8 +915,10 @@ begin
                 end process EastNFCStatexP;
 
                 SouthNFCStatexP : process (SouthNFCDataxDP, SouthNFCStatexDP,
-                                           SouthNFCValidxSP, SouthSendXOFFxSN,
-                                           SouthSendXOFFxSP,
+                                           SouthNFCValidxSP, SouthProgEmptyxSN,
+                                           SouthProgEmptyxSP, SouthProgFullxSN,
+                                           SouthProgFullxSP,
+                                           SouthRXFromFifoS2MxD.ReadyxS,
                                            SouthTXUFCS2MxD.ReadyxS) is
                 begin  -- process SouthNFCStatexP
                     -- Default values
@@ -918,14 +930,16 @@ begin
                         when C_NFC_IDLE =>
                                 SouthNFCStatexDN <= C_NFC_IS_XON;
                         when C_NFC_IS_XON =>
-                                if SouthSendXOFFxSP = '0' and SouthSendXOFFxSN = '1' then
+                                if (SouthProgFullxSP = '0' and SouthProgFullxSN = '1') or
+                                    (SouthRXFromFifoS2MxD.ReadyxS = '0') then
                                     SouthNFCDataxDN  <= C_NFC_XOFF;
                                     SouthNFCValidxSN <= '1';
                                     SouthNFCStatexDN <= C_NFC_SEND_XOFF;
                                 end if;
 
                         when C_NFC_IS_XOFF =>
-                                if SouthSendXOFFxSP = '1' and SouthSendXOFFxSN = '0' then
+                                if (SouthProgEmptyxSP = '0' and SouthProgEmptyxSN = '1') and
+                                    (SouthRXFromFifoS2MxD.ReadyxS = '1') then
                                     SouthNFCDataxDN  <= C_NFC_XON;
                                     SouthNFCValidxSN <= '1';
                                     SouthNFCStatexDN <= C_NFC_SEND_XON;
@@ -949,8 +963,10 @@ begin
                 end process SouthNFCStatexP;
 
                 WestNFCStatexP : process (WestNFCDataxDP, WestNFCStatexDP,
-                                          WestNFCValidxSP, WestSendXOFFxSN,
-                                          WestSendXOFFxSP,
+                                          WestNFCValidxSP, WestProgEmptyxSN,
+                                          WestProgEmptyxSP, WestProgFullxSN,
+                                          WestProgFullxSP,
+                                          WestRXFromFifoS2MxD.ReadyxS,
                                           WestTXUFCS2MxD.ReadyxS) is
                 begin  -- process WestNFCStatexP
                     -- Default values
@@ -962,14 +978,16 @@ begin
                         when C_NFC_IDLE =>
                                 WestNFCStatexDN <= C_NFC_IS_XON;
                         when C_NFC_IS_XON =>
-                                if WestSendXOFFxSP = '0' and WestSendXOFFxSN = '1' then
+                                if (WestProgFullxSP = '0' and WestProgFullxSN = '1') or
+                                    (WestRXFromFifoS2MxD.ReadyxS = '0') then
                                     WestNFCDataxDN  <= C_NFC_XOFF;
                                     WestNFCValidxSN <= '1';
                                     WestNFCStatexDN <= C_NFC_SEND_XOFF;
                                 end if;
 
                         when C_NFC_IS_XOFF =>
-                                if WestSendXOFFxSP = '1' and WestSendXOFFxSN = '0' then
+                                if (WestProgEmptyxSP = '0' and WestProgEmptyxSN = '1') and
+                                    (WestRXFromFifoS2MxD.ReadyxS = '1') then
                                     WestNFCDataxDN  <= C_NFC_XON;
                                     WestNFCValidxSN <= '1';
                                     WestNFCStatexDN <= C_NFC_SEND_XON;