diff --git a/meta-gnome/recipes-gnome/gnome-shell/gnome-shell/0002-calendar-server-Fix-build-failure-with-libical-4.patch b/meta-gnome/recipes-gnome/gnome-shell/gnome-shell/0002-calendar-server-Fix-build-failure-with-libical-4.patch
new file mode 100644
index 0000000000..d64cf38ccc
--- /dev/null
+++ b/meta-gnome/recipes-gnome/gnome-shell/gnome-shell/0002-calendar-server-Fix-build-failure-with-libical-4.patch
@@ -0,0 +1,44 @@
+From 91eaa9221b45b506d7a5d84a9ec8c204b5c8c34f Mon Sep 17 00:00:00 2001
+From: Xi Ruoyao <xry111@xry111.site>
+Date: Fri, 8 May 2026 13:13:37 +0800
+Subject: [PATCH] calendar-server: Fix build failure with libical 4
+
+Fix the following build error with libical 4 due to function signature changes:
+
+    error: passing argument 4 of 'get_time_from_property' from incompatible pointer type [-Wincompatible-pointer-types]
+    note: expected 'ICalTime * (*)(ICalProperty *)' but argument is of type 'ICalTime * (*)(const ICalProperty *)'
+
+Link: https://github.com/libical/libical/blob/4.0/docs/MigrationGuide_to_4.md
+Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/4215>
+
+Only the gnome-shell-calendar-server.c hunk of the upstream commit is taken;
+src/calendar-server/reminder-watcher.c does not exist in the 50.x series.
+
+Upstream-Status: Backport [https://gitlab.gnome.org/GNOME/gnome-shell/-/commit/b34766f3992c7616b7816a47249fb463c053e5fa]
+---
+ src/calendar-server/gnome-shell-calendar-server.c | 8 +++++++-
+ 1 file changed, 7 insertions(+), 1 deletion(-)
+
+diff --git a/src/calendar-server/gnome-shell-calendar-server.c b/src/calendar-server/gnome-shell-calendar-server.c
+index 0b2f88eb7..622c16181 100644
+--- a/src/calendar-server/gnome-shell-calendar-server.c
++++ b/src/calendar-server/gnome-shell-calendar-server.c
+@@ -112,11 +112,17 @@ typedef struct
+   time_t  end_time;
+ } CalendarAppointment;
+ 
++#if ICAL_CHECK_VERSION(4, 0, 0)
++typedef ICalTime * (* GetICalPropFunc) (const ICalProperty *prop);
++#else
++typedef ICalTime * (* GetICalPropFunc) (ICalProperty *prop);
++#endif
++
+ static gboolean
+ get_time_from_property (ECalClient            *cal,
+                         ICalComponent         *icomp,
+                         ICalPropertyKind       prop_kind,
+-                        ICalTime * (* get_prop_func) (ICalProperty *prop),
++                        GetICalPropFunc        get_prop_func,
+                         ICalTimezone          *default_zone,
+                         ICalTime              **out_itt,
+                         ICalTimezone          **out_timezone)
diff --git a/meta-gnome/recipes-gnome/gnome-shell/gnome-shell_48.8.bb b/meta-gnome/recipes-gnome/gnome-shell/gnome-shell_50.4.bb
similarity index 65%
rename from meta-gnome/recipes-gnome/gnome-shell/gnome-shell_48.8.bb
rename to meta-gnome/recipes-gnome/gnome-shell/gnome-shell_50.4.bb
index e8b1bd6d0c..f39d72532e 100644
--- a/meta-gnome/recipes-gnome/gnome-shell/gnome-shell_48.8.bb
+++ b/meta-gnome/recipes-gnome/gnome-shell/gnome-shell_50.4.bb
@@ -2,48 +2,58 @@ SUMMARY = "GNOME Shell is the graphical shell of the GNOME desktop environment"
 LICENSE = "GPL-2.0-only"
 LIC_FILES_CHKSUM = "file://COPYING;md5=b234ee4d69f5fce4486a80fdaf4a4263"
 
-
 DEPENDS = " \
     libxml2-native \
-    gtk4 \
-    mutter \
+    at-spi2-core \
     evolution-data-server \
     gcr \
-    geocode-glib \
+    gdk-pixbuf \
     gjs \
     gnome-autoar \
     gnome-desktop \
-    gnome-control-center \
-    polkit \
-    pipewire \
-    libsoup-3.0 \
-    ${@bb.utils.contains('DISTRO_FEATURES', 'wayland', '', 'startup-notification', d)} \
-    ibus \
     gsettings-desktop-schemas \
+    gtk4 \
+    libsoup-3.0 \
+    libxml2 \
+    mutter \
+    pango \
+    polkit \
 "
 
 inherit gnomebase gsettings gettext gobject-introspection gtk-icon-cache features_check bash-completion
 
-REQUIRED_DISTRO_FEATURES = "polkit systemd pam"
+REQUIRED_DISTRO_FEATURES = "polkit systemd pam wayland"
 
 GTKIC_VERSION = "4"
-GTKDOC_MESON_OPTION = "gtk_doc"
 GIR_MESON_OPTION = ""
 
 # gobject-introspection is mandatory and cannot be configured
 REQUIRED_DISTRO_FEATURES += "gobject-introspection-data"
 
 SRC_URI += "file://0001-shell-app-usage.c-only-include-x11-headers-if-HAVE_X.patch"
-SRC_URI[archive.sha256sum] = "cb9b7d86cf362530e648e68caaf109a32af4e832874a26791ca8789773efd233"
-
-PACKAGECONFIG ??= "bluetooth nm ${@bb.utils.filter('DISTRO_FEATURES', 'systemd', d)}"
+SRC_URI += "file://0002-calendar-server-Fix-build-failure-with-libical-4.patch"
+SRC_URI[archive.sha256sum] = "c531939539db316a41aef23670370abd1330d3254f84bcb0f9f4dae5d6e362cf"
+
+PACKAGECONFIG ??= " \
+    camera-monitor \
+    extensions-tool \
+    nm \
+    portal-helper \
+    bluetooth \
+    ${@bb.utils.filter('DISTRO_FEATURES', 'systemd', d)} \
+"
 PACKAGECONFIG[bluetooth] = ",,gnome-bluetooth"
-PACKAGECONFIG[nm] = "-Dnetworkmanager=true, -Dnetworkmanager=false,networkmanager libsecret,networkmanager"
+PACKAGECONFIG[camera-monitor] = "-Dcamera_monitor=true, -Dcamera_monitor=false, pipewire"
+PACKAGECONFIG[extensions-app] = "-Dextensions_app=true, -Dextensions_app=false"
+PACKAGECONFIG[extensions-tool] = "-Dextensions_tool=true, -Dextensions_tool=false, gnome-autoar json-glib libsoup-3.0"
+PACKAGECONFIG[nm] = "-Dnetworkmanager=true, -Dnetworkmanager=false, networkmanager libsecret, networkmanager"
+PACKAGECONFIG[portal-helper] = "-Dportal_helper=true, -Dportal_helper=false"
 PACKAGECONFIG[systemd] = "-Dsystemd=true, -Dsystemd=false, systemd"
 
 EXTRA_OEMESON += " \
     -Dtests=false \
     -Dman=false \
+    -Dgtk_doc=false \
     --cross-file=${WORKDIR}/meson-${PN}.cross \
 "
 
@@ -88,6 +98,9 @@ RDEPENDS:${PN} += " \
 	librsvg-gtk \
 "
 
+# The extensions app is a GJS application and pulls libadwaita at runtime only.
+RDEPENDS:${PN} += "${@bb.utils.contains('PACKAGECONFIG', 'extensions-app', 'libadwaita', '', d)}"
+
 PACKAGES =+ "${PN}-tools ${PN}-gsettings"
 FILES:${PN}-tools = "${bindir}/*-tool"
 RDEPENDS:${PN}-tools = "python3-core"
