diff --git a/common/cmd_bootm.c b/common/cmd_bootm.c
index 6ebedfb..e1c69b4 100644
--- a/common/cmd_bootm.c
+++ b/common/cmd_bootm.c
@@ -736,6 +736,14 @@ do_bootm_linux (cmd_tbl_t *cmdtp, int flag,
 		len = data = 0;
 	}
 
+#if defined(CONFIG_OF_LIBFDT) && defined(CFG_FDT_ADDR)
+	if ((ulong)fdt != CFG_FDT_ADDR && fdt_check_header(fdt) == 0) {
+		of_flat_tree = (char *)fdt;
+		of_data = 0;
+		printf ("   Using the FDT at 0x%x\n", of_flat_tree);
+	}
+#endif
+
 #if defined(CONFIG_OF_FLAT_TREE) || defined(CONFIG_OF_LIBFDT)
 	if(argc > 3) {
 		of_flat_tree = (char *) simple_strtoul(argv[3], NULL, 16);
diff --git a/common/cmd_ide.c b/common/cmd_ide.c
index bb064ea..03e4c63 100644
--- a/common/cmd_ide.c
+++ b/common/cmd_ide.c
@@ -52,6 +52,10 @@
 # include <status_led.h>
 #endif
 
+#if defined(CONFIG_OF_LIBFDT) && defined(CFG_FDT_ADDR)
+#include <libfdt.h>
+#endif
+
 #ifndef __PPC__
 #include <asm/io.h>
 #ifdef __MIPS__
@@ -531,6 +535,17 @@ void ide_init (void)
 	extern int ide_devices_found; /* Initialized in check_ide_device() */
 #endif	/* CONFIG_IDE_8xx_PCCARD */
 
+#if defined(CONFIG_OF_LIBFDT) && defined(CFG_FDT_ADDR)
+	if (fdt_find_node_by_type(fdt, 0, "pcmcia") <= 0 &&
+	    fdt_find_node_by_type(fdt, 0, "atx") <= 0) {
+		puts("unavailable\n");
+		disable_cmd("pinit");
+		disable_cmd("ide");
+		disable_cmd("diskboot");
+		return;
+	}
+#endif
+
 #ifdef CONFIG_IDE_PREINIT
 	extern int ide_preinit (void);
 	WATCHDOG_RESET();
diff --git a/common/command.c b/common/command.c
index af2f8cb..bd8f15f 100644
--- a/common/command.c
+++ b/common/command.c
@@ -375,6 +375,41 @@ cmd_tbl_t *find_cmd (const char *cmd)
 	return NULL;	/* not found or ambiguous command */
 }
 
+#if defined(CONFIG_OF_LIBFDT) && defined(CFG_FDT_ADDR)
+/***************************************************************************
+ * hide a command from the command table
+ */
+
+int do_disabled (cmd_tbl_t * cmdtp, int flag, int argc, char *argv[])
+{
+	puts("Command not available\n");
+	return 0;
+}
+
+int disable_cmd (const char *cmd)
+{
+	cmd_tbl_t *cmdtp;
+	int len;
+
+	len =  strlen (cmd);
+
+	for (cmdtp = &__u_boot_cmd_start;
+	     cmdtp != &__u_boot_cmd_end;
+	     cmdtp++) {
+		if (strncmp (cmd, cmdtp->name, len) == 0 &&
+		    len == strlen(cmdtp->name))	{ /* full match */
+			cmdtp->cmd = do_disabled;
+			cmdtp->usage = NULL;
+#ifdef	CFG_LONGHELP
+			cmdtp->help = NULL;
+#endif
+			return 0;
+		}
+	}
+	return -1;	/* command not found */
+}
+#endif
+
 #ifdef CONFIG_AUTO_COMPLETE
 
 int var_complete(int argc, char *argv[], char last_char, int maxv, char *cmdv[])
diff --git a/common/fdt_support.c b/common/fdt_support.c
index 175d59e..87717cc 100644
--- a/common/fdt_support.c
+++ b/common/fdt_support.c
@@ -40,7 +40,12 @@ DECLARE_GLOBAL_DATA_PTR;
 /*
  * fdt points to our working device tree.
  */
+#ifdef CFG_FDT_ADDR
+struct fdt_header *fdt = (struct fdt_header *)CFG_FDT_ADDR;
+#else
 struct fdt_header *fdt;
+#endif
+
 
 /********************************************************************/
 
@@ -348,4 +353,47 @@ int fdt_bd_t(void *fdt)
 }
 #endif /* ifdef CONFIG_OF_HAS_BD_T */
 
+
+/********************************************************************/
+
+#ifdef CFG_FDT_ADDR
+
+void fdt_relocate(void)
+{
+	char *str, *model;
+	int err = 0;
+
+	printf("FDT:   %p", fdt);
+
+	if ((str = getenv("fdt_boot_addr"))) {
+		void *new = (void *)simple_strtoul(str, NULL, 16);;
+		err = fdt_open_into(fdt, new,
+				    be32_to_cpu(fdt_totalsize(fdt)));
+		if (!err) {
+			fdt = new;
+			printf("->%p", fdt);
+		}
+	} else
+		err = fdt_check_header(fdt);
+
+	puts(" (");
+	if (err)
+		puts(fdt_strerror(err));
+	else {
+		model = (char *)fdt_getprop(fdt, 0, "model", NULL);
+		if (model)
+			puts(model);
+		else
+			puts("unknown");
+	}
+	puts(")\n");
+
+#ifdef CONFIG_FDT_FIXUP_BOARD
+	if (!err)
+		fdt_fixup_board();
+#endif
+}
+
+#endif
+
 #endif /* CONFIG_OF_LIBFDT */
diff --git a/include/command.h b/include/command.h
index 0597c10..5bafce0 100644
--- a/include/command.h
+++ b/include/command.h
@@ -60,6 +60,7 @@ extern cmd_tbl_t  __u_boot_cmd_end;
 
 /* common/command.c */
 cmd_tbl_t *find_cmd(const char *cmd);
+int disable_cmd(const char *cmd);
 
 #ifdef CONFIG_AUTO_COMPLETE
 extern void install_auto_complete(void);
diff --git a/include/configs/IceCube.h b/include/configs/IceCube.h
index 4c16d22..92bf62b 100644
--- a/include/configs/IceCube.h
+++ b/include/configs/IceCube.h
@@ -180,6 +180,7 @@
 /* pass open firmware flat tree */
 #define CONFIG_OF_LIBFDT	1
 #define CONFIG_OF_BOARD_SETUP	1
+#define CFG_FDT_ADDR		0xff850000
 
 #define OF_CPU			"PowerPC,5200@0"
 #define OF_SOC			"soc5200@f0000000"
diff --git a/include/fdt_support.h b/include/fdt_support.h
index 60fa423..72f8c50 100644
--- a/include/fdt_support.h
+++ b/include/fdt_support.h
@@ -44,5 +44,13 @@ void ft_cpu_setup(void *blob, bd_t *bd);
 void ft_pci_setup(void *blob, bd_t *bd);
 #endif
 
+#ifdef CFG_FDT_ADDR
+void fdt_relocate(void);
+#endif
+
+#ifdef CONFIG_FDT_FIXUP_BOARD
+void fdt_fixup_board(void);
+#endif
+
 #endif /* ifdef CONFIG_OF_LIBFDT */
 #endif /* ifndef __FDT_SUPPORT_H */
diff --git a/lib_ppc/board.c b/lib_ppc/board.c
index 9aa67f9..930bff0 100644
--- a/lib_ppc/board.c
+++ b/lib_ppc/board.c
@@ -122,6 +122,10 @@ ulong monitor_flash_len;
 #include <bedbug/type.h>
 #endif
 
+#if defined(CONFIG_OF_LIBFDT) && defined(CFG_FDT_ADDR)
+#include <fdt_support.h>
+#endif
+
 /*
  * Begin and End of memory area for malloc(), and current "brk"
  */
@@ -797,6 +801,10 @@ void board_init_r (gd_t *id, ulong dest_addr)
 	/* relocate environment function pointers etc. */
 	env_relocate ();
 
+#if defined(CONFIG_OF_LIBFDT) && defined(CFG_FDT_ADDR)
+	fdt_relocate ();
+#endif
+
 	/*
 	 * Fill in missing fields of bd_info.
 	 * We do this here, where we have "normal" access to the
