diff --git a/dynamic-layers/raspberrypi/recipes-bsp/rpi-uboot-scr/files/boot.cmd.in b/dynamic-layers/raspberrypi/recipes-bsp/rpi-uboot-scr/files/boot.cmd.in
index 04cbd7b..8855f43 100644
--- a/dynamic-layers/raspberrypi/recipes-bsp/rpi-uboot-scr/files/boot.cmd.in
+++ b/dynamic-layers/raspberrypi/recipes-bsp/rpi-uboot-scr/files/boot.cmd.in
@@ -2,5 +2,5 @@ saveenv
 fdt addr ${fdt_addr} && fdt get value bootargs /chosen bootargs
 if env exists rpipart;then echo Booting from mmcblk0p${rpipart};else setenv rpipart 2;echo rpipart not set, default to ${rpipart};fi
 load mmc 0:${rpipart} ${kernel_addr_r} boot/@@KERNEL_IMAGETYPE@@
-setenv bootargs ${bootargs} root=/dev/mmcblk0p${rpipart}
+setenv bootargs "${bootargs} root=/dev/mmcblk0p${rpipart}"
 @@KERNEL_BOOTCMD@@ ${kernel_addr_r} - ${fdt_addr}
diff --git a/dynamic-layers/raspberrypi/recipes-bsp/rpi-uboot-scr/rpi-u-boot-scr.bbappend b/dynamic-layers/raspberrypi/recipes-bsp/rpi-uboot-scr/rpi-u-boot-scr.bbappend
index ff7b487..c8aca89 100644
--- a/dynamic-layers/raspberrypi/recipes-bsp/rpi-uboot-scr/rpi-u-boot-scr.bbappend
+++ b/dynamic-layers/raspberrypi/recipes-bsp/rpi-uboot-scr/rpi-u-boot-scr.bbappend
@@ -1,3 +1,3 @@
 FILESEXTRAPATHS:prepend := "${THISDIR}/files:"
 
-COMPATIBLE = "raspberrypi3"
+COMPATIBLE = "raspberrypi3 raspberrypi4-64"
diff --git a/recipes-bsp/libubootenv/files/raspberrypi4-64/fw_env.config b/recipes-bsp/libubootenv/files/raspberrypi4-64/fw_env.config
new file mode 100644
index 0000000..f6eac0e
--- /dev/null
+++ b/recipes-bsp/libubootenv/files/raspberrypi4-64/fw_env.config
@@ -0,0 +1,30 @@
+# Configuration file for fw_(printenv/setenv) utility.
+# Up to two entries are valid, in this case the redundant
+# environment sector is assumed present.
+# Notice, that the "Number of sectors" is not required on NOR and SPI-dataflash.
+# Futhermore, if the Flash sector size is omitted, this value is assumed to
+# be the same as the Environment size, which is valid for NOR and SPI-dataflash
+# Device offset must be prefixed with 0x to be parsed as a hexadecimal value.
+
+# NOR example
+# MTD device name	Device offset	Env. size	Flash sector size	Number of sectors
+#/dev/mtd1		0x0000		0x4000		0x4000
+#/dev/mtd2		0x0000		0x4000		0x4000
+
+# MTD SPI-dataflash example
+# MTD device name	Device offset	Env. size	Flash sector size	Number of sectors
+#/dev/mtd5		0x4200		0x4200
+#/dev/mtd6		0x4200		0x4200
+
+# NAND example
+#/dev/mtd0		0x4000		0x4000		0x20000			2
+
+# On a block device a negative offset is treated as a backwards offset from the
+# end of the device/partition, rather than a forwards offset from the start.
+
+# Block device example
+#/dev/mmcblk0		0xc0000		0x20000
+#/dev/mmcblk0		-0x20000	0x20000
+
+# VFAT example
+/boot/uboot.env		0x0000          0x4000
diff --git a/recipes-core/base-files/base-files/raspberrypi4-64/fstab b/recipes-core/base-files/base-files/raspberrypi4-64/fstab
new file mode 100644
index 0000000..4f23935
--- /dev/null
+++ b/recipes-core/base-files/base-files/raspberrypi4-64/fstab
@@ -0,0 +1,10 @@
+# stock fstab - you probably want to override this with a machine specific one
+
+/dev/root            /                    auto       defaults              1  1
+proc                 /proc                proc       defaults              0  0
+devpts               /dev/pts             devpts     mode=0620,gid=5       0  0
+tmpfs                /run                 tmpfs      mode=0755,nodev,nosuid,strictatime 0  0
+tmpfs                /var/volatile        tmpfs      defaults              0  0
+
+/dev/mmcblk0p1       /boot                auto       defaults,sync         0  0
+/dev/mmcblk0p4       /media               auto       defaults,sync         0  0
diff --git a/recipes-extended/images/update-image/raspberrypi4-64/emmcsetup.lua b/recipes-extended/images/update-image/raspberrypi4-64/emmcsetup.lua
new file mode 100644
index 0000000..c7ef3db
--- /dev/null
+++ b/recipes-extended/images/update-image/raspberrypi4-64/emmcsetup.lua
@@ -0,0 +1,85 @@
+function os.capture(cmd)
+	local f = assert(io.popen(cmd, 'r'))
+	local s = assert(f:read('*a'))
+	f:close()
+	return s
+end
+
+function file_exists(name)
+	local f=io.open(name,"r")
+	if f~=nil then io.close(f) return true else return false end
+end
+
+function cmdexec(cmd)
+	local ret, s, status = os.execute(cmd)
+	if (status ~= 0) then
+		return false, cmd .. " return with error"
+	end
+
+	return true,""
+end
+
+function preinst()
+	local out
+	local s1
+	local ret
+
+	local log = os.tmpname()
+
+	local eMMC = "/dev/mmcblk0"
+	ret = file_exists("/dev/mmcblk0")
+
+	if (ret == false) then
+		return false, "Cannot fine eMMC"
+	end
+
+	cmdexec("/usr/sbin/sfdisk -d " .. eMMC .. "> /tmp/dumppartitions")
+
+	-- check if there are two identical partitions
+	-- and create the second one if no available
+	f = io.input("/tmp/dumppartitions")
+	fo = io.output("/tmp/partitions")
+	t = f:read()
+	found = false
+	while (t ~= nil) do
+		j=0
+		j=string.find(t, "/dev/mmcblk0p3")
+		fo:write(t .. "\n")
+		if (j == 1) then
+			found=true
+			break
+		end
+		j=string.find(t, "/dev/mmcblk0p2")
+		if (j == 1) then
+			start, size = string.match(t, "%a+%s*=%s*(%d+), size=%s*(%d+)")
+		end
+		t = f:read()
+	end
+
+	if (found) then
+		f:close()
+		fo:close()
+		return true, out
+	end
+
+	start=start+size
+	partitions = eMMC .. "p3 : start=    " .. string.format("%d", start) .. ", size=  " .. size .. ", type=83\n"
+
+	fo:write(partitions)
+	fo:close()
+	f:close()
+
+	out = os.capture("/usr/sbin/sfdisk --force " .. eMMC .. " < /tmp/partitions")
+
+	-- use partprobe to inform the kernel of the new partitions
+
+	cmdexec("/usr/sbin/partprobe " .. eMMC)
+
+	return true, out
+end
+
+function postinst()
+	local out = "Post installed script called"
+
+	return true, out
+end
diff --git a/recipes-extended/images/update-image/raspberrypi4-64/sw-description b/recipes-extended/images/update-image/raspberrypi4-64/sw-description
new file mode 100644
index 0000000..8a07161
--- /dev/null
+++ b/recipes-extended/images/update-image/raspberrypi4-64/sw-description
@@ -0,0 +1,66 @@
+software =
+{
+	version = "0.1.0";
+
+	raspberrypi4-64 = {
+		hardware-compatibility: [ "1.0"];
+		stable : {
+			copy1 : {
+				images: (
+					{
+						filename = "core-image-full-cmdline-raspberrypi4-64.ext4.gz";
+						type = "raw";
+						compressed = "zlib";
+						device = "/dev/mmcblk0p2";
+						sha256 = "$swupdate_get_sha256(core-image-full-cmdline-raspberrypi4-64.ext4.gz)";
+					}
+				);
+				scripts: (
+					{
+						filename = "emmcsetup.lua";
+						type = "lua";
+						sha256 = "$swupdate_get_sha256(emmcsetup.lua)";
+					}
+				);
+				bootenv: (
+					{
+						name = "rpipart";
+						value = "2";
+					},
+					{
+						name = "ustate";
+						value = "1";
+					}
+				);
+			};
+			copy2 : {
+				images: (
+					{
+						filename = "core-image-full-cmdline-raspberrypi4-64.ext4.gz";
+						type = "raw";
+						compressed = "zlib";
+						device = "/dev/mmcblk0p3";
+						sha256 = "$swupdate_get_sha256(core-image-full-cmdline-raspberrypi4-64.ext4.gz)";
+					}
+				);
+				scripts: (
+					{
+						filename = "emmcsetup.lua";
+						type = "lua";
+						sha256 = "$swupdate_get_sha256(emmcsetup.lua)";
+					}
+				);
+				bootenv: (
+					{
+						name = "rpipart";
+						value = "3";
+					},
+					{
+						name = "ustate";
+						value = "1";
+					}
+				);
+			};
+		};
+	}
+}
diff --git a/recipes-support/swupdate/swupdate/raspberrypi4-64/09-swupdate-args b/recipes-support/swupdate/swupdate/raspberrypi4-64/09-swupdate-args
new file mode 100644
index 0000000..283e667
--- /dev/null
+++ b/recipes-support/swupdate/swupdate/raspberrypi4-64/09-swupdate-args
@@ -0,0 +1,26 @@
+rootfs=`swupdate -g`
+
+if [ $rootfs == '/dev/mmcblk0p2' ];then
+	selection="-e stable,copy2"
+else
+	selection="-e stable,copy1"
+fi
+
+state=`fw_printenv ustate | cut -f 2 -d'='`
+if [ -z "$state" ];then
+	fw_setenv ustate 1
+	state=`fw_printenv ustate | cut -f 2 -d'='`
+fi
+if [ $state == 1 ];then
+	SWUPDATE_SURICATTA_ARGS="-c 2"
+else
+	SWUPDATE_SURICATTA_ARGS=" "
+fi
+
+if [ -e /media/etc/swupdate.cfg ];then
+	CFGFILE="/media/etc/swupdate.cfg"
+else
+	CFGFILE="/etc/swupdate.cfg"
+fi
+
+SWUPDATE_ARGS="-H raspberrypi4-64:1.0 ${selection} -p 'reboot' -f ${CFGFILE}"
diff --git a/recipes-support/swupdate/swupdate/raspberrypi4-64/defconfig b/recipes-support/swupdate/swupdate/raspberrypi4-64/defconfig
new file mode 100644
index 0000000..03cfd7e
--- /dev/null
+++ b/recipes-support/swupdate/swupdate/raspberrypi4-64/defconfig
@@ -0,0 +1,107 @@
+#
+# Automatically generated file; DO NOT EDIT.
+# Swupdate Configuration
+#
+CONFIG_HAVE_DOT_CONFIG=y
+
+#
+# Swupdate Settings
+#
+
+#
+# General Configuration
+#
+CONFIG_CURL=y
+# CONFIG_CURL_SSL is not set
+CONFIG_SYSTEMD=y
+CONFIG_SCRIPTS=y
+CONFIG_HW_COMPATIBILITY=y
+CONFIG_HW_COMPATIBILITY_FILE="/etc/hwrevision"
+CONFIG_SW_VERSIONS_FILE="/etc/sw-versions"
+
+#
+# Socket Paths
+#
+CONFIG_SOCKET_CTRL_PATH=""
+CONFIG_SOCKET_PROGRESS_PATH=""
+CONFIG_SOCKET_REMOTE_HANDLER_DIRECTORY="/tmp/"
+# CONFIG_MTD is not set
+CONFIG_LUA=y
+CONFIG_LUAPKG="lua"
+# CONFIG_FEATURE_SYSLOG is not set
+
+#
+# Build Options
+#
+CONFIG_CROSS_COMPILE=""
+CONFIG_SYSROOT=""
+CONFIG_EXTRA_CFLAGS=""
+CONFIG_EXTRA_LDFLAGS=""
+CONFIG_EXTRA_LDLIBS=""
+
+#
+# Debugging Options
+#
+# CONFIG_DEBUG is not set
+# CONFIG_WERROR is not set
+# CONFIG_NOCLEANUP is not set
+# CONFIG_BOOTLOADER_EBG is not set
+CONFIG_UBOOT=y
+# CONFIG_BOOTLOADER_NONE is not set
+# CONFIG_BOOTLOADER_GRUB is not set
+CONFIG_UBOOT_FWENV="/etc/fw_env.config"
+CONFIG_UBOOT_NEWAPI=y
+CONFIG_UBOOT_DEFAULTENV="/etc/u-boot-initial-env"
+# CONFIG_SSL_IMPL_NONE is not set
+CONFIG_SSL_IMPL_OPENSSL=y
+# CONFIG_SSL_IMPL_MBEDTLS is not set
+CONFIG_DOWNLOAD=y
+# CONFIG_DOWNLOAD_SSL is not set
+CONFIG_CHANNEL_CURL=y
+CONFIG_HASH_VERIFY=y
+CONFIG_SIGNED_IMAGES=y
+CONFIG_ENCRYPTED_IMAGES=y
+CONFIG_SURICATTA=y
+
+#
+# Features
+#
+CONFIG_SURICATTA_SSL=y
+# CONFIG_SURICATTA_STATE_CHOICE_NONE is not set
+CONFIG_SURICATTA_STATE_CHOICE_BOOTLOADER=y
+CONFIG_SURICATTA_STATE_BOOTLOADER="ustate"
+
+#
+# Server
+#
+CONFIG_SURICATTA_HAWKBIT=y
+# CONFIG_SURICATTA_GENERAL is not set
+CONFIG_WEBSERVER=y
+CONFIG_MONGOOSE=y
+# CONFIG_MONGOOSEIPV6 is not set
+CONFIG_MONGOOSESSL=y
+CONFIG_GUNZIP=y
+# CONFIG_ZSTD is not set
+
+#
+# Parser Features
+#
+CONFIG_LIBCONFIG=y
+CONFIG_PARSERROOT=""
+CONFIG_JSON=y
+# CONFIG_LUAEXTERNAL is not set
+# CONFIG_SETSWDESCRIPTION is not set
+
+#
+# Image Handlers
+#
+CONFIG_RAW=y
+# CONFIG_RDIFFHANDLER is not set
+CONFIG_LUASCRIPTHANDLER=y
+CONFIG_SHELLSCRIPTHANDLER=y
+# CONFIG_HANDLER_IN_LUA is not set
+CONFIG_ARCHIVE=y
+CONFIG_REMOTE_HANDLER=y
+# CONFIG_SWUFORWARDER_HANDLER is not set
+CONFIG_BOOTLOADERHANDLER=y
+# CONFIG_UCFWHANDLER is not set
diff --git a/recipes-support/swupdate/swupdate/raspberrypi4-64/swupdate.cfg b/recipes-support/swupdate/swupdate/raspberrypi4-64/swupdate.cfg
new file mode 100644
index 0000000..329d086
--- /dev/null
+++ b/recipes-support/swupdate/swupdate/raspberrypi4-64/swupdate.cfg
@@ -0,0 +1,41 @@
+globals :
+{
+	verbose			= true;
+	loglevel		= 5;
+	syslog			= true;
+	public-key-file = "@PUBKEY@";
+};
+
+download :
+{
+	retries			= 3;
+	timeout			= 1800;
+};
+
+identify : (
+	{ name = "raspberryPI4-64"; value = "1.0"; }
+);
+
+suricatta :
+{
+	enable			= true;
+	tenant			= "default";
+	id				= "@TARGETID@";
+	url 			= "@PROTOCOL@://@HOSTNAME@:@PORT@";
+	polldelay		= 60;
+	nocheckcert		= true;
+	retry			= 4;
+	retrywait		= 200;
+	loglevel		= 10;
+	userid			= 0;
+	groupid			= 0;
+	targettoken		= "@TARGETTOKEN@";
+};
+
+webserver :
+{
+	document_root	= "/www";
+	userid			= 0;
+	groupid			= 0;
+	timeout			= 20;
+};
