diff --git a/common/cmd_bootm.c b/common/cmd_bootm.c
index 9a745f1e20f97d9fa53ff32cd713fff3df53df6a..022cef8460ada2bed9a1774592b575848937bbe5 100644
--- a/common/cmd_bootm.c
+++ b/common/cmd_bootm.c
@@ -44,6 +44,12 @@
 #include <hush.h>
 #endif
 
+#if defined(CONFIG_OF_LIBFDT)
+#include <fdt.h>
+#include <libfdt.h>
+#include <fdt_support.h>
+#endif
+
 DECLARE_GLOBAL_DATA_PTR;
 
 extern int gunzip (void *dst, int dstlen, unsigned char *src, unsigned long *lenp);
@@ -267,6 +273,8 @@ int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
 			puts ("Could not find a valid device tree\n");
 			return 1;
 		}
+
+		set_working_fdt_addr(images.ft_addr);
 #endif
 	}
 
diff --git a/common/cmd_fdt.c b/common/cmd_fdt.c
index 94bca4646ad6046495290b8d6c9b9d44fdcd56fd..8bc900aa795757a59829edc3b94305038d421cae 100644
--- a/common/cmd_fdt.c
+++ b/common/cmd_fdt.c
@@ -50,6 +50,16 @@ static int fdt_print(const char *pathp, char *prop, int depth);
  */
 struct fdt_header *working_fdt;
 
+void set_working_fdt_addr(void *addr)
+{
+	char buf[17];
+
+	working_fdt = addr;
+
+	sprintf(buf, "%lx", (unsigned long)addr);
+	setenv("fdtaddr", buf);
+}
+
 /*
  * Flattened Device Tree command, see the help for parameter definitions.
  */
@@ -64,6 +74,7 @@ int do_fdt (cmd_tbl_t * cmdtp, int flag, int argc, char *argv[])
 	 * Set the address of the fdt
 	 ********************************************************************/
 	if (argv[1][0] == 'a') {
+		unsigned long addr;
 		/*
 		 * Set the address [and length] of the fdt.
 		 */
@@ -75,7 +86,8 @@ int do_fdt (cmd_tbl_t * cmdtp, int flag, int argc, char *argv[])
 			return 0;
 		}
 
-		working_fdt = (struct fdt_header *)simple_strtoul(argv[2], NULL, 16);
+		addr = simple_strtoul(argv[2], NULL, 16);
+		set_working_fdt_addr((void *)addr);
 
 		if (!fdt_valid()) {
 			return 1;
diff --git a/common/image.c b/common/image.c
index 18d667de89eb367ed164b3ec77a022508ef22b80..55c4ccec8bc0fa4b7422d72e50148b00322d901c 100644
--- a/common/image.c
+++ b/common/image.c
@@ -1245,6 +1245,7 @@ int boot_relocate_fdt (struct lmb *lmb, ulong bootmap_base,
 		*of_size = of_len;
 	}
 
+	set_working_fdt_addr(*of_flat_tree);
 	return 0;
 
 error:
diff --git a/include/fdt_support.h b/include/fdt_support.h
index f2f2cd5532c457bf22a5a6bba969b85126316646..f14ab68ffb8736c66e4cf9d84fd9343513b62f27 100644
--- a/include/fdt_support.h
+++ b/include/fdt_support.h
@@ -68,5 +68,7 @@ void ft_cpu_setup(void *blob, bd_t *bd);
 void ft_pci_setup(void *blob, bd_t *bd);
 #endif
 
+void set_working_fdt_addr(void *addr);
+
 #endif /* ifdef CONFIG_OF_LIBFDT */
 #endif /* ifndef __FDT_SUPPORT_H */