diff --git a/Bootloaders/CDC/BootloaderAPI.c b/Bootloaders/CDC/BootloaderAPI.c
index 2be15680822765d74f2dfe61c346345d7e106d64..5198ea7f01f674e33312821f654ac7053f12b5e5 100644
--- a/Bootloaders/CDC/BootloaderAPI.c
+++ b/Bootloaders/CDC/BootloaderAPI.c
@@ -37,16 +37,22 @@
 
 void BootloaderAPI_ErasePage(const uint32_t Address)
 {
-	boot_page_erase_safe(Address);
-	boot_spm_busy_wait();
-	boot_rww_enable();
+	ATOMIC_BLOCK(ATOMIC_RESTORESTATE)
+	{
+		boot_page_erase_safe(Address);
+		boot_spm_busy_wait();
+		boot_rww_enable();
+	}
 }
 
 void BootloaderAPI_WritePage(const uint32_t Address)
 {
-	boot_page_write_safe(Address);
-	boot_spm_busy_wait();
-	boot_rww_enable();
+	ATOMIC_BLOCK(ATOMIC_RESTORESTATE)
+	{
+		boot_page_write_safe(Address);
+		boot_spm_busy_wait();
+		boot_rww_enable();
+	}
 }
 
 void BootloaderAPI_FillWord(const uint32_t Address, const uint16_t Word)
@@ -71,5 +77,8 @@ uint8_t BootloaderAPI_ReadLock(void)
 
 void BootloaderAPI_WriteLock(const uint8_t LockBits)
 {
-	boot_lock_bits_set_safe(LockBits);
+	ATOMIC_BLOCK(ATOMIC_RESTORESTATE)
+	{
+		boot_lock_bits_set_safe(LockBits);
+	}
 }
diff --git a/Bootloaders/CDC/BootloaderAPI.h b/Bootloaders/CDC/BootloaderAPI.h
index 5169bbc3c4b29ddc2a205ecbe81c31eba41584d5..8f119d7922a7bb5472bd9452096db393a10ea773 100644
--- a/Bootloaders/CDC/BootloaderAPI.h
+++ b/Bootloaders/CDC/BootloaderAPI.h
@@ -39,6 +39,7 @@
 	/* Includes: */
 		#include <avr/io.h>
 		#include <avr/boot.h>
+		#include <util/atomic.h>
 		#include <stdbool.h>
 
 		#include <LUFA/Common/Common.h>
diff --git a/Bootloaders/CDC/BootloaderCDC.c b/Bootloaders/CDC/BootloaderCDC.c
index aa17bc15bdf735c9dfe0dddfdcb4e13b82e02dc5..d386aff74ab8f25251c624fef2f9e4658cdd277c 100644
--- a/Bootloaders/CDC/BootloaderCDC.c
+++ b/Bootloaders/CDC/BootloaderCDC.c
@@ -97,7 +97,7 @@ void Application_Jump_Check(void)
 		JTAG_ENABLE();
 	#else
 		/* Check if the device's BOOTRST fuse is set */
-		if (boot_lock_fuse_bits_get(GET_HIGH_FUSE_BITS) & FUSE_BOOTRST)
+		if (BootloaderAPI_ReadFuse(GET_HIGH_FUSE_BITS) & FUSE_BOOTRST)
 		{
 			/* If the reset source was not an external reset or the key is correct, clear it and jump to the application */
 			if (!(MCUSR & (1 << EXTRF)) || (MagicBootKey == MAGIC_BOOT_KEY))
@@ -297,9 +297,6 @@ static void ReadWriteMemoryBlock(const uint8_t Command)
 	/* Check if command is to read a memory block */
 	if (Command == AVR109_COMMAND_BlockRead)
 	{
-		/* Re-enable RWW section */
-		boot_rww_enable();
-
 		while (BlockSize--)
 		{
 			if (MemoryType == MEMORY_TYPE_FLASH)
@@ -332,10 +329,7 @@ static void ReadWriteMemoryBlock(const uint8_t Command)
 		uint32_t PageStartAddress = CurrAddress;
 
 		if (MemoryType == MEMORY_TYPE_FLASH)
-		{
-			boot_page_erase(PageStartAddress);
-			boot_spm_busy_wait();
-		}
+		  BootloaderAPI_ErasePage(PageStartAddress);
 
 		while (BlockSize--)
 		{
@@ -345,7 +339,7 @@ static void ReadWriteMemoryBlock(const uint8_t Command)
 				if (HighByte)
 				{
 					/* Write the next FLASH word to the current FLASH page */
-					boot_page_fill(CurrAddress, ((FetchNextCommandByte() << 8) | LowByte));
+					BootloaderAPI_FillWord(CurrAddress, ((FetchNextCommandByte() << 8) | LowByte));
 
 					/* Increment the address counter after use */
 					CurrAddress += 2;
@@ -371,10 +365,7 @@ static void ReadWriteMemoryBlock(const uint8_t Command)
 		if (MemoryType == MEMORY_TYPE_FLASH)
 		{
 			/* Commit the flash page to memory */
-			boot_page_write(PageStartAddress);
-
-			/* Wait until write operation has completed */
-			boot_spm_busy_wait();
+			BootloaderAPI_WritePage(PageStartAddress);
 		}
 
 		/* Send response byte back to the host */
@@ -516,12 +507,7 @@ static void CDC_Task(void)
 	{
 		/* Clear the application section of flash */
 		for (uint32_t CurrFlashAddress = 0; CurrFlashAddress < (uint32_t)BOOT_START_ADDR; CurrFlashAddress += SPM_PAGESIZE)
-		{
-			boot_page_erase(CurrFlashAddress);
-			boot_spm_busy_wait();
-			boot_page_write(CurrFlashAddress);
-			boot_spm_busy_wait();
-		}
+			BootloaderAPI_ErasePage(CurrFlashAddress);
 
 		/* Send confirmation byte back to the host */
 		WriteNextResponseByte('\r');
@@ -530,7 +516,7 @@ static void CDC_Task(void)
 	else if (Command == AVR109_COMMAND_WriteLockbits)
 	{
 		/* Set the lock bits to those given by the host */
-		boot_lock_bits_set(FetchNextCommandByte());
+		BootloaderAPI_WriteLock(FetchNextCommandByte());
 
 		/* Send confirmation byte back to the host */
 		WriteNextResponseByte('\r');
@@ -538,19 +524,19 @@ static void CDC_Task(void)
 	#endif
 	else if (Command == AVR109_COMMAND_ReadLockbits)
 	{
-		WriteNextResponseByte(boot_lock_fuse_bits_get(GET_LOCK_BITS));
+		WriteNextResponseByte(BootloaderAPI_ReadLock());
 	}
 	else if (Command == AVR109_COMMAND_ReadLowFuses)
 	{
-		WriteNextResponseByte(boot_lock_fuse_bits_get(GET_LOW_FUSE_BITS));
+		WriteNextResponseByte(BootloaderAPI_ReadFuse(GET_LOW_FUSE_BITS));
 	}
 	else if (Command == AVR109_COMMAND_ReadHighFuses)
 	{
-		WriteNextResponseByte(boot_lock_fuse_bits_get(GET_HIGH_FUSE_BITS));
+		WriteNextResponseByte(BootloaderAPI_ReadFuse(GET_HIGH_FUSE_BITS));
 	}
 	else if (Command == AVR109_COMMAND_ReadExtendedFuses)
 	{
-		WriteNextResponseByte(boot_lock_fuse_bits_get(GET_EXTENDED_FUSE_BITS));
+		WriteNextResponseByte(BootloaderAPI_ReadFuse(GET_EXTENDED_FUSE_BITS));
 	}
 	#if !defined(NO_BLOCK_SUPPORT)
 	else if (Command == AVR109_COMMAND_GetBlockWriteSupport)
@@ -571,7 +557,7 @@ static void CDC_Task(void)
 	else if (Command == AVR109_COMMAND_FillFlashPageWordHigh)
 	{
 		/* Write the high byte to the current flash page */
-		boot_page_fill(CurrAddress, FetchNextCommandByte());
+		BootloaderAPI_FillWord(CurrAddress, FetchNextCommandByte());
 
 		/* Send confirmation byte back to the host */
 		WriteNextResponseByte('\r');
@@ -579,7 +565,7 @@ static void CDC_Task(void)
 	else if (Command == AVR109_COMMAND_FillFlashPageWordLow)
 	{
 		/* Write the low byte to the current flash page */
-		boot_page_fill(CurrAddress | 0x01, FetchNextCommandByte());
+		BootloaderAPI_FillWord(CurrAddress | 0x01, FetchNextCommandByte());
 
 		/* Increment the address */
 		CurrAddress += 2;
@@ -590,10 +576,7 @@ static void CDC_Task(void)
 	else if (Command == AVR109_COMMAND_WriteFlashPage)
 	{
 		/* Commit the flash page to memory */
-		boot_page_write(CurrAddress);
-
-		/* Wait until write operation has completed */
-		boot_spm_busy_wait();
+		BootloaderAPI_WritePage(CurrAddress);
 
 		/* Send confirmation byte back to the host */
 		WriteNextResponseByte('\r');
diff --git a/Bootloaders/DFU/BootloaderAPI.c b/Bootloaders/DFU/BootloaderAPI.c
index 491c506d0fdacd829d9f4fee667041fa43357f4e..5198ea7f01f674e33312821f654ac7053f12b5e5 100644
--- a/Bootloaders/DFU/BootloaderAPI.c
+++ b/Bootloaders/DFU/BootloaderAPI.c
@@ -37,16 +37,22 @@
 
 void BootloaderAPI_ErasePage(const uint32_t Address)
 {
-	boot_page_erase_safe(Address);
-	boot_spm_busy_wait();
-	boot_rww_enable();
+	ATOMIC_BLOCK(ATOMIC_RESTORESTATE)
+	{
+		boot_page_erase_safe(Address);
+		boot_spm_busy_wait();
+		boot_rww_enable();
+	}
 }
 
 void BootloaderAPI_WritePage(const uint32_t Address)
 {
-	boot_page_write_safe(Address);
-	boot_spm_busy_wait();
-	boot_rww_enable();
+	ATOMIC_BLOCK(ATOMIC_RESTORESTATE)
+	{
+		boot_page_write_safe(Address);
+		boot_spm_busy_wait();
+		boot_rww_enable();
+	}
 }
 
 void BootloaderAPI_FillWord(const uint32_t Address, const uint16_t Word)
@@ -71,6 +77,8 @@ uint8_t BootloaderAPI_ReadLock(void)
 
 void BootloaderAPI_WriteLock(const uint8_t LockBits)
 {
-	boot_lock_bits_set_safe(LockBits);
+	ATOMIC_BLOCK(ATOMIC_RESTORESTATE)
+	{
+		boot_lock_bits_set_safe(LockBits);
+	}
 }
-
diff --git a/Bootloaders/DFU/BootloaderAPI.h b/Bootloaders/DFU/BootloaderAPI.h
index 5169bbc3c4b29ddc2a205ecbe81c31eba41584d5..8f119d7922a7bb5472bd9452096db393a10ea773 100644
--- a/Bootloaders/DFU/BootloaderAPI.h
+++ b/Bootloaders/DFU/BootloaderAPI.h
@@ -39,6 +39,7 @@
 	/* Includes: */
 		#include <avr/io.h>
 		#include <avr/boot.h>
+		#include <util/atomic.h>
 		#include <stdbool.h>
 
 		#include <LUFA/Common/Common.h>
diff --git a/Bootloaders/DFU/BootloaderDFU.c b/Bootloaders/DFU/BootloaderDFU.c
index 8da725d24845195bf4e78e00c1933ce3bc6561bb..8e8011fe2c1bd569cb4725540e32bd17e53d9cdd 100644
--- a/Bootloaders/DFU/BootloaderDFU.c
+++ b/Bootloaders/DFU/BootloaderDFU.c
@@ -133,7 +133,7 @@ void Application_Jump_Check(void)
 		JTAG_ENABLE();
 	#else
 		/* Check if the device's BOOTRST fuse is set */
-		if (boot_lock_fuse_bits_get(GET_HIGH_FUSE_BITS) & FUSE_BOOTRST)
+		if (BootloaderAPI_ReadFuse(GET_HIGH_FUSE_BITS) & FUSE_BOOTRST)
 		{
 			/* If the reset source was not an external reset or the key is correct, clear it and jump to the application */
 			if (!(MCUSR & (1 << EXTRF)) || (MagicBootKey == MAGIC_BOOT_KEY))
@@ -351,7 +351,7 @@ void EVENT_USB_Device_ControlRequest(void)
 							}
 
 							/* Write the next word into the current flash page */
-							boot_page_fill(CurrFlashAddress.Long, Endpoint_Read_16_LE());
+							BootloaderAPI_FillWord(CurrFlashAddress.Long, Endpoint_Read_16_LE());
 
 							/* Adjust counters */
 							WordsInFlashPage      += 1;
@@ -361,8 +361,7 @@ void EVENT_USB_Device_ControlRequest(void)
 							if ((WordsInFlashPage == (SPM_PAGESIZE >> 1)) || !(WordsRemaining))
 							{
 								/* Commit the flash page to memory */
-								boot_page_write(CurrFlashPageStartAddress);
-								boot_spm_busy_wait();
+								BootloaderAPI_WritePage(CurrFlashPageStartAddress);
 
 								/* Check if programming incomplete */
 								if (WordsRemaining)
@@ -371,17 +370,13 @@ void EVENT_USB_Device_ControlRequest(void)
 									WordsInFlashPage          = 0;
 
 									/* Erase next page's temp buffer */
-									boot_page_erase(CurrFlashAddress.Long);
-									boot_spm_busy_wait();
+									BootloaderAPI_ErasePage(CurrFlashAddress.Long);
 								}
 							}
 						}
 
 						/* Once programming complete, start address equals the end address */
 						StartAddr = EndAddr;
-
-						/* Re-enable the RWW section of flash */
-						boot_rww_enable();
 					}
 					else                                                   // Write EEPROM
 					{
@@ -691,8 +686,7 @@ static void ProcessMemProgCommand(void)
 			} CurrFlashAddress = {.Words = {StartAddr, Flash64KBPage}};
 
 			/* Erase the current page's temp buffer */
-			boot_page_erase(CurrFlashAddress.Long);
-			boot_spm_busy_wait();
+			BootloaderAPI_ErasePage(CurrFlashAddress.Long);
 		}
 
 		/* Set the state so that the next DNLOAD requests reads in the firmware */
@@ -789,21 +783,9 @@ static void ProcessWriteCommand(void)
 	}
 	else if (IS_TWOBYTE_COMMAND(SentCommand.Data, 0x00, 0xFF))                 // Erase flash
 	{
-		uint32_t CurrFlashAddress = 0;
-
 		/* Clear the application section of flash */
-		while (CurrFlashAddress < (uint32_t)BOOT_START_ADDR)
-		{
-			boot_page_erase(CurrFlashAddress);
-			boot_spm_busy_wait();
-			boot_page_write(CurrFlashAddress);
-			boot_spm_busy_wait();
-
-			CurrFlashAddress += SPM_PAGESIZE;
-		}
-
-		/* Re-enable the RWW section of flash as writing to the flash locks it out */
-		boot_rww_enable();
+		for (uint32_t CurrFlashAddress = 0; CurrFlashAddress < (uint32_t)BOOT_START_ADDR; CurrFlashAddress += SPM_PAGESIZE)
+			BootloaderAPI_ErasePage(CurrFlashAddress);
 
 		/* Memory has been erased, reset the security bit so that programming/reading is allowed */
 		IsSecure = false;
diff --git a/Bootloaders/HID/BootloaderHID.c b/Bootloaders/HID/BootloaderHID.c
index fa1dd5873e2a497e1822215f4ec01eb3b418d4eb..58c9b3b6f46f8d4c15dcf4b78d8b9c987190efe2 100644
--- a/Bootloaders/HID/BootloaderHID.c
+++ b/Bootloaders/HID/BootloaderHID.c
@@ -164,8 +164,11 @@ void EVENT_USB_Device_ControlRequest(void)
 			else if (PageAddress < BOOT_START_ADDR)
 			{
 				/* Erase the given FLASH page, ready to be programmed */
-				boot_page_erase(PageAddress);
-				boot_spm_busy_wait();
+				ATOMIC_BLOCK(ATOMIC_RESTORESTATE)
+				{
+					boot_page_erase(PageAddress);
+					boot_spm_busy_wait();
+				}
 
 				/* Write each of the FLASH page's bytes in sequence */
 				for (uint8_t PageWord = 0; PageWord < (SPM_PAGESIZE / 2); PageWord++)
@@ -182,8 +185,11 @@ void EVENT_USB_Device_ControlRequest(void)
 				}
 
 				/* Write the filled FLASH page to memory */
-				boot_page_write(PageAddress);
-				boot_spm_busy_wait();
+				ATOMIC_BLOCK(ATOMIC_RESTORESTATE)
+				{
+					boot_page_write(PageAddress);
+					boot_spm_busy_wait();
+				}
 
 				/* Re-enable RWW section */
 				boot_rww_enable();
diff --git a/Bootloaders/HID/BootloaderHID.h b/Bootloaders/HID/BootloaderHID.h
index 62ee07de30c4946ab2e5871e99cf1a565d554d06..d94ba76d19a5a241743f125d384584e70e3ba74f 100644
--- a/Bootloaders/HID/BootloaderHID.h
+++ b/Bootloaders/HID/BootloaderHID.h
@@ -42,6 +42,7 @@
 		#include <avr/boot.h>
 		#include <avr/power.h>
 		#include <avr/interrupt.h>
+		#include <util/atomic.h>
 		#include <stdbool.h>
 
 		#include "Descriptors.h"
diff --git a/Bootloaders/MassStorage/BootloaderAPI.c b/Bootloaders/MassStorage/BootloaderAPI.c
index 491c506d0fdacd829d9f4fee667041fa43357f4e..5198ea7f01f674e33312821f654ac7053f12b5e5 100644
--- a/Bootloaders/MassStorage/BootloaderAPI.c
+++ b/Bootloaders/MassStorage/BootloaderAPI.c
@@ -37,16 +37,22 @@
 
 void BootloaderAPI_ErasePage(const uint32_t Address)
 {
-	boot_page_erase_safe(Address);
-	boot_spm_busy_wait();
-	boot_rww_enable();
+	ATOMIC_BLOCK(ATOMIC_RESTORESTATE)
+	{
+		boot_page_erase_safe(Address);
+		boot_spm_busy_wait();
+		boot_rww_enable();
+	}
 }
 
 void BootloaderAPI_WritePage(const uint32_t Address)
 {
-	boot_page_write_safe(Address);
-	boot_spm_busy_wait();
-	boot_rww_enable();
+	ATOMIC_BLOCK(ATOMIC_RESTORESTATE)
+	{
+		boot_page_write_safe(Address);
+		boot_spm_busy_wait();
+		boot_rww_enable();
+	}
 }
 
 void BootloaderAPI_FillWord(const uint32_t Address, const uint16_t Word)
@@ -71,6 +77,8 @@ uint8_t BootloaderAPI_ReadLock(void)
 
 void BootloaderAPI_WriteLock(const uint8_t LockBits)
 {
-	boot_lock_bits_set_safe(LockBits);
+	ATOMIC_BLOCK(ATOMIC_RESTORESTATE)
+	{
+		boot_lock_bits_set_safe(LockBits);
+	}
 }
-
diff --git a/Bootloaders/MassStorage/BootloaderAPI.h b/Bootloaders/MassStorage/BootloaderAPI.h
index 4889b4c0db0bb31ed7197fa7cf1afe9f23d0c800..2ae9009bba9a5e8e8ac5dbe3381ac79e33f26813 100644
--- a/Bootloaders/MassStorage/BootloaderAPI.h
+++ b/Bootloaders/MassStorage/BootloaderAPI.h
@@ -39,6 +39,7 @@
 	/* Includes: */
 		#include <avr/io.h>
 		#include <avr/boot.h>
+		#include <util/atomic.h>
 		#include <stdbool.h>
 
 		#include <LUFA/Common/Common.h>
diff --git a/Bootloaders/MassStorage/BootloaderMassStorage.c b/Bootloaders/MassStorage/BootloaderMassStorage.c
index 6c9697b660cc6e960623bd3389b62a8a71c8d899..04f7c1af1a8e04871ad0cbb943e81af68c5198a0 100644
--- a/Bootloaders/MassStorage/BootloaderMassStorage.c
+++ b/Bootloaders/MassStorage/BootloaderMassStorage.c
@@ -114,7 +114,7 @@ void Application_Jump_Check(void)
 		JTAG_ENABLE();
 	#else
 		/* Check if the device's BOOTRST fuse is set */
-		if (boot_lock_fuse_bits_get(GET_HIGH_FUSE_BITS) & FUSE_BOOTRST)
+		if (BootloaderAPI_ReadFuse(GET_HIGH_FUSE_BITS) & FUSE_BOOTRST)
 		{
 			/* If the reset source was not an external reset or the key is correct, clear it and jump to the application */
 			if (!(MCUSR & (1 << EXTRF)) || (MagicBootKey == MAGIC_BOOT_KEY))
diff --git a/Bootloaders/MassStorage/BootloaderMassStorage.h b/Bootloaders/MassStorage/BootloaderMassStorage.h
index c9ddee4d7fb928391b5c3249fa8f63c629677100..872296d0f83abf8a31337c61263eee6b17e392ab 100644
--- a/Bootloaders/MassStorage/BootloaderMassStorage.h
+++ b/Bootloaders/MassStorage/BootloaderMassStorage.h
@@ -44,6 +44,7 @@
 		#include <string.h>
 
 		#include "Descriptors.h"
+		#include "BootloaderAPI.h"
 		#include "Config/AppConfig.h"
 
 		#include "Lib/SCSI.h"
diff --git a/Bootloaders/Printer/BootloaderAPI.c b/Bootloaders/Printer/BootloaderAPI.c
index 2be15680822765d74f2dfe61c346345d7e106d64..5198ea7f01f674e33312821f654ac7053f12b5e5 100644
--- a/Bootloaders/Printer/BootloaderAPI.c
+++ b/Bootloaders/Printer/BootloaderAPI.c
@@ -37,16 +37,22 @@
 
 void BootloaderAPI_ErasePage(const uint32_t Address)
 {
-	boot_page_erase_safe(Address);
-	boot_spm_busy_wait();
-	boot_rww_enable();
+	ATOMIC_BLOCK(ATOMIC_RESTORESTATE)
+	{
+		boot_page_erase_safe(Address);
+		boot_spm_busy_wait();
+		boot_rww_enable();
+	}
 }
 
 void BootloaderAPI_WritePage(const uint32_t Address)
 {
-	boot_page_write_safe(Address);
-	boot_spm_busy_wait();
-	boot_rww_enable();
+	ATOMIC_BLOCK(ATOMIC_RESTORESTATE)
+	{
+		boot_page_write_safe(Address);
+		boot_spm_busy_wait();
+		boot_rww_enable();
+	}
 }
 
 void BootloaderAPI_FillWord(const uint32_t Address, const uint16_t Word)
@@ -71,5 +77,8 @@ uint8_t BootloaderAPI_ReadLock(void)
 
 void BootloaderAPI_WriteLock(const uint8_t LockBits)
 {
-	boot_lock_bits_set_safe(LockBits);
+	ATOMIC_BLOCK(ATOMIC_RESTORESTATE)
+	{
+		boot_lock_bits_set_safe(LockBits);
+	}
 }
diff --git a/Bootloaders/Printer/BootloaderAPI.h b/Bootloaders/Printer/BootloaderAPI.h
index c2d9b4a188483b09773f0d744461b7b94cb516f4..4cef6d678ad75a4fb69e32458d65dd0bd28feea8 100644
--- a/Bootloaders/Printer/BootloaderAPI.h
+++ b/Bootloaders/Printer/BootloaderAPI.h
@@ -39,6 +39,7 @@
 	/* Includes: */
 		#include <avr/io.h>
 		#include <avr/boot.h>
+		#include <util/atomic.h>
 		#include <stdbool.h>
 
 		#include <LUFA/Common/Common.h>
diff --git a/Bootloaders/Printer/BootloaderPrinter.c b/Bootloaders/Printer/BootloaderPrinter.c
index 9021f998f7db10ce4cbb237d05b519e2ac8dd090..90321d4a3eb12c9c88d8f27dbc0c01e3958aa274 100644
--- a/Bootloaders/Printer/BootloaderPrinter.c
+++ b/Bootloaders/Printer/BootloaderPrinter.c
@@ -146,7 +146,7 @@ void Application_Jump_Check(void)
 		JTAG_ENABLE();
 	#else
 		/* Check if the device's BOOTRST fuse is set */
-		if (boot_lock_fuse_bits_get(GET_HIGH_FUSE_BITS) & FUSE_BOOTRST)
+		if (BootloaderAPI_ReadFuse(GET_HIGH_FUSE_BITS) & FUSE_BOOTRST)
 		{
 			/* If the reset source was not an external reset or the key is correct, clear it and jump to the application */
 			if (!(MCUSR & (1 << EXTRF)) || (MagicBootKey == MAGIC_BOOT_KEY))
@@ -221,8 +221,7 @@ static void FlushPageIfRequired(void)
 	uint32_t NewPageStartAddress = (HEXParser.CurrAddress & ~(SPM_PAGESIZE - 1));
 	if (HEXParser.PageStartAddress != NewPageStartAddress)
 	{
-		boot_page_write(HEXParser.PageStartAddress);
-		boot_spm_busy_wait();
+		BootloaderAPI_WritePage(HEXParser.PageStartAddress);
 
 		HEXParser.PageStartAddress = NewPageStartAddress;
 
@@ -321,14 +320,13 @@ static void ParseIntelHEXByte(const char ReadCharacter)
 					/* If we are writing to a new page, we need to erase it first */
 					if (!(PageDirty))
 					{
-						boot_page_erase(HEXParser.PageStartAddress);
-						boot_spm_busy_wait();
+						BootloaderAPI_ErasePage(HEXParser.PageStartAddress);
 
 						PageDirty = true;
 					}
 
 					/* Fill the FLASH memory buffer with the new word of data */
-					boot_page_fill(HEXParser.CurrAddress, NewDataWord);
+					BootloaderAPI_FillWord(HEXParser.CurrAddress, NewDataWord);
 					HEXParser.CurrAddress += 2;
 
 					/* Flush the FLASH page to physical memory if we are crossing a page boundary */
diff --git a/Bootloaders/Printer/BootloaderPrinter.h b/Bootloaders/Printer/BootloaderPrinter.h
index 8bc1a6879961219295eb689ee682c2649b3851c5..7146a59343474c38d46d64c16ea2ce98402a539b 100644
--- a/Bootloaders/Printer/BootloaderPrinter.h
+++ b/Bootloaders/Printer/BootloaderPrinter.h
@@ -43,6 +43,7 @@
 		#include <avr/interrupt.h>
 
 		#include "Descriptors.h"
+		#include "BootloaderAPI.h"
 
 		#include <LUFA/Drivers/Board/LEDs.h>
 		#include <LUFA/Drivers/USB/USB.h>
diff --git a/LUFA/DoxygenPages/ChangeLog.txt b/LUFA/DoxygenPages/ChangeLog.txt
index 7d6931d41adee8a276b06a428a0765e54e79f218..da8a6582e72c151975ac17886af3a920ebd6d7c3 100644
--- a/LUFA/DoxygenPages/ChangeLog.txt
+++ b/LUFA/DoxygenPages/ChangeLog.txt
@@ -10,6 +10,8 @@
   *  <b>Fixed:</b>
   *  - Core:
   *   - Fixed DeviceUsesOUTPipe flag not being set correctly in the HID host class driver (thanks to Wolfgang Schnerring)
+  *  - Library Applications:
+  *   - Fixed bootloaders not disabling global interrupts during erase and write operations (thanks to Zoltan)
   *
   *  \section Sec_ChangeLog170418 Version 170418
   *  <b>New:</b>