diff --git a/scripts/functions.sh b/scripts/functions.sh
new file mode 100644
index 0000000000000000000000000000000000000000..9a7fcde6277b11da43916564df823d20619de45a
--- /dev/null
+++ b/scripts/functions.sh
@@ -0,0 +1,26 @@
+#!/bin/sh
+
+
+get_magic_word() {
+	dd if=$1 bs=4 count=1 2>/dev/null | od -A n -N 4 -t x1 | tr -d ' '
+}
+
+get_fs_type() {
+	local magic_word="$(get_magic_word "$1")"
+
+	case "$magic_word" in
+	"3118"*)
+		echo "ubifs"
+		;;
+	"68737173")
+		echo "squashfs"
+		;;
+	*)
+		echo "unknown"
+		;;
+	esac
+}
+
+round_up() {
+	echo "$(((($1 + ($2 - 1))/ $2) * $2))"
+}
diff --git a/scripts/sysupgrade-tar.sh b/scripts/sysupgrade-tar.sh
index d1d627a96efb8b93fed445bfc365df32613502a1..b93b2584bb4970bcb16650b893722444986fdf88 100755
--- a/scripts/sysupgrade-tar.sh
+++ b/scripts/sysupgrade-tar.sh
@@ -1,5 +1,7 @@
 #!/bin/sh
 
+. $TOPDIR/scripts/functions.sh
+
 board=""
 kernel=""
 rootfs=""
@@ -53,7 +55,16 @@ fi
 
 mkdir -p "${tmpdir}/sysupgrade-${board}"
 echo "BOARD=${board}" > "${tmpdir}/sysupgrade-${board}/CONTROL"
-[ -z "${rootfs}" ] || cp "${rootfs}" "${tmpdir}/sysupgrade-${board}/root"
+if [ -n "${rootfs}" ]; then
+	case "$( get_fs_type ${rootfs} )" in
+	"squashfs")
+		dd if="${rootfs}" of="${tmpdir}/sysupgrade-${board}/root" bs=1024 conv=sync
+		;;
+	*)
+		cp "${rootfs}" "${tmpdir}/sysupgrade-${board}/root"
+		;;
+	esac
+fi
 [ -z "${kernel}" ] || cp "${kernel}" "${tmpdir}/sysupgrade-${board}/kernel"
 
 mtime=""
diff --git a/scripts/ubinize-image.sh b/scripts/ubinize-image.sh
index a18d6dc428d1cdc21161c5d414ab24211b2b8d03..d82d81432d976cbf0be2d86cfd47fb36420e0d00 100755
--- a/scripts/ubinize-image.sh
+++ b/scripts/ubinize-image.sh
@@ -1,5 +1,7 @@
 #!/bin/sh
 
+. $TOPDIR/scripts/functions.sh
+
 part=""
 ubootenv=""
 ubinize_param=""
@@ -8,16 +10,6 @@ rootfs=""
 outfile=""
 err=""
 
-get_magic_word() {
-	dd if=$1 bs=2 count=1 2>/dev/null | od -A n -N 2 -t x1 | tr -d ' '
-}
-
-is_ubifs() {
-	if [ "$( get_magic_word $1 )" = "3118" ]; then
-		echo "1"
-	fi
-}
-
 ubivol() {
 	volid=$1
 	name=$2
@@ -31,7 +23,7 @@ ubivol() {
 	echo "vol_name=$name"
 	if [ "$image" ]; then
 		echo "image=$image"
-		[ -n "$size" ] && echo "vol_size=${size}MiB"
+		[ -n "$size" ] && echo "vol_size=${size}"
 	else
 		echo "vol_size=1MiB"
 	fi
@@ -42,7 +34,10 @@ ubivol() {
 
 ubilayout() {
 	local vol_id=0
-	local root_is_ubifs="$( is_ubifs "$2" )"
+	local rootsize=
+	local autoresize=
+	local rootfs_type="$( get_fs_type "$2" )"
+
 	if [ "$1" = "ubootenv" ]; then
 		ubivol $vol_id ubootenv
 		vol_id=$(( $vol_id + 1 ))
@@ -62,16 +57,28 @@ ubilayout() {
 
 		size="$part"
 
-		ubivol $vol_id "$name" "$image" "" "$size"
+		ubivol $vol_id "$name" "$image" "" "${size}MiB"
 		vol_id=$(( $vol_id + 1 ))
 	done
 	if [ "$3" ]; then
 		ubivol $vol_id kernel "$3"
 		vol_id=$(( $vol_id + 1 ))
 	fi
-	ubivol $vol_id rootfs "$2" $root_is_ubifs
+
+	case "$rootfs_type" in
+	"ubifs")
+		autoresize=1
+		;;
+	"squashfs")
+		# squashfs uses 1k block size, ensure we do not
+		# violate that
+		rootsize="$( round_up "$( stat -c%s "$2" )" 1024 )"
+		;;
+	esac
+	ubivol $vol_id rootfs "$2" "$autoresize" "$rootsize"
+
 	vol_id=$(( $vol_id + 1 ))
-	[ "$root_is_ubifs" ] || ubivol $vol_id rootfs_data "" 1
+	[ "$rootfs_type" = "ubifs" ] || ubivol $vol_id rootfs_data "" 1
 }
 
 while [ "$1" ]; do