diff --git a/common/spl/Makefile b/common/spl/Makefile
index b9c9fd85212de94e2a1354f2d1279162f9e316c8..7cf01ad72d05592884ea9fdf8b420d69e809fcdd 100644
--- a/common/spl/Makefile
+++ b/common/spl/Makefile
@@ -15,6 +15,7 @@ LIB	= $(obj)libspl.o
 
 ifdef CONFIG_SPL_BUILD
 COBJS-$(CONFIG_SPL_FRAMEWORK) += spl.o
+COBJS-$(CONFIG_SPL_NOR_SUPPORT) += spl_nor.o
 COBJS-$(CONFIG_SPL_YMODEM_SUPPORT) += spl_ymodem.o
 COBJS-$(CONFIG_SPL_NAND_SUPPORT) += spl_nand.o
 endif
diff --git a/common/spl/spl.c b/common/spl/spl.c
index 3b4fcba4cbc9f469755b430f4d8606d536e6360a..3156401fd52a760fdbda894b7c5b2a913e48b089 100644
--- a/common/spl/spl.c
+++ b/common/spl/spl.c
@@ -142,6 +142,11 @@ void board_init_r(gd_t *dummy1, ulong dummy2)
 		spl_nand_load_image();
 		break;
 #endif
+#ifdef CONFIG_SPL_NOR_SUPPORT
+	case BOOT_DEVICE_NOR:
+		spl_nor_load_image();
+		break;
+#endif
 #ifdef CONFIG_SPL_YMODEM_SUPPORT
 	case BOOT_DEVICE_UART:
 		spl_ymodem_load_image();
diff --git a/common/spl/spl_nor.c b/common/spl/spl_nor.c
new file mode 100644
index 0000000000000000000000000000000000000000..976e8651036ff664644feab2264f32087fcea1e5
--- /dev/null
+++ b/common/spl/spl_nor.c
@@ -0,0 +1,62 @@
+/*
+ * Copyright (C) 2012 Stefan Roese <sr@denx.de>
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	 See the
+ * GNU General Public License for more details.
+ */
+
+#include <common.h>
+#include <spl.h>
+
+void spl_nor_load_image(void)
+{
+	/*
+	 * Loading of the payload to SDRAM is done with skipping of
+	 * the mkimage header in this SPL NOR driver
+	 */
+	spl_image.flags |= SPL_COPY_PAYLOAD_ONLY;
+
+	if (spl_start_uboot()) {
+		/*
+		 * Load real U-Boot from its location in NOR flash to its
+		 * defined location in SDRAM
+		 */
+		spl_parse_image_header(
+			(const struct image_header *)CONFIG_SYS_UBOOT_BASE);
+
+		memcpy((void *)spl_image.load_addr,
+		       (void *)(CONFIG_SYS_UBOOT_BASE +
+				sizeof(struct image_header)),
+		       spl_image.size);
+	} else {
+		/*
+		 * Load Linux from its location in NOR flash to its defined
+		 * location in SDRAM
+		 */
+		spl_parse_image_header(
+			(const struct image_header *)CONFIG_SYS_OS_BASE);
+
+		memcpy((void *)spl_image.load_addr,
+		       (void *)(CONFIG_SYS_OS_BASE +
+				sizeof(struct image_header)),
+		       spl_image.size);
+
+		/*
+		 * Copy DT blob (fdt) to SDRAM. Passing pointer to flash
+		 * doesn't work (16 KiB should be enough for DT)
+		 */
+		memcpy((void *)CONFIG_SYS_SPL_ARGS_ADDR,
+		       (void *)(CONFIG_SYS_FDT_BASE),
+		       (16 << 10));
+	}
+}
diff --git a/include/spl.h b/include/spl.h
index 2923cd2a8d2839c5b64040a1265e3d4bc25ba6b9..e40538600ee1febe94cee536cd31e44268d1ff84 100644
--- a/include/spl.h
+++ b/include/spl.h
@@ -56,6 +56,9 @@ void spl_display_print(void);
 /* NAND SPL functions */
 void spl_nand_load_image(void);
 
+/* NOR SPL functions */
+void spl_nor_load_image(void);
+
 /* MMC SPL functions */
 void spl_mmc_load_image(void);