diff --git a/LUFA/ChangeLog.txt b/LUFA/ChangeLog.txt
index 58bd9d233436b6031d4343a78de18c333fb2433d..27cbca8662c467283baca4aa75bd98768422f124 100644
--- a/LUFA/ChangeLog.txt
+++ b/LUFA/ChangeLog.txt
@@ -33,6 +33,8 @@
   *  - The NO_CLEARSET_FEATURE_REQUEST compile time token has been renamed to NO_FEATURELESS_CONTROL_ONLY_DEVICE, and its function expanded
   *    to also remove parts of the Get Status chapter 9 request to further reduce code usage
   *  - Makefile updated to include output giving the currently selected BOARD parameter value
+  *  - Board Dataflash driver now allows for dataflash ICs which use different shifts for setting the current page/byte address (thanks
+  *    to Kenneth Clubb)
   *
   *  \section Sec_ChangeLog090209 Version 090209
   *
diff --git a/LUFA/DriverStubs/Dataflash.h b/LUFA/DriverStubs/Dataflash.h
index 0bef94ebbffb50216eec1697a5e7155f7b7e3f7d..41581a730a938312cc45ffc67ff09e1e471174fe 100644
--- a/LUFA/DriverStubs/Dataflash.h
+++ b/LUFA/DriverStubs/Dataflash.h
@@ -78,4 +78,40 @@
 			/** Total number of pages inside each of the board's dataflash ICs. */
 			#define DATAFLASH_PAGES                      // TODO: Replace with the total number of pages inside one of the Dataflash ICs
 
+		/* Inline Functions: */
+			/** Selects a dataflash IC from the given page number, which should range from 0 to
+			 *  ((DATAFLASH_PAGES * DATAFLASH_TOTALCHIPS) - 1). For boards containing only one
+			 *  dataflash IC, this will select DATAFLASH_CHIP1. If the given page number is outside
+			 *  the total number of pages contained in the boards dataflash ICs, all dataflash ICs
+			 *  are deselected.
+			 *
+			 *  \param PageAddress  Address of the page to manipulate, ranging from
+			 *                      ((DATAFLASH_PAGES * DATAFLASH_TOTALCHIPS) - 1).
+			 */
+			static inline void Dataflash_SelectChipFromPage(const uint16_t PageAddress)
+			{
+				Dataflash_DeselectChip();
+				
+				if (PageAddress >= (DATAFLASH_PAGES * DATAFLASH_TOTALCHIPS))
+				  return;
+
+				// TODO: If more than one dataflash chip, select the correct chip from the page address here
+				Dataflash_SelectChip(DATAFLASH_CHIP1);
+			}
+
+			/** Sends a set of page and buffer address bytes to the currently selected dataflash IC, for use with
+			 *  dataflash commands which require a complete 24-byte address.
+			 *
+			 *  \param PageAddress  Page address within the selected dataflash IC
+			 *  \param BufferByte   Address within the dataflash's buffer
+			 */
+			static inline void Dataflash_SendAddressBytes(uint16_t PageAddress, const uint16_t BufferByte)
+			{	
+				// TODO: If more than one dataflash chip, adjust absolute page address to be correct for the current chip,
+				//       also the shifts may need to be altered to suit the dataflash model being used				
+				Dataflash_SendByte(PageAddress >> 5);
+				Dataflash_SendByte((PageAddress << 3) | (BufferByte >> 8));
+				Dataflash_SendByte(BufferByte);
+			}
+			
 #endif
diff --git a/LUFA/Drivers/Board/Dataflash.h b/LUFA/Drivers/Board/Dataflash.h
index 2b682d7c9c34beec851778fc7bce419fdf931f94..aa0c0892f1073e22189ae927a03f4ab2cc52389c 100644
--- a/LUFA/Drivers/Board/Dataflash.h
+++ b/LUFA/Drivers/Board/Dataflash.h
@@ -52,21 +52,7 @@
 	/* Includes: */
 	#include "../AT90USBXXX/SPI.h"
 	#include "../../Common/Common.h"
-	
-	#if !defined(BOARD)
-		#error BOARD must be set in makefile to a value specified in BoardTypes.h.
-	#elif (BOARD == BOARD_USBKEY)
-		#include "USBKEY/Dataflash.h"
-	#elif (BOARD == BOARD_STK525)
-		#include "STK525/Dataflash.h"
-	#elif (BOARD == BOARD_STK526)
-		#include "STK526/Dataflash.h"
-	#elif (BOARD == BOARD_USER)
-		#include "Board/Dataflash.h"
-	#else
-		#error The selected board does not contain a dataflash IC.
-	#endif
-	
+		
 	/* Enable C linkage for C++ Compilers: */
 		#if defined(__cplusplus)
 			extern "C" {
@@ -89,19 +75,6 @@
 			#define Dataflash_DeselectChip()             Dataflash_SelectChip(DATAFLASH_NO_CHIP)
 
 		/* Inline Functions: */
-			/** Initializes the dataflash driver (including the SPI driver) so that commands and data may be
-			 *  sent to an attached dataflash IC.
-			 *
-			 *  \param PrescalerMask  SPI prescaler mask, see SPI.h documentation
-			 */
-			static inline void Dataflash_Init(const uint8_t PrescalerMask)
-			{
-				DATAFLASH_CHIPCS_DDR  |= DATAFLASH_CHIPCS_MASK;
-				DATAFLASH_CHIPCS_PORT |= DATAFLASH_CHIPCS_MASK;
-
-				SPI_Init(PrescalerMask, true);
-			}
-
 			/** Sends a byte to the currently selected dataflash IC, and returns a byte from the dataflash.
 			 *
 			 *  \param Byte of data to send to the dataflash
@@ -133,21 +106,45 @@
 			{
 				return SPI_ReceiveByte();
 			}
+
+		/* Includes: */
+			#if !defined(BOARD)
+				#error BOARD must be set in makefile to a value specified in BoardTypes.h.
+			#elif (BOARD == BOARD_USBKEY)
+				#include "USBKEY/Dataflash.h"
+			#elif (BOARD == BOARD_STK525)
+				#include "STK525/Dataflash.h"
+			#elif (BOARD == BOARD_STK526)
+				#include "STK526/Dataflash.h"
+			#elif (BOARD == BOARD_USER)
+				#include "Board/Dataflash.h"
+			#else
+				#error The selected board does not contain a dataflash IC.
+			#endif
+
+		/* Inline Functions: */
+			/** Initializes the dataflash driver (including the SPI driver) so that commands and data may be
+			 *  sent to an attached dataflash IC.
+			 *
+			 *  \param PrescalerMask  SPI prescaler mask, see SPI.h documentation
+			 */
+			static inline void Dataflash_Init(const uint8_t PrescalerMask)
+			{
+				DATAFLASH_CHIPCS_DDR  |= DATAFLASH_CHIPCS_MASK;
+				DATAFLASH_CHIPCS_PORT |= DATAFLASH_CHIPCS_MASK;
+
+				SPI_Init(PrescalerMask, true);
+			}
 			
 			/** Toggles the select line of the currently selected dataflash IC, so that it is ready to receive
 			 *  a new command.
 			 */
 			static inline void Dataflash_ToggleSelectedChipCS(void)
 			{
-				#if (DATAFLASH_TOTALCHIPS == 2)
-					uint8_t SelectedChipMask = Dataflash_GetSelectedChip();
+				uint8_t SelectedChipMask = Dataflash_GetSelectedChip();
 					
-					Dataflash_DeselectChip();
-					Dataflash_SelectChip(SelectedChipMask);
-				#else
-					Dataflash_DeselectChip();
-					Dataflash_SelectChip(DATAFLASH_CHIP1);	
-				#endif
+				Dataflash_DeselectChip();
+				Dataflash_SelectChip(SelectedChipMask);
 			}
 
 			/** Spinloops while the currently selected dataflash is busy executing a command, such as a main
@@ -162,28 +159,14 @@
 
 			/** Selects a dataflash IC from the given page number, which should range from 0 to
 			 *  ((DATAFLASH_PAGES * DATAFLASH_TOTALCHIPS) - 1). For boards containing only one
-			 *  dataflash IC, this will select DATAFLASH_CHIP1. If the given page number is outside the total number
-			 *  of pages contained in the boards dataflash ICs, all dataflash ICs are deselected.
+			 *  dataflash IC, this will select DATAFLASH_CHIP1. If the given page number is outside
+			 *  the total number of pages contained in the boards dataflash ICs, all dataflash ICs
+			 *  are deselected.
 			 *
 			 *  \param PageAddress  Address of the page to manipulate, ranging from
 			 *                      ((DATAFLASH_PAGES * DATAFLASH_TOTALCHIPS) - 1).
 			 */
-			static inline void Dataflash_SelectChipFromPage(const uint16_t PageAddress)
-			{
-				Dataflash_DeselectChip();
-				
-				if (PageAddress >= (DATAFLASH_PAGES * DATAFLASH_TOTALCHIPS))
-				  return;
-
-				#if (DATAFLASH_TOTALCHIPS == 2)
-					if (PageAddress & 0x01)
-					  Dataflash_SelectChip(DATAFLASH_CHIP2);
-					else
-					  Dataflash_SelectChip(DATAFLASH_CHIP1);
-				#else
-					Dataflash_SelectChip(DATAFLASH_CHIP1);
-				#endif
-			}
+			static inline void Dataflash_SelectChipFromPage(const uint16_t PageAddress);
 
 			/** Sends a set of page and buffer address bytes to the currently selected dataflash IC, for use with
 			 *  dataflash commands which require a complete 24-byte address.
@@ -191,16 +174,7 @@
 			 *  \param PageAddress  Page address within the selected dataflash IC
 			 *  \param BufferByte   Address within the dataflash's buffer
 			 */
-			static inline void Dataflash_SendAddressBytes(uint16_t PageAddress, const uint16_t BufferByte)
-			{	
-				#if (DATAFLASH_TOTALCHIPS == 2)
-					PageAddress >>= 1;
-				#endif
-
-				Dataflash_SendByte(PageAddress >> 5);
-				Dataflash_SendByte((PageAddress << 3) | (BufferByte >> 8));
-				Dataflash_SendByte(BufferByte);
-			}
+			static inline void Dataflash_SendAddressBytes(uint16_t PageAddress, const uint16_t BufferByte);
 
 	/* Disable C linkage for C++ Compilers: */
 		#if defined(__cplusplus)
diff --git a/LUFA/Drivers/Board/STK525/Dataflash.h b/LUFA/Drivers/Board/STK525/Dataflash.h
index 3f30f97b957f3c9af22afd0e01e52fc8ecb05b2b..e4e2f52371768316b50352c853bbf39bf22fa227 100644
--- a/LUFA/Drivers/Board/STK525/Dataflash.h
+++ b/LUFA/Drivers/Board/STK525/Dataflash.h
@@ -72,4 +72,37 @@
 			/** Total number of pages inside the board's dataflash IC. */
 			#define DATAFLASH_PAGES                      8192
 
+		/* Inline Functions: */
+			/** Selects a dataflash IC from the given page number, which should range from 0 to
+			 *  ((DATAFLASH_PAGES * DATAFLASH_TOTALCHIPS) - 1). For boards containing only one
+			 *  dataflash IC, this will select DATAFLASH_CHIP1. If the given page number is outside
+			 *  the total number of pages contained in the boards dataflash ICs, all dataflash ICs
+			 *  are deselected.
+			 *
+			 *  \param PageAddress  Address of the page to manipulate, ranging from
+			 *                      ((DATAFLASH_PAGES * DATAFLASH_TOTALCHIPS) - 1).
+			 */
+			static inline void Dataflash_SelectChipFromPage(const uint16_t PageAddress)
+			{
+				Dataflash_DeselectChip();
+				
+				if (PageAddress >= (DATAFLASH_PAGES * DATAFLASH_TOTALCHIPS))
+				  return;
+
+				Dataflash_SelectChip(DATAFLASH_CHIP1);
+			}
+
+			/** Sends a set of page and buffer address bytes to the currently selected dataflash IC, for use with
+			 *  dataflash commands which require a complete 24-byte address.
+			 *
+			 *  \param PageAddress  Page address within the selected dataflash IC
+			 *  \param BufferByte   Address within the dataflash's buffer
+			 */
+			static inline void Dataflash_SendAddressBytes(uint16_t PageAddress, const uint16_t BufferByte)
+			{	
+				Dataflash_SendByte(PageAddress >> 5);
+				Dataflash_SendByte((PageAddress << 3) | (BufferByte >> 8));
+				Dataflash_SendByte(BufferByte);
+			}
+			
 #endif
diff --git a/LUFA/Drivers/Board/STK526/Dataflash.h b/LUFA/Drivers/Board/STK526/Dataflash.h
index 177fefaaba6f67126dc3833d294b44c38910c0de..443c1a754d2316c730c0ace7a98411c5dedc92ed 100644
--- a/LUFA/Drivers/Board/STK526/Dataflash.h
+++ b/LUFA/Drivers/Board/STK526/Dataflash.h
@@ -72,4 +72,37 @@
 			/** Total number of pages inside the board's dataflash IC. */
 			#define DATAFLASH_PAGES                      8192
 
+		/* Inline Functions: */
+			/** Selects a dataflash IC from the given page number, which should range from 0 to
+			 *  ((DATAFLASH_PAGES * DATAFLASH_TOTALCHIPS) - 1). For boards containing only one
+			 *  dataflash IC, this will select DATAFLASH_CHIP1. If the given page number is outside
+			 *  the total number of pages contained in the boards dataflash ICs, all dataflash ICs
+			 *  are deselected.
+			 *
+			 *  \param PageAddress  Address of the page to manipulate, ranging from
+			 *                      ((DATAFLASH_PAGES * DATAFLASH_TOTALCHIPS) - 1).
+			 */
+			static inline void Dataflash_SelectChipFromPage(const uint16_t PageAddress)
+			{
+				Dataflash_DeselectChip();
+				
+				if (PageAddress >= (DATAFLASH_PAGES * DATAFLASH_TOTALCHIPS))
+				  return;
+
+				Dataflash_SelectChip(DATAFLASH_CHIP1);
+			}
+
+			/** Sends a set of page and buffer address bytes to the currently selected dataflash IC, for use with
+			 *  dataflash commands which require a complete 24-byte address.
+			 *
+			 *  \param PageAddress  Page address within the selected dataflash IC
+			 *  \param BufferByte   Address within the dataflash's buffer
+			 */
+			static inline void Dataflash_SendAddressBytes(uint16_t PageAddress, const uint16_t BufferByte)
+			{	
+				Dataflash_SendByte(PageAddress >> 5);
+				Dataflash_SendByte((PageAddress << 3) | (BufferByte >> 8));
+				Dataflash_SendByte(BufferByte);
+			}
+			
 #endif
diff --git a/LUFA/Drivers/Board/USBKEY/Dataflash.h b/LUFA/Drivers/Board/USBKEY/Dataflash.h
index 848ae32d85cb121a8a714d1a7b29a5234500f14f..2b3956f04d8a1f31da71f00f3d80796c713f6dfb 100644
--- a/LUFA/Drivers/Board/USBKEY/Dataflash.h
+++ b/LUFA/Drivers/Board/USBKEY/Dataflash.h
@@ -74,5 +74,43 @@
 
 			/** Total number of pages inside each of the board's dataflash ICs. */
 			#define DATAFLASH_PAGES                      8192
+			
+		/* Inline Functions: */
+			/** Selects a dataflash IC from the given page number, which should range from 0 to
+			 *  ((DATAFLASH_PAGES * DATAFLASH_TOTALCHIPS) - 1). For boards containing only one
+			 *  dataflash IC, this will select DATAFLASH_CHIP1. If the given page number is outside
+			 *  the total number of pages contained in the boards dataflash ICs, all dataflash ICs
+			 *  are deselected.
+			 *
+			 *  \param PageAddress  Address of the page to manipulate, ranging from
+			 *                      ((DATAFLASH_PAGES * DATAFLASH_TOTALCHIPS) - 1).
+			 */
+			static inline void Dataflash_SelectChipFromPage(const uint16_t PageAddress)
+			{
+				Dataflash_DeselectChip();
+				
+				if (PageAddress >= (DATAFLASH_PAGES * DATAFLASH_TOTALCHIPS))
+				  return;
+
+				if (PageAddress & 0x01)
+				  Dataflash_SelectChip(DATAFLASH_CHIP2);
+				else
+				  Dataflash_SelectChip(DATAFLASH_CHIP1);
+			}
+
+			/** Sends a set of page and buffer address bytes to the currently selected dataflash IC, for use with
+			 *  dataflash commands which require a complete 24-byte address.
+			 *
+			 *  \param PageAddress  Page address within the selected dataflash IC
+			 *  \param BufferByte   Address within the dataflash's buffer
+			 */
+			static inline void Dataflash_SendAddressBytes(uint16_t PageAddress, const uint16_t BufferByte)
+			{	
+				PageAddress >>= 1;
+				
+				Dataflash_SendByte(PageAddress >> 5);
+				Dataflash_SendByte((PageAddress << 3) | (BufferByte >> 8));
+				Dataflash_SendByte(BufferByte);
+			}		
 
 #endif
diff --git a/LUFA/MigrationInformation.txt b/LUFA/MigrationInformation.txt
index 25bf782685ab5d8b0fd497ead26379ddd4a5c546..a04b1b0538bc3a631a662fe6838d44784dec2747 100644
--- a/LUFA/MigrationInformation.txt
+++ b/LUFA/MigrationInformation.txt
@@ -28,6 +28,7 @@
  *
  *  <b>Non-USB Library Components</b>
  *    - The ATTR_ALWAYSINLINE function attribute macro has been renamed to ATTR_ALWAYS_INLINE.
+ *    - Custom board Dataflash drivers now require the implementation of Dataflash_SelectChipFromPage() and Dataflash_SendAddressBytes().
  *
  *  <b>Device Mode</b>
  *    - The NO_CLEARSET_FEATURE_REQUEST compile time token has been renamed to NO_FEATURELESS_CONTROL_ONLY_DEVICE, and its function expanded