diff --git a/iopsys-brcm63xx-arm/base-files/lib/upgrade/iopsys-4-to-5-migrator.sh b/iopsys-brcm63xx-arm/base-files/lib/upgrade/iopsys-4-to-5-migrator.sh
index 4a55ef49ea1dc10a1be039ad67f0af1f54b458f9..de77f7978e06fa831a04fc1697f394d4a91974e2 100755
--- a/iopsys-brcm63xx-arm/base-files/lib/upgrade/iopsys-4-to-5-migrator.sh
+++ b/iopsys-brcm63xx-arm/base-files/lib/upgrade/iopsys-4-to-5-migrator.sh
@@ -107,7 +107,7 @@ flush_fs_cache() {
 #--------------------------------------------------------------
 # Raw copy of kernel in JFFS2 flash bank $1 to file $2
 jffs_to_img() {
-	local mtd partSize eraseSize usageSize
+	local mtd
 
 	[ -n "$1" -a -n "$2" ] || return
 	[ $1 -ge 0 -a $1 -le 1 ] || return
@@ -117,22 +117,7 @@ jffs_to_img() {
 	[ $mtd -gt 0 ] || return
 	[ -c "/dev/mtd${mtd}" -a -b "/dev/mtdblock${mtd}" ] || return
 
-	# Copy the mtd to a file but leave out the last empty part due
-	# to when we later rewrite it back there may be bad blocks.
-	read -t 5 -s partSize <"/sys/class/mtd/mtd${mtd}/size"
-	read -t 5 -s eraseSize <"/sys/class/mtd/mtd${mtd}/erasesize"
-	[ -n "$partSize" -a -n "$eraseSize" ] || return
-	[ $partSize -gt 0 -a $eraseSize -gt 0 ] || return
-	[ $partSize -gt $eraseSize ] || return
-
-	usageSize=$(tr -s "\377" <"/dev/mtd${mtd}" | wc -c) || return
-	if [ $((usageSize + 2*eraseSize)) -gt $((partSize - 2*eraseSize)) ]; then
-		echo "Error, peculiar usage size of mtd${mtd}: $usageSize" >&2
-		return 1
-	fi
-
-	dd if="/dev/mtd${mtd}" bs=1k count=$((usageSize + 2*erasesize)) \
-		of="$2" 2>/dev/null || return
+	nanddump --bb=skipbad -qf "$2" "/dev/mtd${mtd}" || return
 
 	return 0
 }
@@ -669,12 +654,13 @@ nvram_old_seqnum() {
 
 	[ -n "$1" ] || return
 	[ $1 -ge 1 -a $1 -le 3 ] || return
-	[ -c "/dev/mtd0ro" ] || return
+	[ -c "/dev/mtd0" ] || return
 
 	offs=$((mtdEbSz * $1))
 
-	dd if="/dev/mtd0ro" bs=1 skip=$((offs + 8)) \
-		count=4 2>/dev/null | hexdump -ve \"0x%8.8x\"
+	nanddump --bb=padbad -qa -l $mtdEbSz -s $offs "/dev/mtd0" | \
+		tee /dev/null | dd bs=1 skip=8 count=4 2>/dev/null | \
+		hexdump -ve \"0x%8.8x\"													# The tee is for circumventing a broken pipe.
 }
 
 
@@ -684,25 +670,26 @@ nvram_old_seqnum() {
 # format at index $1 is valid.
 # $1 = index from 0 to 3.
 is_nvram_old_valid() {
-	local offs offsCrc crc1 crc2
+	local offsEb offsSub crc1 crc2
 
 	[ -n "$1" ] || return
 	[ $1 -ge 0 -a $1 -le 3 ] || return
-	[ -c "/dev/mtd0ro" ] || return
+	[ -c "/dev/mtd0" ] || return
 
 	if [ $1 -eq 0 ]; then
 		# nvram embedded into cferom for Broadcom ARM Gen2.
-		offs=$((mtdEbSz / 2 + 0x580))
-		offsCrc=0
+		offsEb=0
+		offsSub=$((mtdEbSz / 2 + 0x580))
 	else
-		offs=$((mtdEbSz * $1))
-		offsCrc=16
+		offsEb=$((mtdEbSz * $1))
+		offsSub=16
 	fi
 
 	if [ $1 -ge 1 ]; then
 		# Magic identifier?
-		dd if="/dev/mtd0ro" bs=1 skip=$((offs + 0)) count=6 2>/dev/null | \
-			strings -n 4 | grep -qEi "^NVRAM$" || return
+		nanddump --bb=padbad -qa -l $mtdEbSz -s $offsEb "/dev/mtd0" | \
+			tee /dev/null | dd bs=1 count=6 2>/dev/null | strings -n 4 | \
+			grep -qEi "^NVRAM$" || return										# The tee is for circumventing a broken pipe.
 	
 		# Sequence number OK?
 		nvram_old_seqnum $1 >/dev/null || return
@@ -710,12 +697,14 @@ is_nvram_old_valid() {
 	fi
 
 	# Checksum?
-	dd if="/dev/mtd0ro" bs=1 skip=$((offs + offsCrc)) \
-		count=1020 2>/dev/null >"/tmp/iopmigr-nvram-crc" || return
-	head -c 4 "/dev/zero" >>"/tmp/iopmigr-nvram-crc" || return
+	nanddump --bb=padbad -qa -l $mtdEbSz -s $offsEb "/dev/mtd0" | \
+		tee /dev/null | dd bs=1 skip=$offsSub count=1020 \
+		2>/dev/null >"/tmp/iopmigr-nvram-crc" || return
+	echo -ne "\x00\x00\x00\x00" >>"/tmp/iopmigr-nvram-crc" || return
 	crc1=$(ubicrc32 "/tmp/iopmigr-nvram-crc") || return
-	crc2=$(dd if="/dev/mtd0ro" bs=1 skip=$((offs + offsCrc + 1020)) \
-		count=4 2>/dev/null | hexdump -ve \"0x%8.8x\\n\") || return
+	crc2=$(nanddump --bb=padbad -qa -l $mtdEbSz -s $offsEb "/dev/mtd0" | \
+		tee /dev/null | dd bs=1 skip=$((offsSub + 1020)) count=4 2>/dev/null | \
+		hexdump -ve \"0x%8.8x\\n\") || return
 	[ $((crc1)) -eq $((crc2)) ]
 }
 
@@ -730,17 +719,19 @@ is_nvram_mirror_valid() {
 
 	[ -n "$1" ] || return
 	[ $1 -ge 1 -a $1 -le 3 ] || return
-	[ -c "/dev/mtd0ro" ] || return
+	[ -c "/dev/mtd0" ] || return
 
 	offs=$((mtdEbSz * $1))
 
 	# Checksum?
-	dd if="/dev/mtd0ro" bs=1 skip=$((offs)) \
-		count=1020 2>/dev/null >"/tmp/iopmigr-nvram-crc" || return
-	head -c 4 "/dev/zero" >>"/tmp/iopmigr-nvram-crc" || return
+	nanddump --bb=padbad -qa -l $mtdEbSz -s $offs "/dev/mtd0" | \
+		tee /dev/null | dd bs=1 count=1020 2>/dev/null \
+		>"/tmp/iopmigr-nvram-crc" || return
+	echo -ne "\x00\x00\x00\x00" >>"/tmp/iopmigr-nvram-crc" || return
 	crc1=$(ubicrc32 "/tmp/iopmigr-nvram-crc") || return
-	crc2=$(dd if="/dev/mtd0ro" bs=1 skip=$((offs + 1020)) \
-		count=4 2>/dev/null | hexdump -ve \"0x%8.8x\\n\") || return
+	crc2=$(nanddump --bb=padbad -qa -l $mtdEbSz -s $offs "/dev/mtd0" | \
+		tee /dev/null | dd bs=1 skip=1020 count=4 2>/dev/null | \
+		hexdump -ve \"0x%8.8x\\n\") || return
 	[ $((crc1)) -eq $((crc2)) ]
 }
 
@@ -788,7 +779,7 @@ nvram_old_freshest() {
 # to Broadcom nvram mirror format. As used in
 # Iopsys v5.
 nvram_old_convert() {
-	local seqn offs i
+	local offs i offsEb offsSub
 
 	for i in 1 2 3; do
 		if ! is_nvram_old_valid $i && is_nvram_mirror_valid $i; then
@@ -798,25 +789,28 @@ nvram_old_convert() {
 	done
 
 	# Find most up to date copy of old nvram.
-	seqn=$(nvram_old_freshest) || return
-	[ -n "$seqn" ] || return
+	i=$(nvram_old_freshest) || return
+	[ -n "$i" ] || return
 
 	# Set offset in flash depending of nvram index.
-	if [ $seqn -eq 0 ]; then
+	if [ $i -eq 0 ]; then
 		# nvram embedded into cferom for Broadcom ARM Gen2.
-		offs=$((mtdEbSz / 2 + 0x580))
-	elif [ $seqn -ge 1 -a $seqn -le 3 ]; then
+		offsEb=0
+		offsSub=$((mtdEbSz / 2 + 0x580))
+	elif [ $i -ge 1 -a $i -le 3 ]; then
 		# Iopsys v4 format.
-		offs=$((mtdEbSz * seqn + 16))
+		offsEb=$((mtdEbSz * $i))
+		offsSub=16
 	else
 		return 1
 	fi
-	echo "NVRAM converting from $seqn..."
+	echo "NVRAM converting from $i..."
 	
 	# Convert it into Broadcom nvram mirror format.
 	[ $mtdEbSz -gt 32768 ] || return
-	dd if="/dev/mtd0ro" bs=1 skip=$((offs)) \
-		count=1024 2>/dev/null >"/tmp/iopmigr-nvram-conv" || return
+	nanddump --bb=padbad -qa -l $mtdEbSz -s $offsEb "/dev/mtd0" | \
+		tee /dev/null | dd bs=1 skip=$offsSub count=1024 \
+		2>/dev/null >"/tmp/iopmigr-nvram-conv" || return
 	head -c $((mtdEbSz - 1024)) "/dev/zero" | \
 		tr "\000" "\377" >>"/tmp/iopmigr-nvram-conv"