diff --git a/board/keymile/common/common.c b/board/keymile/common/common.c
index b2bd7fd8433450b7d983c84f360632cca04ad77d..259462360ce6ba4d41970c8ca5fecc792888fc95 100644
--- a/board/keymile/common/common.c
+++ b/board/keymile/common/common.c
@@ -203,8 +203,9 @@ static int ivm_check_crc (unsigned char *buf, int block)
 	crceeprom = (buf[CONFIG_SYS_IVM_EEPROM_PAGE_LEN - 1] + \
 			buf[CONFIG_SYS_IVM_EEPROM_PAGE_LEN - 2] * 256);
 	if (crc != crceeprom) {
-		printf ("Error CRC Block: %d EEprom: calculated: %lx EEprom: %lx\n",
-			block, crc, crceeprom);
+		if (block == 0)
+			printf ("Error CRC Block: %d EEprom: calculated: \
+			%lx EEprom: %lx\n", block, crc, crceeprom);
 		return -1;
 	}
 	return 0;
@@ -287,7 +288,7 @@ int ivm_analyze_eeprom (unsigned char *buf, int len)
 	GET_STRING("IVM_CustomerProductID", IVM_POS_CUSTOMER_PROD_ID, 32)
 
 	if (ivm_check_crc (&buf[CONFIG_SYS_IVM_EEPROM_PAGE_LEN * 2], 2) != 0)
-		return -2;
+		return 0;
 	ivm_analyze_block2 (&buf[CONFIG_SYS_IVM_EEPROM_PAGE_LEN * 2], CONFIG_SYS_IVM_EEPROM_PAGE_LEN);
 
 	return 0;
@@ -527,6 +528,34 @@ int fdt_set_node_and_value (void *blob,
 	}
 	return ret;
 }
+int fdt_get_node_and_value (void *blob,
+				char *nodename,
+				char *propname,
+				void **var)
+{
+	int len;
+	int nodeoffset = 0;
+
+	nodeoffset = fdt_path_offset (blob, nodename);
+	if (nodeoffset >= 0) {
+		*var = (void *)fdt_getprop (blob, nodeoffset, propname, &len);
+		if (len == 0) {
+			/* no value */
+			printf ("%s no value\n", __FUNCTION__);
+			return -1;
+		} else if (len > 0) {
+			return len;
+		} else {
+			printf ("libfdt fdt_getprop(): %s\n",
+				fdt_strerror(len));
+			return -2;
+		}
+	} else {
+		printf("%s: cannot find %s node err:%s\n", __FUNCTION__,
+			nodename, fdt_strerror (nodeoffset));
+		return -3;
+	}
+}
 #endif
 
 int ethernet_present (void)
diff --git a/board/keymile/common/common.h b/board/keymile/common/common.h
index d3d681424f51b5a59c0337b3e2c20f94dd19b5b8..a38c72772ce75f4659c50378c8d16c4098ec2b6c 100644
--- a/board/keymile/common/common.h
+++ b/board/keymile/common/common.h
@@ -17,4 +17,14 @@ int ivm_read_eeprom (void);
 #ifdef CONFIG_KEYMILE_HDLC_ENET
 int keymile_hdlc_enet_initialize (bd_t *bis);
 #endif
+
+int fdt_set_node_and_value (void *blob,
+			char *nodename,
+			char *regname,
+			void *var,
+			int size);
+int fdt_get_node_and_value (void *blob,
+				char *nodename,
+				char *propname,
+				void **var);
 #endif /* __KEYMILE_COMMON_H */
diff --git a/board/keymile/km8xx/km8xx.c b/board/keymile/km8xx/km8xx.c
index 7c5817977784564f080e75b84c757cfb840a262d..ec883a40447f9b55e2c25fce6c495ee087401ab0 100644
--- a/board/keymile/km8xx/km8xx.c
+++ b/board/keymile/km8xx/km8xx.c
@@ -159,12 +159,6 @@ int hush_init_var (void)
 }
 
 #if defined(CONFIG_OF_BOARD_SETUP) && defined(CONFIG_OF_LIBFDT)
-extern int fdt_set_node_and_value (void *blob,
-				char *nodename,
-				char *regname,
-				void *var,
-				int size);
-
 /*
  * update "memory" property in the blob
  */
@@ -172,33 +166,53 @@ void ft_blob_update (void *blob, bd_t *bd)
 {
 	ulong brg_data[1] = {0};
 	ulong memory_data[2] = {0};
-	ulong flash_data[4] = {0};
+	ulong *flash_data = NULL;
 	ulong flash_reg[3] = {0};
-	uchar enetaddr[6];
+	flash_info_t	*info;
+	int	len;
+	int	i = 0;
 
 	memory_data[0] = cpu_to_be32 (bd->bi_memstart);
 	memory_data[1] = cpu_to_be32 (bd->bi_memsize);
 	fdt_set_node_and_value (blob, "/memory", "reg", memory_data,
 				sizeof (memory_data));
 
-	flash_data[2] = cpu_to_be32 (bd->bi_flashstart);
-	flash_data[3] = cpu_to_be32 (bd->bi_flashsize);
+	len = fdt_get_node_and_value (blob, "/localbus", "ranges",
+					(void *)&flash_data);
+
+	if (flash_data == NULL) {
+		printf ("%s: error /localbus/ranges entry\n", __FUNCTION__);
+		return;
+	}
+
+	/* update Flash addr, size */
+	while ( i < (len / 4)) {
+		switch (flash_data[i]) {
+		case 0:
+			info = flash_get_info(CONFIG_SYS_FLASH_BASE);
+			flash_data[i + 1] = 0;
+			flash_data[i + 2] = cpu_to_be32 (CONFIG_SYS_FLASH_BASE);
+			flash_data[i + 3] = cpu_to_be32 (info->size);
+			break;
+		default:
+			break;
+		}
+		i += 4;
+	}
 	fdt_set_node_and_value (blob, "/localbus", "ranges", flash_data,
-				sizeof (flash_data));
+				len);
 
 	flash_reg[2] = cpu_to_be32 (bd->bi_flashsize);
 	fdt_set_node_and_value (blob, "/localbus/flash@0,0", "reg", flash_reg,
 				sizeof (flash_reg));
-
 	/* BRG */
 	brg_data[0] = cpu_to_be32 (bd->bi_busfreq);
 	fdt_set_node_and_value (blob, "/soc/cpm", "brg-frequency", brg_data,
 				sizeof (brg_data));
 
 	/* MAC adr */
-	eth_getenv_enetaddr("ethaddr", enetaddr);
 	fdt_set_node_and_value (blob, "/soc/cpm/ethernet", "mac-address",
-				enetaddr, sizeof (u8) * 6);
+				bd->bi_enetaddr, sizeof (u8) * 6);
 }
 
 void ft_board_setup(void *blob, bd_t *bd)
diff --git a/board/keymile/kmeter1/kmeter1.c b/board/keymile/kmeter1/kmeter1.c
index 3d1b94154898872d00f36dd8b094b02348d31118..8cac2c4662915ae587e8c47cbf9658231803f067 100644
--- a/board/keymile/kmeter1/kmeter1.c
+++ b/board/keymile/kmeter1/kmeter1.c
@@ -187,9 +187,60 @@ int checkboard (void)
 }
 
 #if defined(CONFIG_OF_BOARD_SETUP)
+/*
+ * update "/localbus/ranges" property in the blob
+ */
+void ft_blob_update (void *blob, bd_t *bd)
+{
+	ulong	*flash_data = NULL;
+	flash_info_t	*info;
+	ulong	flash_reg[6] = {0};
+	int	len;
+	int	size = 0;
+	int	i = 0;
+
+	len = fdt_get_node_and_value (blob, "/localbus", "ranges",
+					(void *)&flash_data);
+
+	if (flash_data == NULL) {
+		printf ("%s: error /localbus/ranges entry\n", __FUNCTION__);
+		return;
+	}
+
+	/* update Flash addr, size */
+	while ( i < (len / 4)) {
+		switch (flash_data[i]) {
+		case 0:
+			info = flash_get_info(CONFIG_SYS_FLASH_BASE);
+			size = info->size;
+			info = flash_get_info(CONFIG_SYS_FLASH_BASE_1);
+			size += info->size;
+			flash_data[i + 1] = 0;
+			flash_data[i + 2] = cpu_to_be32 (CONFIG_SYS_FLASH_BASE);
+			flash_data[i + 3] = cpu_to_be32 (size);
+			break;
+		default:
+			break;
+		}
+		i += 4;
+	}
+	fdt_set_node_and_value (blob, "/localbus", "ranges", flash_data,
+				len);
+
+	info = flash_get_info(CONFIG_SYS_FLASH_BASE);
+	flash_reg[2] = cpu_to_be32 (size);
+	flash_reg[4] = flash_reg[2];
+	info = flash_get_info(CONFIG_SYS_FLASH_BASE_1);
+	flash_reg[5] = cpu_to_be32 (info->size);
+	fdt_set_node_and_value (blob, "/localbus/flash@f0000000,0", "reg", flash_reg,
+				sizeof (flash_reg));
+}
+
+
 void ft_board_setup (void *blob, bd_t *bd)
 {
 	ft_cpu_setup (blob, bd);
+	ft_blob_update (blob, bd);
 }
 #endif
 
diff --git a/board/keymile/mgcoge/mgcoge.c b/board/keymile/mgcoge/mgcoge.c
index 67722e708d7f413ba1cc082ee719825809e5d4a0..d24a4b57698ca1d20a2611d2c727459f6899f365 100644
--- a/board/keymile/mgcoge/mgcoge.c
+++ b/board/keymile/mgcoge/mgcoge.c
@@ -312,42 +312,71 @@ int hush_init_var (void)
 }
 
 #if defined(CONFIG_OF_BOARD_SETUP) && defined(CONFIG_OF_LIBFDT)
-extern int fdt_set_node_and_value (void *blob,
-				char *nodename,
-				char *regname,
-				void *var,
-				int size);
-
 /*
  * update "memory" property in the blob
  */
 void ft_blob_update (void *blob, bd_t *bd)
 {
 	ulong memory_data[2] = {0};
-	ulong flash_data[8] = {0};
+	ulong *flash_data = NULL;
+	ulong	flash_reg[6] = {0};
 	flash_info_t	*info;
-	uchar enetaddr[6];
+	int	len;
+	int	size;
+	int	i = 0;
 
 	memory_data[0] = cpu_to_be32 (bd->bi_memstart);
 	memory_data[1] = cpu_to_be32 (bd->bi_memsize);
 	fdt_set_node_and_value (blob, "/memory", "reg", memory_data,
 				sizeof (memory_data));
 
+	len = fdt_get_node_and_value (blob, "/localbus", "ranges",
+					(void *)&flash_data);
+
+	if (flash_data == NULL) {
+		printf ("%s: error /localbus/ranges entry\n", __FUNCTION__);
+		return;
+	}
+
 	/* update Flash addr, size */
-	info = flash_get_info(CONFIG_SYS_FLASH_BASE);
-	flash_data[2] = cpu_to_be32 (CONFIG_SYS_FLASH_BASE);
-	flash_data[3] = cpu_to_be32 (info->size);
-	flash_data[4] = cpu_to_be32 (5);
-	flash_data[5] = cpu_to_be32 (0);
-	info = flash_get_info(CONFIG_SYS_FLASH_BASE_1);
-	flash_data[6] = cpu_to_be32 (CONFIG_SYS_FLASH_BASE_1);
-	flash_data[7] = cpu_to_be32 (info->size);
+	while ( i < (len / 4)) {
+		switch (flash_data[i]) {
+		case 0:
+			info = flash_get_info(CONFIG_SYS_FLASH_BASE);
+			flash_data[i + 1] = 0;
+			flash_data[i + 2] = cpu_to_be32 (CONFIG_SYS_FLASH_BASE);
+			flash_data[i + 3] = cpu_to_be32 (info->size);
+			break;
+		case 5:
+			info = flash_get_info(CONFIG_SYS_FLASH_BASE_1);
+			size = info->size;
+			info = flash_get_info(CONFIG_SYS_FLASH_BASE_2);
+			size += info->size;
+			flash_data[i + 1] = 0;
+			flash_data[i + 2] = cpu_to_be32 (CONFIG_SYS_FLASH_BASE_1);
+			flash_data[i + 3] = cpu_to_be32 (size);
+			break;
+		default:
+			break;
+		}
+		i += 4;
+	}
 	fdt_set_node_and_value (blob, "/localbus", "ranges", flash_data,
-				sizeof (flash_data));
+				len);
+
+	info = flash_get_info(CONFIG_SYS_FLASH_BASE_1);
+	flash_reg[0] = cpu_to_be32 (5);
+	flash_reg[2] = cpu_to_be32 (info->size);
+	flash_reg[3] = flash_reg[0];
+	flash_reg[4] = flash_reg[2];
+	info = flash_get_info(CONFIG_SYS_FLASH_BASE_2);
+	flash_reg[5] = cpu_to_be32 (info->size);
+	fdt_set_node_and_value (blob, "/localbus/flash@5,0", "reg", flash_reg,
+				sizeof (flash_reg));
+
 	/* MAC addr */
-	eth_getenv_enetaddr("ethaddr", enetaddr);
 	fdt_set_node_and_value (blob, "/soc/cpm/ethernet", "mac-address",
-				enetaddr, sizeof (u8) * 6);
+				bd->bi_enetaddr, sizeof (u8) * 6);
 }
 
 void ft_board_setup (void *blob, bd_t *bd)
diff --git a/include/configs/keymile-common.h b/include/configs/keymile-common.h
index 0fcf692d18b3d9ff639ab60b2e2b0e002a8ea264..0cc1b3b59ce4992287081beb951fee4a45ed180c 100644
--- a/include/configs/keymile-common.h
+++ b/include/configs/keymile-common.h
@@ -45,6 +45,7 @@
 #define CONFIG_CMD_I2C
 #define CONFIG_CMD_JFFS2
 #define CONFIG_JFFS2_CMDLINE
+#define CONFIG_CMD_MTDPARTS
 
 #undef	CONFIG_WATCHDOG			/* disable platform specific watchdog */
 
@@ -97,7 +98,7 @@
 #define CONFIG_SYS_SLOT_ID_MASK		(0x3f)	/* mask for slot ID bits */
 
 #define CONFIG_I2C_MULTI_BUS	1
-#define CONFIG_SYS_MAX_I2C_BUS		2
+#define CONFIG_SYS_MAX_I2C_BUS		1
 #define CONFIG_SYS_I2C_INIT_BOARD	1
 #define CONFIG_I2C_MUX		1
 
@@ -122,6 +123,20 @@
 #define CONFIG_BOOTP_GATEWAY
 #define CONFIG_BOOTP_HOSTNAME
 
+#define CONFIG_ENV_SIZE		0x04000 /* Size of Environment */
+
+#define CONFIG_SYS_MALLOC_LEN	(1024 * 1024)	/* Reserved for malloc */
+
+#define CONFIG_SYS_64BIT_VSPRINTF	/* needed for UBI/UBIFS */
+
+/* UBI Support for all Keymile boards */
+#define CONFIG_CMD_UBI
+#define CONFIG_RBTREE
+#define CONFIG_MTD_PARTITIONS
+#define CONFIG_FLASH_CFI_MTD
+#define CONFIG_MTD_DEVICE
+#define CONFIG_MTD_CONCAT
+
 /* define this to use the keymile's io muxing feature */
 /*#define CONFIG_IO_MUXING */
 
diff --git a/include/configs/km8xx.h b/include/configs/km8xx.h
index c305b896908ce7742b1e7f5021b58d9461af6e37..b5552d217ce007a57f30b1871e7e584bdf5754ce 100644
--- a/include/configs/km8xx.h
+++ b/include/configs/km8xx.h
@@ -121,7 +121,6 @@
 #define CONFIG_SYS_FLASH_BASE		0xf0000000
 #define CONFIG_SYS_MONITOR_LEN		(384 << 10) /* 384 kB for Monitor */
 #define CONFIG_SYS_MONITOR_BASE	CONFIG_SYS_FLASH_BASE
-#define CONFIG_SYS_MALLOC_LEN		(256 << 10) /* 256 kB for malloc() */
 
 /*
  * For booting Linux, the board info and command line data
@@ -146,7 +145,6 @@
 
 #define CONFIG_ENV_IS_IN_FLASH	1
 #define CONFIG_ENV_OFFSET	CONFIG_SYS_MONITOR_LEN
-#define CONFIG_ENV_SIZE		0x04000 /* Total Size of Environment Sector */
 #define CONFIG_ENV_SECT_SIZE	0x20000 /* Total Size of Environment Sector */
 
 /* Address and size of Redundant Environment Sector	*/
diff --git a/include/configs/kmeter1.h b/include/configs/kmeter1.h
index 41dbd0d241861731de6baf781d6120bda6263ca8..347b47c6516f901e07e66e98050b9a889264a3a8 100644
--- a/include/configs/kmeter1.h
+++ b/include/configs/kmeter1.h
@@ -292,7 +292,6 @@
 #define CONFIG_ENV_IS_IN_FLASH	1
 #define CONFIG_ENV_ADDR		(CONFIG_SYS_MONITOR_BASE + CONFIG_SYS_MONITOR_LEN)
 #define CONFIG_ENV_SECT_SIZE	0x20000 /* 128K(one sector) for env */
-#define CONFIG_ENV_SIZE		0x20000
 #define CONFIG_ENV_OFFSET	(CONFIG_SYS_MONITOR_LEN)
 
 /* Address and size of Redundant Environment Sector	*/
@@ -314,7 +313,6 @@
 #define CONFIG_SYS_I2C_SLAVE	0x7F
 #define CONFIG_SYS_I2C_OFFSET	0x3000
 #define CONFIG_I2C_MULTI_BUS	1
-#define CONFIG_SYS_MAX_I2C_BUS		2
 #define CONFIG_I2C_MUX		1
 
 /* EEprom support */
@@ -326,7 +324,7 @@
 #define CONFIG_SYS_DTT_MAX_TEMP	70
 #define CONFIG_SYS_DTT_LOW_TEMP	-30
 #define CONFIG_SYS_DTT_HYSTERESIS	3
-#define CONFIG_SYS_DTT_BUS_NUM		(2)
+#define CONFIG_SYS_DTT_BUS_NUM		(CONFIG_SYS_MAX_I2C_BUS)
 
 #if defined(CONFIG_PCI)
 #define CONFIG_CMD_PCI
@@ -433,7 +431,7 @@
 
 #define CONFIG_PRAM	512	/* protected RAM [KBytes] */
 
-#define MTDIDS_DEFAULT		"nor0=app"
+#define MTDIDS_DEFAULT		"nor2=app"
 #define MTDPARTS_DEFAULT \
 	"mtdparts=app:256k(u-boot),128k(env),128k(envred),"	\
 	"1536k(esw0),8704k(rootfs0),1536k(esw1),2432k(rootfs1),640k(var),768k(cfg)"
diff --git a/include/configs/mgcoge.h b/include/configs/mgcoge.h
index cc42101853568d0eefce51987cea77847150cfad..ea14948c4651c45b93b05de5484ea5bb27777f9c 100644
--- a/include/configs/mgcoge.h
+++ b/include/configs/mgcoge.h
@@ -98,13 +98,11 @@
 	"addcon=setenv bootargs ${bootargs} "				\
 		"console=ttyCPM0,${baudrate}\0"				\
 	"mtdids=nor0=boot,nor1=app \0"					\
-	"mtdparts=mtdparts=boot:384k(u-boot),128k(env),128k(envred),"	\
-		"3456k(free);app:3m(esw0),10m(rootfs0),3m(esw1),"	\
-		"10m(rootfs1),1m(var),5m(cfg) \0"			\
 	"partition=nor1,5 \0"						\
 	"new_env=prot off FE060000 FE09FFFF; era FE060000 FE09FFFF \0" 	\
 	"EEprom_ivm=pca9544a:70:4 \0"					\
-	"mtdparts=" MK_STR(MTDPARTS_DEFAULT) "\0"				\
+	"mtdparts=" MK_STR(MTDPARTS_DEFAULT) "\0"			\
+	"unlock=yes\0"							\
 	""
 
 #define CONFIG_SYS_SDRAM_BASE		0x00000000
@@ -112,13 +110,17 @@
 #define CONFIG_SYS_FLASH_SIZE		32
 #define CONFIG_SYS_FLASH_CFI
 #define CONFIG_FLASH_CFI_DRIVER
-#define CONFIG_SYS_MAX_FLASH_BANKS	2	/* max num of flash banks	*/
+#define CONFIG_SYS_MAX_FLASH_BANKS	3	/* max num of flash banks	*/
 #define CONFIG_SYS_MAX_FLASH_SECT	512	/* max num of sects on one chip */
 
 #define CONFIG_SYS_FLASH_BASE_1	0x50000000
-#define CONFIG_SYS_FLASH_SIZE_1	64
+#define CONFIG_SYS_FLASH_SIZE_1	32
+#define CONFIG_SYS_FLASH_BASE_2	0x52000000
+#define CONFIG_SYS_FLASH_SIZE_2	32
 
-#define CONFIG_SYS_FLASH_BANKS_LIST { CONFIG_SYS_FLASH_BASE, CONFIG_SYS_FLASH_BASE_1 }
+#define CONFIG_SYS_FLASH_BANKS_LIST { CONFIG_SYS_FLASH_BASE, \
+					CONFIG_SYS_FLASH_BASE_1, \
+					CONFIG_SYS_FLASH_BASE_2 }
 
 #define CONFIG_SYS_MONITOR_BASE	TEXT_BASE
 #if (CONFIG_SYS_MONITOR_BASE < CONFIG_SYS_FLASH_BASE)
@@ -193,7 +195,6 @@
 #define BOOTFLAG_COLD		0x01	/* Normal Power-On: Boot from FLASH */
 #define BOOTFLAG_WARM		0x02	/* Software reboot                  */
 
-#define CONFIG_SYS_MALLOC_LEN		(4096 << 10)	/* Reserve 4 MB for malloc()	*/
 #define CONFIG_SYS_BOOTMAPSZ		(8 << 20)	/* Initial Memory map for Linux */
 
 #define CONFIG_SYS_CACHELINE_SIZE	32	/* For MPC8260 CPUs */
@@ -333,9 +334,10 @@
 #define CONFIG_SYS_BR5_PRELIM	((CONFIG_SYS_FLASH_BASE_1 & BRx_BA_MSK) |\
 			 BRx_PS_16 | BRx_MS_GPCM_P | BRx_V)
 
-#define CONFIG_SYS_OR5_PRELIM	(MEG_TO_AM(CONFIG_SYS_FLASH_SIZE_1) |\
-			 ORxG_CSNT | ORxG_ACS_DIV2 |\
-			 ORxG_SCY_5_CLK | ORxG_TRLX )
+#define CONFIG_SYS_OR5_PRELIM	(MEG_TO_AM(CONFIG_SYS_FLASH_SIZE_1 + \
+				 CONFIG_SYS_FLASH_SIZE_2) |\
+				 ORxG_CSNT | ORxG_ACS_DIV2 |\
+				 ORxG_SCY_5_CLK | ORxG_TRLX )
 
 #define	CONFIG_SYS_RESET_ADDRESS 0xFDFFFFFC	/* "bad" address		*/
 
diff --git a/include/i2c.h b/include/i2c.h
index 668e754e2a804d325c0dc915237ff6a222af0787..b75476980bf2292cdc01658f4821f18c5687084e 100644
--- a/include/i2c.h
+++ b/include/i2c.h
@@ -47,7 +47,9 @@
 #define I2C_RXTX_LEN	128	/* maximum tx/rx buffer length */
 
 #if defined(CONFIG_I2C_MULTI_BUS)
+#if !defined(CONFIG_SYS_MAX_I2C_BUS)
 #define CONFIG_SYS_MAX_I2C_BUS		2
+#endif
 #define I2C_GET_BUS()		i2c_get_bus_num()
 #define I2C_SET_BUS(a)		i2c_set_bus_num(a)
 #else