diff --git a/addon/firmware_update_script b/addon/firmware_update_script
index db57c7c..5ed90ae 100644
--- a/addon/firmware_update_script
+++ b/addon/firmware_update_script
@@ -3,14 +3,8 @@
 DISK="/dev/mmcblk0"
 BOOT_SIZE=268435456
 ROOT_SIZE=1073741824
-
-
-echo "Deleting update_script.
" 1>&2
-mount -o remount,rw /userfs
-rm -f "$0"
-mount -o remount,ro /userfs
-
-echo "Checking for rootfs2 on $DISK.
" 1>&2
+REPARTITION=0
+RELABEL=0
 
 function start_sshd() {
 	echo "Starting ssh daemon.
" 1>&2
@@ -20,68 +14,86 @@ function start_sshd() {
 	/etc/init.d/S50sshd start
 }
 
-if blkid ${DISK}p3 | grep 'LABEL="rootfs2"' 1>/dev/null 2>/dev/null; then
-	echo "Rootfs2 found.
" 1>&2
+function repartition() {
+	echo "Checking for rootfs2 on $DISK.
" 1>&2
 	
-	start_sshd
-	
-	cp /bootfs/VERSION /tmp/bootfs.VERSION
-	umount /bootfs
-	umount /rootfs
-	
-	echo "Current partition table:
" 1>&2
-	parted $DISK unit B print | sed ':a;N;$!ba;s#\n#
#g' 1>&2
-	
-	boot_start=$(parted $DISK unit B print | grep '^ 1' | sed -n 's/ [1-4] *\([0-9]*\)B  *\([0-9]*\)B.*/\1/p')
-	user_start=$(parted $DISK unit B print | grep '^ 4' | sed -n 's/ [1-4] *\([0-9]*\)B  *\([0-9]*\)B.*/\1/p')
-	user_end=$(parted $DISK unit B print | grep '^ 4' | sed -n 's/ [1-4] *\([0-9]*\)B  *\([0-9]*\)B.*/\2/p')
-	
-	boot_end=$(($boot_start+$BOOT_SIZE-1))
-	root_start=$(($boot_end+1))
-	root_end=$(($root_start+$ROOT_SIZE-1))
-	
-	boot_start_s=$((${boot_start}/512))
-	boot_size_s=$(((${boot_end}-${boot_start}+1)/512))
-	root_start_s=$((${root_start}/512))
-	root_size_s=$(((${root_end}-${root_start}+1)/512))
-	user_start_s=$((${user_start}/512))
-	user_size_s=$(((${user_end}-${user_start}+1)/512))
-	
-	echo "Calculated new partition layout:
" 1>&2
-	echo " bootfs: $boot_start ($boot_start_s) - $boot_end - $boot_size_s
" 1>&2
-	echo " rootfs: $root_start ($root_start_s) - $root_end - $root_size_s
" 1>&2
-	echo " userfs: $user_start ($user_start_s) - $user_end - $user_size_s
" 1>&2
-	
-	echo "Writing new partition table to disk.
" 1>&2
-	# parted will refuse to write partition table because partitions are mounted
-	#parted --script $DISK \
-	#	mklabel msdos \
-	#	mkpart primary fat32 ${boot_start}B ${boot_end}B \
-	#	set 1 boot on \
-	#	mkpart primary ext4 ${root_start}B ${root_end}B \
-	#	mkpart primary ext4 ${user_start}B ${user_end}B
-	
-	{
-		echo "$boot_start_s,$boot_size_s,0x0C,*"
-		echo "$root_start_s,$root_size_s,0x83"
-		echo "$user_start_s,$user_size_s,0x83"
-		,0
-	} | sfdisk --no-reread --force --wipe=always --label=dos $DISK 2>&1 | sed ':a;N;$!ba;s#\n#
#g' 1>&2
-	
-	# Use dd to write label id
-	printf "\xde\xed\xbe\xef" | dd of=$DISK bs=1 count=4 seek=440
-	
-	#echo "New partition table:
" 1>&2
-	#parted $DISK unit B print | sed ':a;N;$!ba;s#\n#
#g' 1>&2
-	
-	partprobe
-	
-	# RaspberryMatic will check for label rootfs and VERSION file
-	mkfs.ext4 -L rootfs ${DISK}p2
-	mount ${DISK}p2 /rootfs
-	cp /tmp/bootfs.VERSION /rootfs/VERSION
-	umount /rootfs
-fi
+	if blkid ${DISK}p3 | grep 'LABEL="rootfs2"' 1>/dev/null 2>/dev/null; then
+		echo "Rootfs2 found.
" 1>&2
+		
+		cp /bootfs/VERSION /tmp/bootfs.VERSION
+		umount /bootfs
+		umount /rootfs
+		
+		echo "Current partition table:
" 1>&2
+		parted $DISK unit B print | sed ':a;N;$!ba;s#\n#
#g' 1>&2
+		
+		boot_start=$(parted $DISK unit B print | grep '^ 1' | sed -n 's/ [1-4] *\([0-9]*\)B  *\([0-9]*\)B.*/\1/p')
+		user_start=$(parted $DISK unit B print | grep '^ 4' | sed -n 's/ [1-4] *\([0-9]*\)B  *\([0-9]*\)B.*/\1/p')
+		user_end=$(parted $DISK unit B print | grep '^ 4' | sed -n 's/ [1-4] *\([0-9]*\)B  *\([0-9]*\)B.*/\2/p')
+		
+		boot_end=$(($boot_start+$BOOT_SIZE-1))
+		root_start=$(($boot_end+1))
+		root_end=$(($root_start+$ROOT_SIZE-1))
+		
+		boot_start_s=$((${boot_start}/512))
+		boot_size_s=$(((${boot_end}-${boot_start}+1)/512))
+		root_start_s=$((${root_start}/512))
+		root_size_s=$(((${root_end}-${root_start}+1)/512))
+		user_start_s=$((${user_start}/512))
+		user_size_s=$(((${user_end}-${user_start}+1)/512))
+		
+		echo "Calculated new partition layout:
" 1>&2
+		echo " bootfs: $boot_start ($boot_start_s) - $boot_end - $boot_size_s
" 1>&2
+		echo " rootfs: $root_start ($root_start_s) - $root_end - $root_size_s
" 1>&2
+		echo " userfs: $user_start ($user_start_s) - $user_end - $user_size_s
" 1>&2
+		
+		echo "Writing new partition table to disk.
" 1>&2
+		# parted will refuse to write partition table because partitions are mounted
+		#parted --script $DISK \
+		#	mklabel msdos \
+		#	mkpart primary fat32 ${boot_start}B ${boot_end}B \
+		#	set 1 boot on \
+		#	mkpart primary ext4 ${root_start}B ${root_end}B \
+		#	mkpart primary ext4 ${user_start}B ${user_end}B
+		
+		{
+			echo "$boot_start_s,$boot_size_s,0x0C,*"
+			echo "$root_start_s,$root_size_s,0x83"
+			echo "$user_start_s,$user_size_s,0x83"
+			,0
+		} | sfdisk --no-reread --force --wipe=always --label=dos $DISK 2>&1 | sed ':a;N;$!ba;s#\n#
#g' 1>&2
+		
+		# Use dd to write label id
+		printf "\xef\xbe\xed\xde" | dd of=$DISK bs=1 count=4 seek=440
+		
+		#echo "New partition table:
" 1>&2
+		#parted $DISK unit B print | sed ':a;N;$!ba;s#\n#
#g' 1>&2
+		
+		partprobe
+		
+		# RaspberryMatic will check for label rootfs and VERSION file
+		mkfs.ext4 -L rootfs ${DISK}p2
+		mount ${DISK}p2 /rootfs
+		cp /tmp/bootfs.VERSION /rootfs/VERSION
+		umount /rootfs
+	fi
+}
+
+function relabel() {
+	user=$(readlink -f /dev/disk/by-label/userfs)
+	user0=$(readlink -f /dev/disk/by-label/0userfs)
+	tune2fs -L 0userfs $user
+	tune2fs -L userfs $user0
+}
+
+echo "Deleting update_script.
" 1>&2
+mount -o remount,rw /userfs
+rm -f "$0"
+mount -o remount,ro /userfs
+
+start_sshd
+[ "$RELABEL" = "1" ] && relabel
+[ "$REPARTITION" = "1" ] && repartition
 
 echo "Running fwinstall.sh (again).
" 1>&2
 rm -f /tmp/.runningFirmwareUpdate
diff --git a/addon/lib/rmupdate.tcl b/addon/lib/rmupdate.tcl
index 35e8160..acd19fc 100644
--- a/addon/lib/rmupdate.tcl
+++ b/addon/lib/rmupdate.tcl
@@ -469,7 +469,7 @@ proc ::rmupdate::update_cmdline {cmdline root} {
 	close $fd
 }
 
-proc ::rmupdate::update_boot_scr {boot_scr root} {
+proc ::rmupdate::update_boot_scr {boot_scr rootfs userfs} {
 	set boot_script "/tmp/boot.script"
 
 	catch { exec /bin/dd if=$boot_scr of=$boot_script bs=72 skip=1 }
@@ -478,8 +478,8 @@ proc ::rmupdate::update_boot_scr {boot_scr root} {
 	set data [read $fd]
 	close $fd
 
-	regsub -all "setenv rootfs \[0-9\]" $data "setenv rootfs ${root}" data
-	regsub -all "setenv userfs \[0-9\]" $data "setenv userfs 4" data
+	regsub -all "setenv rootfs \[0-9\]" $data "setenv rootfs ${rootfs}" data
+	regsub -all "setenv userfs \[0-9\]" $data "setenv userfs ${userfs}" data
 
 	set fd [open $boot_script w]
 	puts -nonewline $fd $data
@@ -749,7 +749,7 @@ proc ::rmupdate::update_filesystems {image {dryrun 0}} {
 				}
 				set part_uuid [get_part_uuid $sys_dev $new_root_partition_number]
 				if {[file exists "${mnt_s}/boot.scr"]} {
-					update_boot_scr "${mnt_s}/boot.scr" $new_root_partition_number
+					update_boot_scr "${mnt_s}/boot.scr" $new_root_partition_number 4
 				} elseif {[file exists "${mnt_s}/extlinux/extlinux.conf"]} {
 					update_cmdline "${mnt_s}/extlinux/extlinux.conf" "PARTUUID=${part_uuid}"
 				} elseif {[file exists "${mnt_s}/cmdline.txt"]} {
@@ -842,7 +842,7 @@ proc ::rmupdate::move_userfs_to_device {target_device {sync_data 0} {repartition
 		}
 		set target_partition_device [get_partition_device $target_device $partition_number]
 	}
-
+	
 	if {$sync_data == 1} {
 		catch { exec /bin/umount $target_partition_device }
 		set exitcode [catch { exec /sbin/mkfs.ext4 -F -L userfs $target_partition_device } output]
@@ -863,7 +863,7 @@ proc ::rmupdate::move_userfs_to_device {target_device {sync_data 0} {repartition
 			error $output
 		}
 	}
-
+	
 	catch { exec /sbin/tune2fs -L 0userfs $source_partition_device }
 	catch { exec /sbin/tune2fs -L userfs $target_partition_device }
 }
@@ -1301,27 +1301,78 @@ proc ::rmupdate::install_firmware {{download_url ""} {version ""} {lang ""} {reb
 	if {$use_recovery} {
 		# Use recovery system firmware update feature
 		write_install_log "Using recovery system to update firmware."
-		set tmp_dir "/usr/local/tmp"
-		catch { file mkdir $tmp_dir }
-		catch { file delete "${tmp_dir}/new_firmware.img" }
-		catch { file delete /usr/local/.firmwareUpdate }
+		set usr_local "/usr/local"
+		
+		# Test if userfs is on the same device as bootfs
+		set boot_dev ""
+		set user_dev ""
+		set user_part ""
+		set user0_part ""
+		set use_user0 0
+		foreach d [split [exec /sbin/blkid] "\n"] {
+			if {[regexp {^(/dev.*)(\d):.*LABEL="([^"]+)"} $d match dev pnum lab]} {
+				if {$lab == "bootfs"} {
+					set boot_dev $dev
+				} elseif {$lab == "userfs"} {
+					set user_dev $dev
+					set user_part "${dev}${pnum}"
+				} elseif {$lab == "0userfs"} {
+					set user0_part "${dev}${pnum}"
+				}
+			}
+		}
 		if {!$dryrun} {
+			if {$boot_dev != "" && $user_dev != "" && $boot_dev != $user_dev} {
+				if {$user0_part == ""} {
+					error "userfs0 not found"
+				}
+				set usr_local "/tmp/mnt_user0"
+				set use_user0 1
+				if {[file exists $usr_local]} {
+					catch {exec /bin/umount "${usr_local}"}
+				} else {
+					file mkdir $usr_local
+				}
+				catch {exec /bin/mount $user0_part "${usr_local}"}
+			}
+			set tmp_dir "${usr_local}/tmp"
+			catch { file mkdir $tmp_dir }
+			catch { file delete "${tmp_dir}/new_firmware.img" }
+			catch { file delete "${usr_local}/.firmwareUpdate" }
 			if {$version == "" || $keep_download == 0} {
 				file rename -force $firmware_image "${tmp_dir}/new_firmware.img"
 			} else {
 				file copy -force $firmware_image "${tmp_dir}/new_firmware.img"
 			}
-			catch { exec ln -sf $tmp_dir /usr/local/.firmwareUpdate }
-			set fd [open "/usr/local/.recoveryMode" "w"]
+			catch { exec ln -sf "/usr/local/tmp" "${usr_local}/.firmwareUpdate" }
+			
+			set fd [open "${usr_local}/.recoveryMode" "w"]
 			close $fd
+			
+			file copy -force "${addon_dir}/firmware_update_script" "${tmp_dir}/update_script"
+			file attributes "${tmp_dir}/update_script" -permissions 0755
 			if { [get_filesystem_label $sys_dev 3] == "rootfs2" } {
-				file copy -force "${addon_dir}/update_script_repartition" "${tmp_dir}/update_script"
-				file attributes "${tmp_dir}/update_script" -permissions 0755
+				exec /bin/sed -i s/REPARTITION=0/REPARTITION=1/ "${tmp_dir}/update_script"
 				# Ensure correct partition number for userfs
 				exec /bin/mount -o remount,rw "/boot"
-				update_boot_scr "/boot/boot.scr" 2
+				update_boot_scr "/boot/boot.scr" 2 4
 				exec /bin/mount -o remount,ro "/boot"
 			}
+			
+			#exec /bin/mount -o remount,rw "/boot"
+			#set fd [open "/boot/recoveryfs-sshpwd" "w"]
+			#puts -nonewline $fd "rmupdate"
+			#close $fd
+			#exec /bin/mount -o remount,ro "/boot"
+			
+			if {$use_user0} {
+				exec /bin/sed -i s/RELABEL=0/RELABEL=1/ "${tmp_dir}/update_script"
+				exec /bin/umount "${usr_local}"
+				file delete $usr_local
+				catch { exec /sbin/tune2fs -L 0userfs $user_part }
+				catch { exec /sbin/tune2fs -L userfs $user0_part }
+			}
+			
 			set reboot 1
 		}
 	} else {