diff -pruN 1:43.2-2/build-aux/flatpak/org.gnome.Settings.json 1:44~alpha-0ubuntu1/build-aux/flatpak/org.gnome.Settings.json
--- 1:43.2-2/build-aux/flatpak/org.gnome.Settings.json	2022-12-23 11:11:35.000000000 +0000
+++ 1:44~alpha-0ubuntu1/build-aux/flatpak/org.gnome.Settings.json	2023-01-09 20:06:57.000000000 +0000
@@ -26,7 +26,10 @@
         "cxxflags" : "-O2 -g",
         "env" : {
             "V" : "1"
-        }
+        },
+        "build-args": [
+            "--share=network"
+        ]
     },
     "x-run-args" : [
         "--verbose"
@@ -72,7 +75,6 @@
             "config-opts" : [
                 "--disable-polkitd",
                 "--disable-man-pages",
-                "--disable-introspection",
                 "--disable-examples",
                 "--disable-gtk-doc",
                 "--disable-libelogind",
@@ -111,17 +113,15 @@
             "name" : "accountservice",
             "buildsystem" : "meson",
             "config-opts" : [
-                "-Ddocbook=false",
-                "-Delogind=false",
-                "-Dgtk_doc=false",
+                "-Dsystemdsystemunitdir=no",
                 "-Dintrospection=false",
-                "-Dsystemd=false",
-                "-Dsystemdsystemunitdir=no"
+                "-Dvapi=false"
             ],
             "sources" : [
                 {
                     "type" : "git",
-                    "url" : "git://anongit.freedesktop.org/accountsservice"
+                    "url" : "https://gitlab.freedesktop.org/accountsservice/accountsservice",
+                    "branch" : "main"
                 }
             ]
         },
@@ -187,20 +187,6 @@
             ]
         },
         {
-            "name" : "gudev",
-            "buildsystem" : "meson",
-            "config-opts" : [
-                "-Dtests=disabled",
-                "-Dintrospection=disabled"
-            ],
-            "sources" : [
-                {
-                    "type" : "git",
-                    "url" : "https://gitlab.gnome.org/GNOME/libgudev.git"
-                }
-            ]
-        },
-        {
             "name" : "colord",
             "buildsystem" : "meson",
             "config-opts" : [
@@ -279,9 +265,10 @@
             "name" : "geocode-glib",
             "buildsystem" : "meson",
             "config-opts" : [
-            	"-Denable-gtk-doc=false",
+            	"-Denable-installed-tests=false",
             	"-Denable-introspection=false",
-            	"-Denable-installed-tests=false"
+            	"-Denable-gtk-doc=false",
+            	"-Dsoup2=false"
             ],
             "sources" : [
                 {
@@ -294,9 +281,10 @@
             "name" : "libgweather",
             "buildsystem" : "meson",
             "config-opts" : [
-            	"-Dglade_catalog=false",
             	"-Denable_vala=false",
-            	"-Dgtk_doc=false"
+            	"-Dgtk_doc=false",
+            	"-Dintrospection=false",
+            	"-Dtests=false"
             ],
             "sources" : [
                 {
@@ -357,14 +345,10 @@
             "config-opts" : [
                 "-Dlibaudit=no",
                 "-Ddbus_conf_dir=/app/etc/dbus-1/system.d",
-                "-Ddbus_ifaces_dir=/app/share/dbus-1/interfaces",
-                "-Ddbus_sys_dir=/app/share/dbus-1/system.d",
                 "-Ddnsmasq=/usr/bin/true",
                 "-Ddocs=false",
                 "-Dintrospection=false",
                 "-Diptables=/usr/bin/true",
-                "-Djson_validation=false",
-                "-Dlibnm_glib=false",
                 "-Dlibpsl=false",
                 "-Dmodem_manager=false",
                 "-Dnmtui=false",
@@ -419,12 +403,9 @@
             "buildsystem" : "meson",
             "config-opts" : [
                 "-Dappindicator=no",
-                "-Dgtk_doc=false",
-                "-Dintrospection=false",
-                "-Dlibnm_gtk=false",
+                "-Dwwan=false",
                 "-Dselinux=false",
-                "-Dteam=false",
-                "-Dwwan=false"
+                "-Dteam=false"
             ],
             "sources" : [
                 {
@@ -635,6 +616,142 @@
             ]
         },
         {
+            "name" : "mutter",
+            "buildsystem" : "meson",
+            "config-opts" : [
+                "-Dgles2=false",
+                "-Dglx=false",
+                "-Dxwayland=false",
+                "-Dwayland=false",
+                "-Dsystemd=false",
+                "-Dnative_backend=false",
+                "-Dremote_desktop=false",
+                "-Degl_device=false",
+                "-Dudev=false",
+                "-Dstartup_notification=false",
+                "-Dsm=false",
+                "-Dintrospection=true",
+                "-Ddocs=false",
+                "-Dtests=false",
+                "-Dprofiler=false"
+            ],
+            "sources" : [
+                {
+                    "type" : "git",
+                    "branch" : "main",
+                    "url" : "https://gitlab.gnome.org/gnome/mutter.git"
+                }
+            ]
+        },
+        {
+            "name" : "libical",
+            "buildsystem" : "cmake",
+            "config-opts" : [
+                "-DICAL_BUILD_DOCS=false",
+                "-DICAL_GLIB=true",
+                "-DLIBICAL_BUILD_TESTING=false"
+            ],
+            "sources" : [
+                {
+                    "type" : "git",
+                    "url" : "https://github.com/libical/libical.git"
+                }
+            ]
+        },
+        {
+            "name" : "evolution-data-server",
+            "buildsystem" : "cmake",
+            "config-opts" : [
+                "-DWITH_LIBDB=OFF"
+            ],
+            "sources" : [
+                {
+                    "type" : "git",
+                    "url" : "https://gitlab.gnome.org/GNOME/evolution-data-server.git"
+                }
+            ]
+        },
+        {
+            "name" : "libstartup-notification",
+            "buildsystem" : "autotools",
+            "sources" : [
+                {
+                    "type" : "git",
+                    "url" : "https://gitlab.freedesktop.org/xdg/startup-notification.git"
+                }
+            ]
+        },
+        {
+            "name" : "sassc",
+            "buildsystem" : "simple",
+            "sources" : [
+                {
+                    "type" : "git",
+                    "url" : "https://github.com/sass/libsass"
+                },
+                {
+                    "type" : "git",
+                    "url" : "https://github.com/sass/sassc.git",
+                    "dest" : "sassc"
+                }
+            ],
+            "build-commands" : [
+                "make -C sassc",
+                "PREFIX=/app make -C sassc install"
+            ]
+        },
+        {
+            "name" : "cogl",
+            "buildsystem" : "autotools",
+            "sources" : [
+                {
+                    "type" : "git",
+                    "tag" : "cogl-1.22",
+                    "url" : "https://gitlab.gnome.org/Archive/cogl.git"
+                }
+            ]
+        },
+        {
+            "name" : "clutter",
+            "buildsystem" : "meson",
+            "config-opts" : [
+                "-Dbackends='system'",
+                "-Ddrivers='all'",
+                "-Dbuild_tests=false",
+                "-Dbuild_examples=false",
+                "-Ddocumentation=false",
+                "-Dintrospection=true",
+                "-Dpixbuf_tests=false"
+            ],
+            "sources" : [
+                {
+                    "type" : "git",
+                    "url" : "https://gitlab.gnome.org/GNOME/clutter.git"
+                }
+            ]
+        },
+        {
+            "name" : "gnome-shell",
+            "buildsystem" : "meson",
+            "config-opts" : [
+                "-Dextensions_tool=false",
+                "-Dextensions_app=false",
+                "-Dgtk_doc=false",
+                "-Dman=false",
+                "-Dtests=false",
+                "-Dnetworkmanager=false",
+                "-Dsystemd=false"
+            ],
+            "sources" : [
+                {
+                    "type" : "git",
+                    "branch" : "main",
+                    "url" : "https://gitlab.gnome.org/GNOME/gnome-shell.git"
+                }
+            ]
+        },
+
+        {
             "name" : "gnome-backgrounds",
             "buildsystem" : "meson",
             "sources" : [
@@ -650,12 +767,11 @@
             "buildsystem" : "meson",
             "sources" : [
                 {
-                    "type" : "git",
-                    "url" : "https://gitlab.gnome.org/GNOME/gnome-control-center.git"
+                    "type" : "dir",
+                    "path" : "../../"
                 }
             ],
             "config-opts" : [
-                "-Dtracing=true",
                 "-Dprofile=development"
             ]
         }
diff -pruN 1:43.2-2/debian/changelog 1:44~alpha-0ubuntu1/debian/changelog
--- 1:43.2-2/debian/changelog	2023-01-25 12:01:34.000000000 +0000
+++ 1:44~alpha-0ubuntu1/debian/changelog	2023-01-13 16:48:57.000000000 +0000
@@ -1,9 +1,74 @@
-gnome-control-center (1:43.2-2) unstable; urgency=medium
+gnome-control-center (1:44~alpha-0ubuntu1) lunar; urgency=medium
 
-  * d/control.in: Add libspa-0.2-bluetooth as an alternative for
-    pulseaudio-module-bluetooth
+  [ Jeremy Bicha ]
+  * New upstream release
+  * debian/control.in: Bump minimum GTK4 to 4.8 and libnma-gtk4 to 1.10.2
+  * Stop disabling the Device Security panel
+  * Revert commit that hides Device Security panel when chassis_type is empty
+  * Refresh patches
+  * Update patches to drop deprecated gtk_widget_show/hide
+
+  [ Gunnar Hjalmarsson ]
+  * Make "Color" in "Appearance" view translatable (LP: #2000937)
+  * Use a context aware gettext function in the Ubuntu panel (LP: #2000937)
+
+ -- Jeremy Bicha <jbicha@ubuntu.com>  Fri, 13 Jan 2023 11:48:57 -0500
+
+gnome-control-center (1:43.2-1ubuntu1) lunar; urgency=medium
 
- -- Laurent Bigonville <bigon@debian.org>  Wed, 25 Jan 2023 13:01:34 +0100
+  * Merge with Debian. Remaining changes:
+    + Add gnome-control-center-faces package to share with unity-control-center
+    + Install apport hook
+    + debian/control.in:
+      - Build-Depend on libwhoopsie-preferences-dev
+      - Depend on language-selector-gnome, system-config-printer &
+        whoopsie-preferences
+      - Don't depend on desktop-base
+      - Recommend ibus
+      - Suggest instead of recommend gnome-user-share & realmd
+      - Don't recommend malcontent-gui or system-config-printer-common
+      - Don't recommend or suggest pulseaudio (or even pipewire) stuff
+      - Don't recommend libnss-myhostname since we use systemd-resolved
+    + debian/gnome-control-center-data.install:
+      - Don't install gnome-control-center.pkla since we use
+        policykit-desktop-privileges instead
+      - Install additional assets used by unity-control-center
+    * debian/ubuntu-logo-icon.png, debian/source/include-binaries,
+      debian/gnome-control-center-data.install: Include an Ubuntu logo
+    * debian/gnome-control-center-data.links:
+      - Link audio-speaker-center* to audio-speaker-mono* so that an
+        icon is shown in the test speaker panel. (LP: #1704002)
+    + debian/rules: Enable whoospie integration
+    + Add patches:
+      - keyboard-For-xkb-options-have-Layout-default-toggle-and-N.patch
+      - keyboard-Avoid-modifying-xkb-options-when-user-changes-n.patch
+      - u/keyboard-Add-launch-terminal-shortcut.patch
+      - u/sound-Allow-volume-to-be-set-above-100.patch
+      - u/Allow-tweaking-some-settings-for-Ubuntu-Dock.patch
+      - u/background-Allow-configuring-the-ubuntu-accent-color.patch
+      - u/multitasking-panel-Sync-workspace-and-monitor-isolation-d.patch
+      - u/Modify-Mulitasking-assets-for-accent-colors.patch
+      - u/lock-Add-Lock-Screen-on-Suspend-option.patch
+      - u/region-Add-Language-Selector-button.patch
+      - u/Adapts-the-region-capplet-and-the-language-chooser-in-the.patch
+      - u/printers-Temporarily-add-an-additional-advanced-printer-b.patch
+      - u/notifications-Handle-.desktop-files-that-got-renamed.patch
+      - u/shell-Change-the-default-height-so-all-category-are-on-sc.patch
+      - u/connectivity-add-network-connectivity-checking-toggle.patch
+      - u/diagnostics-Add-Whoopsie-support.patch
+      - u/online-accounts-Hide-window-after-adding-an-online-accoun.patch
+      - u/display-Support-UI-scaled-logical-monitor-mode.patch
+      - u/Disable-non-working-camera-microphones-panels.patch
+      - u/info-overview-Show-updates-in-software-propeties-instead-.patch
+      - u/sound-Add-a-button-to-select-the-default-theme.patch
+      - u/applications-Launch-snap-store-if-it-is-installed.patch
+      - u/display-Allow-fractional-scaling-to-be-enabled.patch
+  * d/p/keyboard-For-xkb-options-have-Layout-default-toggle-and-N.patch:
+    + Add nodefault_option after the main option, not before
+      (LP: #2000423)
+    + Get back the "Use layout default" switch_row title
+
+ -- Gunnar Hjalmarsson <gunnarhj@ubuntu.com>  Thu, 29 Dec 2022 18:39:39 +0100
 
 gnome-control-center (1:43.2-1) unstable; urgency=medium
 
@@ -30,6 +95,60 @@ gnome-control-center (1:43.1-2) unstable
 
  -- Jeremy Bicha <jbicha@ubuntu.com>  Thu, 08 Dec 2022 21:06:20 -0500
 
+gnome-control-center (1:43.1-1ubuntu1) lunar; urgency=medium
+
+  * Merge with Debian. Remaining changes:
+    + Add gnome-control-center-faces package to share with unity-control-center
+    + Install apport hook
+    + debian/control.in:
+      - Build-Depend on libwhoopsie-preferences-dev
+      - Depend on language-selector-gnome, system-config-printer &
+        whoopsie-preferences
+      - Don't depend on desktop-base
+      - Recommend ibus
+      - Suggest instead of recommend gnome-user-share & realmd
+      - Don't recommend malcontent-gui or system-config-printer-common
+      - Don't recommend or suggest pulseaudio (or even pipewire) stuff
+      - Don't recommend libnss-myhostname since we use systemd-resolved
+    + debian/gnome-control-center-data.install:
+      - Don't install gnome-control-center.pkla since we use
+        policykit-desktop-privileges instead
+      - Install additional assets used by unity-control-center
+    * debian/ubuntu-logo-icon.png, debian/source/include-binaries,
+      debian/gnome-control-center-data.install: Include an Ubuntu logo
+    * debian/gnome-control-center-data.links:
+      - Link audio-speaker-center* to audio-speaker-mono* so that an
+        icon is shown in the test speaker panel. (LP: #1704002)
+    + debian/rules: Enable whoospie integration
+    + Add patches:
+      - keyboard-Allow-disabling-alternate-characters-key.patch
+      - keyboard-For-xkb-options-have-Layout-default-toggle-and-N.patch
+      - keyboard-Avoid-modifying-xkb-options-when-user-changes-n.patch
+      - u/keyboard-Add-launch-terminal-shortcut.patch
+      - u/sound-Allow-volume-to-be-set-above-100.patch
+      - u/Allow-tweaking-some-settings-for-Ubuntu-Dock.patch
+      - u/background-Allow-configuring-the-ubuntu-accent-color.patch
+      - u/multitasking-panel-Sync-workspace-and-monitor-isolation-d.patch
+      - u/Modify-Mulitasking-assets-for-accent-colors.patch
+      - u/lock-Add-Lock-Screen-on-Suspend-option.patch
+      - u/region-Add-Language-Selector-button.patch
+      - u/Adapts-the-region-capplet-and-the-language-chooser-in-the.patch
+      - u/printers-Temporarily-add-an-additional-advanced-printer-b.patch
+      - u/notifications-Handle-.desktop-files-that-got-renamed.patch
+      - u/shell-Change-the-default-height-so-all-category-are-on-sc.patch
+      - u/connectivity-add-network-connectivity-checking-toggle.patch
+      - u/diagnostics-Add-Whoopsie-support.patch
+      - u/online-accounts-Hide-window-after-adding-an-online-accoun.patch
+      - u/display-Support-UI-scaled-logical-monitor-mode.patch
+      - u/Disable-non-working-camera-microphones-panels.patch
+      - u/info-overview-Show-updates-in-software-propeties-instead-.patch
+      - u/sound-Add-a-button-to-select-the-default-theme.patch
+      - u/applications-Launch-snap-store-if-it-is-installed.patch
+      - u/display-Allow-fractional-scaling-to-be-enabled.patch
+      - build-Look-for-snapd-glib-2.patch
+
+ -- Jeremy Bicha <jbicha@ubuntu.com>  Tue, 22 Nov 2022 14:39:59 -0500
+
 gnome-control-center (1:43.1-1) unstable; urgency=medium
 
   [ Jeremy Bicha ]
@@ -59,6 +178,65 @@ gnome-control-center (1:43.0-2) unstable
 
  -- Simon McVittie <smcv@debian.org>  Fri, 14 Oct 2022 10:05:39 +0100
 
+gnome-control-center (1:43.0-1ubuntu2) kinetic; urgency=medium
+
+  * Don't recommend libnss-myhostname since we use systemd-resolved
+
+ -- Jeremy Bicha <jbicha@ubuntu.com>  Tue, 20 Sep 2022 09:44:03 -0400
+
+gnome-control-center (1:43.0-1ubuntu1) kinetic; urgency=medium
+
+  * Merge with Debian. Remaining changes:
+    + Add gnome-control-center-faces package to share with unity-control-center
+    + Install apport hook
+    + debian/control.in:
+      - Build-Depend on libwhoopsie-preferences-dev
+      - Depend on language-selector-gnome, system-config-printer &
+        whoopsie-preferences
+      - Don't depend on desktop-base
+      - Recommend ibus
+      - Suggest instead of recommend gnome-user-share & realmd
+      - Don't recommend malcontent-gui or system-config-printer-common
+      - Don't recommend or suggest pulseaudio (or even pipewire) stuff
+    + debian/gnome-control-center-data.install:
+      - Don't install gnome-control-center.pkla since we use
+        policykit-desktop-privileges instead
+      - Install additional assets used by unity-control-center
+    * debian/ubuntu-logo-icon.png, debian/source/include-binaries,
+      debian/gnome-control-center-data.install: Include an Ubuntu logo
+    * debian/gnome-control-center-data.links:
+      - Link audio-speaker-center* to audio-speaker-mono* so that an
+        icon is shown in the test speaker panel. (LP: #1704002)
+    + debian/rules: Enable whoospie integration
+    + Add patches:
+      - keyboard-Allow-disabling-alternate-characters-key.patch
+      - keyboard-For-xkb-options-have-Layout-default-toggle-and-N.patch
+      - keyboard-Avoid-modifying-xkb-options-when-user-changes-n.patch
+      - u/keyboard-Add-launch-terminal-shortcut.patch
+      - u/sound-Allow-volume-to-be-set-above-100.patch
+      - u/Allow-tweaking-some-settings-for-Ubuntu-Dock.patch
+      - u/background-Allow-configuring-the-ubuntu-accent-color.patch
+      - u/multitasking-panel-Sync-workspace-and-monitor-isolation-d.patch
+      - u/Modify-Mulitasking-assets-for-accent-colors.patch
+      - u/lock-Add-Lock-Screen-on-Suspend-option.patch
+      - u/region-Add-Language-Selector-button.patch
+      - u/Adapts-the-region-capplet-and-the-language-chooser-in-the.patch
+      - u/printers-Temporarily-add-an-additional-advanced-printer-b.patch
+      - u/notifications-Handle-.desktop-files-that-got-renamed.patch
+      - u/shell-Change-the-default-height-so-all-category-are-on-sc.patch
+      - u/connectivity-add-network-connectivity-checking-toggle.patch
+      - u/diagnostics-Add-Whoopsie-support.patch
+      - u/online-accounts-Hide-window-after-adding-an-online-accoun.patch
+      - u/display-Support-UI-scaled-logical-monitor-mode.patch
+      - u/Disable-non-working-camera-microphones-panels.patch
+      - u/info-overview-Show-updates-in-software-propeties-instead-.patch
+      - u/sound-Add-a-button-to-select-the-default-theme.patch
+      - u/applications-Launch-snap-store-if-it-is-installed.patch
+      - u/display-Allow-fractional-scaling-to-be-enabled.patch
+      - build-Look-for-snapd-glib-2.patch
+
+ -- Jeremy Bicha <jbicha@ubuntu.com>  Thu, 15 Sep 2022 15:42:16 -0400
+
 gnome-control-center (1:43.0-1) unstable; urgency=medium
 
   [ Jeremy Bicha ]
@@ -69,6 +247,21 @@ gnome-control-center (1:43.0-1) unstable
 
  -- Jeremy Bicha <jbicha@ubuntu.com>  Thu, 15 Sep 2022 14:17:01 -0400
 
+gnome-control-center (1:43~rc-1ubuntu2) kinetic; urgency=medium
+
+  * debian/rules:
+    - restore the dh_translations override which was forgotten during one
+      of the recent merge, it's still needed (lp: #1989403)
+
+ -- Sebastien Bacher <seb128@ubuntu.com>  Tue, 13 Sep 2022 12:10:16 +0200
+
+gnome-control-center (1:43~rc-1ubuntu1) kinetic; urgency=medium
+
+  * Merge with Debian
+  * Refresh patches
+
+ -- Jeremy Bicha <jbicha@ubuntu.com>  Tue, 06 Sep 2022 09:25:05 -0400
+
 gnome-control-center (1:43~rc-2) unstable; urgency=medium
 
   * New upstream release
@@ -105,6 +298,29 @@ gnome-control-center (1:43~beta-2) unsta
 
  -- Jeremy Bicha <jbicha@ubuntu.com>  Sun, 21 Aug 2022 18:48:25 -0400
 
+gnome-control-center (1:43~beta-1ubuntu3) kinetic; urgency=medium
+
+  * Recommend gnome-bluetooth-sendto
+  * Build against libsoup3 libraries
+  * Add patch to build against snapd-glib-2
+
+ -- Jeremy Bicha <jbicha@ubuntu.com>  Fri, 26 Aug 2022 08:59:24 -0400
+
+gnome-control-center (1:43~beta-1ubuntu2) kinetic; urgency=medium
+
+  * Add patch to disable the new Device Security panel (LP: #1987162)
+
+ -- Jeremy Bicha <jbicha@ubuntu.com>  Mon, 22 Aug 2022 10:09:25 -0400
+
+gnome-control-center (1:43~beta-1ubuntu1) kinetic; urgency=medium
+
+  * Merge with Debian
+  * Drop patches applied in new release
+  * Refresh patches
+  * Drop the VNC patch (LP: #1987159)
+
+ -- Jeremy Bicha <jbicha@ubuntu.com>  Sat, 20 Aug 2022 07:47:32 -0400
+
 gnome-control-center (1:43~beta-1) experimental; urgency=medium
 
   * New upstream release
@@ -115,6 +331,16 @@ gnome-control-center (1:43~beta-1) exper
 
  -- Jeremy Bicha <jbicha@ubuntu.com>  Fri, 19 Aug 2022 13:33:46 -0400
 
+gnome-control-center (1:42.3-2ubuntu1) kinetic; urgency=medium
+
+  * Merge with Debian
+    - Fix GNOME version number with latest gnome-desktop (LP: #1986616)
+  * Recommend libcanberra-pulse for Test Sound Output feature (Closes: #676234)
+    (LP: #1983638) (LP: #1004973)
+  * Refresh patches
+
+ -- Jeremy Bicha <jbicha@ubuntu.com>  Thu, 18 Aug 2022 09:16:02 -0400
+
 gnome-control-center (1:42.3-2) unstable; urgency=medium
 
   * Lower gnome-remote-desktop from Depends to Recommends (Closes: #1014879)
@@ -134,6 +360,44 @@ gnome-control-center (1:42.3-1) unstable
 
  -- Jeremy Bicha <jbicha@ubuntu.com>  Sun, 03 Jul 2022 19:21:29 -0400
 
+gnome-control-center (1:42.2-1ubuntu2) kinetic; urgency=medium
+
+  * Rebuild against latest gnome-desktop
+
+ -- Jeremy Bicha <jbicha@ubuntu.com>  Thu, 28 Jul 2022 07:22:14 -0400
+
+gnome-control-center (1:42.2-1ubuntu1) kinetic; urgency=medium
+
+  * debian/patches: Drop applied upstream and update old to use Gtk4 and Adw.
+    Some have been dropped as not relevant anymore.
+    While usage of AdwLeaf is now too invasive to do a revert as per
+     debian/patches/ubuntu/window-Stop-using-HdyLeaflet.patch so it's better
+    if we just help fixing the issues upstream.
+  * debian/patches: Ensure VNC/RDP remote control setting is honored
+    (LP: #1977663)
+  * debian/patches: Drop workaround for X-SnapInstanceName.
+    It's in snapd for 3 years now, we can safely assume we support it.
+  * background: Allow configuring the ubuntu accent color.
+    Move the ubuntu colors configuration to a single widget
+    (CcUbuntuColorsRow) so that it can be easily included in other widgets
+    with minimal changes.
+    We keep resources and the widget itself compiled together with the ubuntu
+    panel, so that there's no need to change multiple panels build scripts,
+    given that these are per-process anyways.
+    Helps with LP: #1968213
+  * ubuntu-colors-row: Do not change themes on startup (or on user changes)
+    Do not override user themes unless an user has explicitly selected a
+    color theme. This applies to both the user theme and the icons, as we
+    want a consistent experience. But users could still use tweaks to change
+    them.
+    At the same time, avoid changing the gedit color scheme if an user
+    previously set a non-Yaru theme. (LP: #1968213)
+  * debian/patches: Ensure both VNC and RDP settings are disabled if requested
+    (LP: #1971415)
+  * debian/patches: Move the VNC support patch under the ubuntu topic
+
+ -- Marco Trevisan (Treviño) <marco@ubuntu.com>  Tue, 28 Jun 2022 02:24:04 +0200
+
 gnome-control-center (1:42.2-1) unstable; urgency=medium
 
   * New upstream release
@@ -209,6 +473,13 @@ gnome-control-center (1:42.0-1) experime
 
  -- Simon McVittie <smcv@debian.org>  Wed, 30 Mar 2022 20:24:07 +0100
 
+gnome-control-center (1:41.7-0ubuntu1) kinetic; urgency=medium
+
+  * New upstream release (LP: #1975945)
+  * Drop 6 patches applied in new release
+
+ -- Jeremy Bicha <jbicha@ubuntu.com>  Fri, 27 May 2022 09:17:14 -0400
+
 gnome-control-center (1:41.4-2) unstable; urgency=medium
 
   * Team upload
@@ -239,6 +510,218 @@ gnome-control-center (1:41.4-2) unstable
 
  -- Simon McVittie <smcv@debian.org>  Mon, 28 Mar 2022 19:13:05 +0100
 
+gnome-control-center (1:41.4-1ubuntu15) kinetic; urgency=medium
+
+  * Don't depend on gedit-common. We fixed bug 1947519 differently.
+  * Don't recommend pulseaudio-module-bluetooth; we are switching to PipeWire
+
+ -- Jeremy Bicha <jbicha@ubuntu.com>  Tue, 17 May 2022 16:33:11 -0400
+
+gnome-control-center (1:41.4-1ubuntu14) kinetic; urgency=medium
+
+  * Add patch to turn off RDP gsettings key when turning off RDP (LP: #1971415)
+
+ -- Jeremy Bicha <jbicha@ubuntu.com>  Tue, 10 May 2022 22:01:31 -0400
+
+gnome-control-center (1:41.4-1ubuntu13) jammy; urgency=medium
+
+  * Add patch to fix RDP Sharing on switch (LP: #1969619)
+
+ -- Jeremy Bicha <jbicha@ubuntu.com>  Wed, 20 Apr 2022 15:02:15 -0400
+
+gnome-control-center (1:41.4-1ubuntu12) jammy; urgency=medium
+
+  * debian/patches: Refresh
+  * debian/patches: Support configuring VNC backend along with RDP one.
+    Do not regress, allowing to configure and keep VNC support together with
+    the RDP one.
+    This was supposed to be part of the previous upload, given that it's
+    reducing the regression potential of the FFe. (LP: #1968518)
+
+ -- Marco Trevisan (Treviño) <marco@ubuntu.com>  Wed, 13 Apr 2022 08:41:30 +0200
+
+gnome-control-center (1:41.4-1ubuntu11) jammy; urgency=medium
+
+  * debian/patches/ubuntu/sharing-rdp/*.path:
+    - Backport RDP support (LP: #1968518)
+  * debian/patches/ubuntu/update-vnc-key.patch:
+    - Dropped as fixed in the above backport.
+
+ -- Robert Ancell <robert.ancell@canonical.com>  Wed, 13 Apr 2022 11:38:18 +1200
+
+gnome-control-center (1:41.4-1ubuntu10) jammy; urgency=medium
+
+  * debian/patches/ubuntu/Allow-tweaking-some-settings-for-Ubuntu-Dock.patch
+    Use the correct gettext function in the ubuntu panel for context strings
+  * debian/patches/ubuntu/update-vnc-key.patch:
+    Update the grd vnc key when sharing as required by the new version
+
+ -- Sebastien Bacher <seb128@ubuntu.com>  Fri, 08 Apr 2022 13:45:39 +0200
+
+gnome-control-center (1:41.4-1ubuntu9) jammy; urgency=medium
+
+  * debian/patches: Refresh (and drop removed ones)
+  * ubuntu-panel: Update color assets to match tuned yaru colors
+  * ubuntu-panel: Auto-generate color assets, to make them easier to maintain
+  * ubuntu-panel: Fully auto-generate the gresource xml file
+  * background: Do not show the dark/light notice on GNOME session
+    (LP: #1965507)
+
+ -- Marco Trevisan (Treviño) <marco@ubuntu.com>  Mon, 28 Mar 2022 18:15:08 +0200
+
+gnome-control-center (1:41.4-1ubuntu8) jammy; urgency=medium
+
+  * debian/gnome-control-center-data.install,
+    debian/patches/ubuntu/distro-logo.patch,
+    debian/patches/debian/info-overview-Use-the-Vendor-logo-prominently.patch,
+    debian/rules,
+    debian/source/include-binaries,
+    debian/ubuntu-logo-dark.png:
+    - replace the Debian vendor logo patch by the one used in fedora which
+      handle having a dark variant and provides the corresponding image
+      in the package
+
+ -- Sebastien Bacher <seb128@ubuntu.com>  Fri, 18 Mar 2022 16:30:25 +0100
+
+gnome-control-center (1:41.4-1ubuntu7) jammy; urgency=medium
+
+  * debian/ubuntu-logo-icon.png:
+    - use a variant of the logo with the ubuntu label
+
+ -- Sebastien Bacher <seb128@ubuntu.com>  Fri, 18 Mar 2022 15:27:28 +0100
+
+gnome-control-center (1:41.4-1ubuntu6) jammy; urgency=medium
+
+  [ Marco Trevisan (Treviño) ]
+  * background: Support changing the light / dark wallpaper
+
+ -- Jeremy Bicha <jbicha@ubuntu.com>  Thu, 17 Mar 2022 22:46:55 -0400
+
+gnome-control-center (1:41.4-1ubuntu5) jammy; urgency=medium
+
+  [ Sebastien Bacher ]
+  * debian/ubuntu-logo-icon.png:
+    - update with the new Ubuntu logo
+
+  [ Muqtxdir ]
+  * Add settings to control the main desktop icons options (LP: #1964732)
+  * modernize the over-amplification row
+  * debian/patches: add RTL condition from upstream to cc-multitasking-panel.
+    Use GtkIMage from resource
+  * updated color selectors to match Yaru palette
+    - Added bark, olive, viridian to replace aqua, green and yellow.
+    - Updated colors from yaru PR #3486
+    - remove unnecessary metadata from theme-dark and theme-light now that
+      gradient is not used in SVG.
+    - changed color-names in cc-ubuntu.panel.c and cc-ubuntu-panel.ui
+    - arranged the colors in colors_row based on hue
+  * Remove gradient from SVG, let CSS handle the background-gradient.
+
+  [ Marco Trevisan (Treviño) ]
+  * ubuntu-panel: Update the icon theme on color variant change
+  * ubuntu-panel: Fix issue causing g-c-c to reset the theme when using dark
+    variants
+  * ubuntu-panel: Set new color-scheme preference on dark/light changes.
+    This allows to keep in sync the options to that Hdy and Adw apps can
+    obey to that.
+  * ubuntu-panel: Add more Yaru color variants
+  * ubuntu-panel: Update the keywords for the ubuntu appearance panel
+  * ubuntu-panel: Use more consistent pop-over to show the desktop Icons
+    settings (LP: #1964732)
+  * debian/patches: Cherry-pick various upstream fixes part of 42 branch.
+    Even though we stick on 41 there are some upstream changes that couldn't
+    land on upstream's gnome-41 branch because they may change behavior in a
+    way that is not wanted in a stable update, but this is not the case for
+    us yet, so let's pick them. They include:
+    - Support for new high-contrast and color scheme settings keys
+    - Support for applying gracefully the theme changes
+    - Various memory fixes
+  * debian/patches: Fix a leak when creating a new user.
+    ANDREAAAAAAAAAAAaaaaaaaaaaaaaaaaaaaaaaaaaaaaa! :-*
+  * ubuntu-panel: Ensure accent colors are visible and widget not selectable
+  * ubuntu-panel: Add support for configuring Desktop extension
+  * ubuntu-panel: Check for theme availability in Yaru gresource path
+  * ubuntu-panel: Ensure relevant settings work on missing optional schemas
+  * ubuntu-panel: Support Shell screen transition on theme change
+  * ubuntu-panel: Use faster and saver qdata for the accent values
+  * ubuntu-panel: Improve wording on Desktop Icons settings
+  * ubuntu-panel: Update the keywords for the ubuntu appearance panel
+  * ubuntu-panel: Use more consistent pop-over for the desktop Icons settings
+    (LP: #1964732)
+
+  [ Jeremy Bicha ]
+  * debian/patches: Remove Screenshot key settings.
+    They are under gnome-shell umbrella now
+
+ -- Marco Trevisan (Treviño) <marco@ubuntu.com>  Fri, 18 Mar 2022 02:23:54 +0100
+
+gnome-control-center (1:41.4-1ubuntu3.1) jammy; urgency=medium
+
+  * debian/patches/git_owe_settings.patch: Fix OWE settings (lp: #1963906)
+
+ -- Sebastien Bacher <seb128@ubuntu.com>  Mon, 07 Mar 2022 17:05:27 +0100
+
+gnome-control-center (1:41.4-1ubuntu3) jammy; urgency=medium
+
+  [ Marco Trevisan (Treviño) ]
+  * debian/patches: Refresh
+  * debian/patches: Backport Privacy Screen support patches
+  * debian/control: Depend on gnome schemas 42
+  * ubuntu: Cleanup accent-color selection code and enable only when relevant
+
+  [ Muqtxdir ]
+  * ubuntu-panel: minor-tweaks to cc-ubuntu-dock-dialog
+  * ubuntu-panel: Add switch to change dock panel-mode
+  * ubuntu: Add support to selecting a theme accent color
+  * Modify Mulitasking assets for accent-colors
+
+ -- Marco Trevisan (Treviño) <marco@ubuntu.com>  Fri, 25 Feb 2022 11:39:21 +0100
+
+gnome-control-center (1:41.4-1ubuntu2) jammy; urgency=low
+
+  * Merge from Debian unstable. Remaining changes:
+  * d/p/u/display-Allow-fractional-scaling-to-be-enabled.patch:
+    Ensure renderer is initialized.
+    It may not be the case when running with non-patched mutter, so not a
+    bug, but this helps in development scenarios.
+  * d/p/u/Allow-tweaking-some-settings-for-Ubuntu-Dock.patch:
+    - Do not crash if gedit is not installed
+  * ubuntu-panel: Save dock monitor by connector and support primary monitor
+    Dash to dock used to use the shell's monitor ID to pick the monitor in
+    which should be used, however this is not something that worked well
+    in case one switches configuration or uses a laptop in different
+    scenarios as the dock may be moved to the wrong display.
+    As per this:
+     - Add a "Primary monitor" item, to bind the dock position to the
+       primary monitor (whatever it is)
+     - Store the selected monitor by its connector
+     - Add backward compatibility support for the old 'preferred-monitor'
+       key, and migrate to it.
+    Related to: https://github.com/micheleg/dash-to-dock/pull/1630
+  * multitasking-panel: Sync workspace and monitor isolation dock settings.
+    When using ubuntu-dock the multitasking panel setting doesn't fully
+    apply, because even though the user selects to isolate workspaces, the
+    dock may still continue to show icons from all the workspaces.
+    As per this, ensure that the settings are applied also to the dock, plus
+    include dock-specifc settings to control multi-monitor behavior.
+  * ubuntu-panel: Use libhandy widgets for the dock section.
+    This will help with Gtk and libadwaita porting in future, so let's just
+    such widgets that are also more integrated with the current g-c-c design
+    - ubuntu-panel: Use more modern libadwaita widgets for dock settings.
+      This should make gtk4 porting even easier, plus we can be more consitent
+      with the majority of other g-c-c panels.
+    - ubuntu-panel: Add dock specific dialog to control.
+        Add a dock settings dialog to control some more specific settings.
+        So far we only support toggling the visualization of device and trash
+        icons, but this could be extended more in future. (LP: #1846205)
+    - ubuntu-panel: Improve appearance-page to use more consistent look
+      - Make use of HdyPrefrencesPage for Appearance-panel.
+      - Make use of HdyPrefrencesGroup for Window colors.
+      - Make use of custom css style classes from appearance.css
+      - Update the light/dark variant preview images (LP: #1943849)
+
+ -- Gianfranco Costamagna <locutusofborg@debian.org>  Thu, 17 Feb 2022 20:50:39 +0100
+
 gnome-control-center (1:41.4-1) unstable; urgency=medium
 
   * Team upload
@@ -257,6 +740,52 @@ gnome-control-center (1:41.4-1) unstable
 
  -- Simon McVittie <smcv@debian.org>  Wed, 16 Feb 2022 10:54:42 +0000
 
+gnome-control-center (1:41.2-2ubuntu1) jammy; urgency=low
+
+  * Merge from Debian unstable. Remaining changes:
+  * debian/patches: Refresh
+  * d/p/u/display-Allow-fractional-scaling-to-be-enabled.patch:
+    Ensure renderer is initialized.
+    It may not be the case when running with non-patched mutter, so not a
+    bug, but this helps in development scenarios.
+  * d/p/u/Allow-tweaking-some-settings-for-Ubuntu-Dock.patch:
+    - Do not crash if gedit is not installed
+  * ubuntu-panel: Save dock monitor by connector and support primary monitor
+    Dash to dock used to use the shell's monitor ID to pick the monitor in
+    which should be used, however this is not something that worked well
+    in case one switches configuration or uses a laptop in different
+    scenarios as the dock may be moved to the wrong display.
+    As per this:
+     - Add a "Primary monitor" item, to bind the dock position to the
+       primary monitor (whatever it is)
+     - Store the selected monitor by its connector
+     - Add backward compatibility support for the old 'preferred-monitor'
+       key, and migrate to it.
+    Related to: https://github.com/micheleg/dash-to-dock/pull/1630
+  * multitasking-panel: Sync workspace and monitor isolation dock settings.
+    When using ubuntu-dock the multitasking panel setting doesn't fully
+    apply, because even though the user selects to isolate workspaces, the
+    dock may still continue to show icons from all the workspaces.
+    As per this, ensure that the settings are applied also to the dock, plus
+    include dock-specifc settings to control multi-monitor behavior.
+  * ubuntu-panel: Use libhandy widgets for the dock section.
+    This will help with Gtk and libadwaita porting in future, so let's just
+    such widgets that are also more integrated with the current g-c-c design
+    - ubuntu-panel: Use more modern libadwaita widgets for dock settings.
+      This should make gtk4 porting even easier, plus we can be more consitent
+      with the majority of other g-c-c panels.
+    - ubuntu-panel: Add dock specific dialog to control.
+        Add a dock settings dialog to control some more specific settings.
+        So far we only support toggling the visualization of device and trash
+        icons, but this could be extended more in future. (LP: #1846205)
+    - ubuntu-panel: Improve appearance-page to use more consistent look
+      - Make use of HdyPrefrencesPage for Appearance-panel.
+      - Make use of HdyPrefrencesGroup for Window colors.
+      - Make use of custom css style classes from appearance.css
+      - Update the light/dark variant preview images (LP: #1943849)
+
+ -- Gianfranco Costamagna <locutusofborg@debian.org>  Sun, 06 Feb 2022 22:57:51 +0100
+
 gnome-control-center (1:41.2-2) unstable; urgency=medium
 
   * Team upload
@@ -279,6 +808,66 @@ gnome-control-center (1:41.2-1) unstable
 
  -- Jeremy Bicha <jbicha@debian.org>  Sun, 05 Dec 2021 09:54:38 -0500
 
+gnome-control-center (1:41.1-1ubuntu3) jammy; urgency=medium
+
+  [ Marco Trevisan (Treviño) ]
+  * debian/patches: Refresh
+  * d/p/u/display-Allow-fractional-scaling-to-be-enabled.patch:
+    Ensure renderer is initialized.
+    It may not be the case when running with non-patched mutter, so not a
+    bug, but this helps in development scenarios.
+  * d/p/u/Allow-tweaking-some-settings-for-Ubuntu-Dock.patch:
+    - Do not crash if gedit is not installed
+  * ubuntu-panel: Save dock monitor by connector and support primary monitor
+    Dash to dock used to use the shell's monitor ID to pick the monitor in
+    which should be used, however this is not something that worked well
+    in case one switches configuration or uses a laptop in different
+    scenarios as the dock may be moved to the wrong display.
+    As per this:
+     - Add a "Primary monitor" item, to bind the dock position to the
+       primary monitor (whatever it is)
+     - Store the selected monitor by its connector
+     - Add backward compatibility support for the old 'preferred-monitor'
+       key, and migrate to it.
+    Related to: https://github.com/micheleg/dash-to-dock/pull/1630
+  * multitasking-panel: Sync workspace and monitor isolation dock settings.
+    When using ubuntu-dock the multitasking panel setting doesn't fully
+    apply, because even though the user selects to isolate workspaces, the
+    dock may still continue to show icons from all the workspaces.
+    As per this, ensure that the settings are applied also to the dock, plus
+    include dock-specifc settings to control multi-monitor behavior.
+  * ubuntu-panel: Use libhandy widgets for the dock section.
+    This will help with Gtk and libadwaita porting in future, so let's just
+    such widgets that are also more integrated with the current g-c-c design
+  * ubuntu-panel: Use more modern libadwaita widgets for dock settings.
+    This should make gtk4 porting even easier, plus we can be more consitent
+    with the majority of other g-c-c panels.
+  * ubuntu-panel: Add dock specific dialog to control.
+    Add a dock settings dialog to control some more specific settings.
+    So far we only support toggling the visualization of device and trash
+    icons, but this could be extended more in future. (LP: #1846205)
+
+  [ Muqtxdir ]
+  * ubuntu-panel: Improve appearance-page to use more consistent look
+    - Make use of HdyPrefrencesPage for Appearance-panel.
+    - Make use of HdyPrefrencesGroup for Window colors.
+    - Make use of custom css style classes from appearance.css
+    - Update the light/dark variant preview images (LP: #1943849)
+
+ -- Marco Trevisan (Treviño) <marco@ubuntu.com>  Mon, 31 Jan 2022 03:42:47 +0100
+
+gnome-control-center (1:41.1-1ubuntu2) jammy; urgency=medium
+
+  * Fix FTBFS with recent meson version.
+
+ -- Robert Ancell <robert.ancell@canonical.com>  Wed, 19 Jan 2022 15:03:40 +1300
+
+gnome-control-center (1:41.1-1ubuntu1) jammy; urgency=medium
+
+  * Resynchronize with debian and update to the new serie
+
+ -- Sebastien Bacher <seb128@ubuntu.com>  Tue, 16 Nov 2021 13:37:15 +0100
+
 gnome-control-center (1:41.1-1) unstable; urgency=medium
 
   * Team upload
@@ -323,6 +912,85 @@ gnome-control-center (1:40.0-2) unstable
 
  -- Simon McVittie <smcv@debian.org>  Sat, 11 Sep 2021 21:32:44 +0100
 
+gnome-control-center (1:40.0-1ubuntu6) UNRELEASED; urgency=medium
+
+  [ Gunnar Hjalmarsson ]
+  * Add gedit-common to gcc Depends (LP: #1947519)
+    - Needed for Allow-tweaking-some-settings-for-Ubuntu-Dock.patch
+
+ -- Gunnar Hjalmarsson <gunnarhj@ubuntu.com>  Mon, 18 Oct 2021 13:23:44 +0200
+
+gnome-control-center (1:40.0-1ubuntu5) impish; urgency=medium
+
+  * d/p/keyboard-Create-CcXkbModifierDialog-only-when-used.patch,
+    d/p/keyboard-Rename-XkbOption-and-XkbModifier-with-Cc-prefix.patch:
+    - Avoid Alternate Characters Key unexpected behavior (LP: #1934761)
+  * d/p/keyboard-Avoid-modifying-xkb-options-when-user-changes-n.patch:
+    - Extra 'safety' (LP: #1934761)
+
+ -- Gunnar Hjalmarsson <gunnarhj@ubuntu.com>  Thu, 19 Aug 2021 12:58:46 +0200
+
+gnome-control-center (1:40.0-1ubuntu4) impish; urgency=medium
+
+  [ Muqtadir ]
+  * d/p/u/Allow-tweaking-some-settings-for-Ubuntu-Dock.patch:
+     - Update theme selector to match theme changes.
+
+ -- Robert Ancell <robert.ancell@canonical.com>  Thu, 05 Aug 2021 12:40:07 +1200
+
+gnome-control-center (1:40.0-1ubuntu3) impish; urgency=medium
+
+  [ Gunnar Hjalmarsson ]
+  * Adapts-the-region-capplet-and-the-language-chooser-in-the.patch:
+    - Revert the "Fix locales updates" commit
+    - Drop update_region() call with NULL argument
+  * d/p/u/Fix-volume-adjustment-failure-on-volume-slider.patch:
+    - Added patch headers
+
+  [ Hui Wang ]
+  * d/p/u/Fix-volume-adjustment-failure-on-volume-slider.patch:
+    - Can't adjust the output volume via volume-slider after changing
+      the current output-device. (LP: #1938747)
+
+ -- Gunnar Hjalmarsson <gunnarhj@ubuntu.com>  Tue, 03 Aug 2021 12:46:03 +0200
+
+gnome-control-center (1:40.0-1ubuntu2) impish; urgency=medium
+
+  * debian/ubuntu-logo-icon.png,
+    debian/gnome-control-center-data.install,
+    d/p/d/info-overview-Use-the-Vendor-logo-prominently.patch:
+    - use a vendor logo icon which is available in Ubuntu (lp: #1934564)
+
+ -- Sebastien Bacher <seb128@ubuntu.com>  Fri, 09 Jul 2021 13:10:17 +0200
+
+gnome-control-center (1:40.0-1ubuntu1) impish; urgency=medium
+
+  * Merge with debian
+  * debian/patches: Refresh and rebase
+  * debian/patches: Use debian-gnome standard unnumered names.
+    Having numbered patches makes it only harder to maintain and rebase, so
+    let's just follow the gnome-team rules and use proper names for them as
+    gbp pq generates.
+    If you don't use it, well do :).
+  * debian/patches: Cherry-pick upstream proposed patches to handle cases
+    that we were handlig by reverting 3.38 changes.
+  * d/p/Provide-an-api-for-the-installation-of-language-pack.patch: Drop.
+    This was needed to handle language pack installation, but it's something
+    that is obsolete now.
+  * d/p/Adapts-the-region-capplet-and-the-language-chooser-in-the.patch:
+    - Looks like it needed to be ordered to be rebased proplerly, so adapt it
+      to new code hiding the "more" button from ui file.
+    - Fix locales updates.
+    Ensure that when user language changes we set back the region to the
+    default per the chosen language
+  * debian/patches: Move patches into the debian namespace.
+    They're all only needed in debian, so let's use a proper namespace.
+  * debian/patches: Move the ubuntu-only patches into the ubuntu namespace.
+    We can organize patches better this way avoiding comments that gbp pq
+    would delete.
+
+ -- Marco Trevisan (Treviño) <marco@ubuntu.com>  Fri, 11 Jun 2021 03:38:52 +0200
+
 gnome-control-center (1:40.0-1) experimental; urgency=medium
 
   [ Marco Trevisan (Treviño) ]
@@ -339,18 +1007,96 @@ gnome-control-center (1:40.0-1) experime
 
  -- Marco Trevisan (Treviño) <marco@ubuntu.com>  Thu, 10 Jun 2021 18:36:49 +0200
 
+gnome-control-center (1:3.38.6-0ubuntu2) impish; urgency=medium
+
+  [ Gunnar Hjalmarsson ]
+  * Added note to the header of patch 0030
+
+  [ Marco Trevisan (Treviño) ]
+  * debian/patches: Ensure we list all the usable scaling values.
+    List all the usable scaling values without limiting us to the first 5
+    available, but try instead to show the values closer to the one selected.
+    (LP: #1795483)
+  * debian/patches: Do not leak a variant builder on single monitor setup
+
+ -- Marco Trevisan (Treviño) <marco@ubuntu.com>  Fri, 28 May 2021 20:48:42 +0200
+
+gnome-control-center (1:3.38.6-0ubuntu1) impish; urgency=medium
+
+  * New bugfix update based on Debian
+
+  [ Simon McVittie ]
+  * New upstream release
+    - Translation update: pt
+
+  [ Laurent Bigonville ]
+  * debian/control.in: Bump libnm-dev BD to 1.20.0
+
+ -- Sebastien Bacher <seb128@ubuntu.com>  Mon, 17 May 2021 16:02:35 +0200
+
+gnome-control-center (1:3.38.5-1ubuntu1) hirsute; urgency=medium
+
+  * New bugfix update based on Debian
+
+ -- Sebastien Bacher <seb128@ubuntu.com>  Tue, 23 Mar 2021 08:54:54 +0100
+
 gnome-control-center (1:3.38.5-1) experimental; urgency=medium
 
   * New upstream release
 
  -- Sebastien Bacher <seb128@ubuntu.com>  Tue, 23 Mar 2021 08:46:50 +0100
 
+gnome-control-center (1:3.38.4-1ubuntu2) hirsute; urgency=medium
+
+  * debian/control.in:
+    - Recommends power-profiles-daemon
+  * debian/patches/git_power_profiles.patch:
+    - power: Add "Power Mode" sectionn. Use power-profiles-daemon
+      to implement switchable power profiles. The performance profile will
+      only be available on systems which provide this functionality.
+
+ -- Sebastien Bacher <seb128@ubuntu.com>  Tue, 23 Feb 2021 20:59:56 +0100
+
+gnome-control-center (1:3.38.4-1ubuntu1) hirsute; urgency=medium
+
+  * New upstream version based on Debian
+
+ -- Sebastien Bacher <seb128@ubuntu.com>  Fri, 19 Feb 2021 12:25:12 +0100
+
 gnome-control-center (1:3.38.4-1) unstable; urgency=medium
 
   * New upstream release
 
  -- Sebastien Bacher <seb128@ubuntu.com>  Fri, 19 Feb 2021 11:59:19 +0100
 
+gnome-control-center (1:3.38.3-1ubuntu3) hirsute; urgency=medium
+
+  * d/p/0024-display-Allow-fractional-scaling-to-be-enabled.patch:
+    - Support kms renderer in fractional scaling toggle (LP: #1894593)
+    - Change logical layout mode when switching mode in wayland
+
+ -- Marco Trevisan (Treviño) <marco@ubuntu.com>  Wed, 10 Feb 2021 13:43:55 +0100
+
+gnome-control-center (1:3.38.3-1ubuntu2) hirsute; urgency=medium
+
+  * debian/patches/ubuntu_restore_sharing.patch:
+    - remove the patch bringing back the vino desktop sharing since
+      gnome-remote-desktop support is enabled in Ubuntu now
+  * debian/patches/git_fingerprint_improvements.patch:
+    - backport fingerprint improvements made by Treviño
+  * Remove user config migration script which was needed until focal
+
+ -- Sebastien Bacher <seb128@ubuntu.com>  Tue, 09 Feb 2021 11:31:06 +0100
+
+gnome-control-center (1:3.38.3-1ubuntu1) hirsute; urgency=medium
+
+  * New upstream version based on Debian (lp: #1911918)
+  * debian/patches/0016-diagnostics-Add-Whoopsie-support.patch:
+    - display the whoopsie status to 'autoreport' if the corresponding key
+      is set to true even if report=false (see lp #1906877)
+
+ -- Sebastien Bacher <seb128@ubuntu.com>  Fri, 15 Jan 2021 15:10:51 +0100
+
 gnome-control-center (1:3.38.3-1) unstable; urgency=medium
 
   * Team upload
@@ -367,6 +1113,23 @@ gnome-control-center (1:3.38.2-2) unstab
 
  -- Laurent Bigonville <bigon@debian.org>  Fri, 25 Dec 2020 10:16:26 +0100
 
+gnome-control-center (1:3.38.2-1ubuntu2) hirsute; urgency=medium
+
+  [ Brian Murray ]
+  * 0016-diagnostics-Add-Whoopsie-support.patch: ensure that we always perform
+    the call to automatically report crashes so that it will be turned off if
+    "never" is chosen. (LP: #1906877)
+
+ -- Sebastien Bacher <seb128@ubuntu.com>  Mon, 07 Dec 2020 18:56:07 +0100
+
+gnome-control-center (1:3.38.2-1ubuntu1) hirsute; urgency=medium
+
+  * New upstream version based on Debian
+  * debian/patches/gitlab_ucm_mixer_control_select.patch:
+    - remove change included in the new version
+
+ -- Sebastien Bacher <seb128@debian.org>  Mon, 23 Nov 2020 21:03:57 +0100
+
 gnome-control-center (1:3.38.2-1) unstable; urgency=medium
 
   * Team upload
@@ -387,6 +1150,15 @@ gnome-control-center (1:3.38.2-1) unstab
 
  -- Simon McVittie <smcv@debian.org>  Mon, 23 Nov 2020 10:14:09 +0000
 
+gnome-control-center (1:3.38.1-1ubuntu1) groovy; urgency=medium
+
+  * New upstream version based on Debian
+  * d/p/0033-sound-update-the-profile-list-after-getting-the-sign.patch:
+    - removed, the change is in the new version
+  * Build without malcontent which is in universe
+
+ -- Sebastien Bacher <seb128@ubuntu.com>  Mon, 05 Oct 2020 15:20:23 +0200
+
 gnome-control-center (1:3.38.1-1) unstable; urgency=medium
 
   * New upstream release
@@ -403,6 +1175,23 @@ gnome-control-center (1:3.38.0-2) unstab
 
  -- Simon McVittie <smcv@debian.org>  Fri, 25 Sep 2020 10:27:01 +0100
 
+gnome-control-center (1:3.38.0-1ubuntu2) groovy; urgency=medium
+
+  * d/p/0033-sound-update-the-profile-list-after-getting-the-sign.patch
+    - signal to update profile combo list after the PA changes the
+      active profile, this patch fixes the empty profile combo list issue
+      after selecting the hdmi/dp audio in the g-c-c. (LP: #1896919)
+
+ -- Hui Wang <hui.wang@canonical.com>  Thu, 24 Sep 2020 09:54:10 +0000
+
+gnome-control-center (1:3.38.0-1ubuntu1) groovy; urgency=medium
+
+  * New upstream version based on Debian
+  * debian/patches/gitlab_details_layout.patch:
+    - removed, the change is in the new version
+
+ -- Sebastien Bacher <seb128@ubuntu.com>  Tue, 15 Sep 2020 15:05:08 +0200
+
 gnome-control-center (1:3.38.0-1) experimental; urgency=medium
 
   * New upstream release
@@ -452,18 +1241,139 @@ gnome-control-center (1:3.36.4-1) unstab
 
  -- Sebastien Bacher <seb128@debian.org>  Mon, 06 Jul 2020 16:47:10 +0200
 
+gnome-control-center (1:3.36.3-1ubuntu2) groovy; urgency=medium
+
+  * debian/patches/git-sound-profile.patch:
+    - sound: Stop non-interactive profile changes from triggering
+      changed events, fix selection issues (lp: #1885673)
+
+ -- Sebastien Bacher <seb128@ubuntu.com>  Thu, 02 Jul 2020 11:01:31 +0200
+
+gnome-control-center (1:3.36.3-1ubuntu1) groovy; urgency=medium
+
+  * New upstream version rebased on Debian (lp: #1884063)
+
+  [ Gunnar Hjalmarsson ]
+  * debian/patches/0030-temporarily-revert-alt-char-key.patch:
+    - Change po/POTFILES.in too, so dh_translations can create
+      gnome-control-center-2.0.pot.
+  * d/p/0015-connectivity-add-network-connectivity-checking-toggl.patch:
+    - Add "privacy" to Keywords in the .desktop file in line with
+      https://gitlab.gnome.org/GNOME/gnome-control-center/-/commit/05f3cb67
+      (LP: #1869288)
+
+  [ Marco Trevisan (Treviño) ]
+  * d/p/0008-Allow-tweaking-some-settings-for-Ubuntu-Dock.patch:
+    - Ensure dock position is respected in RTL (LP: #1876937)
+    - Add proper matching the dock monitor ID (LP: #1877108)
+  * d/p/0024-display-Allow-fractional-scaling-to-be-enabled.patch:
+    - Improve fractional scaling toggling (LP: #1876891, #1876894)
+    - Look for proper fractional scaling key in Wayland and X11 (LP: #1871864)
+  * d/p/0031-fingerprint-dialog-Don-t-limit-the-number-of-maximum.patch:
+    - Don't make flowbox children selectable (LP: #1877441)
+
+ -- Sebastien Bacher <seb128@ubuntu.com>  Thu, 18 Jun 2020 13:44:56 +0200
+
 gnome-control-center (1:3.36.3-1) unstable; urgency=medium
 
   * New upstream release
 
  -- Sebastien Bacher <seb128@ubuntu.com>  Thu, 18 Jun 2020 13:38:15 +0200
 
+gnome-control-center (1:3.36.2-1ubuntu1) groovy; urgency=medium
+
+  * New upstream version rebased on Debian (lp: #1876256)
+  * debian/patches/0001-sound-Fix-translation-of-System-Sounds.patch,
+    debian/patches/0028-applications-Fix-only-connected-snap-interfaces-show.patch,
+    debian/patches/git-info-crash-on-nvidia.patch,
+    debian/patches/git-nongnome-segfault.patch:
+    - removed, included in the new version
+
+ -- Sebastien Bacher <seb128@ubuntu.com>  Fri, 01 May 2020 09:10:17 +0200
+
 gnome-control-center (1:3.36.2-1) unstable; urgency=medium
 
   * New upstream release
 
  -- Sebastien Bacher <seb128@ubuntu.com>  Fri, 01 May 2020 09:02:41 +0200
 
+gnome-control-center (1:3.36.1-1ubuntu6) groovy; urgency=medium
+
+  [ Marco Trevisan ]
+  * debian/patches/0008-Allow-tweaking-some-settings-for-Ubuntu-Dock.patch:
+    - disable dock in all monitors when choosing a specific one (lp: #1866088)
+    - Ignore inactive monitors (lp: #1873890)
+    - Show shell labels when using appearance panel (lp: #1873883)
+
+  [ Olivier Tilloy ]
+  * d/p/0032-online-accounts-maybe-leak-a-reference-to-the-panel.patch:
+    maybe leak a reference to the panel, to prevent a crash (LP: #1862553)
+
+ -- Olivier Tilloy <olivier.tilloy@canonical.com>  Mon, 27 Apr 2020 22:47:58 +0200
+
+gnome-control-center (1:3.36.1-1ubuntu5) focal; urgency=medium
+
+  * debian/patches/git-info-crash-on-nvidia.patch:
+    - backport a fix for an info panel segfault on nvidia cards
+      (lp: #1870737)
+  * debian/patches/git-nongnome-segfault.patch:
+    - don't segfault when started outside of GNOME (lp: #1870735)
+
+  [ Marco Trevisan ]
+  * d/p/0028-user-panel-Add-reference-to-selected-user-and-clear-.patch,
+  * d/p/0029-user-panel-Don-t-wait-for-fprintd-on-initialization.patch,
+    d/p/0030-fingerprint-dialog-Don-t-use-sync-calls-for-deleting.patch,
+    d/p/0031-fingerprint-dialog-Don-t-limit-the-number-of-maximum.patch:
+    - Don't wait for fprintd on initialization and don't limit enroll stages
+      (lp: #1865845)
+
+  [ Robert Ancell ]
+  * debian/patches/0027-window-Stop-using-HdyLeaflet.patch:
+    - Disable adaptive layouts, theres some bugs and they're not required on
+      desktop (LP: #1871195)
+  * debian/patches/0028-applications-Fix-only-connected-snap-interfaces-show.patch:
+    - Fix disconnected snap interfaces not showing (LP: #1870600)
+  * debian/patches/0029-applications-Use-new-snapd-glib-API-for-labelling-Sn.patch:
+  * debian/control:
+    - Use shared names for snap interfaces, fixing some interfaces that don't
+      have labels.
+
+  [ Gunnar Hjalmarsson ]
+  * debian/patches/0030-temporarily-revert-alt-char-key.patch:
+    - Revert the "Alternate Characters Key" commit temporarily awaiting
+      a proper fix of LP: #1867548.
+
+ -- Sebastien Bacher <seb128@ubuntu.com>  Thu, 16 Apr 2020 12:30:37 +0200
+
+gnome-control-center (1:3.36.1-1ubuntu4) focal; urgency=medium
+
+  * debian/patches/0025-applications-Hide-buttons-that-launch-gnome-software.patch:
+  * debian/patches/0026-applications-Launch-snap-store-if-it-is-installed.patch:
+    - Launch snap-store if it is installed (LP: #1867000)
+
+ -- Robert Ancell <robert.ancell@canonical.com>  Mon, 06 Apr 2020 11:00:15 +1200
+
+gnome-control-center (1:3.36.1-1ubuntu3) focal; urgency=medium
+
+  * debian/patches/0001-sound-Fix-translation-of-System-Sounds.patch:
+    - Fix system sounds not being translated (LP: #1870152)
+
+ -- Robert Ancell <robert.ancell@canonical.com>  Thu, 02 Apr 2020 13:47:54 +1300
+
+gnome-control-center (1:3.36.1-1ubuntu2) focal; urgency=medium
+
+  [ Robert Ancell ]
+  * debian/patches/ubuntu-scaling-option.patch:
+    - display: Allow fractional scaling to be enabled (lp: #1868019)
+
+ -- Sebastien Bacher <seb128@ubuntu.com>  Tue, 31 Mar 2020 11:31:20 +0200
+
+gnome-control-center (1:3.36.1-1ubuntu1) focal; urgency=medium
+
+  * New upstream version
+
+ -- Sebastien Bacher <seb128@ubuntu.com>  Fri, 27 Mar 2020 10:27:03 +0100
+
 gnome-control-center (1:3.36.1-1) unstable; urgency=medium
 
   * New upstream release
@@ -480,6 +1390,34 @@ gnome-control-center (1:3.36.0-1) unstab
 
  -- Laurent Bigonville <bigon@debian.org>  Tue, 10 Mar 2020 19:17:55 +0100
 
+gnome-control-center (1:3.36.0-0ubuntu3) focal; urgency=medium
+
+  * debian/patches/0023-sound-Add-a-button-to-select-the-default-theme.patch
+    - Make able to restore sound theme to default (LP: #1753070)
+
+ -- Robert Ancell <robert.ancell@canonical.com>  Thu, 19 Mar 2020 16:50:02 +1300
+
+gnome-control-center (1:3.36.0-0ubuntu2) focal; urgency=medium
+
+  * debian/patches/0008-Allow-tweaking-some-settings-for-Ubuntu-Dock.patch:
+    - Only show appearance panel in Ubuntu session (LP: #1866618)
+
+ -- Robert Ancell <robert.ancell@canonical.com>  Tue, 10 Mar 2020 12:47:02 +1300
+
+gnome-control-center (1:3.36.0-0ubuntu1) focal; urgency=medium
+
+  * New upstream release
+  * debian/patches/0008-Allow-tweaking-some-settings-for-Ubuntu-Dock.patch:
+    - Fix crash when theme changed to unknown value (LP: #1866246)
+
+ -- Robert Ancell <robert.ancell@canonical.com>  Tue, 10 Mar 2020 11:55:07 +1300
+
+gnome-control-center (1:3.35.92-1ubuntu1) focal; urgency=medium
+
+  * New upstream version
+
+ -- Sebastien Bacher <seb128@ubuntu.com>  Wed, 04 Mar 2020 15:02:08 +0100
+
 gnome-control-center (1:3.35.92-1) experimental; urgency=medium
 
   * New upstream version, update based on Ubuntu
@@ -494,6 +1432,42 @@ gnome-control-center (1:3.35.92-1) exper
 
  -- Sebastien Bacher <seb128@ubuntu.com>  Wed, 04 Mar 2020 12:18:35 +0100
 
+gnome-control-center (1:3.35.91-0ubuntu3) focal; urgency=medium
+
+  * debian/patches/0003-info-overview-Use-the-Ubuntu-logo-prominently.patch:
+    - Fix Ubuntu logo not showing in about panel (LP: #1864577)
+
+ -- Robert Ancell <robert.ancell@canonical.com>  Tue, 03 Mar 2020 13:55:58 +0100
+
+gnome-control-center (1:3.35.91-0ubuntu2) focal; urgency=medium
+
+  * debian/patches/0008-Allow-tweaking-some-settings-for-Ubuntu-Dock.patch:
+    - Add theme selector to Ubuntu settings panel
+
+ -- Robert Ancell <robert.ancell@canonical.com>  Tue, 25 Feb 2020 11:19:28 +1300
+
+gnome-control-center (1:3.35.91-0ubuntu1) focal; urgency=medium
+
+  * New upstream release
+
+ -- Robert Ancell <robert.ancell@canonical.com>  Tue, 18 Feb 2020 15:41:59 +1300
+
+gnome-control-center (1:3.35.90-0ubuntu1) focal; urgency=medium
+
+  * New upstream release
+  * debian/control:
+    - Set minimum version for libgudev-1.0-dev
+
+ -- Robert Ancell <robert.ancell@canonical.com>  Mon, 03 Feb 2020 14:30:26 +1300
+
+gnome-control-center (1:3.35.2-0ubuntu1) focal; urgency=medium
+
+  * New upstream release
+  * debian/rules:
+    - Build with -Dprivileged_group=sudo
+
+ -- Robert Ancell <robert.ancell@canonical.com>  Fri, 31 Jan 2020 15:33:30 +1300
+
 gnome-control-center (1:3.34.4-1) unstable; urgency=medium
 
   * Team upload
@@ -524,6 +1498,78 @@ gnome-control-center (1:3.34.2-1) unstab
 
  -- Simon McVittie <smcv@debian.org>  Tue, 10 Dec 2019 12:24:48 +0000
 
+gnome-control-center (1:3.34.1-1ubuntu2) eoan; urgency=medium
+
+  * debian/patches/gitlab_background_segfault.patch:
+    - patch from Robert Ancell to fix a segfault in the background panel
+      (lp: #1847103)
+
+ -- Sebastien Bacher <seb128@ubuntu.com>  Tue, 15 Oct 2019 17:52:51 +0200
+
+gnome-control-center (1:3.34.1-1ubuntu1) eoan; urgency=medium
+
+  * Merge with debian unstable. Remaining changes:
+    + debian/control.in:
+      - Depend on language-selector-gnome and whoopsie-preferences
+      - Depend on instead of Recommend system-config-printer
+      - Recommend ibus and ubuntu-system-service
+      - Suggest instead of Recommend gnome-user-share, realmd and rygel
+      - Build-Depend on dh-migrations and libwhoopsie-preferences-dev
+      - Don't recommend libnss-myhostname since systemd-resolved handles this
+        functionality
+      - Bump dep on g-s-d and schema
+    + Split gnome-control-center-faces to a separate package so that it can be
+      used by unity-control-center & recommend this
+    + Install apport hook
+    + debian/gnome-control-center-data.install:
+      - Don't install gnome-control-center.pkla since we use
+        policykit-desktop-privileges instead
+      - Install additional assets used by unity-control-center
+    + debian/ubuntu-logo-icon.png, debian/source/include-binaries,
+      debian/gnome-control-center-data.install: Include an Ubuntu logo
+    + debian/gnome-control-center-data.links:
+      - Link audio-speaker-center* to audio-speaker-mono* so that an
+        icon is shown in the test speaker panel.
+    + debian/rules: Enable whoospie integration
+    + Add migration script to transition from old user settings to new one.
+    + debian/patches:
+      - 52_region_language.patch:
+         Adapt region panel to use Ubuntu style regions
+      - 64_restore_terminal_keyboard_shortcut.patch
+         Bring back terminal shortcut
+      - 70_allow_sound_above_100.patch:
+         Allow setting volume above 100% in the Ubuntu session
+      - 71_ubuntu_dock_settings.patch
+         Add Dock panel for Ubuntu session
+      - 99_add_lock-on-suspend.patch
+         Add option to lock on suspend
+      - auto_quit_after_goa_add.patch
+         Hide window after adding an online account from another app.
+      - connectivity-switch.patch
+         Add Connectivity Checking switch to Privacy panel
+      - privacy-panel-whoopsie.patch
+         Support Ubuntu's whoopsie service in the Privacy panel
+      - ubuntu-default-height.patch:
+         Ensure all items fit in sidebar without scrolling with Yaru theme
+      - ubuntu-language-support.patch
+         Add Language Support button to Region & Language panel to work around
+      - ubuntu-legacy-notifications.patch
+         Ubuntu ships compatibility names for .desktop that got renamed
+         upstream, those use NoDisplay but the panel doesn't respect that key,
+         skip known buggy entries for file-roller and nautilus
+      - ubuntu-printer-support.patch
+         Add Advanced Printer Settings button to work around missing printer
+         sharing feature
+      - ubuntu-region-langpack-install.patch:
+         Check for missing language packs when loading region panel to pull
+         in packs that aren't included with the installer
+      - ubuntu-region-packagekit.patch
+         Fix detection of installed language packs
+  * debian/patches/online_accounts_segfault.patch:
+    - removed, the issue is fixed in the new version
+
+ -- Sebastien Bacher <seb128@ubuntu.com>  Mon, 07 Oct 2019 17:26:09 +0200
+
 gnome-control-center (1:3.34.1-1) unstable; urgency=medium
 
   * New upstream release
@@ -545,6 +1591,75 @@ gnome-control-center (1:3.34.0.1-1) expe
 
  -- Iain Lane <laney@debian.org>  Mon, 09 Sep 2019 17:11:55 +0100
 
+gnome-control-center (1:3.33.90-1ubuntu2) eoan; urgency=medium
+
+  * debian/control.in:
+    - restore rygel to a recommends since the MIR got review now
+
+ -- Sebastien Bacher <seb128@ubuntu.com>  Thu, 22 Aug 2019 17:37:01 +0200
+
+gnome-control-center (1:3.33.90-1ubuntu1) eoan; urgency=medium
+
+  * Merge with debian unstable. Remaining changes:
+    + debian/control.in:
+      - Depend on language-selector-gnome and whoopsie-preferences
+      - Depend on instead of Recommend system-config-printer
+      - Recommend ibus and ubuntu-system-service
+      - Suggest instead of Recommend gnome-user-share, realmd and rygel
+      - Build-Depend on dh-migrations and libwhoopsie-preferences-dev
+      - Don't recommend libnss-myhostname since systemd-resolved handles this
+        functionality
+      - Bump dep on g-s-d and schema
+    + Split gnome-control-center-faces to a separate package so that it can be
+      used by unity-control-center & recommend this
+    + Install apport hook
+    + debian/gnome-control-center-data.install:
+      - Don't install gnome-control-center.pkla since we use
+        policykit-desktop-privileges instead
+      - Install additional assets used by unity-control-center
+    + debian/ubuntu-logo-icon.png, debian/source/include-binaries,
+      debian/gnome-control-center-data.install: Include an Ubuntu logo
+    + debian/gnome-control-center-data.links:
+      - Link audio-speaker-center* to audio-speaker-mono* so that an
+        icon is shown in the test speaker panel.
+    + debian/rules: Enable whoospie integration
+    + Add migration script to transition from old user settings to new one.
+    + debian/patches:
+      - 52_region_language.patch:
+         Adapt region panel to use Ubuntu style regions
+      - 64_restore_terminal_keyboard_shortcut.patch
+         Bring back terminal shortcut
+      - 70_allow_sound_above_100.patch:
+         Allow setting volume above 100% in the Ubuntu session
+      - 71_ubuntu_dock_settings.patch
+         Add Dock panel for Ubuntu session
+      - 99_add_lock-on-suspend.patch
+         Add option to lock on suspend
+      - auto_quit_after_goa_add.patch
+         Hide window after adding an online account from another app.
+      - connectivity-switch.patch
+         Add Connectivity Checking switch to Privacy panel
+      - privacy-panel-whoopsie.patch
+         Support Ubuntu's whoopsie service in the Privacy panel
+      - ubuntu-default-height.patch:
+         Ensure all items fit in sidebar without scrolling with Yaru theme
+      - ubuntu-language-support.patch
+         Add Language Support button to Region & Language panel to work around
+      - ubuntu-legacy-notifications.patch
+         Ubuntu ships compatibility names for .desktop that got renamed
+         upstream, those use NoDisplay but the panel doesn't respect that key,
+         skip known buggy entries for file-roller and nautilus
+      - ubuntu-printer-support.patch
+         Add Advanced Printer Settings button to work around missing printer
+         sharing feature
+      - ubuntu-region-langpack-install.patch:
+         Check for missing language packs when loading region panel to pull
+         in packs that aren't included with the installer
+      - ubuntu-region-packagekit.patch
+         Fix detection of installed language packs
+
+ -- Iain Lane <iain.lane@canonical.com>  Mon, 19 Aug 2019 17:10:39 +0100
+
 gnome-control-center (1:3.33.90-1) experimental; urgency=medium
 
   [ Laurent Bigonville ]
@@ -579,18 +1694,170 @@ gnome-control-center (1:3.33.90-1) exper
 
  -- Iain Lane <laney@debian.org>  Mon, 19 Aug 2019 15:21:34 +0100
 
+gnome-control-center (1:3.32.2-1ubuntu5) eoan; urgency=medium
+
+  * Rebuild for new gnome-desktop soname version
+
+ -- Sebastien Bacher <seb128@ubuntu.com>  Mon, 19 Aug 2019 16:37:40 +0200
+
+gnome-control-center (1:3.32.2-1ubuntu4) eoan; urgency=medium
+
+  * Patch fixing:
+    - Upstreamed changes broken out to git_locale_modifiers.patch
+    - 52_region_language.patch modified accordingly and the description
+      somewhat updated.
+
+ -- Gunnar Hjalmarsson <gunnarhj@ubuntu.com>  Mon, 22 Jul 2019 23:08:00 +0200
+
+gnome-control-center (1:3.32.2-1ubuntu3) eoan; urgency=medium
+
+  * debian/patches/52_region_language.patch:
+    - Enable translation of locale modifiers shown in the language
+      list.
+  * debian/control, debian/control.in:
+    - Bump version of the libgnome-desktop-3-dev build dependency due
+      to use of a new gnome_get_translated_modifier() function.
+
+ -- Gunnar Hjalmarsson <gunnarhj@ubuntu.com>  Sat, 13 Jul 2019 21:09:00 +0200
+
+gnome-control-center (1:3.32.2-1ubuntu2) eoan; urgency=medium
+
+  * Restore revision 1:3.32.1-1ubuntu5 discarded by error
+
+ -- Sebastien Bacher <seb128@ubuntu.com>  Wed, 29 May 2019 12:50:31 +0200
+
+gnome-control-center (1:3.32.2-1ubuntu1) eoan; urgency=medium
+
+  * New upstream stable version, based on the Debian update (lp: #1830884)
+    - Fix crash if a monitor has no preferred mode (lp: #1820861)
+    - Set correct sleep value for the 90 minutes choice (lp: #1827346)
+  * d/p/git_nightlight_translations.patch,
+    d/p/0001-region-Fix-input-source-options-not-being-applied.patch:
+    - remove those patches, the changes are in the new version
+
+ -- Sebastien Bacher <seb128@ubuntu.com>  Wed, 29 May 2019 12:43:47 +0200
+
 gnome-control-center (1:3.32.2-1) experimental; urgency=medium
 
   * New upstream release
 
  -- Sebastien Bacher <seb128@ubuntu.com>  Wed, 29 May 2019 12:27:36 +0200
 
+gnome-control-center (1:3.32.1-1ubuntu5) eoan; urgency=medium
+
+  * debian/patches/52_region_language.patch:
+    Fix languages whose locale includes a modifier (LP: #1823778):
+    - Make language labels include modifiers when present
+    - Don't drop possible modifier when setting language
+
+ -- Gunnar Hjalmarsson <gunnarhj@ubuntu.com>  Mon, 29 Apr 2019 13:23:29 +0100
+
+gnome-control-center (1:3.32.1-1ubuntu4) disco; urgency=medium
+
+  * debian/patches/git_nightlight_translations.patch:
+    - define some strings in the night light dialog as translatable
+
+  [ Gunnar Hjalmarsson ]
+  * debian/patches/series:
+    - Disable ubuntu-region-langpack-install.patch (partially fixes
+      LP: #1823778).
+
+  [ Iain Lane ]
+  * Fix mismerged ubuntu-language-support patch.  The UI was put in the wrong
+    place in the .ui file, where it didn't show up.
+  * debian/patches/info-use-UDisks-to-retrieve-disk-size.patch: Drop.
+    This is upstream and no longer in the patch series.
+
+ -- Sebastien Bacher <seb128@ubuntu.com>  Fri, 12 Apr 2019 16:20:42 +0200
+
+gnome-control-center (1:3.32.1-1ubuntu3) disco; urgency=medium
+
+  * debian/patches/0001-region-Fix-input-source-options-not-being-applied.patch:
+    - Fix input sources per-window setting not being applied (LP: #1822775)
+
+ -- Robert Ancell <robert.ancell@canonical.com>  Tue, 09 Apr 2019 14:27:07 +1200
+
+gnome-control-center (1:3.32.1-1ubuntu2) disco; urgency=medium
+
+  * debian/patches/ubuntu_privacy_hide_buggy_controls.patch:
+    - don't list non working camera/microphones items in the privacy
+      settings, those have been added this cycle but are not working
+
+  [ Marco Trevisan (Treviño) ]
+  * debian/patches/display-Support-UI-scaled-logical-monitor-mode.patch:
+    - Take care of global UI scaled logical monitors width (LP: #1823488)
+
+ -- Sebastien Bacher <seb128@ubuntu.com>  Mon, 08 Apr 2019 15:32:37 +0200
+
+gnome-control-center (1:3.32.1-1ubuntu1) disco; urgency=medium
+
+  * New upstream stable version, based on the Debian update
+    - Only show Bluetooth devices in Bluetooth section (lp: #1785311)
+  * Remove the patches included in the new version
+
+ -- Sebastien Bacher <seb128@ubuntu.com>  Fri, 05 Apr 2019 23:01:07 +0200
+
 gnome-control-center (1:3.32.1-1) experimental; urgency=medium
 
   * New upstream release
 
  -- Sebastien Bacher <seb128@ubuntu.com>  Wed, 03 Apr 2019 18:25:00 +0200
 
+gnome-control-center (1:3.32.0.1-1ubuntu6) disco; urgency=medium
+
+  * debian/patches/display-Don-t-always-set-the-primary-monitor-to-the-first.patch:
+    - Make sure the display panel primary monitor matches configured one
+  * debian/patches/display-Support-UI-scaled-logical-monitor-mode.patch:
+    - Support scaled logical monitors using UI scale as it could happen when
+      using the X11 Randr scaling (LP: #1820850)
+
+ -- Marco Trevisan (Treviño) <marco@ubuntu.com>  Wed, 27 Mar 2019 06:10:59 +0100
+
+gnome-control-center (1:3.32.0.1-1ubuntu5) disco; urgency=medium
+
+  * debian/patches/0001-sound-Fix-crash-when-sound-device-set-to-NULL.patch:
+    - Fix crash introduced in previous fix
+
+ -- Robert Ancell <robert.ancell@canonical.com>  Thu, 14 Mar 2019 11:31:22 +1300
+
+gnome-control-center (1:3.32.0.1-1ubuntu4) disco; urgency=medium
+
+  * debian/patches/0001-sound-Apply-device-changes.patch:
+    - Fix sound output device change not being applied (LP: #1817338)
+
+ -- Robert Ancell <robert.ancell@canonical.com>  Thu, 14 Mar 2019 11:05:45 +1300
+
+gnome-control-center (1:3.32.0.1-1ubuntu3) disco; urgency=medium
+
+  * debian/control:
+    - Add libsnapd-glib-deb to build-depends
+
+ -- Robert Ancell <robert.ancell@canonical.com>  Wed, 13 Mar 2019 16:41:46 +1300
+
+gnome-control-center (1:3.32.0.1-1ubuntu2) disco; urgency=medium
+
+  * debian/rules:
+  * debian/patches/0001-applications-Fix-wrong-IDs-being-passed-to-portal-pe.patch:
+  * debian/patches/0002-applications-Add-missing-whitespace.patch:
+  * debian/patches/0003-applications-Fix-builtin-permissions-showing-when-no.patch:
+  * debian/patches/0004-applications-Rename-functions-as-portal-permssions-a.patch:
+  * debian/patches/0005-applications-Show-portal-permissions-for-snaps.patch:
+  * debian/patches/0006-applications-Show-snap-app-sizes.patch:
+  * debian/patches/0007-applications-Show-snap-interface-controls.patch:
+  * debian/patches/0008-applications-Add-hack-detect-snaps-before-X-SnapInst.patch:
+    - Show snap information on applications page (LP: #1819788)
+
+ -- Robert Ancell <robert.ancell@canonical.com>  Wed, 13 Mar 2019 11:03:01 +1300
+
+gnome-control-center (1:3.32.0.1-1ubuntu1) disco; urgency=medium
+
+  * New upstream version
+    - Correctly select "single" mode when opening display panel
+      (lp: #1818751)
+  * Remove the patches included in the new version
+
+ -- Sebastien Bacher <seb128@ubuntu.com>  Tue, 12 Mar 2019 11:08:37 +0100
+
 gnome-control-center (1:3.32.0.1-1) experimental; urgency=medium
 
   * New upstream release
@@ -611,6 +1878,78 @@ gnome-control-center (1:3.31.92-2) exper
 
  -- Sebastien Bacher <seb128@ubuntu.com>  Wed, 06 Mar 2019 16:05:01 +0100
 
+gnome-control-center (1:3.31.92-1ubuntu1) disco; urgency=medium
+
+  * New version includes:
+    - Revert making Settings responsive; it needs more polish to reach the
+      quality we want (lp: #1817509, #1817425)
+  * debian/patches/online_accounts_segfault.patch:
+    don't segfault when calling the online account panel with add provider,
+    thanks Andrea Azzarone
+  * Merge with debian unstable. Remaining changes:
+    + debian/control.in:
+      - Depend on language-selector-gnome and whoopsie-preferences
+      - Depend on instead of Recommend system-config-printer
+      - Recommend ibus and ubuntu-system-service
+      - Suggest instead of Recommend gnome-user-share, realmd and rygel
+      - Build-Depend on dh-migrations and libwhoopsie-preferences-dev
+      - Don't recommend libnss-myhostname since systemd-resolved handles this
+        functionality
+      - Bump dep on g-s-d and schema
+    + Split gnome-control-center-faces to a separate package so that it can be
+      used by unity-control-center & recommend this
+    + Install apport hook
+    + debian/gnome-control-center-data.install:
+      - Don't install gnome-control-center.pkla since we use
+        policykit-desktop-privileges instead
+      - Install additional assets used by unity-control-center
+    + debian/ubuntu-logo-icon.png, debian/source/include-binaries,
+      debian/gnome-control-center-data.install: Include an Ubuntu logo
+    + debian/gnome-control-center-data.links:
+      - Link audio-speaker-center* to audio-speaker-mono* so that an
+        icon is shown in the test speaker panel.
+    + debian/rules: Enable whoospie integration
+    + Add migration script to transition from old user settings to new one.
+    + debian/patches:
+      - 52_region_language.patch:
+         Adapt region panel to use Ubuntu style regions
+      - 64_restore_terminal_keyboard_shortcut.patch
+         Bring back terminal shortcut
+      - 70_allow_sound_above_100.patch:
+         Allow setting volume above 100% in the Ubuntu session
+      - 71_ubuntu_dock_settings.patch
+         Add Dock panel for Ubuntu session
+      - 99_add_lock-on-suspend.patch
+         Add option to lock on suspend
+      - auto_quit_after_goa_add.patch
+         Hide window after adding an online account from another app.
+      - connectivity-switch.patch
+         Add Connectivity Checking switch to Privacy panel
+      - privacy-panel-whoopsie.patch
+         Support Ubuntu's whoopsie service in the Privacy panel
+      - ubuntu-default-height.patch:
+         Ensure all items fit in sidebar without scrolling with Yaru theme
+      - ubuntu-language-support.patch
+         Add Language Support button to Region & Language panel to work around
+      - ubuntu-legacy-notifications.patch
+         Ubuntu ships compatibility names for .desktop that got renamed
+         upstream, those use NoDisplay but the panel doesn't respect that key,
+         skip known buggy entries for file-roller and nautilus
+      - ubuntu-printer-support.patch
+         Add Advanced Printer Settings button to work around missing printer
+         sharing feature
+      - ubuntu-region-langpack-install.patch:
+         Check for missing language packs when loading region panel to pull
+         in packs that aren't included with the installer
+      - ubuntu-region-packagekit.patch
+         Fix detection of installed language packs
+  * debian/control.in: Don't depend on desktop-base
+  * Modify distro-logo.patch: Use Ubuntu logo
+  * Refresh patches
+  * Fix 99_add_lock-on-suspend so that the switch actually shows up
+
+ -- Sebastien Bacher <seb128@ubuntu.com>  Wed, 06 Mar 2019 15:45:06 +0100
+
 gnome-control-center (1:3.31.92-1) experimental; urgency=medium
 
   * New upstream release
@@ -635,6 +1974,79 @@ gnome-control-center (1:3.30.2-5) unstab
 
  -- Jeremy Bicha <jbicha@debian.org>  Wed, 06 Feb 2019 20:39:07 -0500
 
+gnome-control-center (1:3.30.2-4ubuntu2) disco; urgency=medium
+
+  * debian/patches/71_ubuntu_dock_settings.patch,
+    debian/patches/ubuntu-default-height.patch:
+    - change the default height so all category are on screen,
+      we previously increased the value in the dock patch since we add an
+      entry there but that's not enough so let's split that part now
+      (lp: #1728450)
+
+ -- Sebastien Bacher <seb128@ubuntu.com>  Thu, 31 Jan 2019 15:10:30 +0100
+
+gnome-control-center (1:3.30.2-4ubuntu1) disco; urgency=medium
+
+  * Merge with debian unstable. Remaining changes:
+    + debian/control.in:
+      - Depend on language-selector-gnome and whoopsie-preferences
+      - Depend on instead of Recommend system-config-printer
+      - Recommend ibus and ubuntu-system-service
+      - Suggest instead of Recommend gnome-user-share, realmd and rygel
+      - Build-Depend on dh-migrations and libwhoopsie-preferences-dev
+      - Don't recommend libnss-myhostname since systemd-resolved handles this
+        functionality
+      - Bump dep on g-s-d and schema
+    + Split gnome-control-center-faces to a separate package so that it can be
+      used by unity-control-center & recommend this
+    + Install apport hook
+    + debian/gnome-control-center-data.install:
+      - Don't install gnome-control-center.pkla since we use
+        policykit-desktop-privileges instead
+      - Install additional assets used by unity-control-center
+    + debian/ubuntu-logo-icon.png, debian/source/include-binaries,
+      debian/gnome-control-center-data.install: Include an Ubuntu logo
+    + debian/gnome-control-center-data.links:
+      - Link audio-speaker-center* to audio-speaker-mono* so that an
+        icon is shown in the test speaker panel.
+    + debian/rules: Enable whoospie integration
+    + Add migration script to transition from old user settings to new one.
+    + debian/patches:
+      - 52_region_language.patch:
+         Adapt region panel to use Ubuntu style regions
+      - 64_restore_terminal_keyboard_shortcut.patch
+         Bring back terminal shortcut
+      - 70_allow_sound_above_100.patch:
+         Allow setting volume above 100% in the Ubuntu session
+      - 71_ubuntu_dock_settings.patch
+         Add Dock panel for Ubuntu session
+      - 99_add_lock-on-suspend.patch
+         Add option to lock on suspend
+      - auto_quit_after_goa_add.patch
+         Hide window after adding an online account from another app.
+      - connectivity-switch.patch
+         Add Connectivity Checking switch to Privacy panel
+      - distro-logo.patch:
+         Add Ubuntu branding to Details panel
+      - privacy-panel-whoopsie.patch
+         Support Ubuntu's whoopsie service in the Privacy panel
+      - ubuntu-language-support.patch
+         Add Language Support button to Region & Language panel to work around
+      - ubuntu-legacy-notifications.patch
+         Ubuntu ships compatibility names for .desktop that got renamed
+         upstream, those use NoDisplay but the panel doesn't respect that key,
+         skip known buggy entries for file-roller and nautilus
+      - ubuntu-printer-support.patch
+         Add Advanced Printer Settings button to work around missing printer
+         sharing feature
+      - ubuntu-region-langpack-install.patch:
+         Check for missing language packs when loading region panel to pull
+         in packs that aren't included with the installer
+      - ubuntu-region-packagekit.patch
+         Fix detection of installed language packs
+
+ -- Iain Lane <iain.lane@canonical.com>  Fri, 25 Jan 2019 14:02:27 +0000
+
 gnome-control-center (1:3.30.2-4) unstable; urgency=medium
 
   * debian/patches/power-Label-the-PENDING_CHARGING-state-as-Not-Charging.patch:
@@ -642,6 +2054,68 @@ gnome-control-center (1:3.30.2-4) unstab
 
  -- Marco Trevisan (Treviño) <marco@ubuntu.com>  Fri, 25 Jan 2019 12:39:58 +0000
 
+gnome-control-center (1:3.30.2-3ubuntu1) disco; urgency=medium
+
+  * Merge with debian unstable. Remaining changes:
+    + debian/control.in:
+      - Depend on language-selector-gnome and whoopsie-preferences
+      - Depend on instead of Recommend system-config-printer
+      - Recommend ibus and ubuntu-system-service
+      - Suggest instead of Recommend gnome-user-share, realmd and rygel
+      - Build-Depend on dh-migrations and libwhoopsie-preferences-dev
+      - Don't recommend libnss-myhostname since systemd-resolved handles this
+        functionality
+      - Bump dep on g-s-d and schema
+    + Split gnome-control-center-faces to a separate package so that it can be
+      used by unity-control-center & recommend this
+    + Install apport hook
+    + debian/gnome-control-center-data.install:
+      - Don't install gnome-control-center.pkla since we use
+        policykit-desktop-privileges instead
+      - Install additional assets used by unity-control-center
+    + debian/ubuntu-logo-icon.png, debian/source/include-binaries,
+      debian/gnome-control-center-data.install: Include an Ubuntu logo
+    + debian/gnome-control-center-data.links:
+      - Link audio-speaker-center* to audio-speaker-mono* so that an
+        icon is shown in the test speaker panel.
+    + debian/rules: Enable whoospie integration
+    + Add migration script to transition from old user settings to new one.
+    + debian/patches:
+      - 52_region_language.patch:
+         Adapt region panel to use Ubuntu style regions
+      - 64_restore_terminal_keyboard_shortcut.patch
+         Bring back terminal shortcut
+      - 70_allow_sound_above_100.patch:
+         Allow setting volume above 100% in the Ubuntu session
+      - 71_ubuntu_dock_settings.patch
+         Add Dock panel for Ubuntu session
+      - 99_add_lock-on-suspend.patch
+         Add option to lock on suspend
+      - auto_quit_after_goa_add.patch
+         Hide window after adding an online account from another app.
+      - connectivity-switch.patch
+         Add Connectivity Checking switch to Privacy panel
+      - distro-logo.patch:
+         Add Ubuntu branding to Details panel
+      - privacy-panel-whoopsie.patch
+         Support Ubuntu's whoopsie service in the Privacy panel
+      - ubuntu-language-support.patch
+         Add Language Support button to Region & Language panel to work around
+      - ubuntu-legacy-notifications.patch
+         Ubuntu ships compatibility names for .desktop that got renamed
+         upstream, those use NoDisplay but the panel doesn't respect that key,
+         skip known buggy entries for file-roller and nautilus
+      - ubuntu-printer-support.patch
+         Add Advanced Printer Settings button to work around missing printer
+         sharing feature
+      - ubuntu-region-langpack-install.patch:
+         Check for missing language packs when loading region panel to pull
+         in packs that aren't included with the installer
+      - ubuntu-region-packagekit.patch
+         Fix detection of installed language packs
+
+ -- Iain Lane <iain.lane@canonical.com>  Mon, 14 Jan 2019 16:35:53 +0000
+
 gnome-control-center (1:3.30.2-3) unstable; urgency=medium
 
   * Cherry-pick 8 commits to improve accessibility
@@ -658,6 +2132,75 @@ gnome-control-center (1:3.30.2-2) unstab
 
  -- Jeremy Bicha <jbicha@debian.org>  Sun, 23 Dec 2018 11:17:33 -0500
 
+gnome-control-center (1:3.30.2-1ubuntu1) disco; urgency=medium
+
+  * Merge with debian unstable (LP: #1802313). Remaining changes:
+    + debian/control.in:
+      - Depend on language-selector-gnome and whoopsie-preferences
+      - Depend on instead of Recommend system-config-printer
+      - Recommend ibus and ubuntu-system-service
+      - Suggest instead of Recommend gnome-user-share, realmd and rygel
+      - Build-Depend on dh-migrations and libwhoopsie-preferences-dev
+      - Don't recommend libnss-myhostname since systemd-resolved handles this
+        functionality
+      - Bump dep on g-s-d and schema
+    + Split gnome-control-center-faces to a separate package so that it can be
+      used by unity-control-center & recommend this
+    + Install apport hook
+    + debian/gnome-control-center-data.install:
+      - Don't install gnome-control-center.pkla since we use
+        policykit-desktop-privileges instead
+      - Install additional assets used by unity-control-center
+    + debian/ubuntu-logo-icon.png, debian/source/include-binaries,
+      debian/gnome-control-center-data.install: Include an Ubuntu logo
+    + debian/gnome-control-center-data.links:
+      - Link audio-speaker-center* to audio-speaker-mono* so that an
+        icon is shown in the test speaker panel.
+    + debian/rules: Enable whoospie integration
+    + Add migration script to transition from old user settings to new one.
+    + debian/patches:
+      - 52_region_language.patch:
+         Adapt region panel to use Ubuntu style regions
+      - 64_restore_terminal_keyboard_shortcut.patch
+         Bring back terminal shortcut
+      - 70_allow_sound_above_100.patch:
+         Allow setting volume above 100% in the Ubuntu session
+      - 71_ubuntu_dock_settings.patch
+         Add Dock panel for Ubuntu session
+      - 99_add_lock-on-suspend.patch
+         Add option to lock on suspend
+      - auto_quit_after_goa_add.patch
+         Hide window after adding an online account from another app.
+      - connectivity-switch.patch
+         Add Connectivity Checking switch to Privacy panel
+      - distro-logo.patch:
+         Add Ubuntu branding to Details panel
+      - privacy-panel-whoopsie.patch
+         Support Ubuntu's whoopsie service in the Privacy panel
+      - ubuntu-language-support.patch
+         Add Language Support button to Region & Language panel to work around
+      - ubuntu-legacy-notifications.patch
+         Ubuntu ships compatibility names for .desktop that got renamed
+         upstream, those use NoDisplay but the panel doesn't respect that key,
+         skip known buggy entries for file-roller and nautilus
+      - ubuntu-printer-support.patch
+         Add Advanced Printer Settings button to work around missing printer
+         sharing feature
+      - ubuntu-region-langpack-install.patch:
+         Check for missing language packs when loading region panel to pull
+         in packs that aren't included with the installer
+      - ubuntu-region-packagekit.patch
+         Fix detection of installed language packs
+  * debian/patches:
+    + 08_lowercase_user_names.patch: Drop because an alternative fix is included
+      in Debian.
+    + d/p/region-Fix-double-free-when-closing-the-input-chooser-dia.patch: Drop
+      because applied upstream.
+    + Patches have been round-tripped through gbp-pq and all rebased on the new
+      version - that's why their metadata has changed.
+
+ -- Andrea Azzarone <andrea.azzarone@canonical.com>  Fri, 09 Nov 2018 18:05:32 +0000
+
 gnome-control-center (1:3.30.2-1) unstable; urgency=medium
 
   * d/p/Debian-s-adduser-doesn-t-allow-uppercase-letters-by-defau.patch:
@@ -670,6 +2213,83 @@ gnome-control-center (1:3.30.2-1) unstab
 
  -- Andrea Azzarone <andrea.azzarone@canonical.com>  Thu, 08 Nov 2018 12:55:32 +0000
 
+gnome-control-center (1:3.30.1-1ubuntu2) cosmic; urgency=medium
+
+  * d/p/region-Fix-double-free-when-closing-the-input-chooser-dia.patch:
+    - Cherry pick upstream segfault fix for the region settings
+
+  [ Andrea Azzarone ]
+  * d/p/privacy-panel-whoopsie.patch: Unref the whoopsie proxy (LP: #1796872)
+
+ -- Sebastien Bacher <seb128@ubuntu.com>  Wed, 10 Oct 2018 16:28:01 +0200
+
+gnome-control-center (1:3.30.1-1ubuntu1) cosmic; urgency=medium
+
+  * Merge with debian unstable (LP: #1795460)
+    Remaining changes:
+    + debian/control.in:
+      - Depend on language-selector-gnome and whoopsie-preferences
+      - Depend on instead of Recommend system-config-printer
+      - Recommend ibus and ubuntu-system-service
+      - Suggest instead of Recommend gnome-user-share, realmd and rygel
+      - Build-Depend on dh-migrations and libwhoopsie-preferences-dev
+      - Don't recommend libnss-myhostname since systemd-resolved handles this
+        functionality
+      - Bump dep on g-s-d and schema
+    + Split gnome-control-center-faces to a separate package so that it can be
+      used by unity-control-center & recommend this
+    + Install apport hook
+    + debian/gnome-control-center-data.install:
+      - Don't install gnome-control-center.pkla since we use
+        policykit-desktop-privileges instead
+      - Install additional assets used by unity-control-center
+    + debian/ubuntu-logo-icon.png, debian/source/include-binaries,
+      debian/gnome-control-center-data.install: Include an Ubuntu logo
+    + debian/gnome-control-center-data.links:
+      - Link audio-speaker-center* to audio-speaker-mono* so that an
+        icon is shown in the test speaker panel.
+    + debian/rules: Enable whoospie integration
+    + Add migration script to transition from old user settings to new one.
+    + debian/patches:
+      - 08_lowercase_user_names.patch:
+         Disallow upper-case letters in user names for compliance with adduser
+      - 52_region_language.patch:
+         Adapt region panel to use Ubuntu style regions
+      - 64_restore_terminal_keyboard_shortcut.patch
+         Bring back terminal shortcut
+      - 70_allow_sound_above_100.patch:
+         Allow setting volume above 100% in the Ubuntu session
+      - 71_ubuntu_dock_settings.patch
+         Add Dock panel for Ubuntu session
+      - 99_add_lock-on-suspend.patch
+         Add option to lock on suspend
+      - auto_quit_after_goa_add.patch
+         Hide window after adding an online account from another app.
+      - connectivity-switch.patch
+         Add Connectivity Checking switch to Privacy panel
+      - distro-logo.patch:
+         Add Ubuntu branding to Details panel
+      - privacy-panel-whoopsie.patch
+         Support Ubuntu's whoopsie service in the Privacy panel
+      - ubuntu-language-support.patch
+         Add Language Support button to Region & Language panel to work around
+      - ubuntu-legacy-notifications.patch
+         Ubuntu ships compatibility names for .desktop that got renamed
+         upstream, those use NoDisplay but the panel doesn't respect that key,
+         skip known buggy entries for file-roller and nautilus
+      - ubuntu-printer-support.patch
+         Add Advanced Printer Settings button to work around missing printer
+         sharing feature
+      - ubuntu-region-langpack-install.patch:
+         Check for missing language packs when loading region panel to pull
+         in packs that aren't included with the installer
+      - ubuntu-region-packagekit.patch
+         Fix detection of installed language packs
+  * Patches have been round-tripped through gbp-pq and all rebased on the new
+    version - that's why their metadata has changed.
+
+ -- Andrea Azzarone <andrea.azzarone@canonical.com>  Tue, 02 Oct 2018 18:18:58 +0100
+
 gnome-control-center (1:3.30.1-1) unstable; urgency=medium
 
   * New upstream release
@@ -715,6 +2335,18 @@ gnome-control-center (1:3.30.0-1) experi
 
  -- Simon McVittie <smcv@debian.org>  Wed, 19 Sep 2018 14:55:49 +0100
 
+gnome-control-center (1:3.30.0-0ubuntu1) cosmic; urgency=medium
+
+  * Update to 3.30.0
+
+ -- Didier Roche <didrocks@ubuntu.com>  Tue, 04 Sep 2018 11:34:27 +0200
+
+gnome-control-center (1:3.29.92-1ubuntu1) cosmic; urgency=medium
+
+  * Update to 3.29.92
+
+ -- Sebastien Bacher <seb128@ubuntu.com>  Tue, 28 Aug 2018 10:57:56 +0200
+
 gnome-control-center (1:3.29.92-1) experimental; urgency=medium
 
   * New upstream version
@@ -778,6 +2410,148 @@ gnome-control-center (1:3.29.90-1) exper
 
  -- Simon McVittie <smcv@debian.org>  Sun, 05 Aug 2018 18:18:52 +0100
 
+gnome-control-center (1:3.29.90-1~ubuntu2) cosmic; urgency=medium
+
+  [ Gunnar Hjalmarsson ]
+  * Fix a typo in debian/patches/52_region_language.patch which broke
+    displaying the selected language in the language panell of
+    gnome-control-center (LP: #1786880)
+  * debian/rules:
+    Make use of updated dh_translations; drop workarounds.
+
+ -- Iain Lane <laney@debian.org>  Fri, 24 Aug 2018 11:53:10 +0200
+
+gnome-control-center (1:3.29.90-1~ubuntu1) cosmic; urgency=medium
+
+  [ Iain Lane ]
+  * Merge with unreleased Debian version (LP: #1784396)
+    Remaining changes:
+    + debian/control.in:
+      - Depend on language-selector-gnome and whoopsie-preferences
+      - Depend on instead of Recommend network-manager-gnome and
+        system-config-printer-common
+      - Recommend ibus
+      - Suggest instead of Recommend gnome-user-share, realmd and rygel
+      - Build-Depend on libwhoopsie-preferences-dev
+      - Don't recommend libnss-myhostname since systemd-resolved handles this
+        functionality
+    + Split gnome-control-center-faces to a separate package so
+      that it can be used by unity-control-center & recommend this
+    + Install apport hook
+    + debian/gnome-control-center-data.install:
+      - Don't install gnome-control-center.pkla since we use
+        policykit-desktop-privileges instead
+      - Install additional assets used by unity-control-center
+    * debian/ubuntu-logo-icon.png, debian/source/include-binaries,
+      debian/gnome-control-center-data.install: Include an Ubuntu logo
+    * debian/gnome-control-center-data.links:
+      - Link audio-speaker-center* to audio-speaker-mono* so that an
+        icon is shown in the test speaker panel.
+    + debian/rules: Enable whoospie integration
+    + debian/patches:
+      - 08_lowercase_user_names.patch:
+         Disallow upper-case letters in user names for compliance with adduser
+      - 52_region_language.patch:
+         Adapt region panel to use Ubuntu style regions
+      - 64_restore_terminal_keyboard_shortcut.patch
+         Bring back terminal shortcut
+      - 70_allow_sound_above_100.patch:
+         Allow setting volume above 100% in the Ubuntu session
+      - 71_ubuntu_dock_settings.patch
+         Add Dock panel for Ubuntu session
+      - 99_add_lock-on-suspend.patch
+         Add option to lock on suspend
+      - distro-logo.patch:
+         Add Ubuntu branding to Details panel
+      - ubuntu-region-packagekit.patch
+         fix detection of installed language packs
+      - ubuntu-region-langpack-install.patch:
+         check for missing language packs when loading region panel to pull
+         in packs that arent included with the installer
+      - ubuntu-language-support.patch
+         Add Language Support button to Region & Language panel to
+         work around
+      - ubuntu-printer-support.patch
+         Add Advanced Printer Settings button to work around missing printer
+         sharing feature
+      - ubuntu-legacy-notifications.patch
+         Ubuntu ships compatibility names for .desktop that got renamed
+         upstream, those use NoDisplay but the panel doesn't respect that key,
+         skip known buggy entries for file-roller and nautilus
+      - connectivity-switch.patch
+         Add Connectivity Checking switch to Privacy panel
+      - privacy-panel-whoopsie.patch
+         Support Ubuntu's whoopsie service in the Privacy panel
+      - auto_quit_after_goa_add.patch
+         Hide window after adding an online account from another app.
+  * Patches have been round-tripped through gbp-pq and all rebased on the new
+    version- that's why their metadata has changed.
+
+  [ Didier Roche ]
+  * debian/patches/70_allow_sound_above_100.patch:
+    - switch gsettings key targetting volume above 100% to use now
+      upstream key (schema already in 3.28, but support introduced in
+      g-s-d in 3.29.90.1)
+  * debian/control*:
+    - bump dep on g-s-d and schema
+  * add migration script to transition from old user settings to new one.
+
+ -- Iain Lane <laney@ubuntu.com>  Fri, 03 Aug 2018 11:34:57 +0100
+
+gnome-control-center (1:3.29.90-1) UNRELEASED; urgency=medium
+
+  [ Arnaud Rebillout ]
+  * Team upload
+  * Bump requirement for libgtk-3, libupower-glib and cheese (per meson.build)
+
+  [ Simon McVittie ]
+  * Bump Standards-Version to 4.1.5 (no changes required)
+  * Set Rules-Requires-Root to no
+
+  [ Iain Lane ]
+  * debian/gbp.conf:
+    + Upstream's tags are normal now - remove the commented out
+      upstream-vcs-tag.
+    + Use patch-numbers = False
+  * debian/*: Update for experimental / 3.29 series
+  * New upstream release 3.29.4
+    + Use symbolic icons in Shell search
+    + Introduce Dynamic Panel
+    + Display:
+      - Improve display arrangement widget
+      - Fix a few crashers
+    + Sharing:
+      - Expose Remote Desktop work on Wayland
+    + User Accounts:
+      - Use term "Confirm" instead of "Verify"
+      - Use the same phrase when passwords do not match
+    + Wacom:
+      - Hide when no Wacom devices are connected
+      - Remove deprecated APIs
+    + Wi-Fi:
+      - Hide when no Wi-Fi adapters are available
+    + Power:
+      - Fix showing approximate percentages
+    + Thunderbolt:
+      - Introduce new Thunderbolt panel
+    + User Accounts:
+      - Fix hint for wrong enterprise user/password
+    + Improve logging engine
+    + Add an object caching mechanism
+    + Vastly improve CI
+    + Organize tests
+    + Add Network tests
+  * d/p/Show-scrollbar-on-first-Language-window-if-needed.patch: Drop, applied
+    upstream.
+  * d/p/Expose-touchpad-settings-if-synaptics-is-in-use.patch: Refresh.
+  * debian/control*:
+    + Bump libnm* deps, and add libsecret-1-dev per meson.build.
+    + Add test deps (xvfb, python3-dbusmock, at-spi2-core)
+  * debian/gnome-control-center.docs: Remove AUTHORS, README → README.md
+  * debian/control*: Require gnome-settings-daemon 3.29
+
+ -- Iain Lane <laney@debian.org>  Fri, 27 Jul 2018 16:32:23 +0100
+
 gnome-control-center (1:3.28.2-1) unstable; urgency=medium
 
   * Team upload
@@ -788,6 +2562,17 @@ gnome-control-center (1:3.28.2-1) unstab
 
  -- Simon McVittie <smcv@debian.org>  Wed, 27 Jun 2018 09:18:33 +0100
 
+gnome-control-center (1:3.28.2-0ubuntu1) cosmic; urgency=medium
+
+  * New bugfix version (lp: #1780280)
+  * debian/patches/0006-build-Fix-USER_DIR_MODE-value-in-config.h.patch,
+    debian/patches/0007-fix-open-last-page.patch,
+    debian/patches/only-try-to-select-an-existing-panel-on-startup.patch,
+    git_invalid_dereferencing.patch:
+    - remove, it's included in the new version
+
+ -- Sebastien Bacher <seb128@ubuntu.com>  Thu, 05 Jul 2018 16:52:46 +0200
+
 gnome-control-center (1:3.28.1-1) unstable; urgency=medium
 
   [ Gunnar Hjalmarsson ]
@@ -801,6 +2586,69 @@ gnome-control-center (1:3.28.1-1) unstab
 
  -- Michael Biebl <biebl@debian.org>  Wed, 11 Apr 2018 18:20:17 +0200
 
+gnome-control-center (1:3.28.1-0ubuntu5) cosmic; urgency=medium
+
+  * debian/{gbp.conf,control{,.in}}: Added and updated for Ubuntu
+  * debian/patches/privacy-panel-whoopsie.patch:
+    - display and enable correct section of error reporting mode
+      (never/manual/auto) (LP: #1774597)
+
+ -- Didier Roche <didrocks@ubuntu.com>  Thu, 31 May 2018 17:21:59 +0200
+
+gnome-control-center (1:3.28.1-0ubuntu4) cosmic; urgency=medium
+
+  [ Andrea Azzarone ]
+    * debian/patches/git_invalid_dereferencing.patch:
+    - Avoid dereferencing invalid pointer (lp: #1759468)
+
+ -- Sebastien Bacher <seb128@ubuntu.com>  Fri, 25 May 2018 16:25:16 +0200
+
+gnome-control-center (1:3.28.1-0ubuntu3) cosmic; urgency=medium
+
+  * debian/patches/0001-shell-Don-t-set-per-panel-icon.patch,
+    debian/patches/0002-shell-Icon-name-helper-returns-symbolic-name.patch,
+    debian/patches/0003-thunderbolt-new-panel-for-device-management.patch,
+    debian/patches/0004-thunderbolt-move-to-the-Devices-page.patch:
+    - backport the new upstream "thunderbolt" panel (same patches as fedora
+      is using). Also change to not use per panel icons but just the
+      settings one, that's the right thing to do and avoid issues when
+      some panels like the thunderbolt one don't have a symbolic icon.
+      (lp: #1773378)
+
+  [ Jeremy Bicha ]
+  * Cherry-pick only-try-to-select-an-existing-panel-on-startup.patch:
+    Fix crash when trying to open non-existent panel (LP: #1766799)
+
+ -- Sebastien Bacher <seb128@ubuntu.com>  Fri, 25 May 2018 16:06:18 +0200
+
+gnome-control-center (1:3.28.1-0ubuntu2) cosmic; urgency=medium
+
+  * Rename ubuntu-gnome-version.patch to distro-logo.patch for proposed
+    upstreaming to Debian. Drop the hardcoded use of the Ubuntu font.
+    (LP: #1770473)
+  * debian/control.in:
+    - Drop now unnecessary fonts-ubuntu dependency
+    - Don't recommend libnss-myhostname since systemd-resolved handles this
+      functionality (LP: #1766575)
+    - Demote network-manager-gnome dependency back to recommends
+      (LP: #1770673)
+    - Depend on system-config-printer instead of system-config-printer-common
+      for the Additional Printer Settings button (LP: #1770695)
+  * Add 0007-fix-open-last-page.patch:
+    - Proposed patch fixes the "open last opened page" feature for Devices and
+      Details pages (LP: #1770699)
+
+ -- Jeremy Bicha <jbicha@ubuntu.com>  Fri, 11 May 2018 12:59:17 -0400
+
+gnome-control-center (1:3.28.1-0ubuntu1) bionic; urgency=medium
+
+  * New upstream release (LP: #1764591)
+  * Drop Build-Depends on network-manager-dev, no longer necessary
+  * Cherry-pick 0006-build-Fix-USER_DIR_MODE-value-in-config.h.patch:
+    - Fix file permissions regression introduced in meson conversion
+
+ -- Jeremy Bicha <jbicha@ubuntu.com>  Mon, 16 Apr 2018 21:46:17 -0400
+
 gnome-control-center (1:3.28.0-1) unstable; urgency=medium
 
   [ Simon McVittie ]
@@ -817,6 +2665,152 @@ gnome-control-center (1:3.28.0-1) unstab
 
  -- Jeremy Bicha <jbicha@debian.org>  Sun, 18 Mar 2018 20:14:00 -0400
 
+gnome-control-center (1:3.28.0-0ubuntu6) bionic; urgency=medium
+
+  [ Gunnar Hjalmarsson ]
+  * debian/patches/0005-region-Show-scrollbars-if-needed.patch: Apply to
+    Formats and Input Sources as well. (LP: #1758979)
+
+ -- Iain Lane <iain.lane@canonical.com>  Thu, 29 Mar 2018 17:30:50 +0100
+
+gnome-control-center (1:3.28.0-0ubuntu5) bionic; urgency=medium
+
+  * debian/patches/71_ubuntu_dock_settings.patch:
+    - add context for dock settings where left/right is translated differently
+      to mouse buttons (LP: #1719462).
+
+ -- Didier Roche <didrocks@ubuntu.com>  Wed, 28 Mar 2018 15:27:01 +0200
+
+gnome-control-center (1:3.28.0-0ubuntu4) bionic; urgency=medium
+
+  * debian/patches/ubuntu-printer-support.patch
+    - Connect to the system-config-printer-button{1,2} clicked signals
+      during init rather than in update_sensitivity.  This prevents us
+      from connecting to the signal multiple times. (LP: #1755514)
+
+ -- Ken VanDine <ken.vandine@canonical.com>  Tue, 27 Mar 2018 14:59:55 -0400
+
+gnome-control-center (1:3.28.0-0ubuntu3) bionic; urgency=medium
+
+  * debian/patches/ubuntu-white-lists.patch:
+    - remove patch, this is done in the theme now
+
+ -- Marco Trevisan (Treviño) <marco@ubuntu.com>  Thu, 22 Mar 2018 14:31:51 -0500
+
+gnome-control-center (1:3.28.0-0ubuntu2) bionic; urgency=medium
+
+  [ Gunnar Hjalmarsson ]
+   * debian/patches/52_region_language.patch:
+    - Enable scrollbar in "Language" window when needed (LP: #1727710).
+    - Hide the "Install More..." thing since we can't install languages
+      that way yet.
+
+  [ Iain Lane ]
+  * debian/patches/0005-Show-scrollbar-on-first-Language-window-if-needed.patch:
+    Split out from 52_region_language as forwarded upstream.
+
+ -- Iain Lane <iain.lane@canonical.com>  Mon, 19 Mar 2018 15:34:01 +0000
+
+gnome-control-center (1:3.28.0-0ubuntu1) bionic; urgency=medium
+
+  [ Jeremy Bicha ]
+  * New upstream release
+
+  [ Gunnar Hjalmarsson ]
+  * debian/rules:
+    - Add X-Ubuntu-Gettext-Domain to .desktop files and strip inline
+      translations (LP: #1755473).
+    - Build gnome-control-center-2.0.pot.
+  * Modify 71_ubuntu_dock_settings.patch:
+    - Drop non-existing gnome-ubuntu-panel.desktop.in from POTFILES.in.
+
+  [ Daniel van Vugt ]
+  * Add 0004-Expose-touchpad-settings-if-synaptics-is-in-use.patch
+    - Allow touchpad settings to work with xserver-xorg-input-synaptics
+      Note that this is unneeded on GNOME on Wayland where libinput is
+      always used. (LP: #1686081)
+
+  [ Andrea Azzarone ]
+  * Add auto_quit_after_goa_add.patch:
+    - Hide window after adding an online account from another app.
+      (LP: #1754651)
+
+ -- Jeremy Bicha <jbicha@ubuntu.com>  Mon, 19 Mar 2018 08:37:32 -0400
+
+gnome-control-center (1:3.27.92-1ubuntu1) bionic; urgency=medium
+
+  [ Jeremy Bicha ]
+  * Sync with Debian. (LP: #1750174, LP: #1752928, LP: #1691867)
+    Remaining changes:
+    + debian/control.in:
+      - Depend on fonts-ubuntu, language-selector-gnome, and
+        whoopsie-preferences
+      - Depend on instead of Recommend network-manager-gnome and
+        system-config-printer-common
+      - Recommend ibus, unity-control-center-faces, & ubuntu-system-service
+      - Suggest instead of Recommend realmd and rygel
+      - Build-Depend on libwhoopsie-preferences-dev
+    + Split gnome-control-center-faces to a separate package so
+      that it can be used by unity-control-center
+    + Install apport hook
+    + debian/gnome-control-center-data.install:
+      - Don't install gnome-control-center.pkla since we use
+        policykit-desktop-privileges instead
+      - Install additional assets used by unity-control-center
+    * debian/ubuntu-logo-icon.png, debian/source/include-binaries,
+      debian/gnome-control-center-data.install: Include an Ubuntu logo
+    * debian/gnome-control-center-data.links:
+      - Link audio-speaker-center* to audio-speaker-mono* so that an
+        icon is shown in the test speaker panel. (LP: #1704002)
+    + debian/rules: Enable whoospie integration
+    + debian/patches:
+      - 08_lowercase_user_names.patch:
+         Disallow upper-case letters in user names for compliance with adduser
+      - 52_region_language.patch:
+         Adapt region panel to use Ubuntu style regions
+      - 64_restore_terminal_keyboard_shortcut.patch
+         Bring back terminal shortcut
+      - 70_allow_sound_above_100.patch:
+         Allow setting volume above 100% in the Ubuntu session
+      - 71_ubuntu_dock_settings.patch
+         Add Dock panel for Ubuntu session
+      - 99_add_lock-on-suspend.patch
+         Add option to lock on suspend
+      - ubuntu-gnome-version.patch:
+         Add Ubuntu branding to Details panel
+      - ubuntu-region-packagekit.patch
+         fix detection of installed language packs
+      - ubuntu-region-langpack-install.patch:
+         check for missing language packs when loading region panel to pull
+         in packs that arent included with the installer
+      - ubuntu-language-support.patch
+         Add Language Support button to Region & Language panel to
+         work around (LP: #1631750)
+      - ubuntu-printer-support.patch
+         Add Advanced Printer Settings button to work around missing printer
+         sharing feature (LP: #1718083)
+      - ubuntu-legacy-notifications.patch
+         Ubuntu ships compatibility names for .desktop that got renamed
+         upstream, those use NoDisplay but the panel doesn't respect that key,
+         skip known buggy entries for file-roller and nautilus (LP: #1716267)
+      - connectivity-switch.patch
+         Add Connectivity Checking switch to Privacy panel
+      - privacy-panel-whoopsie.patch
+         Support Ubuntu's whoopsie service in the Privacy panel
+      - ubuntu-white-lists.patch
+         Ensure lists have white background when used with Ambiance & Radiance
+  * Update connectivity-switch.patch with latest version proposed to GNOME
+  * Drop patches applied in new release:
+    - gnome-desktop327.patch
+    - monospace-wifihotspot-password.patch
+    - search-provider-locale.patch
+
+  [ Didier Roche ]
+  * Rebased 70_allow_sound_above_100.patch
+  * Dep on latest gsettings-desktop-schemas for binary
+
+ -- Jeremy Bicha <jbicha@ubuntu.com>  Sat, 10 Mar 2018 15:54:34 -0500
+
 gnome-control-center (1:3.27.92-1) unstable; urgency=medium
 
   * New upstream release candidate
diff -pruN 1:43.2-2/debian/control 1:44~alpha-0ubuntu1/debian/control
--- 1:43.2-2/debian/control	2023-01-25 12:01:34.000000000 +0000
+++ 1:44~alpha-0ubuntu1/debian/control	2023-01-13 16:48:57.000000000 +0000
@@ -5,8 +5,9 @@
 Source: gnome-control-center
 Section: gnome
 Priority: optional
-Maintainer: Debian GNOME Maintainers <pkg-gnome-maintainers@lists.alioth.debian.org>
-Uploaders: Gunnar Hjalmarsson <gunnarhj@debian.org>, Jeremy Bicha <jbicha@ubuntu.com>, Laurent Bigonville <bigon@debian.org>
+Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
+XSBC-Original-Maintainer: Debian GNOME Maintainers <pkg-gnome-maintainers@lists.alioth.debian.org>
+Uploaders: Gunnar Hjalmarsson <gunnarhj@debian.org>, Jeremy Bicha <jbicha@ubuntu.com>
 Build-Depends: debhelper-compat (= 13),
                dh-sequence-gnome (>= 0.22.2),
                libaccountsservice-dev (>= 0.6.39),
@@ -31,13 +32,13 @@ Build-Depends: debhelper-compat (= 13),
                libgoa-1.0-dev (>= 3.45),
                libgoa-backend-1.0-dev (>= 3.45),
                libgsound-dev,
-               libgtk-4-dev (>= 4.4),
+               libgtk-4-dev (>= 4.8),
                libgtop2-dev,
                libgudev-1.0-dev (>= 232) [linux-any],
                libhandy-1-dev (>= 1.2.0),
                libkrb5-dev,
                libnm-dev (>= 1.24.0) [linux-any],
-               libnma-gtk4-dev (>= 1.8.0) [linux-any],
+               libnma-gtk4-dev (>= 1.10.2) [linux-any],
                libmalcontent-0-dev (>= 0.7.0) [amd64 arm64 armel armhf i386 mips mipsel mips64el ppc64el s390x hppa powerpc powerpcspe ppc64],
                libmm-glib-dev [linux-any],
                libpolkit-gobject-1-dev (>= 0.103),
@@ -49,6 +50,7 @@ Build-Depends: debhelper-compat (= 13),
                libudisks2-dev,
                libupower-glib-dev (>= 0.99.8),
                libwacom-dev (>= 0.7) [linux-any],
+               libwhoopsie-preferences-dev,
                libxi-dev (>= 2:1.2),
                libx11-dev,
                libxft-dev (>= 2.1.2),
@@ -64,8 +66,10 @@ Build-Depends: debhelper-compat (= 13),
                python3-dbusmock,
 Standards-Version: 4.6.2
 Rules-Requires-Root: no
-Vcs-Git: https://salsa.debian.org/gnome-team/gnome-control-center.git
-Vcs-Browser: https://salsa.debian.org/gnome-team/gnome-control-center
+XS-Debian-Vcs-Git: https://salsa.debian.org/gnome-team/gnome-control-center.git
+XS-Debian-Vcs-Browser: https://salsa.debian.org/gnome-team/gnome-control-center
+Vcs-Git: https://salsa.debian.org/gnome-team/gnome-control-center.git -b ubuntu/master
+Vcs-Browser: https://salsa.debian.org/gnome-team/gnome-control-center/tree/ubuntu/master
 
 Package: gnome-control-center
 Architecture: any
@@ -74,37 +78,37 @@ Depends: ${misc:Depends},
          accountsservice,
          apg,
          colord (>= 0.1.34),
-         desktop-base (>= 10.0.0),
          desktop-file-utils,
-#         fwupd [linux-any],
+         fwupd [linux-any],
          gnome-control-center-data (<< ${gnome:NextVersion}),
          gnome-control-center-data (>= ${source:Version}),
          gnome-desktop3-data,
          gnome-settings-daemon (>= 41),
          gsettings-desktop-schemas (>= 42~),
+         language-selector-gnome (>= 0.179~),
+         system-config-printer (>= 1.4),
+         whoopsie-preferences,
          webp-pixbuf-loader
 Recommends: cups-pk-helper,
             gnome-bluetooth-sendto,
             gnome-online-accounts (>= 3.25.3),
             gnome-remote-desktop (>= 42),
             gnome-user-docs,
-            gnome-user-share,
             gkbd-capplet,
+            ibus,
             iso-codes,
             libcanberra-pulse,
             polkitd,
             power-profiles-daemon,
             rygel | rygel-tracker,
-            system-config-printer-common (>= 1.4),
-            malcontent-gui [amd64 arm64 armel armhf i386 mips mipsel mips64el ppc64el s390x hppa powerpc powerpcspe ppc64],
             network-manager-gnome (>= 0.9.8),
-            libnss-myhostname,
             cracklib-runtime,
-            libspa-0.2-bluetooth | pulseaudio-module-bluetooth,
-            realmd
+            gnome-control-center-faces,
 Suggests: gnome-software | gnome-packagekit,
+          gnome-user-share,
           gstreamer1.0-pulseaudio,
           pkexec,
+          realmd,
           x11-xserver-utils
 Breaks: gnome-remote-desktop (<< 42),
         gnome-shell (<< 42)
@@ -117,6 +121,16 @@ Description: utilities to configure the
  It also contains a front end to these applets, which can also be
  accessed with the GNOME panel or the Nautilus file manager.
 
+Package: gnome-control-center-faces
+Architecture: all
+Multi-Arch: foreign
+Depends: ${misc:Depends}
+Conflicts: unity-control-center-faces
+Replaces: unity-control-center-faces
+Provides: unity-control-center-faces
+Description: utilities to configure the GNOME desktop - faces images
+ This package contains images that can be used for user profile's icon
+
 Package: gnome-control-center-dev
 Architecture: all
 Multi-Arch: foreign
diff -pruN 1:43.2-2/debian/control.in 1:44~alpha-0ubuntu1/debian/control.in
--- 1:43.2-2/debian/control.in	2023-01-25 12:01:34.000000000 +0000
+++ 1:44~alpha-0ubuntu1/debian/control.in	2023-01-13 16:48:57.000000000 +0000
@@ -1,7 +1,8 @@
 Source: gnome-control-center
 Section: gnome
 Priority: optional
-Maintainer: Debian GNOME Maintainers <pkg-gnome-maintainers@lists.alioth.debian.org>
+Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
+XSBC-Original-Maintainer: Debian GNOME Maintainers <pkg-gnome-maintainers@lists.alioth.debian.org>
 Uploaders: @GNOME_TEAM@
 Build-Depends: debhelper-compat (= 13),
                dh-sequence-gnome (>= 0.22.2),
@@ -27,13 +28,13 @@ Build-Depends: debhelper-compat (= 13),
                libgoa-1.0-dev (>= 3.45),
                libgoa-backend-1.0-dev (>= 3.45),
                libgsound-dev,
-               libgtk-4-dev (>= 4.4),
+               libgtk-4-dev (>= 4.8),
                libgtop2-dev,
                libgudev-1.0-dev (>= 232) [linux-any],
                libhandy-1-dev (>= 1.2.0),
                libkrb5-dev,
                libnm-dev (>= 1.24.0) [linux-any],
-               libnma-gtk4-dev (>= 1.8.0) [linux-any],
+               libnma-gtk4-dev (>= 1.10.2) [linux-any],
                libmalcontent-0-dev (>= 0.7.0) [amd64 arm64 armel armhf i386 mips mipsel mips64el ppc64el s390x hppa powerpc powerpcspe ppc64],
                libmm-glib-dev [linux-any],
                libpolkit-gobject-1-dev (>= 0.103),
@@ -45,6 +46,7 @@ Build-Depends: debhelper-compat (= 13),
                libudisks2-dev,
                libupower-glib-dev (>= 0.99.8),
                libwacom-dev (>= 0.7) [linux-any],
+               libwhoopsie-preferences-dev,
                libxi-dev (>= 2:1.2),
                libx11-dev,
                libxft-dev (>= 2.1.2),
@@ -60,8 +62,10 @@ Build-Depends: debhelper-compat (= 13),
                python3-dbusmock,
 Standards-Version: 4.6.2
 Rules-Requires-Root: no
-Vcs-Git: https://salsa.debian.org/gnome-team/gnome-control-center.git
-Vcs-Browser: https://salsa.debian.org/gnome-team/gnome-control-center
+XS-Debian-Vcs-Git: https://salsa.debian.org/gnome-team/gnome-control-center.git
+XS-Debian-Vcs-Browser: https://salsa.debian.org/gnome-team/gnome-control-center
+Vcs-Git: https://salsa.debian.org/gnome-team/gnome-control-center.git -b ubuntu/master
+Vcs-Browser: https://salsa.debian.org/gnome-team/gnome-control-center/tree/ubuntu/master
 
 Package: gnome-control-center
 Architecture: any
@@ -70,37 +74,37 @@ Depends: ${misc:Depends},
          accountsservice,
          apg,
          colord (>= 0.1.34),
-         desktop-base (>= 10.0.0),
          desktop-file-utils,
-#         fwupd [linux-any],
+         fwupd [linux-any],
          gnome-control-center-data (<< ${gnome:NextVersion}),
          gnome-control-center-data (>= ${source:Version}),
          gnome-desktop3-data,
          gnome-settings-daemon (>= 41),
          gsettings-desktop-schemas (>= 42~),
+         language-selector-gnome (>= 0.179~),
+         system-config-printer (>= 1.4),
+         whoopsie-preferences,
          webp-pixbuf-loader
 Recommends: cups-pk-helper,
             gnome-bluetooth-sendto,
             gnome-online-accounts (>= 3.25.3),
             gnome-remote-desktop (>= 42),
             gnome-user-docs,
-            gnome-user-share,
             gkbd-capplet,
+            ibus,
             iso-codes,
             libcanberra-pulse,
             polkitd,
             power-profiles-daemon,
             rygel | rygel-tracker,
-            system-config-printer-common (>= 1.4),
-            malcontent-gui [amd64 arm64 armel armhf i386 mips mipsel mips64el ppc64el s390x hppa powerpc powerpcspe ppc64],
             network-manager-gnome (>= 0.9.8),
-            libnss-myhostname,
             cracklib-runtime,
-            libspa-0.2-bluetooth | pulseaudio-module-bluetooth,
-            realmd
+            gnome-control-center-faces,
 Suggests: gnome-software | gnome-packagekit,
+          gnome-user-share,
           gstreamer1.0-pulseaudio,
           pkexec,
+          realmd,
           x11-xserver-utils
 Breaks: gnome-remote-desktop (<< 42),
         gnome-shell (<< 42)
@@ -113,6 +117,16 @@ Description: utilities to configure the
  It also contains a front end to these applets, which can also be
  accessed with the GNOME panel or the Nautilus file manager.
 
+Package: gnome-control-center-faces
+Architecture: all
+Multi-Arch: foreign
+Depends: ${misc:Depends}
+Conflicts: unity-control-center-faces
+Replaces: unity-control-center-faces
+Provides: unity-control-center-faces
+Description: utilities to configure the GNOME desktop - faces images
+ This package contains images that can be used for user profile's icon
+
 Package: gnome-control-center-dev
 Architecture: all
 Multi-Arch: foreign
diff -pruN 1:43.2-2/debian/gbp.conf 1:44~alpha-0ubuntu1/debian/gbp.conf
--- 1:43.2-2/debian/gbp.conf	2023-01-25 12:01:34.000000000 +0000
+++ 1:44~alpha-0ubuntu1/debian/gbp.conf	2023-01-13 16:48:57.000000000 +0000
@@ -1,7 +1,8 @@
 [DEFAULT]
 pristine-tar = True
-debian-branch = debian/master
+debian-branch=ubuntu/master
 upstream-branch = upstream/latest
+debian-tag=ubuntu/%(version)s
 
 [buildpackage]
 sign-tags = True
diff -pruN 1:43.2-2/debian/gnome-control-center-data.install 1:44~alpha-0ubuntu1/debian/gnome-control-center-data.install
--- 1:43.2-2/debian/gnome-control-center-data.install	2023-01-25 12:01:34.000000000 +0000
+++ 1:44~alpha-0ubuntu1/debian/gnome-control-center-data.install	2023-01-13 16:48:57.000000000 +0000
@@ -4,6 +4,8 @@ usr/share/sounds
 usr/share/locale
 usr/share/gettext/its
 usr/share/icons
-usr/share/pixmaps/faces
 usr/share/polkit-1
-debian/gnome-control-center.pkla /var/lib/polkit-1/localauthority/10-vendor.d/
+debian/source_gnome-control-center.py /usr/share/apport/package-hooks
+debian/ubuntu-logo-icon.png /usr/share/pixmaps/
+debian/ubuntu-logo-dark.png /usr/share/pixmaps/
+debian/ubuntu-panel-assets/* /usr/share/icons/hicolor/
diff -pruN 1:43.2-2/debian/gnome-control-center-data.links 1:44~alpha-0ubuntu1/debian/gnome-control-center-data.links
--- 1:43.2-2/debian/gnome-control-center-data.links	1970-01-01 00:00:00.000000000 +0000
+++ 1:44~alpha-0ubuntu1/debian/gnome-control-center-data.links	2023-01-13 16:48:57.000000000 +0000
@@ -0,0 +1,2 @@
+usr/share/gnome-control-center/icons/hicolor/48x48/devices/audio-speaker-center.svg		usr/share/gnome-control-center/icons/hicolor/48x48/devices/audio-speaker-mono.svg
+usr/share/gnome-control-center/icons/hicolor/48x48/devices/audio-speaker-center-testing.svg	usr/share/gnome-control-center/icons/hicolor/48x48/devices/audio-speaker-mono-testing.svg
diff -pruN 1:43.2-2/debian/gnome-control-center-faces.install 1:44~alpha-0ubuntu1/debian/gnome-control-center-faces.install
--- 1:43.2-2/debian/gnome-control-center-faces.install	1970-01-01 00:00:00.000000000 +0000
+++ 1:44~alpha-0ubuntu1/debian/gnome-control-center-faces.install	2023-01-13 16:48:57.000000000 +0000
@@ -0,0 +1 @@
+usr/share/pixmaps/faces
diff -pruN 1:43.2-2/debian/patches/build-Look-for-snapd-glib-2.patch 1:44~alpha-0ubuntu1/debian/patches/build-Look-for-snapd-glib-2.patch
--- 1:43.2-2/debian/patches/build-Look-for-snapd-glib-2.patch	2023-01-25 12:01:34.000000000 +0000
+++ 1:44~alpha-0ubuntu1/debian/patches/build-Look-for-snapd-glib-2.patch	2023-01-13 16:48:57.000000000 +0000
@@ -7,10 +7,10 @@ Subject: build: Look for snapd-glib-2
  1 file changed, 1 insertion(+), 1 deletion(-)
 
 diff --git a/meson.build b/meson.build
-index bd2ade9..24059a6 100644
+index 77b7454..66aa643 100644
 --- a/meson.build
 +++ b/meson.build
-@@ -204,7 +204,7 @@ config_h.set10('HAVE_FN_EXPLICIT_BZERO',
+@@ -208,7 +208,7 @@ config_h.set10('HAVE_FN_EXPLICIT_BZERO',
  enable_snap = get_option('snap')
  if enable_snap
    snapd_glib_deps = [
diff -pruN 1:43.2-2/debian/patches/debian/Debian-s-adduser-doesn-t-allow-uppercase-letters-by-defau.patch 1:44~alpha-0ubuntu1/debian/patches/debian/Debian-s-adduser-doesn-t-allow-uppercase-letters-by-defau.patch
--- 1:43.2-2/debian/patches/debian/Debian-s-adduser-doesn-t-allow-uppercase-letters-by-defau.patch	2023-01-25 12:01:34.000000000 +0000
+++ 1:44~alpha-0ubuntu1/debian/patches/debian/Debian-s-adduser-doesn-t-allow-uppercase-letters-by-defau.patch	2023-01-13 16:48:57.000000000 +0000
@@ -9,10 +9,10 @@ Bug-Debian: https://bugs.debian.org/cgi-
  1 file changed, 4 insertions(+), 2 deletions(-)
 
 diff --git a/panels/user-accounts/cc-add-user-dialog.c b/panels/user-accounts/cc-add-user-dialog.c
-index e462015..031eaa7 100644
+index 3814103..2354e52 100644
 --- a/panels/user-accounts/cc-add-user-dialog.c
 +++ b/panels/user-accounts/cc-add-user-dialog.c
-@@ -229,6 +229,7 @@ create_user_done (ActUserManager  *manager,
+@@ -230,6 +230,7 @@ create_user_done (ActUserManager  *manager,
  static void
  local_create_user (CcAddUserDialog *self)
  {
@@ -20,7 +20,7 @@ index e462015..031eaa7 100644
          ActUserManager *manager;
          const gchar *username;
          const gchar *name;
-@@ -240,11 +241,12 @@ local_create_user (CcAddUserDialog *self)
+@@ -241,11 +242,12 @@ local_create_user (CcAddUserDialog *self)
          username = gtk_combo_box_text_get_active_text (self->local_username_combo);
          account_type = gtk_switch_get_active (self->local_account_type_switch) ? ACT_USER_ACCOUNT_TYPE_ADMINISTRATOR : ACT_USER_ACCOUNT_TYPE_STANDARD;
  
diff -pruN 1:43.2-2/debian/patches/debian/Expose-touchpad-settings-if-synaptics-is-in-use.patch 1:44~alpha-0ubuntu1/debian/patches/debian/Expose-touchpad-settings-if-synaptics-is-in-use.patch
--- 1:43.2-2/debian/patches/debian/Expose-touchpad-settings-if-synaptics-is-in-use.patch	2023-01-25 12:01:34.000000000 +0000
+++ 1:44~alpha-0ubuntu1/debian/patches/debian/Expose-touchpad-settings-if-synaptics-is-in-use.patch	2023-01-13 16:48:57.000000000 +0000
@@ -38,7 +38,7 @@ index 6658f41..12aafdb 100644
          display = GDK_DISPLAY_XDISPLAY (gdk_display_get_default ());
  	prop_scroll_methods = XInternAtom (display, "libinput Scroll Methods Available", False);
 diff --git a/panels/mouse/cc-mouse-panel.c b/panels/mouse/cc-mouse-panel.c
-index cdd28ab..6d1269a 100644
+index 8427a49..f903731 100644
 --- a/panels/mouse/cc-mouse-panel.c
 +++ b/panels/mouse/cc-mouse-panel.c
 @@ -64,7 +64,6 @@ struct _CcMousePanel
@@ -55,7 +55,7 @@ index cdd28ab..6d1269a 100644
  
 -  if (self->have_synaptics || !self->have_touchpad) {
 +  if (!self->have_touchpad) {
-     gtk_widget_hide (GTK_WIDGET (self->touchpad_group));
+     gtk_widget_set_visible (GTK_WIDGET (self->touchpad_group), FALSE);
      return;
    }
 @@ -308,7 +307,10 @@ setup_dialog (CcMousePanel *self)
diff -pruN 1:43.2-2/debian/patches/debian/firmware-security-disable.patch 1:44~alpha-0ubuntu1/debian/patches/debian/firmware-security-disable.patch
--- 1:43.2-2/debian/patches/debian/firmware-security-disable.patch	2023-01-25 12:01:34.000000000 +0000
+++ 1:44~alpha-0ubuntu1/debian/patches/debian/firmware-security-disable.patch	1970-01-01 00:00:00.000000000 +0000
@@ -1,31 +0,0 @@
-From: Jeremy Bicha <jeremy.bicha@canonical.com>
-Date: Mon, 22 Aug 2022 08:31:15 -0400
-Subject: firmware-security: Disable
-
-Not yet useful enough to justify its inclusion by default here
-
-You can get the same info by running
-fwupdmgr security
-
-If you drop this patch, add a Depends: fwupd [linux-any]
-
-https://launchpad.net/bugs/1987162
-
-https://gitlab.gnome.org/GNOME/gnome-control-center/-/issues/1938
----
- shell/cc-panel-loader.c | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/shell/cc-panel-loader.c b/shell/cc-panel-loader.c
-index 17f9601..1b819a5 100644
---- a/shell/cc-panel-loader.c
-+++ b/shell/cc-panel-loader.c
-@@ -113,7 +113,7 @@ static CcPanelLoaderVtable default_panels[] =
-   PANEL_TYPE("info-overview",    cc_info_overview_panel_get_type,        NULL),
-   PANEL_TYPE("keyboard",         cc_keyboard_panel_get_type,             NULL),
-   PANEL_TYPE("location",         cc_location_panel_get_type,             NULL),
--  PANEL_TYPE("firmware-security",cc_firmware_security_panel_get_type,    cc_firmware_security_panel_static_init_func),
-+  // PANEL_TYPE("firmware-security",cc_firmware_security_panel_get_type,    cc_firmware_security_panel_static_init_func),
-   PANEL_TYPE("microphone",       cc_microphone_panel_get_type,           NULL),
-   PANEL_TYPE("mouse",            cc_mouse_panel_get_type,                NULL),
-   PANEL_TYPE("multitasking",     cc_multitasking_panel_get_type,         NULL),
diff -pruN 1:43.2-2/debian/patches/keyboard-Allow-disabling-alternate-characters-key.patch 1:44~alpha-0ubuntu1/debian/patches/keyboard-Allow-disabling-alternate-characters-key.patch
--- 1:43.2-2/debian/patches/keyboard-Allow-disabling-alternate-characters-key.patch	2023-01-25 12:01:34.000000000 +0000
+++ 1:44~alpha-0ubuntu1/debian/patches/keyboard-Allow-disabling-alternate-characters-key.patch	2023-01-13 16:48:57.000000000 +0000
@@ -18,10 +18,10 @@ Bug-GNOME: https://gitlab.gnome.org/GNOM
  1 file changed, 1 insertion(+), 1 deletion(-)
 
 diff --git a/panels/keyboard/cc-keyboard-panel.c b/panels/keyboard/cc-keyboard-panel.c
-index 663bcc2..9679b0d 100644
+index 1e45222..25b70a2 100644
 --- a/panels/keyboard/cc-keyboard-panel.c
 +++ b/panels/keyboard/cc-keyboard-panel.c
-@@ -72,7 +72,7 @@ static const CcXkbModifier LV3_MODIFIER = {
+@@ -71,7 +71,7 @@ static const CcXkbModifier LV3_MODIFIER = {
      { NC_("keyboard key", "Right Ctrl"),  "lv3:switch" },
      { NULL,                               NULL }
    },
diff -pruN 1:43.2-2/debian/patches/keyboard-Avoid-modifying-xkb-options-when-user-changes-n.patch 1:44~alpha-0ubuntu1/debian/patches/keyboard-Avoid-modifying-xkb-options-when-user-changes-n.patch
--- 1:43.2-2/debian/patches/keyboard-Avoid-modifying-xkb-options-when-user-changes-n.patch	1970-01-01 00:00:00.000000000 +0000
+++ 1:44~alpha-0ubuntu1/debian/patches/keyboard-Avoid-modifying-xkb-options-when-user-changes-n.patch	2023-01-13 16:48:57.000000000 +0000
@@ -0,0 +1,61 @@
+From: Ian Douglas Scott <idscott@system76.com>
+Date: Mon, 16 Aug 2021 13:56:05 -0700
+Subject: keyboard: Avoid modifying `xkb-options` when user changes nothing
+
+Avoids clobbering certain custom settings that can't be set in UI.
+
+Origin: https://gitlab.gnome.org/GNOME/gnome-control-center/-/merge_requests/910
+Bug-Ubuntu: https://launchpad.net/bugs/1934761
+---
+ panels/keyboard/cc-xkb-modifier-dialog.c | 10 ++++++++++
+ 1 file changed, 10 insertions(+)
+
+diff --git a/panels/keyboard/cc-xkb-modifier-dialog.c b/panels/keyboard/cc-xkb-modifier-dialog.c
+index e52eeb4..8aaf752 100644
+--- a/panels/keyboard/cc-xkb-modifier-dialog.c
++++ b/panels/keyboard/cc-xkb-modifier-dialog.c
+@@ -36,6 +36,7 @@ struct _CcXkbModifierDialog
+   GSettings      *input_source_settings;
+   const CcXkbModifier *modifier;
+   GSList         *radio_group;
++  gboolean        updating_active_radio;
+ };
+ 
+ G_DEFINE_TYPE (CcXkbModifierDialog, cc_xkb_modifier_dialog, GTK_TYPE_DIALOG)
+@@ -85,6 +86,9 @@ update_active_radio (CcXkbModifierDialog *self)
+   guint i;
+   gboolean have_nodefault_option = FALSE;
+ 
++  // Block `on_active_radio_changed_cb` from running
++  self->updating_active_radio = TRUE;
++
+   options = g_settings_get_strv (self->input_source_settings, "xkb-options");
+ 
+   for (i = 0; options != NULL && options[i] != NULL; i++)
+@@ -104,6 +108,7 @@ update_active_radio (CcXkbModifierDialog *self)
+ 
+       gtk_check_button_set_active (GTK_CHECK_BUTTON (radio), TRUE);
+       gtk_switch_set_active (self->default_switch, FALSE);
++      self->updating_active_radio = FALSE;
+       return;
+     }
+ 
+@@ -117,6 +122,8 @@ update_active_radio (CcXkbModifierDialog *self)
+     {
+       gtk_switch_set_active (self->default_switch, TRUE);
+     }
++
++  self->updating_active_radio = FALSE;
+ }
+ 
+ static void
+@@ -181,6 +188,9 @@ on_active_radio_changed_cb (CcXkbModifierDialog *self,
+   if (gtk_switch_get_state (self->default_switch))
+     return;
+ 
++  if (self->updating_active_radio)
++    return;
++
+   xkb_option = (gchar *)g_object_get_data (G_OBJECT (radio), "xkb-option");
+   set_xkb_option (self, xkb_option);
+ }
diff -pruN 1:43.2-2/debian/patches/keyboard-For-xkb-options-have-Layout-default-toggle-and-N.patch 1:44~alpha-0ubuntu1/debian/patches/keyboard-For-xkb-options-have-Layout-default-toggle-and-N.patch
--- 1:43.2-2/debian/patches/keyboard-For-xkb-options-have-Layout-default-toggle-and-N.patch	1970-01-01 00:00:00.000000000 +0000
+++ 1:44~alpha-0ubuntu1/debian/patches/keyboard-For-xkb-options-have-Layout-default-toggle-and-N.patch	2023-01-13 16:48:57.000000000 +0000
@@ -0,0 +1,303 @@
+From: Ian Douglas Scott <idscott@system76.com>
+Date: Mon, 28 Dec 2020 13:25:50 -0800
+Subject: keyboard: For xkb options, have "Layout default" toggle, and "None"
+
+Meant to address issues mentioned in
+https://gitlab.gnome.org/GNOME/gnome-control-center/-/issues/1214
+using the solution proposed there.
+
+There is no "None" option for the compose key, since there doesn't
+appear to be a way to disable it on the unusual layouts where it's
+available by default.
+
+XKB options are a mess, but this seems like a more accurate
+representation of how they function.
+
+Changes compared to the original patch made 2022-12-25:
+* Add nodefault_option after the main option, not before (LP: #2000423)
+
+Origin: https://gitlab.gnome.org/GNOME/gnome-control-center/-/merge_requests/910
+Bug-Ubuntu: https://launchpad.net/bugs/1867548
+Bug-GNOME: https://gitlab.gnome.org/GNOME/gnome-control-center/issues/918
+Last-Update: 2022-12-25
+---
+ panels/keyboard/cc-keyboard-panel.c       |  5 +-
+ panels/keyboard/cc-xkb-modifier-dialog.c  | 78 +++++++++++++++++--------------
+ panels/keyboard/cc-xkb-modifier-dialog.h  |  1 +
+ panels/keyboard/cc-xkb-modifier-dialog.ui |  5 +-
+ 4 files changed, 52 insertions(+), 37 deletions(-)
+
+diff --git a/panels/keyboard/cc-keyboard-panel.c b/panels/keyboard/cc-keyboard-panel.c
+index 25b70a2..058c27b 100644
+--- a/panels/keyboard/cc-keyboard-panel.c
++++ b/panels/keyboard/cc-keyboard-panel.c
+@@ -63,6 +63,7 @@ static const CcXkbModifier LV3_MODIFIER = {
+   N_("Alternate Characters Key"),
+   N_("The alternate characters key can be used to enter additional characters. These are sometimes printed as a third-option on your keyboard."),
+   (CcXkbOption[]){
++    { NC_("keyboard key", "None"),        "lv3:ralt_alt" },
+     { NC_("keyboard key", "Left Alt"),    "lv3:lalt_switch" },
+     { NC_("keyboard key", "Right Alt"),   "lv3:ralt_switch" },
+     { NC_("keyboard key", "Left Super"),  "lv3:lwin_switch" },
+@@ -71,7 +72,8 @@ static const CcXkbModifier LV3_MODIFIER = {
+     { NC_("keyboard key", "Right Ctrl"),  "lv3:switch" },
+     { NULL,                               NULL }
+   },
+-  NULL,
++  "lv3:ralt_switch",
++  "lv3:ralt_alt",
+ };
+ 
+ static const CcXkbModifier COMPOSE_MODIFIER = {
+@@ -93,6 +95,7 @@ static const CcXkbModifier COMPOSE_MODIFIER = {
+     { NULL,                                NULL }
+   },
+   NULL,
++  NULL,
+ };
+ 
+ static void
+diff --git a/panels/keyboard/cc-xkb-modifier-dialog.c b/panels/keyboard/cc-xkb-modifier-dialog.c
+index da8116e..e52eeb4 100644
+--- a/panels/keyboard/cc-xkb-modifier-dialog.c
++++ b/panels/keyboard/cc-xkb-modifier-dialog.c
+@@ -28,7 +28,7 @@ struct _CcXkbModifierDialog
+   GtkDialog       parent_instance;
+ 
+   GtkLabel       *description_label;
+-  GtkSwitch      *enabled_switch;
++  GtkSwitch      *default_switch;
+   GtkListBox     *listbox;
+   GtkListBox     *switch_listbox;
+   AdwActionRow   *switch_row;
+@@ -51,9 +51,9 @@ get_xkb_option_from_name (const CcXkbModifier *modifier, const gchar* name)
+   const CcXkbOption *options = modifier->options;
+   int i;
+ 
+-  for (i = 0; options[i].label && options[i].xkb_option; i++)
++  for (i = 0; options[i].label; i++)
+     {
+-      if (g_str_equal (name, options[i].xkb_option))
++      if (g_strcmp0 (name, options[i].xkb_option) == 0)
+         return &options[i];
+     }
+ 
+@@ -81,9 +81,9 @@ static void
+ update_active_radio (CcXkbModifierDialog *self)
+ {
+   g_auto(GStrv) options = NULL;
+-  GtkCheckButton *rightalt_radio;
+-  const CcXkbOption *default_option;
++  GtkCheckButton *none_radio;
+   guint i;
++  gboolean have_nodefault_option = FALSE;
+ 
+   options = g_settings_get_strv (self->input_source_settings, "xkb-options");
+ 
+@@ -94,26 +94,28 @@ update_active_radio (CcXkbModifierDialog *self)
+       if (!g_str_has_prefix (options[i], self->modifier->prefix))
+         continue;
+ 
++      if (g_strcmp0 (options[i], self->modifier->nodefault_option) == 0)
++        have_nodefault_option = TRUE;
++
+       radio = get_radio_button_from_xkb_option_name (self, options[i]);
+ 
+       if (!radio)
+         continue;
+ 
+       gtk_check_button_set_active (GTK_CHECK_BUTTON (radio), TRUE);
+-      gtk_switch_set_active (self->enabled_switch, TRUE);
++      gtk_switch_set_active (self->default_switch, FALSE);
+       return;
+     }
+ 
+-  if (self->modifier->default_option != NULL)
++  if (have_nodefault_option)
+     {
+-      default_option = get_xkb_option_from_name(self->modifier, self->modifier->default_option);
+-      rightalt_radio = get_radio_button_from_xkb_option_name (self, default_option->xkb_option);
+-      gtk_check_button_set_active (GTK_CHECK_BUTTON (rightalt_radio), TRUE);
+-      gtk_switch_set_active (self->enabled_switch, TRUE);
++      none_radio = get_radio_button_from_xkb_option_name (self, self->modifier->nodefault_option);
++      gtk_check_button_set_active (GTK_CHECK_BUTTON (none_radio), TRUE);
++      gtk_switch_set_active (self->default_switch, FALSE);
+     }
+   else
+     {
+-      gtk_switch_set_active (self->enabled_switch, FALSE);
++      gtk_switch_set_active (self->default_switch, TRUE);
+     }
+ }
+ 
+@@ -125,6 +127,12 @@ set_xkb_option (CcXkbModifierDialog *self,
+   g_auto(GStrv) options = NULL;
+   gboolean found;
+   guint i;
++  gboolean add_nodefault;
++
++  add_nodefault = xkb_option != self->modifier->default_option
++               && xkb_option != self->modifier->nodefault_option
++               && xkb_option != NULL
++               && self->modifier->nodefault_option != NULL;
+ 
+   /* Either replace the existing "<modifier>:" option in the string
+    * array, or add the option at the end
+@@ -139,6 +147,8 @@ set_xkb_option (CcXkbModifierDialog *self,
+         {
+           if (!found && xkb_option != NULL)
+             g_ptr_array_add (array, xkb_option);
++          if (!found && add_nodefault)
++            g_ptr_array_add (array, self->modifier->nodefault_option);
+           found = TRUE;
+         }
+       else
+@@ -149,6 +159,8 @@ set_xkb_option (CcXkbModifierDialog *self,
+ 
+   if (!found && xkb_option != NULL)
+     g_ptr_array_add (array, xkb_option);
++  if (!found && add_nodefault)
++    g_ptr_array_add (array, self->modifier->nodefault_option);
+ 
+   g_ptr_array_add (array, NULL);
+ 
+@@ -166,7 +178,7 @@ on_active_radio_changed_cb (CcXkbModifierDialog *self,
+   if (!gtk_check_button_get_active (GTK_CHECK_BUTTON (radio)))
+     return;
+ 
+-  if (!gtk_switch_get_state (self->enabled_switch))
++  if (gtk_switch_get_state (self->default_switch))
+     return;
+ 
+   xkb_option = (gchar *)g_object_get_data (G_OBJECT (radio), "xkb-option");
+@@ -181,17 +193,17 @@ on_xkb_options_changed_cb (CcXkbModifierDialog *self)
+ }
+ 
+ static gboolean
+-enable_switch_changed_cb (GtkSwitch *widget,
+-                          gboolean   state,
+-                          gpointer   user_data)
++default_switch_changed_cb (GtkSwitch *widget,
++                           gboolean   state,
++                           gpointer   user_data)
+ {
+   CcXkbModifierDialog *self = user_data;
+   gchar *xkb_option;
+   GSList *l;
+ 
+-  gtk_widget_set_sensitive (GTK_WIDGET (self->listbox), state);
++  gtk_widget_set_sensitive (GTK_WIDGET (self->listbox), !state);
+ 
+-  if (state)
++  if (!state)
+     {
+       for (l = self->radio_group; l != NULL; l = l->next)
+         {
+@@ -232,12 +244,12 @@ cc_xkb_modifier_dialog_class_init (CcXkbModifierDialogClass *klass)
+   gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/control-center/keyboard/cc-xkb-modifier-dialog.ui");
+ 
+   gtk_widget_class_bind_template_child (widget_class, CcXkbModifierDialog, description_label);
+-  gtk_widget_class_bind_template_child (widget_class, CcXkbModifierDialog, enabled_switch);
++  gtk_widget_class_bind_template_child (widget_class, CcXkbModifierDialog, default_switch);
+   gtk_widget_class_bind_template_child (widget_class, CcXkbModifierDialog, listbox);
+   gtk_widget_class_bind_template_child (widget_class, CcXkbModifierDialog, switch_listbox);
+   gtk_widget_class_bind_template_child (widget_class, CcXkbModifierDialog, switch_row);
+ 
+-  gtk_widget_class_bind_template_callback (widget_class, enable_switch_changed_cb);
++  gtk_widget_class_bind_template_callback (widget_class, default_switch_changed_cb);
+ }
+ 
+ static void
+@@ -248,7 +260,7 @@ add_radio_buttons (CcXkbModifierDialog *self)
+   CcXkbOption *options = self->modifier->options;
+   int i;
+ 
+-  for (i = 0; options[i].label && options[i].xkb_option; i++)
++  for (i = 0; options[i].label != NULL; i++)
+     {
+       row = g_object_new (GTK_TYPE_LIST_BOX_ROW,
+                           "visible", TRUE,
+@@ -310,12 +322,10 @@ cc_xkb_modifier_dialog_new (GSettings *input_settings,
+ 
+   self->modifier = modifier;
+   gtk_window_set_title (GTK_WINDOW (self), gettext (modifier->title));
+-  adw_preferences_row_set_title (ADW_PREFERENCES_ROW (self->switch_row), gettext (modifier->title));
+   gtk_label_set_markup (self->description_label, gettext (modifier->description));
+-  gtk_widget_set_visible (GTK_WIDGET (self->switch_listbox), modifier->default_option == NULL);
+   add_radio_buttons (self);
+   update_active_radio (self);
+-  gtk_widget_set_sensitive (GTK_WIDGET (self->listbox), gtk_switch_get_state (self->enabled_switch));
++  gtk_widget_set_sensitive (GTK_WIDGET (self->listbox), !gtk_switch_get_state (self->default_switch));
+ 
+   return self;
+ }
+@@ -329,6 +339,7 @@ xcb_modifier_transform_binding_to_label (GValue   *value,
+   const CcXkbOption *entry = NULL;
+   const char **items;
+   guint i;
++  gboolean have_nodefault_option = FALSE;
+ 
+   items = g_variant_get_strv (variant, NULL);
+ 
+@@ -337,19 +348,18 @@ xcb_modifier_transform_binding_to_label (GValue   *value,
+       entry = get_xkb_option_from_name (modifier, items[i]);
+       if (entry != NULL)
+         break;
+-    }
+ 
+-  if (entry == NULL && modifier->default_option == NULL)
+-    {
+-      g_value_set_string (value, _("Disabled"));
+-      return TRUE;
++      if (g_strcmp0 (items[i], modifier->nodefault_option) == 0)
++       have_nodefault_option = TRUE;
+     }
++
++  if (entry != NULL)
++    g_value_set_string (value,
++                        g_dpgettext2 (NULL, "keyboard key", entry->label));
++  if (entry == NULL && have_nodefault_option)
++    g_value_set_string (value, _("None"));
+   else if (entry == NULL)
+-    {
+-      entry = get_xkb_option_from_name(modifier, modifier->default_option);
+-    }
++    g_value_set_string (value, _("Layout default"));
+ 
+-  g_value_set_string (value,
+-                      g_dpgettext2 (NULL, "keyboard key", entry->label));
+   return TRUE;
+ }
+diff --git a/panels/keyboard/cc-xkb-modifier-dialog.h b/panels/keyboard/cc-xkb-modifier-dialog.h
+index 91efbcd..fd05b32 100644
+--- a/panels/keyboard/cc-xkb-modifier-dialog.h
++++ b/panels/keyboard/cc-xkb-modifier-dialog.h
+@@ -37,6 +37,7 @@ typedef struct
+   gchar *description;
+   CcXkbOption *options;
+   gchar *default_option;
++  gchar *nodefault_option;
+ } CcXkbModifier;
+ 
+ #define CC_TYPE_XKB_MODIFIER_DIALOG (cc_xkb_modifier_dialog_get_type())
+diff --git a/panels/keyboard/cc-xkb-modifier-dialog.ui b/panels/keyboard/cc-xkb-modifier-dialog.ui
+index e5612ba..a0b6cf3 100644
+--- a/panels/keyboard/cc-xkb-modifier-dialog.ui
++++ b/panels/keyboard/cc-xkb-modifier-dialog.ui
+@@ -36,13 +36,14 @@
+                   <object class="AdwActionRow" id="switch_row">
+                     <property name="activatable">False</property>
+                     <property name="selectable">False</property>
++                    <property name="title" translatable="yes">Use layout default</property>
+                     <child>
+-                      <object class="GtkSwitch" id="enabled_switch">
++                      <object class="GtkSwitch" id="default_switch">
+                         <property name="valign">center</property>
+                         <accessibility>
+                           <property name="label" translatable="yes">Enabled</property>
+                         </accessibility>
+-                        <signal name="state-set" handler="enable_switch_changed_cb" object="CcXkbModifierDialog" swapped="no"/>
++                        <signal name="state-set" handler="default_switch_changed_cb" object="CcXkbModifierDialog" swapped="no"/>
+                       </object>
+                     </child>
+                   </object>
diff -pruN 1:43.2-2/debian/patches/Revert-firmware-security-Hide-the-panel-when-chassis-type.patch 1:44~alpha-0ubuntu1/debian/patches/Revert-firmware-security-Hide-the-panel-when-chassis-type.patch
--- 1:43.2-2/debian/patches/Revert-firmware-security-Hide-the-panel-when-chassis-type.patch	1970-01-01 00:00:00.000000000 +0000
+++ 1:44~alpha-0ubuntu1/debian/patches/Revert-firmware-security-Hide-the-panel-when-chassis-type.patch	2023-01-13 16:48:57.000000000 +0000
@@ -0,0 +1,26 @@
+From: Jeremy Bicha <jeremy.bicha@canonical.com>
+Date: Fri, 13 Jan 2023 11:38:19 -0500
+Subject: Revert "firmware-security: Hide the panel when chassis type is an
+ empty string"
+
+This reverts commit 0245329949957e7f7ab56f240faaf336408ced86.
+
+It seems to not be working correctly in some cases:
+https://gitlab.gnome.org/GNOME/gnome-control-center/-/issues/2301
+---
+ panels/firmware-security/cc-firmware-security-panel.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/panels/firmware-security/cc-firmware-security-panel.c b/panels/firmware-security/cc-firmware-security-panel.c
+index c43b9db..b90462e 100644
+--- a/panels/firmware-security/cc-firmware-security-panel.c
++++ b/panels/firmware-security/cc-firmware-security-panel.c
+@@ -638,7 +638,7 @@ update_panel_visibility (const gchar *chassis_type)
+   gboolean visible = TRUE;
+ 
+   /* there's no point showing this */
+-  if (g_strcmp0 (chassis_type, "vm") == 0 || g_strcmp0 (chassis_type, "") == 0)
++  if (g_strcmp0 (chassis_type, "vm") == 0)
+     visible = FALSE;
+   application = CC_APPLICATION (g_application_get_default ());
+   cc_shell_model_set_panel_visibility (cc_application_get_model (application),
diff -pruN 1:43.2-2/debian/patches/series 1:44~alpha-0ubuntu1/debian/patches/series
--- 1:43.2-2/debian/patches/series	2023-01-25 12:01:34.000000000 +0000
+++ 1:44~alpha-0ubuntu1/debian/patches/series	2023-01-13 16:48:57.000000000 +0000
@@ -1,6 +1,29 @@
 keyboard-Allow-disabling-alternate-characters-key.patch
+keyboard-For-xkb-options-have-Layout-default-toggle-and-N.patch
+keyboard-Avoid-modifying-xkb-options-when-user-changes-n.patch
 build-Look-for-snapd-glib-2.patch
+Revert-firmware-security-Hide-the-panel-when-chassis-type.patch
 debian/Expose-touchpad-settings-if-synaptics-is-in-use.patch
 debian/Debian-s-adduser-doesn-t-allow-uppercase-letters-by-defau.patch
 debian/Ignore-result-of-test-network-panel.patch
-debian/firmware-security-disable.patch
+ubuntu/keyboard-Add-launch-terminal-shortcut.patch
+ubuntu/sound-Allow-volume-to-be-set-above-100.patch
+ubuntu/Allow-tweaking-some-settings-for-Ubuntu-Dock.patch
+ubuntu/background-Allow-configuring-the-ubuntu-accent-color.patch
+ubuntu/multitasking-panel-Sync-workspace-and-monitor-isolation-d.patch
+ubuntu/Modify-Mulitasking-assets-for-accent-colors.patch
+ubuntu/lock-Add-Lock-Screen-on-Suspend-option.patch
+ubuntu/region-Add-Language-Selector-button.patch
+ubuntu/Adapts-the-region-capplet-and-the-language-chooser-in-the.patch
+ubuntu/printers-Temporarily-add-an-additional-advanced-printer-b.patch
+ubuntu/notifications-Handle-.desktop-files-that-got-renamed.patch
+ubuntu/shell-Change-the-default-height-so-all-category-are-on-sc.patch
+ubuntu/connectivity-add-network-connectivity-checking-toggle.patch
+ubuntu/diagnostics-Add-Whoopsie-support.patch
+ubuntu/online-accounts-Hide-window-after-adding-an-online-accoun.patch
+ubuntu/display-Support-UI-scaled-logical-monitor-mode.patch
+ubuntu/Disable-non-working-camera-microphones-panels.patch
+ubuntu/info-overview-Show-updates-in-software-propeties-instead-.patch
+ubuntu/sound-Add-a-button-to-select-the-default-theme.patch
+ubuntu/applications-Launch-snap-store-if-it-is-installed.patch
+ubuntu/display-Allow-fractional-scaling-to-be-enabled.patch
diff -pruN 1:43.2-2/debian/patches/ubuntu/Adapts-the-region-capplet-and-the-language-chooser-in-the.patch 1:44~alpha-0ubuntu1/debian/patches/ubuntu/Adapts-the-region-capplet-and-the-language-chooser-in-the.patch
--- 1:43.2-2/debian/patches/ubuntu/Adapts-the-region-capplet-and-the-language-chooser-in-the.patch	1970-01-01 00:00:00.000000000 +0000
+++ 1:44~alpha-0ubuntu1/debian/patches/ubuntu/Adapts-the-region-capplet-and-the-language-chooser-in-the.patch	2023-01-13 16:48:57.000000000 +0000
@@ -0,0 +1,533 @@
+From: Gunnar Hjalmarsson <gunnarhj@ubuntu.com>
+Date: Mon, 22 Jul 2019 22:24:00 +0200
+Subject: Adapts the region capplet and the language chooser in the user
+ accounts capplet
+
+ Some background that explains the need for this patch:
+
+ * Ubuntu isn't shipped with all languages installed and all locales generated.
+   Instead the users install the needed language pack(s), and the corresponding
+   locales are generated.
+
+ * The code in accountsservice for handling languages has been extended via Ubuntu
+   specific patches. That code is shared by multiple packages. Currently those
+   packages are:
+   - gnome-control-center
+   - unity-control-center
+   - language-selector
+   - lightdm (for the language chooser in lightdm-gtk-greeter)
+
+ With this patch applied, the g-c-c region capplet and the language chooser in the
+ user accounts capplet behave approximately the same way as language-selector. No
+ migration code needed when standard Ubuntu drops the language-selector UI.
+
+ Compared with how the region capplet in g-c-c works out of the box, this patch
+ results in:
+
+ * Languages are dealt with using 'll' and 'll_CC' language codes instead of
+   complete locale names.
+
+ * Selected language is stored in both LANGUAGE and LANG.
+
+ * Only one language list that shows the translations belonging to the installed
+   language packs (not a 'short' and a 'long' list).
+
+ * User level settings of language and regional formats are stored as
+   accountsservice properties and in ~/.pam_environment.
+
+ * All the formats related locale categories set, not just a subset.
+---
+ panels/common/cc-common-language.c   | 137 +++++++++++++++++++++++++++++------
+ panels/common/cc-common-language.h   |   4 +
+ panels/region/cc-region-panel.c      | 124 +++++++++++++++++++++++--------
+ panels/user-accounts/cc-user-panel.c |  13 +++-
+ 4 files changed, 220 insertions(+), 58 deletions(-)
+
+diff --git a/panels/common/cc-common-language.c b/panels/common/cc-common-language.c
+index 9357c3e..c923d82 100644
+--- a/panels/common/cc-common-language.c
++++ b/panels/common/cc-common-language.c
+@@ -161,6 +161,55 @@ cc_common_language_get_current_language (void)
+         return language;
+ }
+ 
++gchar *
++cc_common_language_get_property (const gchar *prop_name)
++{
++        g_autoptr(GDBusConnection) bus = NULL;
++        g_autofree gchar *user_path = NULL;
++        g_autoptr(GVariant) properties = NULL;
++        g_autoptr(GVariantIter) iter = NULL;
++        const gchar *key;
++        GVariant *value;
++        g_autoptr(GError) error = NULL;
++
++        if (g_strcmp0 (prop_name, "Language") != 0 && g_strcmp0 (prop_name, "FormatsLocale") != 0) {
++                g_warning ("Invalid argument: '%s'", prop_name);
++                return NULL;
++        }
++
++        bus = g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, NULL);
++        user_path = g_strdup_printf ("/org/freedesktop/Accounts/User%i", getuid ());
++
++        properties = g_dbus_connection_call_sync (bus,
++                                                  "org.freedesktop.Accounts",
++                                                  user_path,
++                                                  "org.freedesktop.DBus.Properties",
++                                                  "GetAll",
++                                                  g_variant_new ("(s)", "org.freedesktop.Accounts.User"),
++                                                  G_VARIANT_TYPE ("(a{sv})"),
++                                                  G_DBUS_CALL_FLAGS_NONE,
++                                                  -1,
++                                                  NULL,
++                                                  &error);
++        if (!properties) {
++                g_warning ("Error calling GetAll() when retrieving properties for %s: %s", user_path, error->message);
++
++                /* g_hash_table_lookup() is not NULL-safe, so don't return NULL */
++                if (g_strcmp0 (prop_name, "Language") == 0)
++                        return g_strdup ("en");
++                else
++                        return g_strdup ("en_US.UTF-8");
++        }
++
++        g_variant_get (properties, "(a{sv})", &iter);
++        while (g_variant_iter_loop (iter, "{&sv}", &key, &value)) {
++                if (g_strcmp0 (key, prop_name) == 0)
++                        return g_variant_dup_string (value, NULL);
++        }
++
++        return NULL;
++}
++
+ static char *
+ get_lang_for_user_object_path (const char *path)
+ {
+@@ -201,30 +250,62 @@ insert_language (GHashTable *ht,
+         g_autofree gchar *label_own_lang = NULL;
+         g_autofree gchar *label_current_lang = NULL;
+         g_autofree gchar *label_untranslated = NULL;
++        g_autofree gchar *key = NULL;
++
++        cc_common_language_get_locale (lang, &key);
+ 
+-        label_own_lang = gnome_get_language_from_locale (lang, lang);
+-        label_current_lang = gnome_get_language_from_locale (lang, NULL);
+-        label_untranslated = gnome_get_language_from_locale (lang, "C");
++        label_own_lang = gnome_get_language_from_locale (key, key);
++        label_current_lang = gnome_get_language_from_locale (key, NULL);
++        label_untranslated = gnome_get_language_from_locale (key, "C");
+ 
+         /* We don't have a translation for the label in
+          * its own language? */
+         if (g_strcmp0 (label_own_lang, label_untranslated) == 0) {
+                 if (g_strcmp0 (label_current_lang, label_untranslated) == 0)
+-                        g_hash_table_insert (ht, g_strdup (lang), g_strdup (label_untranslated));
++                        g_hash_table_insert (ht, g_strdup (key), g_strdup (label_untranslated));
+                 else
+-                        g_hash_table_insert (ht, g_strdup (lang), g_strdup (label_current_lang));
++                        g_hash_table_insert (ht, g_strdup (key), g_strdup (label_current_lang));
+         } else {
+-                g_hash_table_insert (ht, g_strdup (lang), g_strdup (label_own_lang));
++                g_hash_table_insert (ht, g_strdup (key), g_strdup (label_own_lang));
+         }
+ }
+ 
++gchar **
++cc_common_language_get_installed_languages (void)
++{
++        g_autofree gchar *output = NULL;
++        g_auto(GStrv) langs = NULL;
++        g_autoptr(GError) error = NULL;
++
++        if (!g_spawn_command_line_sync ("/usr/share/language-tools/language-options",
++                                        &output, NULL, NULL, &error)) {
++                g_warning ("Couldn't get installed languages: %s", error->message);
++                return NULL;
++        }
++        langs = g_strsplit (output, "\n", 0);
++
++        return g_steal_pointer (&langs);
++}
++
+ GHashTable *
+ cc_common_language_get_initial_languages (void)
+ {
+         GHashTable *ht;
++        gchar **langs;
++        gint i;
+ 
+         ht = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free);
+ 
++        langs = cc_common_language_get_installed_languages ();
++
++        if (langs) {
++                for (i = 0; langs[i]; i++) {
++                        insert_language (ht, langs[i]);
++                }
++
++                g_strfreev (langs);
++        }
++/*
+         insert_language (ht, "en_US.UTF-8");
+         insert_language (ht, "en_GB.UTF-8");
+         insert_language (ht, "de_DE.UTF-8");
+@@ -234,10 +315,30 @@ cc_common_language_get_initial_languages (void)
+         insert_language (ht, "ja_JP.UTF-8");
+         insert_language (ht, "ru_RU.UTF-8");
+         insert_language (ht, "ar_EG.UTF-8");
+-
++*/
+         return ht;
+ }
+ 
++void
++cc_common_language_get_locale (const gchar *language, gchar **locale)
++{
++        g_autofree gchar *command = NULL;
++        g_autoptr(GError) error = NULL;
++
++        /* Get locale that corresponds to the language */
++        command = g_strconcat ("/usr/share/language-tools/language2locale ", language, NULL);
++        if (!g_spawn_command_line_sync (command, locale, NULL, NULL, &error)) {
++                g_warning ("Couldn't get locale: %s", error->message);
++                return;
++        }
++
++        g_strchomp (*locale);
++        if (strlen (*locale) == 0) {
++                g_warning ("Couldn't get locale for language: %s", language);
++                return;
++        }
++
++}
+ static void
+ foreach_user_lang_cb (gpointer key,
+                       gpointer value,
+@@ -263,28 +364,18 @@ cc_common_language_add_user_languages (GtkTreeModel *model)
+         GtkListStore *store = GTK_LIST_STORE (model);
+         GHashTable *user_langs;
+         const char *display;
++        const char *lang;
+ 
+         gtk_list_store_clear (store);
+ 
+         user_langs = cc_common_language_get_initial_languages ();
+ 
+         /* Add the current locale first */
+-        name = cc_common_language_get_current_language ();
++        lang = cc_common_language_get_property ("Language");
++        cc_common_language_get_locale (lang, &name);
+         display = g_hash_table_lookup (user_langs, name);
+         if (!display) {
+-                g_autofree gchar *language = NULL;
+-                g_autofree gchar *country = NULL;
+-                g_autofree gchar *codeset = NULL;
+-
+-                gnome_parse_locale (name, &language, &country, &codeset, NULL);
+-
+-                if (!codeset || !g_str_equal (codeset, "UTF-8"))
+-                        g_warning ("Current user locale codeset isn't UTF-8");
+-
+-                g_free (name);
+-                name = g_strdup_printf ("%s_%s.UTF-8", language, country);
+-
+-                insert_language (user_langs, name);
++                insert_language (user_langs, lang);
+                 display = g_hash_table_lookup (user_langs, name);
+         }
+ 
+@@ -296,8 +387,8 @@ cc_common_language_add_user_languages (GtkTreeModel *model)
+         g_hash_table_foreach (user_langs, (GHFunc) foreach_user_lang_cb, store);
+ 
+         /* And now the "Other…" selection */
+-        gtk_list_store_append (store, &iter);
+-        gtk_list_store_set (store, &iter, LOCALE_COL, NULL, DISPLAY_LOCALE_COL, _("Other…"), -1);
++        //gtk_list_store_append (store, &iter);
++        //gtk_list_store_set (store, &iter, LOCALE_COL, NULL, DISPLAY_LOCALE_COL, _("Other…"), -1);
+ 
+         g_hash_table_destroy (user_langs);
+ }
+diff --git a/panels/common/cc-common-language.h b/panels/common/cc-common-language.h
+index 1f578b7..2e5a446 100644
+--- a/panels/common/cc-common-language.h
++++ b/panels/common/cc-common-language.h
+@@ -43,6 +43,8 @@ guint    cc_common_language_add_available_languages (GtkListStore     *store,
+                                                      GHashTable       *user_langs);
+ gboolean cc_common_language_has_font                (const gchar  *locale);
+ gchar   *cc_common_language_get_current_language    (void);
++gchar   *cc_common_language_get_property            (const gchar  *prop_name);
++gchar	**cc_common_language_get_installed_languages   (void);
+ 
+ GHashTable *cc_common_language_get_initial_languages   (void);
+ GHashTable *cc_common_language_get_user_languages      (void);
+@@ -55,4 +57,6 @@ void     cc_common_language_select_current_language (GtkTreeView  *treeview);
+ 
+ void     cc_common_language_add_user_languages (GtkTreeModel *model);
+ 
++void    cc_common_language_get_locale (const gchar *language, gchar **locale);
++
+ G_END_DECLS
+diff --git a/panels/region/cc-region-panel.c b/panels/region/cc-region-panel.c
+index 00190f5..0547778 100644
+--- a/panels/region/cc-region-panel.c
++++ b/panels/region/cc-region-panel.c
+@@ -237,27 +237,26 @@ set_localed_locale (CcRegionPanel *self)
+ {
+         g_autoptr(GVariantBuilder) b = NULL;
+         g_autofree gchar *lang_value = NULL;
++        g_autofree gchar *lang = NULL;
++
++        cc_common_language_get_locale (self->system_language, &lang);
+ 
+         b = g_variant_builder_new (G_VARIANT_TYPE ("as"));
+-        lang_value = g_strconcat ("LANG=", self->system_language, NULL);
++        lang_value = g_strconcat ("LANG=", lang, NULL);
++        g_variant_builder_add (b, "s", lang_value);
++
++        g_free (lang_value);
++
++        lang_value = g_strconcat ("LANGUAGE=", self->system_language, NULL);
+         g_variant_builder_add (b, "s", lang_value);
+ 
+-        if (self->system_region != NULL) {
+-                g_autofree gchar *time_value = NULL;
+-                g_autofree gchar *numeric_value = NULL;
+-                g_autofree gchar *monetary_value = NULL;
+-                g_autofree gchar *measurement_value = NULL;
+-                g_autofree gchar *paper_value = NULL;
+-                time_value = g_strconcat ("LC_TIME=", self->system_region, NULL);
+-                g_variant_builder_add (b, "s", time_value);
+-                numeric_value = g_strconcat ("LC_NUMERIC=", self->system_region, NULL);
+-                g_variant_builder_add (b, "s", numeric_value);
+-                monetary_value = g_strconcat ("LC_MONETARY=", self->system_region, NULL);
+-                g_variant_builder_add (b, "s", monetary_value);
+-                measurement_value = g_strconcat ("LC_MEASUREMENT=", self->system_region, NULL);
+-                g_variant_builder_add (b, "s", measurement_value);
+-                paper_value = g_strconcat ("LC_PAPER=", self->system_region, NULL);
+-                g_variant_builder_add (b, "s", paper_value);
++        const gchar *format_categories[] = { "LC_NUMERIC", "LC_TIME",
++           "LC_MONETARY", "LC_PAPER", "LC_IDENTIFICATION", "LC_NAME",
++           "LC_ADDRESS", "LC_TELEPHONE", "LC_MEASUREMENT", NULL };
++        for (int i = 0; format_categories[i] != NULL; i++) {
++                g_autofree gchar *s = NULL;
++                s = g_strconcat (format_categories[i], "=", self->system_region, NULL);
++                g_variant_builder_add (b, "s", s);
+         }
+         g_dbus_proxy_call (self->localed,
+                            "SetLocale",
+@@ -284,6 +283,8 @@ update_language (CcRegionPanel  *self,
+                  CcLocaleTarget  target,
+                  const gchar    *language)
+ {
++        g_debug ("Setting language to %s", language);
++
+         switch (target) {
+         case USER:
+                 if (g_strcmp0 (language, self->language) == 0)
+@@ -313,6 +314,40 @@ set_system_region (CcRegionPanel *self,
+         set_localed_locale (self);
+ }
+ 
++static void
++set_formats_locale (const gchar *formats_locale)
++{
++        g_autoptr(GDBusProxy) proxy = NULL;
++        g_autofree gchar *user_path = NULL;
++        g_autoptr(GVariant) ret = NULL;
++        g_autoptr(GError) error = NULL;
++
++        user_path = g_strdup_printf ("/org/freedesktop/Accounts/User%i", getuid ());
++        proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM,
++                                               G_DBUS_PROXY_FLAGS_NONE,
++                                               NULL,
++                                               "org.freedesktop.Accounts",
++                                               user_path,
++                                               "org.freedesktop.Accounts.User",
++                                               NULL,
++                                               &error);
++        if (!proxy) {
++                g_warning ("Couldn't get accountsservice proxy for %s: %s", user_path, error->message);
++                return;
++        }
++
++        ret = g_dbus_proxy_call_sync (proxy,
++                                      "SetFormatsLocale",
++                                      g_variant_new ("(s)", formats_locale),
++                                      G_DBUS_CALL_FLAGS_NONE,
++                                      -1,
++                                      NULL,
++                                      &error);
++        if (!ret)
++                g_warning ("Couldn't set FormatsLocale: %s", error->message);
++}
++
++
+ static void
+ update_region (CcRegionPanel  *self,
+                CcLocaleTarget  target,
+@@ -322,6 +357,7 @@ update_region (CcRegionPanel  *self,
+         case USER:
+                 if (g_strcmp0 (region, self->region) == 0)
+                         return;
++                set_formats_locale (region);
+                 if (region == NULL || region[0] == '\0')
+                         g_settings_reset (self->locale_settings, KEY_REGION);
+                 else
+@@ -523,15 +559,19 @@ static void
+ update_language_from_user (CcRegionPanel *self)
+ {
+         const gchar *language = NULL;
++        g_autofree gchar *locale = NULL;
+ 
+-        if (act_user_is_loaded (self->user))
++        if (act_user_is_loaded (self->user)) {
+                 language = act_user_get_language (self->user);
++                cc_common_language_get_locale (language, &locale);
++        }
+ 
+-        if (language == NULL || *language == '\0')
+-                language = setlocale (LC_MESSAGES, NULL);
++        if (language == NULL || *language == '\0') {
++                locale = g_strdup (setlocale (LC_MESSAGES, NULL));
++        }
+ 
+         g_free (self->language);
+-        self->language = g_strdup (language);
++        self->language = g_steal_pointer (&locale);
+         update_user_language_row (self);
+ }
+ 
+@@ -539,7 +579,7 @@ static void
+ update_region_from_setting (CcRegionPanel *self)
+ {
+         g_free (self->region);
+-        self->region = g_settings_get_string (self->locale_settings, KEY_REGION);
++        self->region = cc_common_language_get_property ("FormatsLocale");
+         update_user_region_row (self);
+ }
+ 
+@@ -629,6 +669,16 @@ set_login_button_visibility (CcRegionPanel *self)
+ 
+ /* Callbacks */
+ 
++static gchar *
++strip_quotes (const gchar *str)
++{
++        if ((g_str_has_prefix (str, "\"") && g_str_has_suffix (str, "\""))
++          || (g_str_has_prefix (str, "'") && g_str_has_suffix (str, "'")))
++                return g_strndup (str + 1, strlen (str) - 2);
++        else
++                return g_strdup (str);
++}
++
+ static void
+ on_localed_properties_changed (GDBusProxy     *localed_proxy,
+                                GVariant       *changed_properties,
+@@ -637,33 +687,43 @@ on_localed_properties_changed (GDBusProxy     *localed_proxy,
+ {
+         g_autoptr(GVariant) v = NULL;
+ 
+-        v = g_dbus_proxy_get_cached_property (localed_proxy, "Locale");
++        v = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (self->localed), "Locale");
+         if (v) {
+                 g_autofree const gchar **strv = NULL;
+                 gsize len;
+                 gint i;
+-                const gchar *lang, *messages, *time;
++                g_autofree gchar *lang;
++                g_autofree gchar *language;
++                g_autofree gchar *messages;
++                g_autofree gchar *time;
+ 
+                 strv = g_variant_get_strv (v, &len);
+ 
+-                lang = messages = time = NULL;
++                lang = language = messages = time = NULL;
+                 for (i = 0; strv[i]; i++) {
+                         if (g_str_has_prefix (strv[i], "LANG=")) {
+-                                lang = strv[i] + strlen ("LANG=");
++                                lang = strip_quotes (strv[i] + strlen ("LANG="));
++                        } else if (g_str_has_prefix (strv[i], "LANGUAGE=")) {
++                                g_autofree gchar *tmp = strip_quotes (strv[i] + strlen ("LANGUAGE="));
++                                g_auto(GStrv) tokens = g_strsplit (tmp, ":", 2);
++                                language = g_strdup (tokens[0]);
+                         } else if (g_str_has_prefix (strv[i], "LC_MESSAGES=")) {
+-                                messages = strv[i] + strlen ("LC_MESSAGES=");
++                                messages = strip_quotes (strv[i] + strlen ("LC_MESSAGES="));
+                         } else if (g_str_has_prefix (strv[i], "LC_TIME=")) {
+-                                time = strv[i] + strlen ("LC_TIME=");
++                                time = strip_quotes (strv[i] + strlen ("LC_TIME="));
+                         }
+                 }
+                 if (!lang) {
+-                        lang = setlocale (LC_MESSAGES, NULL);
++                        lang = g_strdup ("en_US.UTF-8");
+                 }
+-                if (!messages) {
+-                        messages = lang;
++                if (!language) {
++                        if (messages)
++                                language = g_strdup (messages);
++                        else
++                                language = g_strdup (lang);
+                 }
+                 g_free (self->system_language);
+-                self->system_language = g_strdup (messages);
++                self->system_language = g_steal_pointer (&language);
+                 g_free (self->system_region);
+                 self->system_region = g_strdup (time);
+ 
+diff --git a/panels/user-accounts/cc-user-panel.c b/panels/user-accounts/cc-user-panel.c
+index 86b040c..6c3ded5 100644
+--- a/panels/user-accounts/cc-user-panel.c
++++ b/panels/user-accounts/cc-user-panel.c
+@@ -871,6 +871,8 @@ show_user (ActUser *user, CcUserPanel *self)
+         gtk_widget_set_sensitive (GTK_WIDGET (self->autologin_switch), get_autologin_possible (user));
+ 
+         lang = g_strdup (act_user_get_language (user));
++        cc_common_language_get_locale (lang, &lang);
++
+         if (lang && *lang != '\0') {
+                 name = gnome_get_language_from_locale (lang, NULL);
+         } else {
+@@ -1073,7 +1075,8 @@ language_response (CcUserPanel *self,
+                    GtkDialog   *dialog)
+ {
+         ActUser *user;
+-        const gchar *lang, *account_language;
++        const gchar *lang;//, *account_language;
++        gchar *locale;
+ 
+         if (response_id != GTK_RESPONSE_OK) {
+                 gtk_widget_hide (GTK_WIDGET (dialog));
+@@ -1081,12 +1084,13 @@ language_response (CcUserPanel *self,
+         }
+ 
+         user = get_selected_user (self);
+-        account_language = act_user_get_language (user);
++        //account_language = act_user_get_language (user);
++        cc_common_language_get_locale (act_user_get_language (user), &locale);
+ 
+         lang = cc_language_chooser_get_language (CC_LANGUAGE_CHOOSER (dialog));
+         if (lang) {
+                 g_autofree gchar *name = NULL;
+-                if (g_strcmp0 (lang, account_language) != 0) {
++                if (g_strcmp0 (lang, locale) != 0) {
+                         act_user_set_language (user, lang);
+                 }
+ 
+@@ -1101,10 +1105,13 @@ static void
+ change_language (CcUserPanel *self)
+ {
+         const gchar *current_language;
++        g_autofree gchar *locale = NULL;
+         ActUser *user;
+ 
+         user = get_selected_user (self);
+         current_language = act_user_get_language (user);
++        cc_common_language_get_locale (current_language, &locale);
++        current_language = locale;
+ 
+         if (self->language_chooser) {
+                 cc_language_chooser_clear_filter (self->language_chooser);
diff -pruN 1:43.2-2/debian/patches/ubuntu/Allow-tweaking-some-settings-for-Ubuntu-Dock.patch 1:44~alpha-0ubuntu1/debian/patches/ubuntu/Allow-tweaking-some-settings-for-Ubuntu-Dock.patch
--- 1:43.2-2/debian/patches/ubuntu/Allow-tweaking-some-settings-for-Ubuntu-Dock.patch	1970-01-01 00:00:00.000000000 +0000
+++ 1:44~alpha-0ubuntu1/debian/patches/ubuntu/Allow-tweaking-some-settings-for-Ubuntu-Dock.patch	2023-01-13 16:48:57.000000000 +0000
@@ -0,0 +1,2016 @@
+From: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
+Date: Wed, 15 Jan 2020 16:56:17 +1300
+Subject: ubuntu-panel: Allow tweaking some Ubuntu specific settings
+
+Expose some of the settings that most users will find useful for our
+Ubuntu Dock installation. Those are located in its own panel for now:
+* change intellihide true/hide mode
+* change dock icon size
+* modify placement of the launcher (all monitor, primary or any monitors)
+* Configure the desktop icons extension
+
+These changes are maintained in a single branch at:
+ https://gitlab.gnome.org/Community/Ubuntu/gnome-control-center/-/commits/ubuntu-panel
+
+Please provide merge requests there.
+
+Origin: ubuntu
+Forwarded: not-needed
+---
+ panels/meson.build                          |    1 +
+ panels/ubuntu/assets/colors/color.svg.in    |    5 +
+ panels/ubuntu/assets/theme-dark.svg         |    1 +
+ panels/ubuntu/assets/theme-light.svg        |    1 +
+ panels/ubuntu/cc-ubuntu-dock-dialog.c       |  103 +++
+ panels/ubuntu/cc-ubuntu-dock-dialog.h       |   31 +
+ panels/ubuntu/cc-ubuntu-dock-dialog.ui      |   81 ++
+ panels/ubuntu/cc-ubuntu-panel.c             | 1289 +++++++++++++++++++++++++++
+ panels/ubuntu/cc-ubuntu-panel.h             |   35 +
+ panels/ubuntu/cc-ubuntu-panel.ui            |  163 ++++
+ panels/ubuntu/gnome-ubuntu-panel.desktop.in |   13 +
+ panels/ubuntu/meson.build                   |   97 ++
+ panels/ubuntu/ubuntu.gresource.xml          |    6 +
+ po/POTFILES.in                              |    5 +
+ shell/cc-panel-list.c                       |    1 +
+ shell/cc-panel-loader.c                     |    3 +
+ 16 files changed, 1835 insertions(+)
+ create mode 100644 panels/ubuntu/assets/colors/color.svg.in
+ create mode 100644 panels/ubuntu/assets/theme-dark.svg
+ create mode 100644 panels/ubuntu/assets/theme-light.svg
+ create mode 100644 panels/ubuntu/cc-ubuntu-dock-dialog.c
+ create mode 100644 panels/ubuntu/cc-ubuntu-dock-dialog.h
+ create mode 100644 panels/ubuntu/cc-ubuntu-dock-dialog.ui
+ create mode 100644 panels/ubuntu/cc-ubuntu-panel.c
+ create mode 100644 panels/ubuntu/cc-ubuntu-panel.h
+ create mode 100644 panels/ubuntu/cc-ubuntu-panel.ui
+ create mode 100644 panels/ubuntu/gnome-ubuntu-panel.desktop.in
+ create mode 100644 panels/ubuntu/meson.build
+ create mode 100644 panels/ubuntu/ubuntu.gresource.xml
+
+diff --git a/panels/meson.build b/panels/meson.build
+index cb732f2..c825ee2 100644
+--- a/panels/meson.build
++++ b/panels/meson.build
+@@ -26,6 +26,7 @@ panels = [
+   'search',
+   'sharing',
+   'sound',
++  'ubuntu',
+   'universal-access',
+   'usage',
+   'user-accounts',
+diff --git a/panels/ubuntu/assets/colors/color.svg.in b/panels/ubuntu/assets/colors/color.svg.in
+new file mode 100644
+index 0000000..4c0e136
+--- /dev/null
++++ b/panels/ubuntu/assets/colors/color.svg.in
+@@ -0,0 +1,5 @@
++<svg version="1.1" viewBox="0 0 32 32" xmlns="http://www.w3.org/2000/svg">
++ <g transform="translate(-401 -339)">
++  <circle cx="417" cy="355" r="13.35" fill="#00ff00" stroke-width="2.9706"/>
++ </g>
++</svg>
+diff --git a/panels/ubuntu/assets/theme-dark.svg b/panels/ubuntu/assets/theme-dark.svg
+new file mode 100644
+index 0000000..90a7f86
+--- /dev/null
++++ b/panels/ubuntu/assets/theme-dark.svg
+@@ -0,0 +1 @@
++<svg version="1.0" width="250" height="150" xmlns="http://www.w3.org/2000/svg"><defs><filter id="a" x="-.042" y="-.055" width="1.085" height="1.111" color-interpolation-filters="sRGB"><feGaussianBlur stdDeviation="1.5"/></filter><filter id="b" x="-.042" y="-.055" width="1.085" height="1.111" color-interpolation-filters="sRGB"><feGaussianBlur stdDeviation="1.5"/></filter></defs><g transform="translate(111.066 -45.354) scale(1.1742)"><rect x="-15" y="55" width="85" height="65" ry="5" filter="url(#a)" opacity=".55"/><rect x="-15" y="55" width="85" height="65" ry="5" fill="#404040"/><path d="M-10 55c-2.77 0-5 2.23-5 5v10h85V60c0-2.77-2.23-5-5-5z" fill="#404040"/><rect x="-15" y="69" width="85" height="1" ry="0" fill="#5d5d5d"/></g><g transform="translate(75.84 -10.128) scale(1.1742)"><rect x="-15" y="55" width="85" height="65" ry="5" filter="url(#b)" opacity=".55"/><rect x="-15" y="55" width="85" height="65" ry="5" fill="#242424"/><path d="M-10 55c-2.77 0-5 2.23-5 5v10h85V60c0-2.77-2.23-5-5-5z" fill="#303030" fill-opacity=".937"/><rect x="-15" y="69" width="85" height="1" ry="0" fill="#4d4d4d"/></g></svg>
+\ No newline at end of file
+diff --git a/panels/ubuntu/assets/theme-light.svg b/panels/ubuntu/assets/theme-light.svg
+new file mode 100644
+index 0000000..0a8f29f
+--- /dev/null
++++ b/panels/ubuntu/assets/theme-light.svg
+@@ -0,0 +1 @@
++<svg version="1.0" width="250" height="150" xmlns="http://www.w3.org/2000/svg"><defs><filter id="a" x="-.042" y="-.055" width="1.085" height="1.111" color-interpolation-filters="sRGB"><feGaussianBlur stdDeviation="1.5"/></filter><filter id="c" x="-.042" y="-.055" width="1.085" height="1.111" color-interpolation-filters="sRGB"><feGaussianBlur stdDeviation="1.5"/></filter><filter id="b" x="-.042" y="-.055" width="1.085" height="1.111" color-interpolation-filters="sRGB"><feGaussianBlur stdDeviation="1.5"/></filter><filter id="d" x="-.042" y="-.055" width="1.085" height="1.111" color-interpolation-filters="sRGB"><feGaussianBlur stdDeviation="1.5"/></filter></defs><g transform="translate(111.066 -45.354) scale(1.1742)"><rect x="-15" y="55" width="85" height="65" ry="5" filter="url(#a)" opacity=".55" style="filter:url(#b)"/><rect x="-15" y="55" width="85" height="65" ry="5" fill="#4d4d4d"/><path d="M-10 55c-2.77 0-5 2.23-5 5v10h85V60c0-2.77-2.23-5-5-5z" fill="#4d4d4d"/><rect x="-15" y="69" width="85" height="1" ry="0" fill="#666"/></g><g transform="translate(75.84 -10.128) scale(1.1742)"><rect x="-15" y="55" width="85" height="65" ry="5" filter="url(#c)" opacity=".55" style="filter:url(#d)"/><rect x="-15" y="55" width="85" height="65" ry="5" fill="#fafafa"/><path d="M-10 55c-2.77 0-5 2.23-5 5v10h85V60c0-2.77-2.23-5-5-5z" fill="#dedede"/><rect x="-15" y="69" width="85" height="1" ry="0" fill="#b3b3b3"/></g></svg>
+\ No newline at end of file
+diff --git a/panels/ubuntu/cc-ubuntu-dock-dialog.c b/panels/ubuntu/cc-ubuntu-dock-dialog.c
+new file mode 100644
+index 0000000..4a64f2d
+--- /dev/null
++++ b/panels/ubuntu/cc-ubuntu-dock-dialog.c
+@@ -0,0 +1,103 @@
++/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
++/*
++ * Copyright (C) 2022 Marco Trevisan <marco.trevisan@canonical.com>
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General
++ * Public License along with this library; if not, see <http://www.gnu.org/licenses/>.
++ *
++ */
++
++#include "config.h"
++
++#include <string.h>
++#include <glib/gi18n-lib.h>
++#include <glib.h>
++
++#include "cc-list-row.h"
++#include "cc-ubuntu-dock-dialog.h"
++
++struct _CcUbuntuDockDialog {
++  GtkDialog       parent;
++
++  GSettings      *settings;
++
++  CcListRow      *volumes_switch;
++  GtkCheckButton *unmounted_check;
++  GtkCheckButton *network_volumes_check;
++  CcListRow      *trash_switch;
++};
++
++G_DEFINE_TYPE (CcUbuntuDockDialog, cc_ubuntu_dock_dialog, GTK_TYPE_DIALOG)
++
++static void
++cc_ubuntu_dock_dialog_dispose (GObject *object)
++{
++  CcUbuntuDockDialog *dialog = CC_UBUNTU_DOCK_DIALOG (object);
++
++  g_clear_object (&dialog->settings);
++
++  G_OBJECT_CLASS (cc_ubuntu_dock_dialog_parent_class)->dispose (object);
++}
++
++static void
++cc_ubuntu_dock_dialog_class_init (CcUbuntuDockDialogClass *klass)
++{
++  GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
++  GObjectClass *object_class = G_OBJECT_CLASS (klass);
++
++  object_class->dispose = cc_ubuntu_dock_dialog_dispose;
++
++  gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/control-center/ubuntu/cc-ubuntu-dock-dialog.ui");
++
++  gtk_widget_class_bind_template_child (widget_class, CcUbuntuDockDialog, volumes_switch);
++  gtk_widget_class_bind_template_child (widget_class, CcUbuntuDockDialog, unmounted_check);
++  gtk_widget_class_bind_template_child (widget_class, CcUbuntuDockDialog, network_volumes_check);
++  gtk_widget_class_bind_template_child (widget_class, CcUbuntuDockDialog, trash_switch);
++}
++
++void
++cc_ubuntu_dock_dialog_init (CcUbuntuDockDialog *dialog)
++{
++  gtk_widget_init_template (GTK_WIDGET (dialog));
++}
++
++CcUbuntuDockDialog *
++cc_ubuntu_dock_dialog_new (GSettings *settings)
++{
++  CcUbuntuDockDialog *dialog;
++
++  dialog = g_object_new (CC_TYPE_UBUNTU_DOCK_DIALOG,
++                         "use-header-bar", TRUE,
++                         NULL);
++
++  gtk_window_set_title (GTK_WINDOW (dialog), _("Dock"));
++  dialog->settings = g_object_ref (settings);
++
++  g_settings_bind (dialog->settings, "show-mounts",
++                   dialog->volumes_switch, "active",
++                   G_SETTINGS_BIND_DEFAULT);
++
++  g_settings_bind (dialog->settings, "show-mounts-only-mounted",
++                   dialog->unmounted_check, "active",
++                   G_SETTINGS_BIND_INVERT_BOOLEAN);
++
++  g_settings_bind (dialog->settings, "show-mounts-network",
++                   dialog->network_volumes_check, "active",
++                   G_SETTINGS_BIND_DEFAULT);
++
++  g_settings_bind (dialog->settings, "show-trash",
++                   dialog->trash_switch, "active",
++                   G_SETTINGS_BIND_DEFAULT);
++
++  return dialog;
++}
+diff --git a/panels/ubuntu/cc-ubuntu-dock-dialog.h b/panels/ubuntu/cc-ubuntu-dock-dialog.h
+new file mode 100644
+index 0000000..cd84651
+--- /dev/null
++++ b/panels/ubuntu/cc-ubuntu-dock-dialog.h
+@@ -0,0 +1,31 @@
++/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
++/*
++ * Copyright (C) 2022 Marco Trevisan <marco.trevisan@canonical.com>
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General
++ * Public License along with this library; if not, see <http://www.gnu.org/licenses/>.
++ *
++ */
++
++#pragma once
++
++#include <gtk/gtk.h>
++
++G_BEGIN_DECLS
++
++#define CC_TYPE_UBUNTU_DOCK_DIALOG (cc_ubuntu_dock_dialog_get_type ())
++G_DECLARE_FINAL_TYPE (CcUbuntuDockDialog, cc_ubuntu_dock_dialog, CC, UBUNTU_DOCK_DIALOG, GtkDialog)
++
++CcUbuntuDockDialog *cc_ubuntu_dock_dialog_new (GSettings *settings);
++
++G_END_DECLS
+diff --git a/panels/ubuntu/cc-ubuntu-dock-dialog.ui b/panels/ubuntu/cc-ubuntu-dock-dialog.ui
+new file mode 100644
+index 0000000..2b51182
+--- /dev/null
++++ b/panels/ubuntu/cc-ubuntu-dock-dialog.ui
+@@ -0,0 +1,81 @@
++<?xml version="1.0" encoding="UTF-8"?>
++<interface>
++  <template class="CcUbuntuDockDialog" parent="GtkDialog">
++    <property name="width_request">386</property>
++    <property name="can_focus">False</property>
++    <property name="modal">True</property>
++    <property name="destroy-with-parent">True</property>
++    <property name="hide-on-close">True</property>
++    <child internal-child="content_area">
++      <object class="GtkBox">
++        <property name="can_focus">False</property>
++        <property name="orientation">vertical</property>
++        <property name="spacing">2</property>
++        <child>
++          <object class="AdwPreferencesGroup">
++            <property name="margin-top">12</property>
++            <property name="margin-bottom">12</property>
++            <property name="margin-start">12</property>
++            <property name="margin-end">12</property>
++            <child>
++              <object class="CcListRow" id="volumes_switch">
++                <property name="use_underline">True</property>
++                <property name="can_focus">True</property>
++                <property name="show-switch">True</property>
++                <property name="title" translatable="yes">Show _Volumes and _Devices</property>
++              </object>
++            </child>
++            <child>
++              <object class="AdwActionRow" id="unmounted_row">
++                <property name="use_underline">True</property>
++                <property name="can_focus">True</property>
++                <property name="title" translatable="yes" context="ubuntu-dock">Include _Unmounted Volumes</property>
++                <property name="activatable">True</property>
++                <property name="activatable_widget">unmounted_check</property>
++                <property name="sensitive" bind-source="volumes_switch" bind-property="active" bind-flags="default|sync-create" />
++                <child type="prefix">
++                  <object class="GtkCheckButton" id="unmounted_check">
++                    <property name="can_focus">True</property>
++                    <property name="valign">center</property>
++                  </object>
++                </child>
++              </object>
++            </child>
++            <child>
++              <object class="AdwActionRow" id="network_volumes_row">
++                <property name="use_underline">True</property>
++                <property name="can_focus">True</property>
++                <property name="title" translatable="yes" context="ubuntu-dock">Include _Network Volumes</property>
++                <property name="activatable">True</property>
++                <property name="activatable_widget">network_volumes_check</property>
++                <property name="sensitive" bind-source="volumes_switch" bind-property="active" bind-flags="default|sync-create" />
++                <child type="prefix">
++                  <object class="GtkCheckButton" id="network_volumes_check">
++                    <property name="can_focus">True</property>
++                    <property name="valign">center</property>
++                  </object>
++                </child>
++              </object>
++            </child>
++          </object>
++        </child>
++        <child>
++          <object class="AdwPreferencesGroup">
++            <property name="margin-top">12</property>
++            <property name="margin-bottom">12</property>
++            <property name="margin-start">12</property>
++            <property name="margin-end">12</property>
++            <child>
++              <object class="CcListRow" id="trash_switch">
++                <property name="use_underline">True</property>
++                <property name="can_focus">True</property>
++                <property name="show-switch">True</property>
++                <property name="title" translatable="yes">Show _Trash</property>
++              </object>
++            </child>
++          </object>
++        </child>
++      </object>
++    </child>
++  </template>
++</interface>
+diff --git a/panels/ubuntu/cc-ubuntu-panel.c b/panels/ubuntu/cc-ubuntu-panel.c
+new file mode 100644
+index 0000000..5e02160
+--- /dev/null
++++ b/panels/ubuntu/cc-ubuntu-panel.c
+@@ -0,0 +1,1289 @@
++/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
++/*
++ * Copyright (C) 2017-2022 Canonical Ltd
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General
++ * Public License along with this library; if not, see <http://www.gnu.org/licenses/>.
++ *
++ */
++
++#include "config.h"
++
++#include <glib/gi18n-lib.h>
++#include <gio/gdesktopappinfo.h>
++
++#include "cc-list-row.h"
++#include "cc-ubuntu-panel.h"
++#include "cc-ubuntu-dock-dialog.h"
++#include "cc-ubuntu-resources.h"
++#include "shell/cc-application.h"
++#include "shell/cc-object-storage.h"
++
++#include "panels/display/cc-display-config-manager-dbus.h"
++#include "panels/display/cc-display-config.h"
++
++#define DING_SCHEMA "org.gnome.shell.extensions.ding"
++
++#define MIN_ICONSIZE 16.0
++#define MAX_ICONSIZE 64.0
++#define DEFAULT_ICONSIZE 48.0
++#define ICONSIZE_KEY "dash-max-icon-size"
++
++#define UBUNTU_DOCK_SCHEMA "org.gnome.shell.extensions.dash-to-dock"
++#define UBUNTU_DOCK_ALL_MONITORS_KEY "multi-monitor"
++#define UBUNTU_DOCK_PREFERRED_MONITOR_KEY "preferred-monitor"
++#define UBUNTU_DOCK_PREFERRED_CONNECTOR_KEY "preferred-monitor-by-connector"
++
++/*
++ * This allows to migrate settings from 'preferred-monitor' to
++ * 'preferred-monitor-by-connector', and can be removed after 22.04
++ * simplifying all the logic, by relying on connector names only.
++ */
++#define UBUNTU_DOCK_MONITOR_INDEX_USE_CONNECTOR -2
++
++struct _CcUbuntuPanel {
++  CcPanel                 parent_instance;
++
++  AdwPreferencesGroup    *ding_preferences_group;
++  GtkCenterBox           *no_settings_view;
++  AdwComboRow            *ding_icon_size_row;
++  AdwComboRow            *ding_icons_new_alignment_row;
++  CcListRow              *ding_showhome_switch;
++  AdwPreferencesGroup    *dock_preferences_group;
++  CcListRow              *dock_autohide_switch;
++  CcListRow              *dock_extendheight_switch;
++  AdwComboRow            *dock_monitor_row;
++  GListStore             *dock_monitors_list;
++  AdwComboRow            *dock_position_row;
++  GtkAdjustment          *icon_size_adjustment;
++  GtkScale               *icon_size_scale;
++
++  GSettings              *ding_settings;
++  GSettings              *dock_settings;
++  GSettings              *interface_settings;
++  GSettings              *gedit_settings;
++  CcDisplayConfigManager *display_config_manager;
++  CcDisplayConfig        *display_current_config;
++  GDBusProxy             *shell_proxy;
++
++  gboolean                updating;
++};
++
++CC_PANEL_REGISTER (CcUbuntuPanel, cc_ubuntu_panel);
++
++static void monitor_labeler_hide (CcUbuntuPanel *self);
++static void update_dock_monitor_combo_row_selection (CcUbuntuPanel *self);
++
++static void
++cc_ubuntu_panel_dispose (GObject *object)
++{
++  CcUbuntuPanel *self = CC_UBUNTU_PANEL (object);
++
++  monitor_labeler_hide (self);
++
++  g_clear_object (&self->ding_settings);
++  g_clear_object (&self->dock_settings);
++  g_clear_object (&self->dock_monitors_list);
++  g_clear_object (&self->interface_settings);
++  g_clear_object (&self->gedit_settings);
++  g_clear_object (&self->display_current_config);
++  g_clear_object (&self->display_config_manager);
++  g_clear_object (&self->shell_proxy);
++
++  G_OBJECT_CLASS (cc_ubuntu_panel_parent_class)->dispose (object);
++}
++
++static void
++monitor_labeler_hide (CcUbuntuPanel *self)
++{
++  if (!self->shell_proxy)
++    return;
++
++  g_dbus_proxy_call (self->shell_proxy,
++                     "HideMonitorLabels",
++                     NULL, G_DBUS_CALL_FLAGS_NONE,
++                     -1, NULL, NULL, NULL);
++}
++
++static void
++monitor_labeler_show (CcUbuntuPanel *self)
++{
++  GList *outputs, *l;
++  GVariantBuilder builder;
++  gint number = 0;
++  guint n_monitors = 0;
++
++  if (!self->shell_proxy || !self->display_current_config)
++    return;
++
++  outputs = cc_display_config_get_ui_sorted_monitors (self->display_current_config);
++  if (!outputs)
++    return;
++
++  if (cc_display_config_is_cloning (self->display_current_config))
++    return monitor_labeler_hide (self);
++
++  g_variant_builder_init (&builder, G_VARIANT_TYPE_TUPLE);
++  g_variant_builder_open (&builder, G_VARIANT_TYPE_ARRAY);
++
++  for (l = outputs; l != NULL; l = l->next)
++    {
++      CcDisplayMonitor *output = l->data;
++
++      if (!cc_display_monitor_is_active (output))
++        continue;
++
++      number = cc_display_monitor_get_ui_number (output);
++      if (number == 0)
++        continue;
++
++      g_variant_builder_add (&builder, "{sv}",
++                             cc_display_monitor_get_connector_name (output),
++                             g_variant_new_int32 (number));
++      n_monitors++;
++    }
++
++  g_variant_builder_close (&builder);
++
++  if (number < 2 || n_monitors < 2)
++    {
++      g_variant_builder_clear (&builder);
++      return monitor_labeler_hide (self);
++    }
++
++  g_dbus_proxy_call (self->shell_proxy,
++                     "ShowMonitorLabels",
++                     g_variant_builder_end (&builder),
++                     G_DBUS_CALL_FLAGS_NONE,
++                     -1, NULL, NULL, NULL);
++}
++
++static void
++ensure_monitor_labels (CcUbuntuPanel *self)
++{
++  g_autoptr(GList) windows = NULL;
++  GList *w;
++
++  windows = gtk_window_list_toplevels ();
++
++  for (w = windows; w; w = w->next)
++    {
++      if (gtk_window_is_active (GTK_WINDOW (w->data)))
++        {
++          monitor_labeler_show (self);
++          break;
++        }
++    }
++
++  if (!w)
++    monitor_labeler_hide (self);
++}
++
++static void
++shell_proxy_ready (GObject        *source,
++                   GAsyncResult   *res,
++                   CcUbuntuPanel *self)
++{
++  GDBusProxy *proxy;
++  g_autoptr(GError) error = NULL;
++
++  proxy = cc_object_storage_create_dbus_proxy_finish (res, &error);
++  if (!proxy)
++    {
++      if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
++        g_warning ("Failed to contact gnome-shell: %s", error->message);
++      return;
++    }
++
++  self->shell_proxy = proxy;
++
++  ensure_monitor_labels (self);
++}
++
++static GList *
++get_valid_monitors (CcUbuntuPanel   *self,
++                    gint            *n_monitors,
++                    gint            *primary_index)
++{
++  CcDisplayMonitor *primary_monitor;
++  GList *config_monitors = NULL;
++  GList *valid_monitors, *l;
++  gint n_valid_monitors;
++
++  config_monitors = cc_display_config_get_monitors (self->display_current_config);
++  primary_monitor = NULL;
++  valid_monitors = NULL;
++  n_valid_monitors = 0;
++
++  for (l = config_monitors; l != NULL; l = l->next)
++    {
++      CcDisplayMonitor *monitor = l->data;
++
++      if (!cc_display_monitor_is_active (monitor))
++        continue;
++
++      /* The default monitors list uses reversed order, so prepend to
++       * set it back to mutter order */
++      valid_monitors = g_list_prepend (valid_monitors, monitor);
++
++      if (cc_display_monitor_is_primary (monitor))
++        primary_monitor = monitor;
++
++      n_valid_monitors++;
++    }
++
++  if (n_monitors)
++    *n_monitors = n_valid_monitors;
++
++  if (primary_index)
++    *primary_index = g_list_index (valid_monitors, primary_monitor);
++
++  return valid_monitors;
++}
++
++static int
++ui_sort_monitor (gconstpointer a, gconstpointer b)
++{
++  CcDisplayMonitor *monitor_a = (CcDisplayMonitor *) a;
++  CcDisplayMonitor *monitor_b = (CcDisplayMonitor *) b;
++
++  return cc_display_monitor_get_ui_number (monitor_a) -
++         cc_display_monitor_get_ui_number (monitor_b);
++}
++
++static GList *
++get_valid_monitors_sorted (CcUbuntuPanel   *self,
++                           gint            *n_monitors,
++                           gint            *primary_index)
++{
++  GList *monitors = get_valid_monitors (self, n_monitors, primary_index);
++
++  return g_list_sort (monitors, ui_sort_monitor);
++}
++
++static int
++dock_monitor_to_id (gint index,
++                    gint primary_monitor,
++                    gint n_monitors)
++{
++  if (index < 0)
++    return -1;
++
++  /* The The dock uses the Gdk index for monitors, where the primary monitor
++   * always has index 0, so let's follow what dash-to-dock does in docking.js
++   * (as part of _createDocks) */
++  return (primary_monitor + index) % n_monitors;
++}
++
++typedef enum
++{
++  GSD_UBUNTU_DOCK_MONITOR_ALL,
++  GSD_UBUNTU_DOCK_MONITOR_PRIMARY,
++} GsdUbuntuDockMonitor;
++
++static char *
++get_dock_monitor_value_object_name (GObject *object_value,
++                                    CcUbuntuPanel *self)
++{
++  if (GTK_IS_STRING_OBJECT (object_value))
++    {
++      GtkStringObject *string_object = GTK_STRING_OBJECT (object_value);
++
++      return g_strdup (gtk_string_object_get_string (string_object));
++    }
++
++  if (CC_IS_DISPLAY_MONITOR (object_value))
++    {
++      CcDisplayMonitor *monitor = CC_DISPLAY_MONITOR (object_value);
++      int monitor_number = cc_display_monitor_get_ui_number (monitor);
++      const char *monitor_name = cc_display_monitor_get_display_name (monitor);
++
++      if (gtk_widget_get_state_flags (GTK_WIDGET (self)) & GTK_STATE_FLAG_DIR_LTR)
++        return g_strdup_printf ("%d. %s", monitor_number, monitor_name);
++      else
++        return g_strdup_printf ("%s .%d", monitor_name, monitor_number);
++    }
++
++  g_return_val_if_reached (NULL);
++}
++
++static GtkStringObject *
++new_take_string_object (char *label)
++{
++  g_autofree char *string = g_steal_pointer (&label);
++  return gtk_string_object_new (string);
++}
++
++static void
++populate_dock_monitor_combo_row (CcUbuntuPanel *self)
++{
++  g_autoptr(CcDisplayMonitor) primary_monitor = NULL;
++  g_autoptr(GList) valid_monitors = NULL;
++  g_autoptr(GtkStringObject) primary_value_object = NULL;
++  g_autoptr(GtkStringObject) all_displays_value_object = NULL;
++  GList *l;
++  gint index;
++
++  if (self->display_config_manager == NULL)
++    return;
++
++  g_list_store_remove_all (self->dock_monitors_list);
++
++  valid_monitors = get_valid_monitors_sorted (self, NULL, NULL);
++  gtk_widget_set_visible (GTK_WIDGET (self->dock_monitor_row), valid_monitors != NULL);
++
++  if (!valid_monitors)
++    return;
++
++  all_displays_value_object = gtk_string_object_new (_("All displays"));
++  g_list_store_insert (self->dock_monitors_list,
++                       GSD_UBUNTU_DOCK_MONITOR_ALL,
++                       all_displays_value_object);
++
++  for (l = valid_monitors, index = 0; l != NULL; l = l->next, index++)
++    {
++      CcDisplayMonitor *monitor = l->data;
++
++      if (cc_display_monitor_is_primary (monitor))
++        g_set_object (&primary_monitor, monitor);
++
++      g_list_store_append (self->dock_monitors_list, monitor);
++    }
++
++  if (primary_monitor)
++    {
++      int ui_number = cc_display_monitor_get_ui_number (primary_monitor);
++
++      if (gtk_widget_get_state_flags (GTK_WIDGET (self)) & GTK_STATE_FLAG_DIR_LTR)
++        {
++          primary_value_object = new_take_string_object (
++            g_strdup_printf ("%s (%d)", _("Primary Display"), ui_number));
++        }
++      else
++        {
++          primary_value_object = new_take_string_object (
++            g_strdup_printf ("(%d) %s", ui_number, _("Primary Display")));
++        }
++    }
++  else
++    {
++      primary_value_object = gtk_string_object_new (_("Primary Display"));
++    }
++
++  g_list_store_insert (self->dock_monitors_list,
++                       GSD_UBUNTU_DOCK_MONITOR_PRIMARY,
++                       primary_value_object);
++}
++
++static void
++on_screen_changed (CcUbuntuPanel *self)
++{
++  g_autoptr(CcDisplayConfig) current = NULL;
++
++  if (self->display_config_manager == NULL || !self->dock_settings)
++    return;
++
++  current = cc_display_config_manager_get_current (self->display_config_manager);
++  if (current == NULL)
++    return;
++
++  self->updating = TRUE;
++
++  g_set_object (&self->display_current_config, current);
++
++  populate_dock_monitor_combo_row (self);
++  ensure_monitor_labels (self);
++
++  self->updating = FALSE;
++
++  update_dock_monitor_combo_row_selection (self);
++}
++
++static void
++session_bus_ready (GObject        *source,
++                   GAsyncResult   *res,
++                   gpointer        user_data)
++{
++  CcUbuntuPanel *self = user_data;
++  GDBusConnection *bus;
++  g_autoptr(GError) error = NULL;
++
++  bus = g_bus_get_finish (res, &error);
++  if (!bus)
++    {
++      if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
++        g_warning ("Failed to get session bus: %s", error->message);
++      return;
++    }
++
++  self->display_config_manager = cc_display_config_manager_dbus_new ();
++  g_signal_connect_object (self->display_config_manager, "changed",
++                           G_CALLBACK (on_screen_changed),
++                           self,
++                           G_CONNECT_SWAPPED);
++}
++
++static void
++icon_size_widget_refresh (CcUbuntuPanel *self)
++{
++  gint value = g_settings_get_int (self->dock_settings, ICONSIZE_KEY);
++  gtk_adjustment_set_value (self->icon_size_adjustment, (gdouble) value / 2);
++}
++
++static gchar *
++on_icon_size_format_value (GtkScale *scale,
++                           gdouble value,
++                           gpointer data)
++{
++  return g_strdup_printf ("%d", (int)value * 2);
++}
++
++static void
++on_icon_size_adjustment_value_changed (CcUbuntuPanel *self)
++{
++  if (!self->dock_settings)
++    return;
++
++  gint value = (gint)gtk_adjustment_get_value (self->icon_size_adjustment) * 2;
++  if (g_settings_get_int (self->dock_settings, ICONSIZE_KEY) != value)
++    g_settings_set_int (self->dock_settings, ICONSIZE_KEY, value);
++}
++
++static void
++on_dock_monitor_row_changed (CcUbuntuPanel *self)
++{
++  gboolean ubuntu_dock_on_all_monitors;
++  g_autofree char *ubuntu_dock_current_connector = NULL;
++  int selected;
++
++  if (self->updating || !self->dock_settings)
++    return;
++
++  selected = adw_combo_row_get_selected (self->dock_monitor_row);
++  if (selected < 0)
++    return;
++
++  ubuntu_dock_on_all_monitors =
++    g_settings_get_boolean (self->dock_settings, UBUNTU_DOCK_ALL_MONITORS_KEY);
++  ubuntu_dock_current_connector =
++    g_settings_get_string (self->dock_settings, UBUNTU_DOCK_PREFERRED_CONNECTOR_KEY);
++  if (selected == GSD_UBUNTU_DOCK_MONITOR_ALL)
++    {
++      if (!ubuntu_dock_on_all_monitors)
++        {
++          g_settings_set_boolean (self->dock_settings,
++                                  UBUNTU_DOCK_ALL_MONITORS_KEY,
++                                  TRUE);
++          g_settings_apply (self->dock_settings);
++        }
++    }
++  else
++    {
++      g_autoptr(GSettings) delayed_settings = g_settings_new (UBUNTU_DOCK_SCHEMA);
++      g_settings_delay (delayed_settings);
++      g_autofree char *connector_name = NULL;
++
++      if (ubuntu_dock_on_all_monitors)
++        g_settings_set_boolean (delayed_settings, UBUNTU_DOCK_ALL_MONITORS_KEY, FALSE);
++
++      if (selected == GSD_UBUNTU_DOCK_MONITOR_PRIMARY)
++        {
++          connector_name = g_strdup ("primary");
++        }
++      else
++        {
++          g_autoptr(GObject) value_object = NULL;
++          g_autoptr(CcDisplayMonitor) monitor = NULL;
++
++          monitor = g_list_model_get_item (G_LIST_MODEL (self->dock_monitors_list),
++                                           selected);
++          connector_name = g_strdup (cc_display_monitor_get_connector_name (monitor));
++        }
++
++      if (g_strcmp0 (ubuntu_dock_current_connector, connector_name) != 0)
++        {
++          g_settings_set_int (delayed_settings, UBUNTU_DOCK_PREFERRED_MONITOR_KEY,
++                                                UBUNTU_DOCK_MONITOR_INDEX_USE_CONNECTOR);
++          g_settings_set_string (delayed_settings, UBUNTU_DOCK_PREFERRED_CONNECTOR_KEY,
++                                 connector_name);
++        }
++
++      g_settings_apply (delayed_settings);
++    }
++}
++
++static void
++on_dock_behavior_row_activated (CcUbuntuPanel *self)
++{
++  CcShell *shell = cc_panel_get_shell (CC_PANEL (self));
++  CcUbuntuDockDialog *dialog;
++
++  dialog = cc_ubuntu_dock_dialog_new (self->dock_settings);
++  gtk_window_set_transient_for (GTK_WINDOW (dialog),
++                                GTK_WINDOW (cc_shell_get_toplevel (shell)));
++  gtk_widget_set_visible (GTK_WIDGET (dialog), TRUE);
++}
++
++static CcDisplayMonitor *
++get_dock_monitor (CcUbuntuPanel *self)
++{
++  g_autoptr(GList) monitors = NULL;
++  int index;
++  int n_monitors;
++  int primary_monitor;
++
++  monitors = get_valid_monitors_sorted (self, &n_monitors, &primary_monitor);
++  index = g_settings_get_int (self->dock_settings, UBUNTU_DOCK_PREFERRED_MONITOR_KEY);
++
++  if (index == UBUNTU_DOCK_MONITOR_INDEX_USE_CONNECTOR)
++    {
++      g_autofree char *connector = NULL;
++      GList *l;
++      int i;
++
++      connector = g_settings_get_string (self->dock_settings,
++                                         UBUNTU_DOCK_PREFERRED_CONNECTOR_KEY);
++
++      for (l = monitors, i = 0; l; l = l->next, i++)
++        {
++          CcDisplayMonitor *monitor = l->data;
++          const char *monitor_connector = cc_display_monitor_get_connector_name (monitor);
++          if (g_strcmp0 (monitor_connector, connector) == 0)
++            return g_object_ref (monitor);
++        }
++    }
++
++  if (index < 0 || index >= n_monitors)
++    return NULL;
++
++  index = dock_monitor_to_id (index, primary_monitor, n_monitors);
++
++  return g_object_ref (g_list_nth_data (monitors, index));
++}
++
++static gboolean
++dock_placement_row_compare (gconstpointer a, gconstpointer b)
++{
++  GObject *row_object_a = G_OBJECT (a);
++  GObject *row_object_b = G_OBJECT (b);
++
++  if (row_object_a == NULL || row_object_b == NULL)
++    return row_object_a == row_object_b;
++
++  if (G_OBJECT_TYPE (row_object_a) != G_OBJECT_TYPE (row_object_b))
++    return FALSE;
++
++  if (CC_IS_DISPLAY_MONITOR (row_object_a))
++    {
++      return cc_display_monitor_get_ui_number (CC_DISPLAY_MONITOR (row_object_a)) ==
++             cc_display_monitor_get_ui_number (CC_DISPLAY_MONITOR (row_object_b));
++    }
++
++  if (GTK_IS_STRING_OBJECT (row_object_a))
++    {
++      return g_strcmp0 (gtk_string_object_get_string (GTK_STRING_OBJECT (row_object_a)),
++                        gtk_string_object_get_string (GTK_STRING_OBJECT (row_object_b))) == 0;
++    }
++
++  g_return_val_if_reached (FALSE);
++}
++
++static void
++update_dock_monitor_combo_row_selection (CcUbuntuPanel *self)
++{
++  guint selection = GSD_UBUNTU_DOCK_MONITOR_PRIMARY;
++
++  if (g_settings_get_boolean (self->dock_settings, UBUNTU_DOCK_ALL_MONITORS_KEY))
++    {
++      selection = GSD_UBUNTU_DOCK_MONITOR_ALL;
++    }
++  else
++    {
++      g_autoptr (CcDisplayMonitor) monitor = get_dock_monitor (self);
++
++      if (monitor)
++        {
++          if (!g_list_store_find_with_equal_func (self->dock_monitors_list,
++                                                  monitor,
++                                                  dock_placement_row_compare,
++                                                  &selection))
++            selection = GSD_UBUNTU_DOCK_MONITOR_PRIMARY;
++        }
++    }
++
++  adw_combo_row_set_selected (self->dock_monitor_row, selection);
++}
++
++static void
++cc_ubuntu_panel_class_init (CcUbuntuPanelClass *klass)
++{
++  GObjectClass *object_class = G_OBJECT_CLASS (klass);
++  GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
++
++  object_class->dispose = cc_ubuntu_panel_dispose;
++
++  gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/control-center/ubuntu/cc-ubuntu-panel.ui");
++
++  gtk_widget_class_bind_template_child (widget_class, CcUbuntuPanel, no_settings_view);
++  gtk_widget_class_bind_template_child (widget_class, CcUbuntuPanel, ding_preferences_group);
++  gtk_widget_class_bind_template_child (widget_class, CcUbuntuPanel, ding_icon_size_row);
++  gtk_widget_class_bind_template_child (widget_class, CcUbuntuPanel, ding_icons_new_alignment_row);
++  gtk_widget_class_bind_template_child (widget_class, CcUbuntuPanel, ding_showhome_switch);
++  gtk_widget_class_bind_template_child (widget_class, CcUbuntuPanel, dock_preferences_group);
++  gtk_widget_class_bind_template_child (widget_class, CcUbuntuPanel, dock_autohide_switch);
++  gtk_widget_class_bind_template_child (widget_class, CcUbuntuPanel, dock_extendheight_switch);
++  gtk_widget_class_bind_template_child (widget_class, CcUbuntuPanel, dock_monitor_row);
++  gtk_widget_class_bind_template_child (widget_class, CcUbuntuPanel, dock_position_row);
++  gtk_widget_class_bind_template_child (widget_class, CcUbuntuPanel, icon_size_adjustment);
++  gtk_widget_class_bind_template_child (widget_class, CcUbuntuPanel, icon_size_scale);
++
++  gtk_widget_class_bind_template_callback (widget_class, on_dock_monitor_row_changed);
++  gtk_widget_class_bind_template_callback (widget_class, on_dock_behavior_row_activated);
++  gtk_widget_class_bind_template_callback (widget_class, on_icon_size_adjustment_value_changed);
++}
++
++static void
++mapped_cb (CcUbuntuPanel *self)
++{
++  CcShell *shell;
++  GtkWidget *toplevel;
++
++  shell = cc_panel_get_shell (CC_PANEL (self));
++  toplevel = cc_shell_get_toplevel (shell);
++
++  g_signal_handlers_disconnect_by_func (toplevel, mapped_cb, self);
++  g_signal_connect_object (toplevel, "notify::has-toplevel-focus",
++                           G_CALLBACK (ensure_monitor_labels), self,
++                           G_CONNECT_SWAPPED);
++}
++
++typedef enum
++{
++  GSD_UBUNTU_DOCK_POSITION_TOP,
++  GSD_UBUNTU_DOCK_POSITION_RIGHT,
++  GSD_UBUNTU_DOCK_POSITION_BOTTOM,
++  GSD_UBUNTU_DOCK_POSITION_LEFT,
++
++  GSD_UBUNTU_DOCK_POSITION_FIRST = GSD_UBUNTU_DOCK_POSITION_RIGHT,
++} GsdUbuntuDockPosition;
++
++static GsdUbuntuDockPosition
++get_dock_position_for_direction (CcUbuntuPanel         *self,
++                                 GsdUbuntuDockPosition  position)
++{
++  if (gtk_widget_get_state_flags (GTK_WIDGET (self)) & GTK_STATE_FLAG_DIR_RTL)
++    {
++      switch (position)
++        {
++          case GSD_UBUNTU_DOCK_POSITION_RIGHT:
++            position = GSD_UBUNTU_DOCK_POSITION_LEFT;
++            break;
++          case GSD_UBUNTU_DOCK_POSITION_LEFT:
++            position = GSD_UBUNTU_DOCK_POSITION_LEFT;
++            break;
++          default:
++            break;
++        }
++    }
++
++  return position;
++}
++
++static const char *
++get_dock_position_string (GsdUbuntuDockPosition  position)
++{
++  switch (position)
++    {
++      case GSD_UBUNTU_DOCK_POSITION_TOP:
++        return "TOP";
++      case GSD_UBUNTU_DOCK_POSITION_RIGHT:
++        return "RIGHT";
++      case GSD_UBUNTU_DOCK_POSITION_BOTTOM:
++        return "BOTTOM";
++      case GSD_UBUNTU_DOCK_POSITION_LEFT:
++        return "LEFT";
++      default:
++        g_return_val_if_reached ("LEFT");
++    }
++}
++
++static GsdUbuntuDockPosition
++get_dock_position_from_string (const char *position)
++{
++  if (g_str_equal (position, "TOP"))
++    return GSD_UBUNTU_DOCK_POSITION_TOP;
++
++  if (g_str_equal (position, "RIGHT"))
++    return GSD_UBUNTU_DOCK_POSITION_RIGHT;
++
++  if (g_str_equal (position, "BOTTOM"))
++    return GSD_UBUNTU_DOCK_POSITION_BOTTOM;
++
++  if (g_str_equal (position, "LEFT"))
++    return GSD_UBUNTU_DOCK_POSITION_LEFT;
++
++  g_return_val_if_reached (GSD_UBUNTU_DOCK_POSITION_LEFT);
++}
++
++static GsdUbuntuDockPosition
++get_dock_position_row_position (CcUbuntuPanel *self,
++                                int            index)
++{
++  GListModel *model = adw_combo_row_get_model (self->dock_position_row);
++  g_autoptr(GObject) value_object = g_list_model_get_item (model, index);
++
++  return GPOINTER_TO_INT (g_object_get_data (G_OBJECT (value_object), "position"));
++}
++
++static int
++get_dock_position_row_index (CcUbuntuPanel         *self,
++                             GsdUbuntuDockPosition  position)
++{
++  GListModel *model = adw_combo_row_get_model (self->dock_position_row);
++  guint n_items;
++  guint i;
++
++  n_items = g_list_model_get_n_items (model);
++
++  if (position == GSD_UBUNTU_DOCK_POSITION_TOP)
++    return n_items;
++
++  for (i = 0; i < n_items; i++)
++    {
++      g_autoptr(GObject) value_object = g_list_model_get_item (model, i);
++      GsdUbuntuDockPosition item_position;
++
++      item_position = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (value_object), "position"));
++
++      if (item_position == position)
++        return i;
++    }
++
++  g_return_val_if_reached (n_items);
++}
++
++static gboolean
++dock_position_get_mapping (GValue   *value,
++                           GVariant *variant,
++                           gpointer  user_data)
++{
++  CcUbuntuPanel *self = user_data;
++  GsdUbuntuDockPosition position;
++
++  position = get_dock_position_from_string (g_variant_get_string (variant, NULL));
++  position = get_dock_position_for_direction (self, position);
++
++  if (G_VALUE_TYPE (value) == G_TYPE_UINT)
++    {
++      g_value_set_uint (value, get_dock_position_row_index (self, position));
++      return TRUE;
++    }
++  else if (G_VALUE_TYPE (value) == G_TYPE_STRING)
++    {
++      g_value_set_string (value, get_dock_position_string (position));
++      return TRUE;
++    }
++
++  return FALSE;
++}
++
++static GVariant *
++dock_position_set_mapping (const GValue       *value,
++                           const GVariantType *type,
++                           gpointer            user_data)
++{
++  CcUbuntuPanel *self = user_data;
++  GsdUbuntuDockPosition position;
++
++  position = get_dock_position_row_position (self, g_value_get_uint (value));
++  position = get_dock_position_for_direction (self, position);
++
++  return g_variant_new_string (get_dock_position_string (position));
++}
++
++static void
++populate_dock_position_row (AdwComboRow *combo_row)
++{
++  g_autoptr (GtkStringList) string_list = NULL;
++  struct {
++    char *name;
++    GsdUbuntuDockPosition position;
++  } positions[] = {
++    {
++      NC_("Position on screen for the Ubuntu dock", "Left"),
++          GSD_UBUNTU_DOCK_POSITION_LEFT,
++    },
++    {
++      NC_("Position on screen for the Ubuntu dock", "Bottom"),
++          GSD_UBUNTU_DOCK_POSITION_BOTTOM,
++    },
++    {
++      NC_("Position on screen for the Ubuntu dock", "Right"),
++          GSD_UBUNTU_DOCK_POSITION_RIGHT,
++    },
++  };
++  guint i;
++
++  string_list = gtk_string_list_new (NULL);
++  for (i = 0; i < G_N_ELEMENTS (positions); i++)
++    {
++      g_autoptr (GObject) value_object = NULL;
++
++      gtk_string_list_append (string_list, g_dpgettext2 (NULL, "Position on screen for the Ubuntu dock", positions[i].name));
++      value_object = g_list_model_get_item (G_LIST_MODEL (string_list), i);
++      g_object_set_data (value_object, "position",
++                         GUINT_TO_POINTER (positions[i].position));
++    }
++
++  adw_combo_row_set_model (combo_row, G_LIST_MODEL (string_list));
++}
++
++typedef enum
++{
++  UBUNTU_DING_ICONS_SIZE_SMALL,
++  UBUNTU_DING_ICONS_SIZE_STANDARD,
++  UBUNTU_DING_ICONS_SIZE_LARGE,
++  UBUNTU_DING_ICONS_SIZE_TINY,
++} UbuntuDingIconsSize;
++
++static const char *
++get_ding_size_string (UbuntuDingIconsSize size)
++{
++  switch (size)
++    {
++      case UBUNTU_DING_ICONS_SIZE_TINY:
++        return "tiny";
++      case UBUNTU_DING_ICONS_SIZE_SMALL:
++        return "small";
++      case UBUNTU_DING_ICONS_SIZE_STANDARD:
++        return "standard";
++      case UBUNTU_DING_ICONS_SIZE_LARGE:
++        return "large";
++      default:
++        g_return_val_if_reached ("standard");
++    }
++}
++
++static UbuntuDingIconsSize
++get_ding_size_from_string (const char *size)
++{
++  if (g_str_equal (size, "tiny"))
++    return UBUNTU_DING_ICONS_SIZE_TINY;
++
++  if (g_str_equal (size, "small"))
++    return UBUNTU_DING_ICONS_SIZE_SMALL;
++
++  if (g_str_equal (size, "standard"))
++    return UBUNTU_DING_ICONS_SIZE_STANDARD;
++
++  if (g_str_equal (size, "large"))
++    return UBUNTU_DING_ICONS_SIZE_LARGE;
++
++  g_return_val_if_reached (UBUNTU_DING_ICONS_SIZE_STANDARD);
++}
++
++static int
++get_ding_size_row_index (CcUbuntuPanel       *self,
++                         UbuntuDingIconsSize  size)
++{
++  GListModel *model = adw_combo_row_get_model (self->ding_icon_size_row);
++  guint n_items;
++  guint i;
++
++  n_items = g_list_model_get_n_items (model);
++
++  for (i = 0; i < n_items; i++)
++    {
++      g_autoptr(GObject) value_object = g_list_model_get_item (model, i);
++      UbuntuDingIconsSize item_size;
++
++      item_size = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (value_object), "size"));
++
++      if (item_size == size)
++        return i;
++    }
++
++  g_return_val_if_reached (0);
++}
++
++static gboolean
++ding_size_get_mapping (GValue   *value,
++                       GVariant *variant,
++                       gpointer  user_data)
++{
++  CcUbuntuPanel *self = user_data;
++  UbuntuDingIconsSize size = 0;
++
++  size = get_ding_size_from_string (g_variant_get_string (variant, NULL));
++
++  if (G_VALUE_TYPE (value) == G_TYPE_UINT)
++    {
++      g_value_set_uint (value, get_ding_size_row_index (self, size));
++      return TRUE;
++    }
++  else if (G_VALUE_TYPE (value) == G_TYPE_STRING)
++    {
++      g_value_set_string (value, get_ding_size_string (size));
++      return TRUE;
++    }
++
++  return FALSE;
++}
++
++static GVariant *
++ding_size_set_mapping (const GValue           *value,
++                           const GVariantType *type,
++                           gpointer            user_data)
++{
++  UbuntuDingIconsSize size = g_value_get_uint (value);
++
++  return g_variant_new_string (get_ding_size_string (size));
++}
++
++static void
++populate_ding_size_row (AdwComboRow *combo_row)
++{
++  g_autoptr (GtkStringList) string_list = NULL;
++  struct {
++    char *name;
++    UbuntuDingIconsSize size;
++  } sizes[] = {
++    {
++      NC_("Size of the desktop icons", "Small"),
++          UBUNTU_DING_ICONS_SIZE_SMALL,
++    },
++    {
++      NC_("Size of the desktop icons", "Normal"),
++          UBUNTU_DING_ICONS_SIZE_STANDARD,
++    },
++    {
++      NC_("Size of the desktop icons", "Large"),
++          UBUNTU_DING_ICONS_SIZE_LARGE,
++    },
++    {
++      NC_("Size of the desktop icons", "Tiny"),
++          UBUNTU_DING_ICONS_SIZE_TINY,
++    },
++  };
++  guint i;
++
++  string_list = gtk_string_list_new (NULL);
++  for (i = 0; i < G_N_ELEMENTS (sizes); i++)
++    {
++      g_autoptr (GObject) value_object = NULL;
++
++      gtk_string_list_append (string_list, g_dpgettext2 (NULL, "Size of the desktop icons", sizes[i].name));
++      value_object = g_list_model_get_item (G_LIST_MODEL (string_list), i);
++      g_object_set_data (value_object, "size",
++                         GUINT_TO_POINTER (sizes[i].size));
++    }
++
++  adw_combo_row_set_model (combo_row, G_LIST_MODEL (string_list));
++}
++
++typedef enum
++{
++  UBUNTU_DING_START_CORNER_TOP_LEFT,
++  UBUNTU_DING_START_CORNER_TOP_RIGHT,
++  UBUNTU_DING_START_CORNER_BOTTOM_LEFT,
++  UBUNTU_DING_START_CORNER_BOTTOM_RIGHT,
++} UbuntuDingStartCorner;
++
++static const char *
++get_ding_start_corner_string (UbuntuDingStartCorner corner)
++{
++  switch (corner)
++    {
++      case UBUNTU_DING_START_CORNER_TOP_LEFT:
++        return "top-left";
++      case UBUNTU_DING_START_CORNER_TOP_RIGHT:
++        return "top-right";
++      case UBUNTU_DING_START_CORNER_BOTTOM_LEFT:
++        return "bottom-left";
++      case UBUNTU_DING_START_CORNER_BOTTOM_RIGHT:
++        return "bottom-right";
++      default:
++        g_return_val_if_reached ("standard");
++    }
++}
++
++static UbuntuDingStartCorner
++get_ding_start_corner_from_string (const char *corner)
++{
++  if (g_str_equal (corner, "top-left"))
++    return UBUNTU_DING_START_CORNER_TOP_LEFT;
++
++  if (g_str_equal (corner, "top-right"))
++    return UBUNTU_DING_START_CORNER_TOP_RIGHT;
++
++  if (g_str_equal (corner, "bottom-left"))
++    return UBUNTU_DING_START_CORNER_BOTTOM_LEFT;
++
++  if (g_str_equal (corner, "bottom-right"))
++    return UBUNTU_DING_START_CORNER_BOTTOM_RIGHT;
++
++  g_warning("Value is %s", corner);
++
++  g_return_val_if_reached (UBUNTU_DING_START_CORNER_BOTTOM_RIGHT);
++}
++
++static int
++ding_start_corner_get_row_index (CcUbuntuPanel         *self,
++                                 UbuntuDingStartCorner  corner)
++{
++  GListModel *model = adw_combo_row_get_model (self->ding_icons_new_alignment_row);
++  guint n_items;
++  guint i;
++
++  n_items = g_list_model_get_n_items (model);
++
++  for (i = 0; i < n_items; i++)
++    {
++      g_autoptr(GObject) value_object = g_list_model_get_item (model, i);
++      UbuntuDingStartCorner item_corner;
++
++      item_corner = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (value_object), "corner"));
++
++      if (item_corner == corner)
++        return i;
++    }
++
++  g_return_val_if_reached (0);
++}
++
++static gboolean
++ding_start_corner_get_mapping (GValue   *value,
++                               GVariant *variant,
++                               gpointer  user_data)
++{
++  CcUbuntuPanel *self = user_data;
++  UbuntuDingStartCorner corner = 0;
++
++  corner = get_ding_start_corner_from_string (g_variant_get_string (variant, NULL));
++
++  if (G_VALUE_TYPE (value) == G_TYPE_UINT)
++    {
++      g_value_set_uint (value, ding_start_corner_get_row_index (self, corner));
++      return TRUE;
++    }
++  else if (G_VALUE_TYPE (value) == G_TYPE_STRING)
++    {
++      g_value_set_string (value, get_ding_start_corner_string (corner));
++      return TRUE;
++    }
++
++  return FALSE;
++}
++
++static GVariant *
++ding_start_corner_set_mapping (const GValue       *value,
++                               const GVariantType *type,
++                               gpointer            user_data)
++{
++  UbuntuDingStartCorner corner = g_value_get_uint (value);
++
++  return g_variant_new_string (get_ding_start_corner_string (corner));
++}
++
++static void
++populate_ding_start_corner_row (AdwComboRow *combo_row)
++{
++  g_autoptr (GtkStringList) string_list = NULL;
++  struct {
++    char *name;
++    UbuntuDingStartCorner corner;
++  } corners[] = {
++    {
++      NC_("Alignment of new desktop icons", "Top Left"),
++          UBUNTU_DING_START_CORNER_TOP_LEFT,
++    },
++    {
++      NC_("Alignment of new desktop icons", "Top Right"),
++          UBUNTU_DING_START_CORNER_TOP_RIGHT,
++    },
++    {
++      NC_("Alignment of new desktop icons", "Bottom Left"),
++          UBUNTU_DING_START_CORNER_BOTTOM_LEFT,
++    },
++    {
++      NC_("Alignment of new desktop icons", "Bottom Right"),
++          UBUNTU_DING_START_CORNER_BOTTOM_RIGHT,
++    },
++  };
++  guint i;
++
++  string_list = gtk_string_list_new (NULL);
++  for (i = 0; i < G_N_ELEMENTS (corners); i++)
++    {
++      g_autoptr(GObject) value_object = NULL;
++
++      gtk_string_list_append (string_list, g_dpgettext2 (NULL, "Alignment of new desktop icons", corners[i].name));
++      value_object = g_list_model_get_item (G_LIST_MODEL (string_list), i);
++      g_object_set_data (value_object, "corner",
++                         GUINT_TO_POINTER (corners[i].corner));
++    }
++
++  adw_combo_row_set_model (combo_row, G_LIST_MODEL (string_list));
++}
++
++static void
++cc_ubuntu_panel_init (CcUbuntuPanel *self)
++{
++  GSettingsSchemaSource *schema_source = g_settings_schema_source_get_default ();
++  g_autoptr(GSettingsSchema) schema = NULL;
++
++  g_resources_register (cc_ubuntu_get_resource ());
++
++  gtk_widget_init_template (GTK_WIDGET (self));
++
++  /* Only load if we ding installed */
++  schema = g_settings_schema_source_lookup (schema_source, DING_SCHEMA, TRUE);
++  if (schema)
++    {
++      self->ding_settings = g_settings_new_full (schema, NULL, NULL);
++
++      populate_ding_size_row (self->ding_icon_size_row);
++      g_settings_bind_with_mapping (self->ding_settings, "icon-size",
++                                    self->ding_icon_size_row, "selected",
++                                    G_SETTINGS_BIND_DEFAULT,
++                                    ding_size_get_mapping,
++                                    ding_size_set_mapping,
++                                    self, NULL);
++
++      populate_ding_start_corner_row (self->ding_icons_new_alignment_row);
++      g_settings_bind_with_mapping (self->ding_settings, "start-corner",
++                                    self->ding_icons_new_alignment_row, "selected",
++                                    G_SETTINGS_BIND_DEFAULT,
++                                    ding_start_corner_get_mapping,
++                                    ding_start_corner_set_mapping,
++                                    self, NULL);
++
++      g_settings_bind (self->ding_settings, "show-home",
++                       self->ding_showhome_switch, "active",
++                       G_SETTINGS_BIND_DEFAULT);
++    }
++  else
++    {
++      g_warning ("No Ding is installed here. Please fix your installation.");
++      gtk_widget_set_visible (GTK_WIDGET (self->ding_preferences_group), FALSE);
++    }
++
++  /* Only load if we have ubuntu dock or dash to dock installed */
++  schema = g_settings_schema_source_lookup (schema_source, UBUNTU_DOCK_SCHEMA, TRUE);
++  if (schema)
++    {
++      GtkExpression *expression;
++
++      self->dock_settings = g_settings_new_full (schema, NULL, NULL);
++      self->dock_monitors_list = g_list_store_new (G_TYPE_OBJECT);
++
++      expression = gtk_cclosure_expression_new (G_TYPE_STRING,
++                                                NULL, 0, NULL,
++                                                G_CALLBACK (get_dock_monitor_value_object_name),
++                                                self, NULL);
++      adw_combo_row_set_expression (self->dock_monitor_row, expression);
++
++      self->updating = TRUE;
++      adw_combo_row_set_model (self->dock_monitor_row,
++                               G_LIST_MODEL (self->dock_monitors_list));
++      self->updating = FALSE;
++
++      populate_dock_position_row (self->dock_position_row);
++
++      g_signal_connect_object (self->dock_settings,
++                               "changed::" ICONSIZE_KEY,
++                               G_CALLBACK (icon_size_widget_refresh),
++                               self, G_CONNECT_SWAPPED);
++      g_signal_connect_object (self->dock_settings,
++                               "changed::" UBUNTU_DOCK_ALL_MONITORS_KEY,
++                               G_CALLBACK (update_dock_monitor_combo_row_selection),
++                               self, G_CONNECT_SWAPPED);
++      g_signal_connect_object (self->dock_settings,
++                               "changed::" UBUNTU_DOCK_PREFERRED_MONITOR_KEY,
++                               G_CALLBACK (update_dock_monitor_combo_row_selection),
++                               self, G_CONNECT_SWAPPED);
++      g_signal_connect_object (self->dock_settings,
++                               "changed::" UBUNTU_DOCK_PREFERRED_CONNECTOR_KEY,
++                               G_CALLBACK (update_dock_monitor_combo_row_selection),
++                               self, G_CONNECT_SWAPPED);
++      g_settings_bind_with_mapping (self->dock_settings, "dock-position",
++                                    self->dock_position_row, "selected",
++                                    G_SETTINGS_BIND_DEFAULT,
++                                    dock_position_get_mapping,
++                                    dock_position_set_mapping,
++                                    self, NULL);
++      g_settings_bind (self->dock_settings, "dock-fixed",
++                       self->dock_autohide_switch, "active",
++                       G_SETTINGS_BIND_INVERT_BOOLEAN);
++      g_settings_bind (self->dock_settings, "extend-height",
++                       self->dock_extendheight_switch, "active",
++                       G_SETTINGS_BIND_DEFAULT);
++
++      /* Icon size change - we halve the sizes so we can only get even values */
++      gtk_adjustment_set_value (self->icon_size_adjustment, DEFAULT_ICONSIZE / 2);
++      gtk_adjustment_set_lower (self->icon_size_adjustment, MIN_ICONSIZE / 2);
++      gtk_adjustment_set_upper (self->icon_size_adjustment, MAX_ICONSIZE / 2);
++      gtk_scale_add_mark (self->icon_size_scale, DEFAULT_ICONSIZE / 2, GTK_POS_BOTTOM, NULL);
++      gtk_scale_set_format_value_func (self->icon_size_scale,
++                                       on_icon_size_format_value,
++                                       NULL, NULL);
++
++      icon_size_widget_refresh (self);
++
++      g_bus_get (G_BUS_TYPE_SESSION, NULL, session_bus_ready, self);
++    }
++  else
++    {
++      g_warning ("No Ubuntu Dock is installed here. Panel disabled. Please fix your installation.");
++      gtk_widget_set_visible (GTK_WIDGET (self->dock_preferences_group), FALSE);
++    }
++
++  if (!gtk_widget_is_visible (GTK_WIDGET (self->dock_preferences_group)) &&
++      !gtk_widget_is_visible (GTK_WIDGET (self->ding_preferences_group)))
++    {
++      gtk_widget_set_visible (GTK_WIDGET (self->no_settings_view), TRUE);
++      return;
++    }
++
++  cc_object_storage_create_dbus_proxy (G_BUS_TYPE_SESSION,
++                                       G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES |
++                                       G_DBUS_PROXY_FLAGS_DO_NOT_CONNECT_SIGNALS |
++                                       G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START,
++                                       "org.gnome.Shell",
++                                       "/org/gnome/Shell",
++                                       "org.gnome.Shell",
++                                       cc_panel_get_cancellable (CC_PANEL (self)),
++                                       (GAsyncReadyCallback) shell_proxy_ready,
++                                       self);
++
++  g_signal_connect (self, "map", G_CALLBACK (mapped_cb), NULL);
++}
++
++void
++cc_ubuntu_panel_static_init_func (void)
++{
++  CcApplication *application;
++  const gchar *desktop_list;
++  g_auto(GStrv) desktops = NULL;
++
++  desktop_list = g_getenv ("XDG_CURRENT_DESKTOP");
++  if (desktop_list != NULL)
++    desktops = g_strsplit (desktop_list, ":", -1);
++
++  if (desktops == NULL || !g_strv_contains ((const gchar * const *) desktops, "ubuntu")) {
++    application = CC_APPLICATION (g_application_get_default ());
++    cc_shell_model_set_panel_visibility (cc_application_get_model (application),
++                                         "ubuntu",
++                                         CC_PANEL_HIDDEN);
++  }
++}
+diff --git a/panels/ubuntu/cc-ubuntu-panel.h b/panels/ubuntu/cc-ubuntu-panel.h
+new file mode 100644
+index 0000000..b13f611
+--- /dev/null
++++ b/panels/ubuntu/cc-ubuntu-panel.h
+@@ -0,0 +1,35 @@
++/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
++/*
++ * Copyright (C) 2017 Canonical Ltd
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General
++ * Public License along with this library; if not, see <http://www.gnu.org/licenses/>.
++ *
++ */
++
++#ifndef _CC_UBUNTU_PANEL_H_
++#define _CC_UBUNTU_PANEL_H_
++
++#include <gio/gio.h>
++#include <shell/cc-panel.h>
++
++G_BEGIN_DECLS
++
++#define CC_TYPE_UBUNTU_PANEL (cc_ubuntu_panel_get_type ())
++G_DECLARE_FINAL_TYPE (CcUbuntuPanel, cc_ubuntu_panel, CC, UBUNTU_PANEL, CcPanel)
++
++void cc_ubuntu_panel_static_init_func (void);
++
++G_END_DECLS
++
++#endif /* _CC_EDIT_DIALOG_H_ */
+diff --git a/panels/ubuntu/cc-ubuntu-panel.ui b/panels/ubuntu/cc-ubuntu-panel.ui
+new file mode 100644
+index 0000000..0840525
+--- /dev/null
++++ b/panels/ubuntu/cc-ubuntu-panel.ui
+@@ -0,0 +1,163 @@
++<?xml version="1.0" encoding="UTF-8"?>
++<interface>
++  <template class="CcUbuntuPanel" parent="CcPanel">
++    <child type="content">
++      <object class="AdwPreferencesPage">
++        <!-- Nothing to configure child -->
++        <child>
++          <object class="GtkCenterBox" id="no_settings_view">
++            <property name="hexpand">True</property>
++            <property name="vexpand">True</property>
++            <property name="halign">center</property>
++            <property name="valign">center</property>
++            <property name="orientation">vertical</property>
++            <property name="margin-top">18</property>
++            <property name="margin-bottom">18</property>
++            <property name="margin-start">18</property>
++            <property name="margin-end">18</property>
++            <property name="visible">False</property>
++            <child type="start">
++              <object class="GtkImage">
++                <property name="icon_name">face-sad-symbolic</property>
++                <property name="pixel_size">128</property>
++                <style>
++                  <class name="dim-label" />
++                </style>
++              </object>
++            </child>
++            <child type="center">
++              <object class="GtkLabel">
++                <property name="margin-top">12</property>
++                <property name="wrap">True</property>
++                <property name="label" translatable="yes">No ubuntu settings found</property>
++              </object>
++            </child>
++            <child type="end">
++              <object class="GtkLabel">
++                <property name="wrap">True</property>
++                <property name="label" translatable="yes">Oops, something has gone wrong. Please report a bug in Launchpad.</property>
++                <attributes>
++                  <attribute name="scale" value="1.42" />
++                </attributes>
++              </object>
++            </child>
++          </object>
++        </child>
++
++        <!-- Desktop icons settings -->
++        <child>
++          <object class="AdwPreferencesGroup" id="ding_preferences_group">
++            <property name="margin_top">16</property>
++            <property name="title" translatable="yes" comments="Desktop icons settings.">Desktop Icons</property>
++            <child>
++              <object class="AdwComboRow" id="ding_icon_size_row">
++                <property name="use_underline">True</property>
++                <property name="can_focus">True</property>
++                <property name="can_focus">True</property>
++                <property name="width_request">100</property>
++                <property name="title" translatable="yes" context="Desktop Icons Size">Size</property>
++              </object>
++            </child>
++            <child>
++              <object class="AdwComboRow" id="ding_icons_new_alignment_row">
++                <property name="use_underline">True</property>
++                <property name="can_focus">True</property>
++                <property name="can_focus">True</property>
++                <property name="width_request">100</property>
++                <property name="title" translatable="yes" context="Desktop Icons Size">Position of New Icons</property>
++              </object>
++            </child>
++            <child>
++              <object class="CcListRow" id="ding_showhome_switch">
++                <property name="title" translatable="yes">Show Personal folder</property>
++                <property name="use-underline">True</property>
++                <property name="show-switch">True</property>
++              </object>
++            </child>
++          </object>
++        </child>
++
++        <!-- Dock settings -->
++        <child>
++          <object class="AdwPreferencesGroup" id="dock_preferences_group">
++            <property name="margin_top">16</property>
++            <property name="margin_bottom">16</property>
++            <property name="title" translatable="yes" comments="Dock settings.">Dock</property>
++            <child>
++              <object class="CcListRow" id="dock_autohide_switch">
++                <property name="title" translatable="yes">Auto-hide the Dock</property>
++                <property name="subtitle" translatable="yes">The dock hides when any windows overlap with it.</property>
++                <property name="use-underline">True</property>
++                <property name="show-switch">True</property>
++              </object>
++            </child>
++            <child>
++              <object class="CcListRow" id="dock_extendheight_switch">
++                <property name="title" translatable="yes">Panel mode</property>
++                <property name="subtitle" translatable="yes">The dock extends to the screen edge.</property>
++                <property name="use-underline">True</property>
++                <property name="show-switch">True</property>
++              </object>
++            </child>
++            <child>
++              <object class="AdwActionRow">
++                <property name="use_underline">True</property>
++                <property name="can_focus">True</property>
++                <property name="title" translatable="yes">Icon size</property>
++                <property name="activatable">True</property>
++                <child>
++                  <object class="GtkScale" id="icon_size_scale">
++                    <property name="adjustment">icon_size_adjustment</property>
++                    <property name="orientation">horizontal</property>
++                    <property name="draw-value">True</property>
++                    <property name="value-pos">left</property>
++                    <property name="width_request">264</property>
++                  </object>
++                </child>
++              </object>
++            </child>
++            <child>
++              <object class="AdwComboRow" id="dock_monitor_row">
++                <property name="use_underline">True</property>
++                <property name="can_focus">True</property>
++                <property name="width_request">100</property>
++                <property name="title" translatable="yes">Show on</property>
++                <signal name="notify::selected-item" handler="on_dock_monitor_row_changed" swapped="yes"/>
++              </object>
++            </child>
++            <child>
++              <object class="AdwComboRow" id="dock_position_row">
++                <property name="use_underline">True</property>
++                <property name="can_focus">True</property>
++                <property name="can_focus">True</property>
++                <property name="width_request">100</property>
++                <property name="title" translatable="yes">Position on screen</property>
++              </object>
++            </child>
++            <child>
++              <object class="AdwActionRow" id="dock_behavior_row">
++                <property name="can_focus">True</property>
++                <property name="title" translatable="yes">Configure dock behavior</property>
++                <property name="activatable">True</property>
++                <signal name="activated" handler="on_dock_behavior_row_activated" object="CcUbuntuPanel" swapped="yes"/>
++                <child>
++                  <object class="GtkImage">
++                    <property name="icon_name">go-next-symbolic</property>
++                    <style>
++                      <class name="dim-label"/>
++                    </style>
++                  </object>
++                </child>
++              </object>
++            </child>
++          </object>
++        </child>
++      </object>
++    </child>
++  </template>
++  <object class="GtkAdjustment" id="icon_size_adjustment">
++    <property name="step_increment">1</property>
++    <property name="page_increment">4</property>
++    <signal name="value-changed" handler="on_icon_size_adjustment_value_changed" object="CcUbuntuPanel" swapped="yes"/>
++  </object>
++</interface>
+diff --git a/panels/ubuntu/gnome-ubuntu-panel.desktop.in b/panels/ubuntu/gnome-ubuntu-panel.desktop.in
+new file mode 100644
+index 0000000..ee93bc0
+--- /dev/null
++++ b/panels/ubuntu/gnome-ubuntu-panel.desktop.in
+@@ -0,0 +1,13 @@
++[Desktop Entry]
++Name=Ubuntu Desktop
++Comment=Ubuntu Desktop Appearance Settings
++Exec=gnome-control-center ubuntu
++Icon=preferences-ubuntu-panel
++Terminal=false
++Type=Application
++NoDisplay=true
++StartupNotify=true
++Categories=GNOME;GTK;Settings;DesktopSettings;X-GNOME-Settings-Panel;X-GNOME-PersonalSettings;X-GNOME-PersonalizationSettings;
++OnlyShowIn=ubuntu;
++# Translators: those are keywords for the ubuntu control-center panel
++Keywords=Dock;Launcher;Theme;Ubuntu;Dark;icons;Yaru;Accent;
+diff --git a/panels/ubuntu/meson.build b/panels/ubuntu/meson.build
+new file mode 100644
+index 0000000..529be08
+--- /dev/null
++++ b/panels/ubuntu/meson.build
+@@ -0,0 +1,97 @@
++fs = import('fs')
++
++panels_list += cappletname
++desktop = 'gnome-@0@-panel.desktop'.format(cappletname)
++
++i18n.merge_file(
++  type: 'desktop',
++  input: desktop + '.in',
++  output: desktop,
++  po_dir: po_dir,
++  install: true,
++  install_dir: control_center_desktopdir
++)
++
++sources = files(
++  'cc-ubuntu-panel.c',
++  'cc-ubuntu-dock-dialog.c',
++)
++
++colors = {
++  'default': '#E95420',
++  'bark': '#787859',
++  'sage': '#657B69',
++  'olive': '#4B8501',
++  'viridian': '#03875B',
++  'prussiangreen': '#308280',
++  'blue': '#0073E5',
++  'purple': '#7764D8',
++  'magenta': '#B34CB3',
++  'red': '#DA3450',
++}
++
++gresource_xml_contents = []
++resource_generated_data = []
++resource_data = files(
++  'assets/theme-dark.svg',
++  'assets/theme-light.svg',
++  'cc-ubuntu-panel.ui',
++  'cc-ubuntu-dock-dialog.ui',
++)
++
++foreach file: resource_data
++  file_path = '@0@'.format(file)
++  gresource_xml_contents += '<file alias="@0@" preprocess="@1@">@2@</file>'.format(
++    (meson.project_source_root() / file_path).replace(meson.current_source_dir() + '/', ''),
++    fs.name(file).endswith('.ui') or fs.name(file).endswith('.svg') ? 'xml-stripblanks' : '',
++    meson.project_source_root() / file_path,
++  )
++endforeach
++
++foreach color, code: colors
++  asset_name = color + '.svg'
++  asset_path = 'assets' / 'colors'
++  color_asset = custom_target(
++    asset_name,
++    input: asset_path / 'color.svg.in',
++    depfile: '@INPUT@',
++    output: asset_name,
++    command: [
++      'sed',
++      's/#00ff00/@0@/g'.format(code),
++      '@INPUT@',
++    ],
++    capture: true,
++  )
++
++  gresource_xml_contents += (
++    '<file alias="@0@" preprocess="xml-stripblanks">@1@</file>'.format(
++    asset_path / asset_name, color_asset.full_path()))
++  resource_generated_data += color_asset
++endforeach
++
++gresource_xml = configure_file(
++  configuration: {
++    'GENERATED_FILES': '\n'.join(gresource_xml_contents)
++  },
++  input: cappletname + '.gresource.xml',
++  output: cappletname + '.generated.gresource.xml',
++)
++
++sources += gnome.compile_resources(
++  'cc-' + cappletname + '-resources',
++  gresource_xml,
++  c_name: 'cc_' + cappletname,
++  dependencies: resource_data + resource_generated_data,
++  export: true
++)
++
++cflags += '-DGNOMELOCALEDIR="@0@"'.format(control_center_localedir)
++
++panels_libs += static_library(
++  cappletname,
++  sources: sources,
++  include_directories: [top_inc, common_inc],
++  dependencies: common_deps,
++  c_args: cflags
++)
+diff --git a/panels/ubuntu/ubuntu.gresource.xml b/panels/ubuntu/ubuntu.gresource.xml
+new file mode 100644
+index 0000000..a636e9c
+--- /dev/null
++++ b/panels/ubuntu/ubuntu.gresource.xml
+@@ -0,0 +1,6 @@
++<?xml version="1.0" encoding="UTF-8"?>
++<gresources>
++  <gresource prefix="/org/gnome/control-center/ubuntu">
++    @GENERATED_FILES@
++  </gresource>
++</gresources>
+diff --git a/po/POTFILES.in b/po/POTFILES.in
+index 2fb23da..c511375 100644
+--- a/po/POTFILES.in
++++ b/po/POTFILES.in
+@@ -212,6 +212,11 @@ panels/thunderbolt/cc-bolt-device-entry.c
+ panels/thunderbolt/cc-bolt-panel.c
+ panels/thunderbolt/cc-bolt-panel.ui
+ panels/thunderbolt/gnome-thunderbolt-panel.desktop.in
++panels/ubuntu/cc-ubuntu-panel.c
++panels/ubuntu/cc-ubuntu-panel.ui
++panels/ubuntu/cc-ubuntu-dock-dialog.c
++panels/ubuntu/cc-ubuntu-dock-dialog.ui
++panels/ubuntu/gnome-ubuntu-panel.desktop.in
+ panels/universal-access/cc-cursor-size-dialog.ui
+ panels/universal-access/cc-ua-hearing-page.ui
+ panels/universal-access/cc-ua-mouse-page.ui
+diff --git a/shell/cc-panel-list.c b/shell/cc-panel-list.c
+index e122d94..8e8d052 100644
+--- a/shell/cc-panel-list.c
++++ b/shell/cc-panel-list.c
+@@ -392,6 +392,7 @@ static const gchar * const panel_order[] = {
+   "mobile-broadband",
+   "bluetooth",
+   "background",
++  "ubuntu",
+   "notifications",
+   "search",
+   "multitasking",
+diff --git a/shell/cc-panel-loader.c b/shell/cc-panel-loader.c
+index 5a70523..eb90fe6 100644
+--- a/shell/cc-panel-loader.c
++++ b/shell/cc-panel-loader.c
+@@ -61,6 +61,7 @@ extern GType cc_sound_panel_get_type (void);
+ extern GType cc_bolt_panel_get_type (void);
+ #endif /* BUILD_THUNDERBOLT */
+ extern GType cc_ua_panel_get_type (void);
++extern GType cc_ubuntu_panel_get_type(void);
+ extern GType cc_user_panel_get_type (void);
+ #ifdef BUILD_WACOM
+ extern GType cc_wacom_panel_get_type (void);
+@@ -68,6 +69,7 @@ extern GType cc_wacom_panel_get_type (void);
+ #ifdef BUILD_WWAN
+ extern GType cc_wwan_panel_get_type (void);
+ #endif /* BUILD_WWAN */
++extern GType cc_ubuntu_panel_static_init_func (void);
+ extern GType cc_location_panel_get_type (void);
+ extern GType cc_firmware_security_panel_get_type (void);
+ extern GType cc_camera_panel_get_type (void);
+@@ -134,6 +136,7 @@ static CcPanelLoaderVtable default_panels[] =
+   PANEL_TYPE("search",           cc_search_panel_get_type,               NULL),
+   PANEL_TYPE("sharing",          cc_sharing_panel_get_type,              NULL),
+   PANEL_TYPE("sound",            cc_sound_panel_get_type,                NULL),
++  PANEL_TYPE("ubuntu",           cc_ubuntu_panel_get_type,               cc_ubuntu_panel_static_init_func),
+ #ifdef BUILD_THUNDERBOLT
+   PANEL_TYPE("thunderbolt",      cc_bolt_panel_get_type,                 cc_thunderbolt_panel_static_init_func),
+ #endif
diff -pruN 1:43.2-2/debian/patches/ubuntu/applications-Launch-snap-store-if-it-is-installed.patch 1:44~alpha-0ubuntu1/debian/patches/ubuntu/applications-Launch-snap-store-if-it-is-installed.patch
--- 1:43.2-2/debian/patches/ubuntu/applications-Launch-snap-store-if-it-is-installed.patch	1970-01-01 00:00:00.000000000 +0000
+++ 1:44~alpha-0ubuntu1/debian/patches/ubuntu/applications-Launch-snap-store-if-it-is-installed.patch	2023-01-13 16:48:57.000000000 +0000
@@ -0,0 +1,56 @@
+From: Robert Ancell <robert.ancell@canonical.com>
+Date: Mon, 6 Apr 2020 10:30:27 +1200
+Subject: applications: Launch snap-store if it is installed
+
+---
+ panels/applications/cc-applications-panel.c | 16 ++++++++++++++--
+ 1 file changed, 14 insertions(+), 2 deletions(-)
+
+diff --git a/panels/applications/cc-applications-panel.c b/panels/applications/cc-applications-panel.c
+index 9d0ab57..799634f 100644
+--- a/panels/applications/cc-applications-panel.c
++++ b/panels/applications/cc-applications-panel.c
+@@ -157,6 +157,13 @@ gnome_software_is_installed (void)
+   return path != NULL;
+ }
+ 
++static gboolean
++snap_store_is_installed (void)
++{
++  g_autofree gchar *path = g_find_program_in_path ("snap-store");
++  return path != NULL;
++}
++
+ /* Callbacks */
+ 
+ static gboolean
+@@ -176,6 +183,9 @@ open_software_cb (CcApplicationsPanel *self)
+ {
+   const gchar *argv[] = { "gnome-software", "--details", "appid", NULL };
+ 
++  if (!gnome_software_is_installed ())
++    argv[0] = "snap-store";
++
+   if (self->current_app_id == NULL)
+     argv[1] = NULL;
+   else
+@@ -1422,7 +1432,8 @@ update_panel (CcApplicationsPanel *self,
+ 
+   adw_window_title_set_title (self->header_title, g_app_info_get_display_name (info));
+   gtk_stack_set_visible_child (self->stack, self->settings_box);
+-  gtk_widget_set_visible (GTK_WIDGET (self->view_details_button), gnome_software_is_installed ());
++  gtk_widget_set_visible (GTK_WIDGET (self->view_details_button),
++                          gnome_software_is_installed () || snap_store_is_installed ());
+ 
+   g_clear_pointer (&self->current_app_id, g_free);
+   g_clear_pointer (&self->current_portal_app_id, g_free);
+@@ -1835,7 +1846,8 @@ cc_applications_panel_init (CcApplicationsPanel *self)
+ 
+   gtk_widget_init_template (GTK_WIDGET (self));
+ 
+-  gtk_widget_set_visible (GTK_WIDGET (self->install_button), gnome_software_is_installed ());
++  gtk_widget_set_visible (GTK_WIDGET (self->install_button),
++    gnome_software_is_installed () || snap_store_is_installed ());
+ 
+   g_signal_connect_object (self->sidebar_listbox, "row-activated",
+                            G_CALLBACK (row_activated_cb), self, G_CONNECT_SWAPPED);
diff -pruN 1:43.2-2/debian/patches/ubuntu/background-Allow-configuring-the-ubuntu-accent-color.patch 1:44~alpha-0ubuntu1/debian/patches/ubuntu/background-Allow-configuring-the-ubuntu-accent-color.patch
--- 1:43.2-2/debian/patches/ubuntu/background-Allow-configuring-the-ubuntu-accent-color.patch	1970-01-01 00:00:00.000000000 +0000
+++ 1:44~alpha-0ubuntu1/debian/patches/ubuntu/background-Allow-configuring-the-ubuntu-accent-color.patch	2023-01-13 16:48:57.000000000 +0000
@@ -0,0 +1,1040 @@
+From: =?utf-8?b?Ik1hcmNvIFRyZXZpc2FuIChUcmV2acOxbyki?= <mail@3v1n0.net>
+Date: Mon, 27 Jun 2022 19:34:40 +0200
+Subject: background: Allow configuring the ubuntu accent color
+
+Move the ubuntu colors configuration to a single widget
+(CcUbuntuColorsRow) so that it can be easily included in other widgets
+with minimal changes.
+We keep resources and the widget itself compiled together with the ubuntu
+panel, so that there's no need to change multiple panels build scripts,
+given that these are per-process anyways.
+---
+ panels/background/cc-background-panel.c  |  12 +
+ panels/background/cc-background-panel.ui |   4 +
+ panels/ubuntu/cc-ubuntu-colors-row.c     | 538 +++++++++++++++++++++++++++++++
+ panels/ubuntu/cc-ubuntu-colors-row.css   |  24 ++
+ panels/ubuntu/cc-ubuntu-colors-row.h     |  34 ++
+ panels/ubuntu/cc-ubuntu-colors-row.ui    | 289 +++++++++++++++++
+ panels/ubuntu/meson.build                |   3 +
+ po/POTFILES.in                           |   2 +
+ 8 files changed, 906 insertions(+)
+ create mode 100644 panels/ubuntu/cc-ubuntu-colors-row.c
+ create mode 100644 panels/ubuntu/cc-ubuntu-colors-row.css
+ create mode 100644 panels/ubuntu/cc-ubuntu-colors-row.h
+ create mode 100644 panels/ubuntu/cc-ubuntu-colors-row.ui
+
+diff --git a/panels/background/cc-background-panel.c b/panels/background/cc-background-panel.c
+index f748e9a..db2dbd6 100644
+--- a/panels/background/cc-background-panel.c
++++ b/panels/background/cc-background-panel.c
+@@ -35,6 +35,8 @@
+ #include "cc-background-resources.h"
+ #include "cc-background-xml.h"
+ 
++#include "panels/ubuntu/cc-ubuntu-colors-row.h"
++
+ #define WP_PATH_ID "org.gnome.desktop.background"
+ #define WP_LOCK_PATH_ID "org.gnome.desktop.screensaver"
+ #define WP_URI_KEY "picture-uri"
+@@ -67,6 +69,8 @@ struct _CcBackgroundPanel
+   CcBackgroundPreview *dark_preview;
+   GtkToggleButton *default_toggle;
+   GtkToggleButton *dark_toggle;
++
++  CcUbuntuColorsRow *ubuntu_colors;
+ };
+ 
+ CC_PANEL_REGISTER (CcBackgroundPanel, cc_background_panel)
+@@ -103,6 +107,8 @@ reload_color_scheme_toggles (CcBackgroundPanel *self)
+       gtk_toggle_button_set_active (self->default_toggle, FALSE);
+       gtk_toggle_button_set_active (self->dark_toggle, FALSE);
+     }
++
++  cc_ubuntu_colors_row_set_color_scheme (self->ubuntu_colors, scheme);
+ }
+ 
+ static void
+@@ -380,6 +386,7 @@ cc_background_panel_class_init (CcBackgroundPanelClass *klass)
+ 
+   g_type_ensure (CC_TYPE_BACKGROUND_CHOOSER);
+   g_type_ensure (CC_TYPE_BACKGROUND_PREVIEW);
++  g_type_ensure (CC_TYPE_UBUNTU_COLORS_ROW);
+ 
+   panel_class->get_help_uri = cc_background_panel_get_help_uri;
+ 
+@@ -393,6 +400,7 @@ cc_background_panel_class_init (CcBackgroundPanelClass *klass)
+   gtk_widget_class_bind_template_child (widget_class, CcBackgroundPanel, dark_preview);
+   gtk_widget_class_bind_template_child (widget_class, CcBackgroundPanel, default_toggle);
+   gtk_widget_class_bind_template_child (widget_class, CcBackgroundPanel, dark_toggle);
++  gtk_widget_class_bind_template_child (widget_class, CcBackgroundPanel, ubuntu_colors);
+ 
+   gtk_widget_class_bind_template_callback (widget_class, on_color_scheme_toggle_active_cb);
+   gtk_widget_class_bind_template_callback (widget_class, on_chooser_background_chosen_cb);
+@@ -451,5 +459,9 @@ cc_background_panel_init (CcBackgroundPanel *panel)
+                             got_transition_proxy_cb,
+                             panel);
+ 
++  g_signal_connect_object (panel->ubuntu_colors, "changed",
++                           G_CALLBACK (transition_screen),
++                           panel, G_CONNECT_SWAPPED);
++
+   load_custom_css (panel);
+ }
+diff --git a/panels/background/cc-background-panel.ui b/panels/background/cc-background-panel.ui
+index 33a8638..89a5ef5 100644
+--- a/panels/background/cc-background-panel.ui
++++ b/panels/background/cc-background-panel.ui
+@@ -90,6 +90,10 @@
+               </object>
+             </child>
+ 
++            <child>
++              <object class="CcUbuntuColorsRow" id="ubuntu_colors" />
++            </child>
++
+           </object>
+         </child>
+ 
+diff --git a/panels/ubuntu/cc-ubuntu-colors-row.c b/panels/ubuntu/cc-ubuntu-colors-row.c
+new file mode 100644
+index 0000000..2d64912
+--- /dev/null
++++ b/panels/ubuntu/cc-ubuntu-colors-row.c
+@@ -0,0 +1,538 @@
++/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
++/*
++ * Copyright (C) 2022 Canonical Ltd
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General
++ * Public License along with this library; if not, see <http://www.gnu.org/licenses/>.
++ *
++ * Author: Marco Trevisan <marco.trevisan@canonical.com>
++ *
++ */
++
++#include "config.h"
++
++#include <glib/gi18n-lib.h>
++
++#include "cc-ubuntu-colors-row.h"
++#include "cc-ubuntu-resources.h"
++
++#include "gdesktop-enums.h"
++
++#define MIN_ICONSIZE 16.0
++#define MAX_ICONSIZE 64.0
++#define DEFAULT_ICONSIZE 48.0
++#define ICONSIZE_KEY "dash-max-icon-size"
++
++#define UBUNTU_DOCK_SCHEMA "org.gnome.shell.extensions.dash-to-dock"
++#define UBUNTU_DOCK_ALL_MONITORS_KEY "multi-monitor"
++#define UBUNTU_DOCK_PREFERRED_MONITOR_KEY "preferred-monitor"
++#define UBUNTU_DOCK_PREFERRED_CONNECTOR_KEY "preferred-monitor-by-connector"
++
++/*
++ * This allows to migrate settings from 'preferred-monitor' to
++ * 'preferred-monitor-by-connector', and can be removed after 22.04
++ * simplifying all the logic, by relying on connector names only.
++ */
++#define UBUNTU_DOCK_MONITOR_INDEX_USE_CONNECTOR -2
++
++#define INTERFACE_SCHEMA "org.gnome.desktop.interface"
++#define GTK_THEME_KEY "gtk-theme"
++#define CURSOR_THEME_KEY "cursor-theme"
++#define ICON_THEME_KEY "icon-theme"
++
++#define GEDIT_PREFRENCES_SCHEMA "org.gnome.gedit.preferences.editor"
++#define GEDIT_THEME_KEY "scheme"
++
++#define DEFAULT_ACCENT_COLOR "default"
++
++struct _CcUbuntuColorsRow {
++  AdwActionRow parent_instance;
++
++  gboolean startup;
++
++  GtkFlowBox      *color_box;
++  GtkFlowBoxChild *accent_bark;
++  GtkFlowBoxChild *accent_blue;
++  GtkFlowBoxChild *accent_olive;
++  GtkFlowBoxChild *accent_default;
++  GtkFlowBoxChild *accent_magenta;
++  GtkFlowBoxChild *accent_purple;
++  GtkFlowBoxChild *accent_prussiangreen;
++  GtkFlowBoxChild *accent_sage;
++  GtkFlowBoxChild *accent_red;
++  GtkFlowBoxChild *accent_viridian;
++
++  GSettings *interface_settings;
++  GSettings *gedit_settings;
++
++  GDesktopColorScheme color_scheme;
++};
++
++G_DEFINE_FINAL_TYPE (CcUbuntuColorsRow, cc_ubuntu_colors_row, ADW_TYPE_ACTION_ROW)
++
++enum
++{
++  CHANGED,
++  N_SIGNALS,
++};
++
++static guint signals[N_SIGNALS];
++
++static GQuark accent_quark (void);
++G_DEFINE_QUARK (accent-quark, accent);
++
++static void
++on_selected_color_changed (CcUbuntuColorsRow *self)
++{
++  GtkWidget *accent_color;
++  g_autoptr(GString) gtk_theme = NULL;
++  g_autoptr(GString) icon_theme = NULL;
++  g_autoptr(GString) gedit_theme = NULL;
++  g_autofree char *current_gtk_theme = NULL;
++  g_autofree char *current_icon_theme = NULL;
++
++  gtk_theme = g_string_new ("Yaru");
++  icon_theme = g_string_new ("Yaru");
++  gedit_theme = g_string_new ("Yaru");
++
++  for (accent_color = gtk_widget_get_first_child (GTK_WIDGET (self->color_box));
++       accent_color != NULL;
++       accent_color = gtk_widget_get_next_sibling (accent_color))
++    {
++      const char *color = g_object_get_qdata (G_OBJECT (accent_color), accent_quark ());
++
++      if (!gtk_widget_is_visible (accent_color))
++        continue;
++
++      if (color && gtk_flow_box_child_is_selected (GTK_FLOW_BOX_CHILD (accent_color)))
++        {
++          if (g_str_equal (color, DEFAULT_ACCENT_COLOR))
++            break;
++
++          g_string_append_printf (gtk_theme, "-%s", color);
++          g_string_append_printf (icon_theme, "-%s", color);
++          break;
++        }
++    }
++
++  if (accent_color == NULL)
++    {
++      /* No selection, do not change anything */
++      return;
++    }
++
++  if (self->color_scheme == G_DESKTOP_COLOR_SCHEME_PREFER_DARK)
++    {
++      g_string_append (gtk_theme, "-dark");
++      g_string_append (gedit_theme, "-dark");
++    }
++
++  current_gtk_theme = g_settings_get_string (self->interface_settings, GTK_THEME_KEY);
++
++  if (g_strcmp0 (current_gtk_theme, gtk_theme->str))
++    {
++      g_signal_emit (self, signals[CHANGED], 0);
++      g_settings_set_string (self->interface_settings, GTK_THEME_KEY, gtk_theme->str);
++    }
++
++  current_icon_theme = g_settings_get_string (self->interface_settings, ICON_THEME_KEY);
++
++  if (!current_icon_theme || !self->startup ||
++      g_str_has_prefix (current_icon_theme, "Yaru"))
++    g_settings_set_string (self->interface_settings, ICON_THEME_KEY, icon_theme->str);
++
++  if (self->gedit_settings)
++    {
++      g_autoptr(GVariant) gedit_user_value = NULL;
++      const char *gedit_theme_name = NULL;
++
++      gedit_user_value = g_settings_get_user_value (self->gedit_settings,
++                                                    GEDIT_THEME_KEY);
++
++      if (gedit_user_value)
++        gedit_theme_name = g_variant_get_string (gedit_user_value, NULL);
++
++      if (!gedit_theme_name || *gedit_theme_name == '\0' ||
++          g_str_has_prefix (gedit_theme_name, "Yaru"))
++        {
++          /* Only change the gedit setting if user is using a Yaru theme, or unset */
++          g_settings_set_string (self->gedit_settings, GEDIT_THEME_KEY,
++                                 gedit_theme->str);
++        }
++    }
++}
++
++static void
++on_interface_settings_changed (CcUbuntuColorsRow *self)
++{
++  GtkWidget *color_item;
++  g_autofree gchar *gtk_theme = NULL;
++  g_autofree gchar *cursor_theme = NULL;
++  g_autofree gchar *icon_theme = NULL;
++  g_auto(GStrv) parts = NULL;
++  const char *accent_color = DEFAULT_ACCENT_COLOR;
++  gboolean is_dark = FALSE;
++
++  gtk_theme = g_settings_get_string (self->interface_settings, GTK_THEME_KEY);
++  cursor_theme = g_settings_get_string (self->interface_settings, CURSOR_THEME_KEY);
++  icon_theme = g_settings_get_string (self->interface_settings, ICON_THEME_KEY);
++
++  if (!g_str_has_prefix (gtk_theme, "Yaru"))
++    {
++      g_warning ("No yaru theme selected!");
++
++      gtk_flow_box_unselect_all (self->color_box);
++      return;
++    }
++
++  is_dark = g_str_has_suffix (gtk_theme, "-dark");
++  parts = g_strsplit (gtk_theme, "-", 3);
++
++  switch (g_strv_length (parts))
++    {
++      case 3:
++        g_return_if_fail (is_dark);
++        accent_color = parts[1];
++        break;
++      case 2:
++        if (!is_dark)
++          accent_color = parts[1];
++        break;
++    }
++
++  if (!is_dark && self->color_scheme == G_DESKTOP_COLOR_SCHEME_PREFER_DARK)
++    is_dark = TRUE;
++  else if (is_dark && self->color_scheme != G_DESKTOP_COLOR_SCHEME_PREFER_DARK)
++    is_dark = FALSE;
++
++  for (color_item = gtk_widget_get_first_child (GTK_WIDGET (self->color_box));
++       color_item != NULL;
++       color_item = gtk_widget_get_next_sibling (color_item))
++    {
++      GtkFlowBoxChild *item = GTK_FLOW_BOX_CHILD (color_item);
++      const char *color = g_object_get_qdata (G_OBJECT (item), accent_quark ());
++
++      if (!gtk_widget_is_visible (color_item))
++        continue;
++
++      if (g_strcmp0 (color, accent_color) == 0)
++        {
++          gtk_flow_box_select_child (self->color_box, item);
++          break;
++        }
++    }
++}
++
++static gchar *
++get_theme_dir (void)
++{
++  const gchar *var;
++
++  var = g_getenv ("GTK_DATA_PREFIX");
++  if (var == NULL)
++    var = "/usr";
++
++  return g_build_filename (var, "share", "themes", NULL);
++}
++
++
++#if (GTK_MINOR_VERSION % 2)
++#define MINOR (GTK_MINOR_VERSION + 1)
++#else
++#define MINOR GTK_MINOR_VERSION
++#endif
++
++
++static gchar *
++find_theme_dir (const gchar *dir,
++                const gchar *subdir,
++                const gchar *name,
++                const gchar *variant)
++{
++  g_autofree gchar *file = NULL;
++  g_autofree gchar *base = NULL;
++  gchar *path;
++  gint i;
++
++  if (variant)
++    file = g_strconcat ("gtk-", variant, ".css", NULL);
++  else
++    file = g_strdup ("gtk.css");
++
++  if (subdir)
++    base = g_build_filename (dir, subdir, name, NULL);
++  else
++    base = g_build_filename (dir, name, NULL);
++
++  for (i = MINOR; i >= 0; i = i - 2) {
++    g_autofree gchar *subsubdir = NULL;
++
++    if (i < 14)
++      i = 0;
++
++    subsubdir = g_strdup_printf ("gtk-4.%d", i);
++    path = g_build_filename (base, subsubdir, file, NULL);
++
++    if (g_file_test (path, G_FILE_TEST_EXISTS))
++      break;
++
++    g_free (path);
++    path = NULL;
++  }
++
++  return path;
++}
++
++#undef MINOR
++
++static gchar *
++find_theme (const gchar *name,
++            const gchar *variant)
++{
++  g_autofree gchar *dir = NULL;
++  const gchar *const *dirs;
++  gchar *path;
++  gint i;
++
++  /* First look in the user's data directory */
++  path = find_theme_dir (g_get_user_data_dir (), "themes", name, variant);
++  if (path)
++    return path;
++
++  /* Next look in the user's home directory */
++  path = find_theme_dir (g_get_home_dir (), ".themes", name, variant);
++  if (path)
++    return path;
++
++  /* Look in system data directories */
++  dirs = g_get_system_data_dirs ();
++  for (i = 0; dirs[i]; i++) {
++    path = find_theme_dir (dirs[i], "themes", name, variant);
++    if (path)
++      return path;
++  }
++
++  /* Finally, try in the default theme directory */
++  dir = get_theme_dir ();
++  path = find_theme_dir (dir, NULL, name, variant);
++
++  return path;
++}
++
++/* Courtesy of libhandy... */
++static gboolean
++check_theme_exists (const gchar *name,
++                    const gchar *variant)
++{
++  g_autofree gchar *resource_path = NULL;
++  g_autofree gchar *path = NULL;
++
++  /* try loading the resource for the theme. This is mostly meant for built-in
++   * themes.
++   */
++  if (variant)
++    resource_path = g_strdup_printf ("/org/gtk/libgtk/theme/%s/gtk-%s.css", name, variant);
++  else
++    resource_path = g_strdup_printf ("/org/gtk/libgtk/theme/%s/gtk.css", name);
++
++  if (g_resources_get_info (resource_path, 0, NULL, NULL, NULL))
++    return TRUE;
++
++  g_clear_pointer (&resource_path, g_free);
++
++  if (variant)
++    resource_path = g_strdup_printf ("/com/ubuntu/themes/%s/4.0/gtk-%s.css", name, variant);
++  else
++    resource_path = g_strdup_printf ("/com/ubuntu/themes/%s/4.0/gtk.css", name);
++
++  if (g_resources_get_info (resource_path, 0, NULL, NULL, NULL))
++    return TRUE;
++
++  /* Next try looking for files in the various theme directories. */
++  path = find_theme (name, variant);
++
++  return path != NULL;
++}
++
++static void
++check_theme_accents_availability (CcUbuntuColorsRow *self)
++{
++  GtkWidget *accent_color;
++  g_autoptr (GList) colors = NULL;
++  gint available_accents = 0;
++
++  if (!check_theme_exists ("Yaru", NULL))
++    g_critical ("No Yaru theme found");
++
++  if (!check_theme_exists ("Yaru", "dark"))
++    g_critical ("No Yaru-dark theme found");
++
++  for (accent_color = gtk_widget_get_first_child (GTK_WIDGET (self->color_box));
++       accent_color != NULL;
++       accent_color = gtk_widget_get_next_sibling (accent_color))
++    {
++      GtkFlowBoxChild *item = GTK_FLOW_BOX_CHILD (accent_color);
++      const char *accent = g_object_get_qdata (G_OBJECT (item), accent_quark ());
++      g_autofree char *theme_name = NULL;
++
++      if (g_strcmp0 (accent, DEFAULT_ACCENT_COLOR) == 0)
++        continue;
++
++      theme_name = g_strdup_printf("Yaru-%s", accent);
++
++      if (check_theme_exists (theme_name, NULL) && check_theme_exists (theme_name, "dark"))
++        available_accents++;
++      else
++        gtk_widget_set_visible (GTK_WIDGET (item), FALSE);
++    }
++
++  if (!available_accents)
++    gtk_widget_set_visible (GTK_WIDGET (self), FALSE);
++}
++
++static void
++load_custom_css (CcUbuntuColorsRow *self)
++{
++  g_autoptr(GtkCssProvider) provider = NULL;
++
++  /* use custom CSS */
++  provider = gtk_css_provider_new ();
++  gtk_css_provider_load_from_resource (provider,
++    "/org/gnome/control-center/ubuntu/cc-ubuntu-colors-row.css");
++  gtk_style_context_add_provider_for_display (gdk_display_get_default (),
++                                              GTK_STYLE_PROVIDER (provider),
++                                              GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
++}
++
++static void
++cc_ubuntu_colors_row_init (CcUbuntuColorsRow *self)
++{
++  GSettingsSchemaSource *schema_source = g_settings_schema_source_get_default ();
++  g_autoptr(GSettingsSchema) schema = NULL;
++  const gchar *desktop_list;
++  g_auto(GStrv) desktops = NULL;
++
++  desktop_list = g_getenv ("XDG_CURRENT_DESKTOP");
++  if (desktop_list != NULL)
++    desktops = g_strsplit (desktop_list, ":", -1);
++
++  if (desktops == NULL ||
++      !g_strv_contains ((const gchar * const *) desktops, "ubuntu"))
++    {
++      gtk_widget_set_visible (GTK_WIDGET (self), FALSE);
++      return;
++    }
++
++  self->startup = TRUE;
++
++  g_resources_register (cc_ubuntu_get_resource ());
++
++  gtk_widget_init_template (GTK_WIDGET (self));
++
++  g_object_set_qdata (G_OBJECT (self->accent_bark), accent_quark (), "bark");
++  g_object_set_qdata (G_OBJECT (self->accent_blue), accent_quark (), "blue");
++  g_object_set_qdata (G_OBJECT (self->accent_magenta), accent_quark (), "magenta");
++  g_object_set_qdata (G_OBJECT (self->accent_olive), accent_quark (), "olive");
++  g_object_set_qdata (G_OBJECT (self->accent_default), accent_quark (), "default");
++  g_object_set_qdata (G_OBJECT (self->accent_purple), accent_quark (), "purple");
++  g_object_set_qdata (G_OBJECT (self->accent_prussiangreen), accent_quark (), "prussiangreen");
++  g_object_set_qdata (G_OBJECT (self->accent_red), accent_quark (), "red");
++  g_object_set_qdata (G_OBJECT (self->accent_sage), accent_quark (), "sage");
++  g_object_set_qdata (G_OBJECT (self->accent_viridian), accent_quark (), "viridian");
++  check_theme_accents_availability (self);
++
++  self->interface_settings = g_settings_new (INTERFACE_SCHEMA);
++  g_signal_connect_object (self->interface_settings, "changed::" GTK_THEME_KEY,
++                           G_CALLBACK (on_interface_settings_changed), self,
++                           G_CONNECT_SWAPPED);
++  g_signal_connect_object (self->interface_settings, "changed::" CURSOR_THEME_KEY,
++                           G_CALLBACK (on_interface_settings_changed), self,
++                           G_CONNECT_SWAPPED);
++  g_signal_connect_object (self->interface_settings, "changed::" ICON_THEME_KEY,
++                           G_CALLBACK (on_interface_settings_changed), self,
++                           G_CONNECT_SWAPPED);
++
++  schema = g_settings_schema_source_lookup (schema_source, GEDIT_PREFRENCES_SCHEMA, TRUE);
++  if (schema)
++    {
++      self->gedit_settings = g_settings_new (GEDIT_PREFRENCES_SCHEMA);
++      g_signal_connect_object (self->gedit_settings, "changed::" GEDIT_THEME_KEY,
++                               G_CALLBACK (on_interface_settings_changed), self, G_CONNECT_SWAPPED);
++    }
++  else
++    {
++      g_warning ("No gedit is installed here. Colors won't be updated. Please fix your installation.");
++    }
++
++  load_custom_css (self);
++  on_interface_settings_changed (self);
++
++  self->startup = FALSE;
++}
++
++static void
++cc_ubuntu_colors_row_dispose (GObject *object)
++{
++  CcUbuntuColorsRow *self = CC_UBUNTU_COLORS_ROW (object);
++
++  g_clear_object (&self->interface_settings);
++  g_clear_object (&self->gedit_settings);
++
++  G_OBJECT_CLASS (cc_ubuntu_colors_row_parent_class)->dispose (object);
++}
++
++static void
++cc_ubuntu_colors_row_class_init (CcUbuntuColorsRowClass *klass)
++{
++  GObjectClass *object_class = G_OBJECT_CLASS (klass);
++  GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
++
++  object_class->dispose = cc_ubuntu_colors_row_dispose;
++
++  signals[CHANGED] = g_signal_new ("changed",
++                                   CC_TYPE_UBUNTU_COLORS_ROW,
++                                   G_SIGNAL_RUN_FIRST,
++                                   0, NULL, NULL, NULL,
++                                   G_TYPE_NONE,
++                                   0);
++
++  gtk_widget_class_set_template_from_resource (widget_class,
++    "/org/gnome/control-center/ubuntu/cc-ubuntu-colors-row.ui");
++
++  gtk_widget_class_bind_template_child (widget_class, CcUbuntuColorsRow, color_box);
++  gtk_widget_class_bind_template_child (widget_class, CcUbuntuColorsRow, accent_bark);
++  gtk_widget_class_bind_template_child (widget_class, CcUbuntuColorsRow, accent_blue);
++  gtk_widget_class_bind_template_child (widget_class, CcUbuntuColorsRow, accent_olive);
++  gtk_widget_class_bind_template_child (widget_class, CcUbuntuColorsRow, accent_default);
++  gtk_widget_class_bind_template_child (widget_class, CcUbuntuColorsRow, accent_magenta);
++  gtk_widget_class_bind_template_child (widget_class, CcUbuntuColorsRow, accent_purple);
++  gtk_widget_class_bind_template_child (widget_class, CcUbuntuColorsRow, accent_prussiangreen);
++  gtk_widget_class_bind_template_child (widget_class, CcUbuntuColorsRow, accent_red);
++  gtk_widget_class_bind_template_child (widget_class, CcUbuntuColorsRow, accent_sage);
++  gtk_widget_class_bind_template_child (widget_class, CcUbuntuColorsRow, accent_viridian);
++
++  gtk_widget_class_bind_template_callback (widget_class, on_selected_color_changed);
++}
++
++void
++cc_ubuntu_colors_row_set_color_scheme (CcUbuntuColorsRow *self,
++                                       GDesktopColorScheme color_scheme)
++{
++  if (self->color_scheme == color_scheme)
++    return;
++
++  self->color_scheme = color_scheme;
++
++  if (self->interface_settings)
++    on_interface_settings_changed (self);
++}
+diff --git a/panels/ubuntu/cc-ubuntu-colors-row.css b/panels/ubuntu/cc-ubuntu-colors-row.css
+new file mode 100644
+index 0000000..cd9f62b
+--- /dev/null
++++ b/panels/ubuntu/cc-ubuntu-colors-row.css
+@@ -0,0 +1,24 @@
++.ubuntu-colors flowboxchild.ubuntu-color {
++  border-radius: 9999px;
++  background-color: transparent;
++}
++
++.ubuntu-colors flowboxchild.ubuntu-color:selected {
++  background-color: alpha(@theme_selected_bg_color, 0.75);
++}
++
++.ubuntu-colors flowboxchild.ubuntu-color box {
++  background-color: transparent;
++}
++
++.ubuntu-colors flowboxchild.ubuntu-color:selected box {
++  background-color: mix(@view_bg_color, @card_bg_color, 0.25);
++}
++
++.ubuntu-colors box.ubuntu-color {
++  border-radius: 9999px;
++}
++
++.ubuntu-colors picture.thumbnail {
++  border-radius: 9999px;
++}
+diff --git a/panels/ubuntu/cc-ubuntu-colors-row.h b/panels/ubuntu/cc-ubuntu-colors-row.h
+new file mode 100644
+index 0000000..07cedee
+--- /dev/null
++++ b/panels/ubuntu/cc-ubuntu-colors-row.h
+@@ -0,0 +1,34 @@
++/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
++/*
++ * Copyright (C) 2022 Canonical Ltd
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General
++ * Public License along with this library; if not, see <http://www.gnu.org/licenses/>.
++ *
++ */
++
++#pragma once
++
++#include <glib.h>
++#include <adwaita.h>
++#include <gdesktop-enums.h>
++
++G_BEGIN_DECLS
++
++#define CC_TYPE_UBUNTU_COLORS_ROW (cc_ubuntu_colors_row_get_type ())
++G_DECLARE_FINAL_TYPE (CcUbuntuColorsRow, cc_ubuntu_colors_row, CC, UBUNTU_COLORS_ROW, AdwActionRow)
++
++void cc_ubuntu_colors_row_set_color_scheme (CcUbuntuColorsRow *colors_row,
++                                            GDesktopColorScheme color_scheme);
++
++G_END_DECLS
+diff --git a/panels/ubuntu/cc-ubuntu-colors-row.ui b/panels/ubuntu/cc-ubuntu-colors-row.ui
+new file mode 100644
+index 0000000..5f760f2
+--- /dev/null
++++ b/panels/ubuntu/cc-ubuntu-colors-row.ui
+@@ -0,0 +1,289 @@
++<?xml version="1.0" encoding="UTF-8"?>
++<interface>
++  <template class="CcUbuntuColorsRow" parent="AdwActionRow">
++    <property name="title" translatable="yes">Color</property>
++    <property name="title-lines">1</property>
++    <property name="activatable">False</property>
++    <property name="selectable">False</property>
++    <style>
++        <class name="ubuntu-colors" />
++    </style>
++    <child>
++        <object class="GtkFlowBox" id="color_box">
++            <property name="max-children-per-line">10</property>
++            <property name="min-children-per-line">10</property>
++            <property name="column-spacing">12</property>
++            <property name="row-spacing">12</property>
++            <property name="margin-top">6</property>
++            <property name="margin-bottom">6</property>
++            <property name="margin-start">6</property>
++            <property name="margin-end">6</property>
++            <property name="activate-on-single-click">False</property>
++            <signal name="selected-children-changed" handler="on_selected_color_changed" object="CcUbuntuColorsRow" swapped="yes"/>
++            <style>
++                <class name="ubuntu-color" />
++            </style>
++            <child>
++                <object class="GtkFlowBoxChild" id="accent_default">
++                    <property name="tooltip_text" translatable="yes" context="Yaru theme accent color">Orange</property>
++                    <property name="valign">center</property>
++                    <style>
++                        <class name="ubuntu-color" />
++                    </style>
++                    <child>
++                        <object class="GtkBox">
++                            <property name="orientation">vertical</property>
++                            <style>
++                                <class name="ubuntu-color" />
++                                <class name="background" />
++                            </style>
++                            <child>
++                                <object class="GtkPicture">
++                                    <property name="file">resource:///org/gnome/control-center/ubuntu/assets/colors/default.svg</property>
++                                    <style>
++                                        <class name="thumbnail" />
++                                    </style>
++                                </object>
++                            </child>
++                        </object>
++                    </child>
++                </object>
++            </child>
++            <child>
++                <object class="GtkFlowBoxChild" id="accent_bark">
++                    <property name="tooltip_text" translatable="yes" context="Yaru theme accent color">Bark</property>
++                    <property name="valign">center</property>
++                    <style>
++                        <class name="ubuntu-color" />
++                    </style>
++                    <child>
++                        <object class="GtkBox">
++                            <property name="orientation">vertical</property>
++                            <style>
++                                <class name="ubuntu-color" />
++                                <class name="background" />
++                            </style>
++                            <child>
++                                <object class="GtkPicture">
++                                    <property name="file">resource:///org/gnome/control-center/ubuntu/assets/colors/bark.svg</property>
++                                    <style>
++                                        <class name="thumbnail" />
++                                    </style>
++                                </object>
++                            </child>
++                        </object>
++                    </child>
++                </object>
++            </child>
++            <child>
++                <object class="GtkFlowBoxChild" id="accent_sage">
++                    <property name="tooltip_text" translatable="yes" context="Yaru theme accent color">Sage</property>
++                    <property name="valign">center</property>
++                    <style>
++                        <class name="ubuntu-color" />
++                    </style>
++                    <child>
++                        <object class="GtkBox">
++                            <property name="orientation">vertical</property>
++                            <style>
++                                <class name="ubuntu-color" />
++                                <class name="background" />
++                            </style>
++                            <child>
++                                <object class="GtkPicture">
++                                    <property name="file">resource:///org/gnome/control-center/ubuntu/assets/colors/sage.svg</property>
++                                    <style>
++                                        <class name="thumbnail" />
++                                    </style>
++                                </object>
++                            </child>
++                        </object>
++                    </child>
++                </object>
++            </child>
++            <child>
++                <object class="GtkFlowBoxChild" id="accent_olive">
++                    <property name="tooltip_text" translatable="yes" context="Yaru theme accent color">Olive</property>
++                    <property name="valign">center</property>
++                    <style>
++                        <class name="ubuntu-color" />
++                    </style>
++                    <child>
++                        <object class="GtkBox">
++                            <property name="orientation">vertical</property>
++                            <style>
++                                <class name="ubuntu-color" />
++                                <class name="background" />
++                            </style>
++                            <child>
++                                <object class="GtkPicture">
++                                    <property name="file">resource:///org/gnome/control-center/ubuntu/assets/colors/olive.svg</property>
++                                    <style>
++                                        <class name="thumbnail" />
++                                    </style>
++                                </object>
++                            </child>
++                        </object>
++                    </child>
++                </object>
++            </child>
++            <child>
++                <object class="GtkFlowBoxChild" id="accent_viridian">
++                    <property name="tooltip_text" translatable="yes" context="Yaru theme accent color">Viridian</property>
++                    <property name="valign">center</property>
++                    <style>
++                        <class name="ubuntu-color" />
++                    </style>
++                    <child>
++                        <object class="GtkBox">
++                            <property name="orientation">vertical</property>
++                            <style>
++                                <class name="ubuntu-color" />
++                                <class name="background" />
++                            </style>
++                            <child>
++                                <object class="GtkPicture">
++                                    <property name="file">resource:///org/gnome/control-center/ubuntu/assets/colors/viridian.svg</property>
++                                    <style>
++                                        <class name="thumbnail" />
++                                    </style>
++                                </object>
++                            </child>
++                        </object>
++                    </child>
++                </object>
++            </child>
++            <child>
++                <object class="GtkFlowBoxChild" id="accent_prussiangreen">
++                    <property name="tooltip_text" translatable="yes" context="Yaru theme accent color">Prussian Green</property>
++                    <property name="valign">center</property>
++                    <style>
++                        <class name="ubuntu-color" />
++                    </style>
++                    <child>
++                        <object class="GtkBox">
++                            <property name="orientation">vertical</property>
++                            <style>
++                                <class name="ubuntu-color" />
++                                <class name="background" />
++                            </style>
++                            <child>
++                                <object class="GtkPicture">
++                                    <property name="file">resource:///org/gnome/control-center/ubuntu/assets/colors/prussiangreen.svg</property>
++                                    <style>
++                                        <class name="thumbnail" />
++                                    </style>
++                                </object>
++                            </child>
++                        </object>
++                    </child>
++                </object>
++            </child>
++            <child>
++                <object class="GtkFlowBoxChild" id="accent_blue">
++                    <property name="tooltip_text" translatable="yes" context="Yaru theme accent color">Blue</property>
++                    <property name="valign">center</property>
++                    <style>
++                        <class name="ubuntu-color" />
++                    </style>
++                    <child>
++                        <object class="GtkBox">
++                            <property name="orientation">vertical</property>
++                            <style>
++                                <class name="ubuntu-color" />
++                                <class name="background" />
++                            </style>
++                            <child>
++                                <object class="GtkPicture">
++                                    <property name="file">resource:///org/gnome/control-center/ubuntu/assets/colors/blue.svg</property>
++                                    <style>
++                                        <class name="thumbnail" />
++                                    </style>
++                                </object>
++                            </child>
++                        </object>
++                    </child>
++                </object>
++            </child>
++            <child>
++                <object class="GtkFlowBoxChild" id="accent_purple">
++                    <property name="tooltip_text" translatable="yes" context="Yaru theme accent color">Purple</property>
++                    <property name="valign">center</property>
++                    <style>
++                        <class name="ubuntu-color" />
++                    </style>
++                    <child>
++                        <object class="GtkBox">
++                            <property name="orientation">vertical</property>
++                            <style>
++                                <class name="ubuntu-color" />
++                                <class name="background" />
++                            </style>
++                            <child>
++                                <object class="GtkPicture">
++                                    <property name="file">resource:///org/gnome/control-center/ubuntu/assets/colors/purple.svg</property>
++                                    <style>
++                                        <class name="thumbnail" />
++                                    </style>
++                                </object>
++                            </child>
++                        </object>
++                    </child>
++                </object>
++            </child>
++            <child>
++                <object class="GtkFlowBoxChild" id="accent_magenta">
++                    <property name="tooltip_text" translatable="yes" context="Yaru theme accent color">Magenta</property>
++                    <property name="valign">center</property>
++                    <style>
++                        <class name="ubuntu-color" />
++                    </style>
++                    <child>
++                        <object class="GtkBox">
++                            <property name="orientation">vertical</property>
++                            <style>
++                                <class name="ubuntu-color" />
++                                <class name="background" />
++                            </style>
++                            <child>
++                                <object class="GtkPicture">
++                                    <property name="file">resource:///org/gnome/control-center/ubuntu/assets/colors/magenta.svg</property>
++                                    <style>
++                                        <class name="thumbnail" />
++                                    </style>
++                                </object>
++                            </child>
++                        </object>
++                    </child>
++                </object>
++            </child>
++            <child>
++                <object class="GtkFlowBoxChild" id="accent_red">
++                    <property name="tooltip_text" translatable="yes" context="Yaru theme accent color">Red</property>
++                    <property name="valign">center</property>
++                    <style>
++                        <class name="ubuntu-color" />
++                    </style>
++                    <child>
++                        <object class="GtkBox">
++                            <property name="orientation">vertical</property>
++                            <style>
++                                <class name="ubuntu-color" />
++                                <class name="background" />
++                            </style>
++                            <child>
++                                <object class="GtkPicture">
++                                    <property name="file">resource:///org/gnome/control-center/ubuntu/assets/colors/red.svg</property>
++                                    <style>
++                                        <class name="thumbnail" />
++                                    </style>
++                                </object>
++                            </child>
++                        </object>
++                    </child>
++                </object>
++            </child>
++        </object>
++    </child>
++  </template>
++</interface>
+diff --git a/panels/ubuntu/meson.build b/panels/ubuntu/meson.build
+index 529be08..d7f73e6 100644
+--- a/panels/ubuntu/meson.build
++++ b/panels/ubuntu/meson.build
+@@ -13,6 +13,7 @@ i18n.merge_file(
+ )
+ 
+ sources = files(
++  'cc-ubuntu-colors-row.c',
+   'cc-ubuntu-panel.c',
+   'cc-ubuntu-dock-dialog.c',
+ )
+@@ -35,6 +36,8 @@ resource_generated_data = []
+ resource_data = files(
+   'assets/theme-dark.svg',
+   'assets/theme-light.svg',
++  'cc-ubuntu-colors-row.css',
++  'cc-ubuntu-colors-row.ui',
+   'cc-ubuntu-panel.ui',
+   'cc-ubuntu-dock-dialog.ui',
+ )
+diff --git a/po/POTFILES.in b/po/POTFILES.in
+index c511375..6b4c652 100644
+--- a/po/POTFILES.in
++++ b/po/POTFILES.in
+@@ -216,6 +216,8 @@ panels/ubuntu/cc-ubuntu-panel.c
+ panels/ubuntu/cc-ubuntu-panel.ui
+ panels/ubuntu/cc-ubuntu-dock-dialog.c
+ panels/ubuntu/cc-ubuntu-dock-dialog.ui
++panels/ubuntu/cc-ubuntu-colors-row.c
++panels/ubuntu/cc-ubuntu-colors-row.ui
+ panels/ubuntu/gnome-ubuntu-panel.desktop.in
+ panels/universal-access/cc-cursor-size-dialog.ui
+ panels/universal-access/cc-ua-hearing-page.ui
diff -pruN 1:43.2-2/debian/patches/ubuntu/connectivity-add-network-connectivity-checking-toggle.patch 1:44~alpha-0ubuntu1/debian/patches/ubuntu/connectivity-add-network-connectivity-checking-toggle.patch
--- 1:43.2-2/debian/patches/ubuntu/connectivity-add-network-connectivity-checking-toggle.patch	1970-01-01 00:00:00.000000000 +0000
+++ 1:44~alpha-0ubuntu1/debian/patches/ubuntu/connectivity-add-network-connectivity-checking-toggle.patch	2023-01-13 16:48:57.000000000 +0000
@@ -0,0 +1,350 @@
+From: James Henstridge <james@jamesh.id.au>
+Date: Wed, 9 Aug 2017 22:30:21 +0800
+Subject: connectivity: add network connectivity checking toggle
+
+NetworkManager supports toggling the periodic network check,
+a check that by itself can be a security threat since it leaks
+information about the host.
+
+This patch adds a periodic network check toggle to the Privacy
+panel.
+
+https://bugzilla.gnome.org/show_bug.cgi?id=737362
+---
+ panels/connectivity/cc-connectivity-panel.c        | 131 +++++++++++++++++++++
+ panels/connectivity/cc-connectivity-panel.h        |  28 +++++
+ panels/connectivity/cc-connectivity-panel.ui       |  21 ++++
+ panels/connectivity/connectivity.gresource.xml     |   6 +
+ .../gnome-connectivity-panel.desktop.in            |  15 +++
+ panels/connectivity/meson.build                    |  38 ++++++
+ panels/meson.build                                 |   1 +
+ po/POTFILES.in                                     |   2 +
+ shell/cc-panel-loader.c                            |   2 +
+ 9 files changed, 244 insertions(+)
+ create mode 100644 panels/connectivity/cc-connectivity-panel.c
+ create mode 100644 panels/connectivity/cc-connectivity-panel.h
+ create mode 100644 panels/connectivity/cc-connectivity-panel.ui
+ create mode 100644 panels/connectivity/connectivity.gresource.xml
+ create mode 100644 panels/connectivity/gnome-connectivity-panel.desktop.in
+ create mode 100644 panels/connectivity/meson.build
+
+diff --git a/panels/connectivity/cc-connectivity-panel.c b/panels/connectivity/cc-connectivity-panel.c
+new file mode 100644
+index 0000000..6abb6e8
+--- /dev/null
++++ b/panels/connectivity/cc-connectivity-panel.c
+@@ -0,0 +1,131 @@
++/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*-
++ *
++ * Copyright (C) 2020 Canonical Ltd
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2 of the License, or
++ * (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, see <http://www.gnu.org/licenses/>.
++ */
++
++#include <config.h>
++
++#ifdef HAVE_NETWORK_MANAGER
++#  include <NetworkManager.h>
++#endif
++
++#include "shell/cc-object-storage.h"
++
++#include "cc-connectivity-panel.h"
++#include "cc-connectivity-resources.h"
++
++#include <glib/gi18n.h>
++
++struct _CcConnectivityPanel
++{
++  CcPanel parent_instance;
++
++  GtkWidget *connectivity_switch;
++
++#ifdef HAVE_NETWORK_MANAGER
++  GCancellable *cancellable;
++  NMClient     *nm_client;
++#endif
++};
++
++CC_PANEL_REGISTER (CcConnectivityPanel, cc_connectivity_panel)
++
++static void
++setup_nm_client (CcConnectivityPanel *self,
++                 NMClient            *client)
++{
++  self->nm_client = client;
++
++  g_object_bind_property (self->nm_client, NM_CLIENT_CONNECTIVITY_CHECK_AVAILABLE,
++                          self->connectivity_switch, "sensitive",
++                          G_BINDING_SYNC_CREATE);
++
++  g_object_bind_property (self->nm_client, NM_CLIENT_CONNECTIVITY_CHECK_ENABLED,
++                          self->connectivity_switch, "active",
++                          G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE);
++}
++
++static void
++nm_client_ready_cb (GObject *source_object,
++                    GAsyncResult *res,
++                    gpointer user_data)
++{
++  CcConnectivityPanel *self;
++  NMClient *client;
++  g_autoptr(GError) error = NULL;
++
++  client = nm_client_new_finish (res, &error);
++  if (!client)
++    {
++      if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
++        g_warning ("Failed to create NetworkManager client: %s",
++                   error->message);
++      return;
++    }
++
++  self = user_data;
++
++  /* Setup the client */
++  setup_nm_client (self, client);
++
++  /* Store the object in the cache too */
++  cc_object_storage_add_object (CC_OBJECT_NMCLIENT, client);
++}
++
++static void
++cc_connectivity_panel_dispose (GObject *object)
++{
++  CcConnectivityPanel *self = CC_CONNECTIVITY_PANEL (object);
++
++  g_cancellable_cancel (self->cancellable);
++
++#ifdef HAVE_NETWORK_MANAGER
++  g_clear_object (&self->nm_client);
++#endif
++
++  G_OBJECT_CLASS (cc_connectivity_panel_parent_class)->dispose (object);
++}
++
++static void
++cc_connectivity_panel_class_init (CcConnectivityPanelClass *klass)
++{
++  GObjectClass *object_class = G_OBJECT_CLASS (klass);
++  GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
++
++  object_class->dispose = cc_connectivity_panel_dispose;
++
++  gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/control-center/connectivity/cc-connectivity-panel.ui");
++
++  gtk_widget_class_bind_template_child (widget_class, CcConnectivityPanel, connectivity_switch);
++}
++
++static void
++cc_connectivity_panel_init (CcConnectivityPanel *self)
++{
++  g_resources_register (cc_connectivity_get_resource ());
++
++  gtk_widget_init_template (GTK_WIDGET (self));
++
++  self->cancellable = g_cancellable_new ();
++
++#ifdef HAVE_NETWORK_MANAGER
++  /* Create and store a NMClient instance if it doesn't exist yet */
++  if (cc_object_storage_has_object (CC_OBJECT_NMCLIENT))
++    setup_nm_client (self, cc_object_storage_get_object (CC_OBJECT_NMCLIENT));
++  else
++    nm_client_new_async (self->cancellable, nm_client_ready_cb, self);
++#endif
++}
+diff --git a/panels/connectivity/cc-connectivity-panel.h b/panels/connectivity/cc-connectivity-panel.h
+new file mode 100644
+index 0000000..1a21b5b
+--- /dev/null
++++ b/panels/connectivity/cc-connectivity-panel.h
+@@ -0,0 +1,28 @@
++/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*-
++ *
++ * Copyright (C) 2020 Canonical Ltd
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2 of the License, or
++ * (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, see <http://www.gnu.org/licenses/>.
++ */
++
++#pragma once
++
++#include <shell/cc-panel.h>
++
++G_BEGIN_DECLS
++
++#define CC_TYPE_CONNECTIVITY_PANEL (cc_connectivity_panel_get_type ())
++G_DECLARE_FINAL_TYPE (CcConnectivityPanel, cc_connectivity_panel, CC, CONNECTIVITY_PANEL, CcPanel)
++
++G_END_DECLS
+diff --git a/panels/connectivity/cc-connectivity-panel.ui b/panels/connectivity/cc-connectivity-panel.ui
+new file mode 100644
+index 0000000..709dc2d
+--- /dev/null
++++ b/panels/connectivity/cc-connectivity-panel.ui
+@@ -0,0 +1,21 @@
++<?xml version="1.0" encoding="UTF-8"?>
++<interface>
++  <template class="CcConnectivityPanel" parent="CcPanel">
++    <child type="content">
++      <object class="AdwPreferencesPage">
++        <child>
++          <object class="AdwPreferencesGroup">
++            <property name="description" translatable="yes">Connectivity checking is used to detect connection issues and helps you to stay online. If your network communications are being monitored, it could be used to gather technical information about this computer.</property>
++            <child>
++              <object class="CcListRow" id="connectivity_switch">
++                <property name="title" translatable="yes">_Connectivity Checking</property>
++                <property name="use-underline">True</property>
++                <property name="show-switch">True</property>
++              </object>
++            </child>
++          </object>
++        </child>
++      </object>
++    </child>
++  </template>
++</interface>
+diff --git a/panels/connectivity/connectivity.gresource.xml b/panels/connectivity/connectivity.gresource.xml
+new file mode 100644
+index 0000000..e102045
+--- /dev/null
++++ b/panels/connectivity/connectivity.gresource.xml
+@@ -0,0 +1,6 @@
++<?xml version="1.0" encoding="UTF-8"?>
++<gresources>
++  <gresource prefix="/org/gnome/control-center/connectivity">
++    <file preprocess="xml-stripblanks">cc-connectivity-panel.ui</file>
++  </gresource>
++</gresources>
+diff --git a/panels/connectivity/gnome-connectivity-panel.desktop.in b/panels/connectivity/gnome-connectivity-panel.desktop.in
+new file mode 100644
+index 0000000..b36f569
+--- /dev/null
++++ b/panels/connectivity/gnome-connectivity-panel.desktop.in
+@@ -0,0 +1,15 @@
++[Desktop Entry]
++Name=Connectivity
++Comment=Protect connectivity feature
++Exec=gnome-control-center connectivity
++# FIXME
++# Translators: Do NOT translate or transliterate this text (this is an icon file name)!
++Icon=network-workgroup
++Terminal=false
++Type=Application
++NoDisplay=true
++StartupNotify=true
++Categories=GNOME;GTK;Settings;DesktopSettings;X-GNOME-Settings-Panel;X-GNOME-PrivacySettings;
++OnlyShowIn=GNOME;Unity;
++# Translators: Search terms to find the Privacy panel. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon!
++Keywords=network;privacy;
+diff --git a/panels/connectivity/meson.build b/panels/connectivity/meson.build
+new file mode 100644
+index 0000000..94c0d23
+--- /dev/null
++++ b/panels/connectivity/meson.build
+@@ -0,0 +1,38 @@
++panels_list += cappletname
++desktop = 'gnome-@0@-panel.desktop'.format(cappletname)
++
++i18n.merge_file(
++  type: 'desktop',
++  input: desktop + '.in',
++  output: desktop,
++  po_dir: po_dir,
++  install: true,
++  install_dir: control_center_desktopdir
++)
++
++sources = files('cc-connectivity-panel.c')
++
++resource_data = files('cc-connectivity-panel.ui')
++
++sources += gnome.compile_resources(
++  'cc-' + cappletname + '-resources',
++  cappletname + '.gresource.xml',
++  c_name: 'cc_' + cappletname,
++  dependencies: resource_data,
++  export: true
++)
++
++deps = common_deps
++if host_is_linux
++  deps += network_manager_deps
++endif
++
++cflags += '-DGNOMELOCALEDIR="@0@"'.format(control_center_localedir)
++
++panels_libs += static_library(
++  cappletname,
++  sources: sources,
++  include_directories: [top_inc, common_inc],
++  dependencies: deps,
++  c_args: cflags
++)
+diff --git a/panels/meson.build b/panels/meson.build
+index c825ee2..100bce5 100644
+--- a/panels/meson.build
++++ b/panels/meson.build
+@@ -5,6 +5,7 @@ panels = [
+   'background',
+   'camera',
+   'color',
++  'connectivity',
+   'datetime',
+   'default-apps',
+   'diagnostics',
+diff --git a/po/POTFILES.in b/po/POTFILES.in
+index 6b4c652..9c4737e 100644
+--- a/po/POTFILES.in
++++ b/po/POTFILES.in
+@@ -32,6 +32,8 @@ panels/common/cc-time-editor.ui
+ panels/common/cc-time-entry.c
+ panels/common/cc-util.c
+ panels/common/hostname-helper.c
++panels/connectivity/cc-connectivity-panel.ui
++panels/connectivity/gnome-connectivity-panel.desktop.in
+ panels/datetime/cc-datetime-panel.c
+ panels/datetime/cc-datetime-panel.ui
+ panels/datetime/cc-tz-dialog.ui
+diff --git a/shell/cc-panel-loader.c b/shell/cc-panel-loader.c
+index eb90fe6..5814def 100644
+--- a/shell/cc-panel-loader.c
++++ b/shell/cc-panel-loader.c
+@@ -37,6 +37,7 @@ extern GType cc_background_panel_get_type (void);
+ extern GType cc_bluetooth_panel_get_type (void);
+ #endif /* BUILD_BLUETOOTH */
+ extern GType cc_color_panel_get_type (void);
++extern GType cc_connectivity_panel_get_type (void);
+ extern GType cc_date_time_panel_get_type (void);
+ extern GType cc_default_apps_panel_get_type (void);
+ extern GType cc_display_panel_get_type (void);
+@@ -111,6 +112,7 @@ static CcPanelLoaderVtable default_panels[] =
+ #endif
+   PANEL_TYPE("camera",           cc_camera_panel_get_type,               NULL),
+   PANEL_TYPE("color",            cc_color_panel_get_type,                NULL),
++  PANEL_TYPE("connectivity",     cc_connectivity_panel_get_type,         NULL),
+   PANEL_TYPE("datetime",         cc_date_time_panel_get_type,            NULL),
+   PANEL_TYPE("default-apps",     cc_default_apps_panel_get_type,         NULL),
+   PANEL_TYPE("diagnostics",      cc_diagnostics_panel_get_type,          cc_diagnostics_panel_static_init_func),
diff -pruN 1:43.2-2/debian/patches/ubuntu/diagnostics-Add-Whoopsie-support.patch 1:44~alpha-0ubuntu1/debian/patches/ubuntu/diagnostics-Add-Whoopsie-support.patch
--- 1:43.2-2/debian/patches/ubuntu/diagnostics-Add-Whoopsie-support.patch	1970-01-01 00:00:00.000000000 +0000
+++ 1:44~alpha-0ubuntu1/debian/patches/ubuntu/diagnostics-Add-Whoopsie-support.patch	2023-01-13 16:48:57.000000000 +0000
@@ -0,0 +1,397 @@
+From: =?utf-8?b?Ik1hcmNvIFRyZXZpc2FuIChUcmV2acOxbyki?= <mail@3v1n0.net>
+Date: Sat, 4 Jun 2022 14:57:01 +0200
+Subject: diagnostics: Add Whoopsie support
+
+---
+ meson.build                                        |   9 +
+ meson_options.txt                                  |   1 +
+ panels/diagnostics/cc-diagnostics-panel.c          | 224 +++++++++++++++++++++
+ panels/diagnostics/cc-diagnostics-panel.ui         |  10 +-
+ .../diagnostics/gnome-diagnostics-panel.desktop.in |   2 +-
+ panels/diagnostics/meson.build                     |   7 +-
+ 6 files changed, 250 insertions(+), 3 deletions(-)
+
+diff --git a/meson.build b/meson.build
+index 66aa643..f213066 100644
+--- a/meson.build
++++ b/meson.build
+@@ -224,6 +224,14 @@ endif
+ config_h.set('HAVE_MALCONTENT', enable_malcontent,
+              description: 'Define to 1 if malcontent support is enabled')
+ 
++# Whoopsie (Ubuntu error reporting service)
++enable_whoopsie = get_option('whoopsie')
++if enable_whoopsie
++  whoopsie_dep = dependency('libwhoopsie-preferences')
++endif
++config_h.set('HAVE_WHOOPSIE', enable_whoopsie,
++             description: 'Define to 1 if Whoopsie is enabled')
++
+ if host_is_linux
+   # network manager
+   mm_dep =  dependency('mm-glib', version: '>= 0.7')
+@@ -323,4 +331,5 @@ summary({
+   'IBus': enable_ibus,
+   'Snap': enable_snap,
+   'Malcontent': enable_malcontent,
++  'Whoopsie': enable_whoopsie,
+ }, section: 'Optional Dependencies')
+diff --git a/meson_options.txt b/meson_options.txt
+index 8ee7b6e..beebcf2 100644
+--- a/meson_options.txt
++++ b/meson_options.txt
+@@ -8,3 +8,4 @@ option('profile', type: 'combo', choices: ['default','development'], value: 'def
+ option('malcontent', type: 'boolean', value: false, description: 'build with malcontent support')
+ option('distributor_logo', type: 'string', description: 'absolute path to distributor logo for the About panel')
+ option('dark_mode_distributor_logo', type: 'string', description: 'absolute path to distributor logo dark mode variant')
++option('whoopsie', type: 'boolean', value: false, description: 'build with Whoopsie support')
+diff --git a/panels/diagnostics/cc-diagnostics-panel.c b/panels/diagnostics/cc-diagnostics-panel.c
+index 9aeca6e..4b4d4cf 100644
+--- a/panels/diagnostics/cc-diagnostics-panel.c
++++ b/panels/diagnostics/cc-diagnostics-panel.c
+@@ -18,6 +18,8 @@
+  * Author: Matthias Clasen <mclasen@redhat.com>
+  */
+ 
++#include <config.h>
++
+ #include "cc-diagnostics-panel.h"
+ #include "cc-diagnostics-resources.h"
+ #include "cc-util.h"
+@@ -26,6 +28,10 @@
+ #include <gio/gdesktopappinfo.h>
+ #include <glib/gi18n.h>
+ 
++#ifdef HAVE_WHOOPSIE
++#  include <whoopsie-preferences/libwhoopsie-preferences.h>
++#endif
++
+ struct _CcDiagnosticsPanel
+ {
+   CcPanel              parent_instance;
+@@ -34,6 +40,13 @@ struct _CcDiagnosticsPanel
+   GtkSwitch           *abrt_switch;
+ 
+   GSettings           *privacy_settings;
++
++#ifdef HAVE_WHOOPSIE
++  AdwActionRow        *abrt_row;
++  AdwComboRow         *whoopsie_combo_row;
++  WhoopsiePreferences *whoopsie;
++  GCancellable        *cancellable;
++#endif
+ };
+ 
+ CC_PANEL_REGISTER (CcDiagnosticsPanel, cc_diagnostics_panel)
+@@ -68,9 +81,190 @@ abrt_vanished_cb (GDBusConnection *connection,
+                   gpointer         user_data)
+ {
+   g_debug ("ABRT vanished");
++#ifndef HAVE_WHOOPSIE
+   set_panel_visibility (CC_PANEL_VISIBLE_IN_SEARCH);
++#endif
++}
++
++#ifdef HAVE_WHOOPSIE
++typedef enum
++{
++  WHOOPSIE_BUTTON_SETTING_NEVER,
++  WHOOPSIE_BUTTON_SETTING_AUTO,
++  WHOOPSIE_BUTTON_SETTING_MANUAL,
++} WhoopsieButtonSettingType;
++
++static void
++whoopsie_set_report_crashes_done (GObject *source_object,
++                                  GAsyncResult *res,
++                                  gpointer user_data)
++{
++  CcDiagnosticsPanel *self = user_data;
++  g_autoptr(GError) error = NULL;
++
++  if (!whoopsie_preferences_call_set_report_crashes_finish (self->whoopsie, res, &error))
++    {
++      if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
++        return;
++
++      g_warning ("Failed to toggle crash reporting: %s", error->message);
++    }
+ }
+ 
++static void
++whoopsie_set_report_crashes_mode_done (GObject *source_object,
++                                       GAsyncResult *res,
++                                       gpointer user_data)
++{
++  CcDiagnosticsPanel *self = user_data;
++  g_autoptr(GError) error = NULL;
++
++  if (!whoopsie_preferences_call_set_automatically_report_crashes_finish (self->whoopsie, res, &error))
++    {
++      if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
++        return;
++
++      g_warning ("Failed to toggle crash reporting mode: %s", error->message);
++    }
++}
++
++static void
++whoopsie_combo_row_changed_cb (CcDiagnosticsPanel *self)
++{
++  g_autoptr (GObject) item = NULL;
++  GListModel *model;
++  gint selected_index;
++  gint value;
++
++  model = adw_combo_row_get_model (self->whoopsie_combo_row);
++  selected_index = adw_combo_row_get_selected (self->whoopsie_combo_row);
++  if (selected_index == -1)
++    return;
++
++  item = g_list_model_get_item (model, selected_index);
++  value = GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (item), "value"));
++
++  whoopsie_preferences_call_set_report_crashes (self->whoopsie,
++                                                value != WHOOPSIE_BUTTON_SETTING_NEVER,
++                                                self->cancellable,
++                                                whoopsie_set_report_crashes_done,
++                                                self);
++
++  whoopsie_preferences_call_set_automatically_report_crashes (self->whoopsie,
++                                                              value == WHOOPSIE_BUTTON_SETTING_AUTO,
++                                                              self->cancellable,
++                                                              whoopsie_set_report_crashes_mode_done,
++                                                              self);
++}
++
++static void
++set_value_for_combo_row (AdwComboRow *combo_row, gint value)
++{
++  g_autoptr (GObject) new_item = NULL;
++  GListModel *model;
++  guint i;
++
++  /* try to make the UI match the setting */
++  model = adw_combo_row_get_model (combo_row);
++  for (i = 0; i < g_list_model_get_n_items (model); i++)
++    {
++      g_autoptr (GObject) item = g_list_model_get_item (model, i);
++      gint value_tmp = GPOINTER_TO_UINT (g_object_get_data (item, "value"));
++      if (value_tmp == value)
++        {
++          adw_combo_row_set_selected (combo_row, i);
++          return;
++        }
++    }
++}
++
++static void
++whoopsie_properties_changed (CcDiagnosticsPanel *self)
++{
++  WhoopsieButtonSettingType value = WHOOPSIE_BUTTON_SETTING_NEVER;
++
++  if (whoopsie_preferences_get_automatically_report_crashes (self->whoopsie))
++    value = WHOOPSIE_BUTTON_SETTING_AUTO;
++  else if (whoopsie_preferences_get_report_crashes (self->whoopsie))
++    value = WHOOPSIE_BUTTON_SETTING_MANUAL;
++
++  g_signal_handlers_block_by_func (self->whoopsie_combo_row, whoopsie_combo_row_changed_cb, self);
++  set_value_for_combo_row (self->whoopsie_combo_row, value);
++  g_signal_handlers_unblock_by_func (self->whoopsie_combo_row, whoopsie_combo_row_changed_cb, self);
++}
++
++static void
++populate_whoopsie_button_row (AdwComboRow *combo_row)
++{
++  g_autoptr (GtkStringList) string_list = NULL;
++  struct {
++    char *name;
++    WhoopsieButtonSettingType value;
++  } actions[] = {
++    { NC_("Whoopsie error reporting", "Never"), WHOOPSIE_BUTTON_SETTING_NEVER },
++    { NC_("Whoopsie error reporting", "Automatic"), WHOOPSIE_BUTTON_SETTING_AUTO },
++    { NC_("Whoopsie error reporting", "Manual"), WHOOPSIE_BUTTON_SETTING_MANUAL },
++  };
++  guint item_index = 0;
++  guint i;
++
++  string_list = gtk_string_list_new (NULL);
++  for (i = 0; i < G_N_ELEMENTS (actions); i++)
++    {
++      g_autoptr (GObject) item = NULL;
++
++      gtk_string_list_append (string_list, _(actions[i].name));
++
++      item = g_list_model_get_item (G_LIST_MODEL (string_list), item_index++);
++      g_object_set_data (item, "value", GUINT_TO_POINTER (actions[i].value));
++    }
++
++  adw_combo_row_set_model (combo_row, G_LIST_MODEL (string_list));
++}
++
++static void
++on_new_whoopsie_proxy_cb (GObject *object,
++                          GAsyncResult *res,
++                          gpointer data)
++{
++  CcDiagnosticsPanel *self = data;
++  g_autoptr(GError) error = NULL;
++
++  self->whoopsie = whoopsie_preferences_proxy_new_for_bus_finish (res, &error);
++
++  if (error)
++    {
++      if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
++        g_warning ("Failed to get whoopsie proxy: %s", error->message);
++
++      gtk_widget_set_visible (GTK_WIDGET (self->whoopsie_combo_row), FALSE);
++      gtk_widget_set_visible (GTK_WIDGET (self->abrt_row), TRUE);
++      return;
++    }
++
++  g_debug ("Whoopsie available");
++  gtk_widget_set_visible (GTK_WIDGET (self->whoopsie_combo_row), TRUE);
++  gtk_widget_set_sensitive (GTK_WIDGET (self->whoopsie_combo_row), TRUE);
++
++
++  g_signal_handlers_block_by_func (self->whoopsie_combo_row,
++                                   whoopsie_combo_row_changed_cb, self);
++  populate_whoopsie_button_row (self->whoopsie_combo_row);
++  g_signal_handlers_unblock_by_func (self->whoopsie_combo_row,
++                                     whoopsie_combo_row_changed_cb, self);
++
++  g_signal_connect_object (self->whoopsie, "g-properties-changed",
++                           G_CALLBACK (whoopsie_properties_changed),
++                           self, G_CONNECT_SWAPPED);
++
++  whoopsie_properties_changed (self);
++}
++#else
++static void
++whoopsie_combo_row_changed_cb (CcDiagnosticsPanel *self)
++{}
++#endif
++
+ void
+ cc_diagnostics_panel_static_init_func (void)
+ {
+@@ -82,7 +276,9 @@ cc_diagnostics_panel_static_init_func (void)
+                     NULL,
+                     NULL);
+ 
++#ifndef HAVE_WHOOPSIE
+   set_panel_visibility (CC_PANEL_VISIBLE_IN_SEARCH);
++#endif
+ }
+ 
+ static void
+@@ -92,6 +288,12 @@ cc_diagnostics_panel_finalize (GObject *object)
+ 
+   g_clear_object (&self->privacy_settings);
+ 
++#if HAVE_WHOOPISE
++  g_cancellable_cancel (self->cancellable);
++  g_clear_object (&self->cancellable);
++  g_clear_object (&self->whoopsie);
++#endif
++
+   G_OBJECT_CLASS (cc_diagnostics_panel_parent_class)->finalize (object);
+ }
+ 
+@@ -107,6 +309,12 @@ cc_diagnostics_panel_class_init (CcDiagnosticsPanelClass *klass)
+ 
+   gtk_widget_class_bind_template_child (widget_class, CcDiagnosticsPanel, diagnostics_group);
+   gtk_widget_class_bind_template_child (widget_class, CcDiagnosticsPanel, abrt_switch);
++
++#ifdef HAVE_WHOOPSIE
++  gtk_widget_class_bind_template_child (widget_class, CcDiagnosticsPanel, abrt_row);
++  gtk_widget_class_bind_template_child (widget_class, CcDiagnosticsPanel, whoopsie_combo_row);
++#endif
++  gtk_widget_class_bind_template_callback (widget_class, whoopsie_combo_row_changed_cb);
+ }
+ 
+ static void
+@@ -127,6 +335,22 @@ cc_diagnostics_panel_init (CcDiagnosticsPanel *self)
+                    self->abrt_switch, "active",
+                    G_SETTINGS_BIND_DEFAULT);
+ 
++#ifdef HAVE_WHOOPSIE
++  /* check for whoopsie */
++  self->cancellable = g_cancellable_new ();
++  whoopsie_preferences_proxy_new_for_bus (G_BUS_TYPE_SYSTEM,
++                                          G_DBUS_PROXY_FLAGS_NONE,
++                                          "com.ubuntu.WhoopsiePreferences",
++                                          "/com/ubuntu/WhoopsiePreferences",
++                                          self->cancellable,
++                                          on_new_whoopsie_proxy_cb,
++                                          self);
++
++  gtk_widget_set_visible (GTK_WIDGET (self->whoopsie_combo_row), TRUE);
++  gtk_widget_set_visible (GTK_WIDGET (self->abrt_row), FALSE);
++  gtk_widget_set_sensitive (GTK_WIDGET (self->whoopsie_combo_row), FALSE);
++#endif
++
+   os_name = g_get_os_info (G_OS_INFO_KEY_NAME);
+   if (!os_name)
+     os_name = g_strdup ("GNOME");
+diff --git a/panels/diagnostics/cc-diagnostics-panel.ui b/panels/diagnostics/cc-diagnostics-panel.ui
+index a08a4ca..7a0a3f9 100644
+--- a/panels/diagnostics/cc-diagnostics-panel.ui
++++ b/panels/diagnostics/cc-diagnostics-panel.ui
+@@ -7,7 +7,7 @@
+           <object class="AdwPreferencesGroup" id="diagnostics_group">
+             <property name="title" translatable="yes">Problem Reporting</property>
+             <child>
+-              <object class="AdwActionRow">
++              <object class="AdwActionRow" id ="abrt_row">
+                 <property name="title" translatable="yes">_Automatic Problem Reporting</property>
+                 <property name="use-underline">True</property>
+                 <property name="activatable-widget">abrt_switch</property>
+@@ -21,6 +21,14 @@
+                 </child>
+               </object>
+             </child>
++            <child>
++              <object class="AdwComboRow" id="whoopsie_combo_row">
++                <property name="visible">False</property>
++                <property name="title" translatable="yes">Send error reports to Canonical</property>
++                <property name="use_underline">True</property>
++                <signal name="notify::selected-item" handler="whoopsie_combo_row_changed_cb" object="CcDiagnosticsPanel" swapped="yes"/>
++              </object>
++            </child>
+           </object>
+         </child>
+       </object>
+diff --git a/panels/diagnostics/gnome-diagnostics-panel.desktop.in b/panels/diagnostics/gnome-diagnostics-panel.desktop.in
+index dbdbfd5..2fa1121 100644
+--- a/panels/diagnostics/gnome-diagnostics-panel.desktop.in
++++ b/panels/diagnostics/gnome-diagnostics-panel.desktop.in
+@@ -12,4 +12,4 @@ StartupNotify=true
+ Categories=GNOME;GTK;Settings;DesktopSettings;X-GNOME-Settings-Panel;X-GNOME-PrivacySettings;
+ OnlyShowIn=GNOME;Unity;
+ # Translators: Search terms to find the Diagnostics panel. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon!
+-Keywords=diagnostics;crash;
++Keywords=diagnostics;crash;error;bug;whoopsie;launchpad;issue;
+diff --git a/panels/diagnostics/meson.build b/panels/diagnostics/meson.build
+index a17f0b8..64418e1 100644
+--- a/panels/diagnostics/meson.build
++++ b/panels/diagnostics/meson.build
+@@ -22,13 +22,18 @@ sources += gnome.compile_resources(
+   export: true
+ )
+ 
++deps = common_deps
++if enable_whoopsie
++  deps += whoopsie_dep
++endif
++
+ cflags += '-DGNOMELOCALEDIR="@0@"'.format(control_center_localedir)
+ 
+ panels_libs += static_library(
+   cappletname,
+   sources: sources,
+   include_directories: [top_inc, common_inc],
+-  dependencies: common_deps,
++  dependencies: deps,
+   c_args: cflags
+ )
+ 
diff -pruN 1:43.2-2/debian/patches/ubuntu/Disable-non-working-camera-microphones-panels.patch 1:44~alpha-0ubuntu1/debian/patches/ubuntu/Disable-non-working-camera-microphones-panels.patch
--- 1:43.2-2/debian/patches/ubuntu/Disable-non-working-camera-microphones-panels.patch	1970-01-01 00:00:00.000000000 +0000
+++ 1:44~alpha-0ubuntu1/debian/patches/ubuntu/Disable-non-working-camera-microphones-panels.patch	2023-01-13 16:48:57.000000000 +0000
@@ -0,0 +1,38 @@
+From: Robert Ancell <robert.ancell@canonical.com>
+Date: Thu, 30 Jan 2020 10:16:06 +1300
+Subject: Disable non working camera/microphones panels
+
+Upstream: https://gitlab.gnome.org/GNOME/gnome-control-center/issues/381
+https://gitlab.gnome.org/GNOME/gnome-control-center/-/issues/741
+https://gitlab.gnome.org/GNOME/cheese/-/issues/95
+
+Even with improved text from the original implementation, the panel
+doesn't seem to work with Snap apps. I disabled the camera and microphone
+here and the Zoom snap still works and it isn't listed as an app
+"requesting permission".
+---
+ shell/cc-panel-loader.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/shell/cc-panel-loader.c b/shell/cc-panel-loader.c
+index 5814def..fe0baf7 100644
+--- a/shell/cc-panel-loader.c
++++ b/shell/cc-panel-loader.c
+@@ -110,7 +110,7 @@ static CcPanelLoaderVtable default_panels[] =
+ #ifdef BUILD_BLUETOOTH
+   PANEL_TYPE("bluetooth",        cc_bluetooth_panel_get_type,            NULL),
+ #endif
+-  PANEL_TYPE("camera",           cc_camera_panel_get_type,               NULL),
++  //PANEL_TYPE("camera",           cc_camera_panel_get_type,               NULL),
+   PANEL_TYPE("color",            cc_color_panel_get_type,                NULL),
+   PANEL_TYPE("connectivity",     cc_connectivity_panel_get_type,         NULL),
+   PANEL_TYPE("datetime",         cc_date_time_panel_get_type,            NULL),
+@@ -121,7 +121,7 @@ static CcPanelLoaderVtable default_panels[] =
+   PANEL_TYPE("keyboard",         cc_keyboard_panel_get_type,             NULL),
+   PANEL_TYPE("location",         cc_location_panel_get_type,             NULL),
+   PANEL_TYPE("firmware-security",cc_firmware_security_panel_get_type,    cc_firmware_security_panel_static_init_func),
+-  PANEL_TYPE("microphone",       cc_microphone_panel_get_type,           NULL),
++  // PANEL_TYPE("microphone",       cc_microphone_panel_get_type,           NULL),
+   PANEL_TYPE("mouse",            cc_mouse_panel_get_type,                NULL),
+   PANEL_TYPE("multitasking",     cc_multitasking_panel_get_type,         NULL),
+ #ifdef BUILD_NETWORK
diff -pruN 1:43.2-2/debian/patches/ubuntu/display-Allow-fractional-scaling-to-be-enabled.patch 1:44~alpha-0ubuntu1/debian/patches/ubuntu/display-Allow-fractional-scaling-to-be-enabled.patch
--- 1:43.2-2/debian/patches/ubuntu/display-Allow-fractional-scaling-to-be-enabled.patch	1970-01-01 00:00:00.000000000 +0000
+++ 1:44~alpha-0ubuntu1/debian/patches/ubuntu/display-Allow-fractional-scaling-to-be-enabled.patch	2023-01-13 16:48:57.000000000 +0000
@@ -0,0 +1,622 @@
+From: Robert Ancell <robert.ancell@canonical.com>
+Date: Sun, 15 Mar 2020 09:07:51 +0100
+Subject: display: Allow fractional scaling to be enabled
+
+---
+ panels/display/cc-display-config-dbus.c |  60 ++++++++
+ panels/display/cc-display-config.c      | 244 ++++++++++++++++++++++++++++++++
+ panels/display/cc-display-config.h      |  11 ++
+ panels/display/cc-display-settings.c    |  28 +++-
+ panels/display/cc-display-settings.ui   |   9 ++
+ 5 files changed, 351 insertions(+), 1 deletion(-)
+
+diff --git a/panels/display/cc-display-config-dbus.c b/panels/display/cc-display-config-dbus.c
+index eea7d43..e054d00 100644
+--- a/panels/display/cc-display-config-dbus.c
++++ b/panels/display/cc-display-config-dbus.c
+@@ -994,6 +994,8 @@ struct _CcDisplayConfigDBus
+   gboolean supports_changing_layout_mode;
+   gboolean global_scale_required;
+   CcDisplayLayoutMode layout_mode;
++  gint legacy_ui_scale;
++  char *renderer;
+ 
+   GList *monitors;
+   CcDisplayMonitorDBus *primary;
+@@ -1160,6 +1162,9 @@ cc_display_config_dbus_equal (CcDisplayConfig *pself,
+   g_return_val_if_fail (pself, FALSE);
+   g_return_val_if_fail (pother, FALSE);
+ 
++  if (self->layout_mode != other->layout_mode)
++    return FALSE;
++
+   cc_display_config_dbus_ensure_non_offset_coords (self);
+   cc_display_config_dbus_ensure_non_offset_coords (other);
+ 
+@@ -1458,6 +1463,29 @@ cc_display_config_dbus_is_layout_logical (CcDisplayConfig *pself)
+          self->layout_mode == CC_DISPLAY_LAYOUT_MODE_GLOBAL_UI_LOGICAL;
+ }
+ 
++static void
++cc_display_config_dbus_set_layout_logical (CcDisplayConfig *pself,
++                                           gboolean         logical)
++{
++  CcDisplayConfigDBus *self = CC_DISPLAY_CONFIG_DBUS (pself);
++
++  if (!self->supports_changing_layout_mode)
++    return;
++
++  if (!logical)
++    {
++      self->layout_mode = CC_DISPLAY_LAYOUT_MODE_PHYSICAL;
++      return;
++    }
++
++  if (g_str_equal (self->renderer, "native") || g_str_equal (self->renderer, "kms"))
++    self->layout_mode = CC_DISPLAY_LAYOUT_MODE_LOGICAL;
++  else if (g_str_equal (self->renderer, "xrandr"))
++    self->layout_mode = CC_DISPLAY_LAYOUT_MODE_GLOBAL_UI_LOGICAL;
++  else
++    g_return_if_reached ();
++}
++
+ static gboolean
+ cc_display_config_dbus_layout_use_ui_scale (CcDisplayConfig *pself)
+ {
+@@ -1465,6 +1493,20 @@ cc_display_config_dbus_layout_use_ui_scale (CcDisplayConfig *pself)
+   return self->layout_mode == CC_DISPLAY_LAYOUT_MODE_GLOBAL_UI_LOGICAL;
+ }
+ 
++static gint
++cc_display_config_dbus_get_legacy_ui_scale (CcDisplayConfig *pself)
++{
++  CcDisplayConfigDBus *self = CC_DISPLAY_CONFIG_DBUS (pself);
++  return self->legacy_ui_scale;
++}
++
++static const char *
++cc_display_config_dbus_get_renderer (CcDisplayConfig *pself)
++{
++  CcDisplayConfigDBus *self = CC_DISPLAY_CONFIG_DBUS (pself);
++  return self->renderer;
++}
++
+ static gboolean
+ is_scale_allowed_by_active_monitors (CcDisplayConfigDBus *self,
+                                      CcDisplayMode       *mode,
+@@ -1632,6 +1674,11 @@ cc_display_config_dbus_init (CcDisplayConfigDBus *self)
+   self->global_scale_required = FALSE;
+   self->layout_mode = CC_DISPLAY_LAYOUT_MODE_LOGICAL;
+   self->logical_monitors = g_hash_table_new (NULL, NULL);
++
++  if (g_getenv ("WAYLAND_DISPLAY"))
++    self->renderer = g_strdup ("native");
++  else if (g_getenv ("DISPLAY"))
++    self->renderer = g_strdup ("xrandr");
+ }
+ 
+ static void
+@@ -1818,6 +1865,15 @@ cc_display_config_dbus_constructed (GObject *object)
+         {
+           g_variant_get (v, "b", &self->global_scale_required);
+         }
++      else if (g_str_equal (s, "legacy-ui-scaling-factor"))
++        {
++          g_variant_get (v, "i", &self->legacy_ui_scale);
++        }
++      else if (g_str_equal (s, "renderer"))
++        {
++          g_clear_pointer (&self->renderer, g_free);
++          g_variant_get (v, "s", &self->renderer);
++        }
+       else if (g_str_equal (s, "layout-mode"))
+         {
+           guint32 u = 0;
+@@ -1921,6 +1977,7 @@ cc_display_config_dbus_finalize (GObject *object)
+ 
+   g_clear_list (&self->monitors, g_object_unref);
+   g_clear_pointer (&self->logical_monitors, g_hash_table_destroy);
++  g_clear_pointer (&self->renderer, g_free);
+ 
+   G_OBJECT_CLASS (cc_display_config_dbus_parent_class)->finalize (object);
+ }
+@@ -1946,11 +2003,14 @@ cc_display_config_dbus_class_init (CcDisplayConfigDBusClass *klass)
+   parent_class->set_cloning = cc_display_config_dbus_set_cloning;
+   parent_class->generate_cloning_modes = cc_display_config_dbus_generate_cloning_modes;
+   parent_class->is_layout_logical = cc_display_config_dbus_is_layout_logical;
++  parent_class->set_layout_logical = cc_display_config_dbus_set_layout_logical;
+   parent_class->is_scaled_mode_valid = cc_display_config_dbus_is_scaled_mode_valid;
+   parent_class->set_minimum_size = cc_display_config_dbus_set_minimum_size;
+   parent_class->get_panel_orientation_managed =
+     cc_display_config_dbus_get_panel_orientation_managed;
+   parent_class->layout_use_ui_scale = cc_display_config_dbus_layout_use_ui_scale;
++  parent_class->get_legacy_ui_scale = cc_display_config_dbus_get_legacy_ui_scale;
++  parent_class->get_renderer = cc_display_config_dbus_get_renderer;
+ 
+   pspec = g_param_spec_variant ("state",
+                                 "GVariant",
+diff --git a/panels/display/cc-display-config.c b/panels/display/cc-display-config.c
+index 4c21aa8..5743869 100644
+--- a/panels/display/cc-display-config.c
++++ b/panels/display/cc-display-config.c
+@@ -17,6 +17,11 @@
+  *
+  */
+ 
++#define MUTTER_SCHEMA                     "org.gnome.mutter"
++#define MUTTER_EXPERIMENTAL_FEATURES_KEY  "experimental-features"
++#define MUTTER_FEATURE_FRACTIONAL_SCALING_X11 "x11-randr-fractional-scaling"
++#define MUTTER_FEATURE_FRACTIONAL_SCALING_WAYLAND "scale-monitor-framebuffer"
++
+ #include <gio/gio.h>
+ #include <math.h>
+ #include "cc-display-config.h"
+@@ -443,6 +448,10 @@ cc_display_monitor_set_ui_info (CcDisplayMonitor *self, gint ui_number, gchar *u
+ 
+ struct _CcDisplayConfigPrivate {
+   GList *ui_sorted_monitors;
++
++  GSettings *mutter_settings;
++  gboolean fractional_scaling;
++  gboolean fractional_scaling_pending_disable;
+ };
+ typedef struct _CcDisplayConfigPrivate CcDisplayConfigPrivate;
+ 
+@@ -450,6 +459,68 @@ G_DEFINE_TYPE_WITH_PRIVATE (CcDisplayConfig,
+                             cc_display_config,
+                             G_TYPE_OBJECT)
+ 
++static const char *
++get_fractional_scaling_key (CcDisplayConfig *self)
++{
++  const char *renderer = cc_display_config_get_renderer (self);
++
++  if (!renderer)
++    g_return_val_if_reached (MUTTER_FEATURE_FRACTIONAL_SCALING_WAYLAND);
++
++  if (g_str_equal (renderer, "xrandr"))
++    return MUTTER_FEATURE_FRACTIONAL_SCALING_X11;
++
++  if (g_str_equal (renderer, "native") || g_str_equal (renderer, "kms"))
++    return MUTTER_FEATURE_FRACTIONAL_SCALING_WAYLAND;
++
++  g_return_val_if_reached (NULL);
++}
++
++static gboolean
++get_fractional_scaling_active (CcDisplayConfig *self)
++{
++  const char *renderer = cc_display_config_get_renderer (self);
++
++  if (renderer && g_str_equal (renderer, "xrandr") &&
++      !cc_display_config_layout_use_ui_scale (self))
++    return FALSE;
++
++  return cc_display_config_is_layout_logical (self);
++}
++
++static void
++set_fractional_scaling_active (CcDisplayConfig *self,
++                               gboolean         enable)
++{
++  CcDisplayConfigPrivate *priv = cc_display_config_get_instance_private (self);
++  g_auto(GStrv) existing_features = NULL;
++  gboolean have_fractional_scaling = FALSE;
++  g_autoptr(GVariantBuilder) builder = NULL;
++  const char *key = get_fractional_scaling_key (self);
++
++  /* Add or remove the fractional scaling feature from mutter */
++  existing_features = g_settings_get_strv (priv->mutter_settings,
++                                           MUTTER_EXPERIMENTAL_FEATURES_KEY);
++  builder = g_variant_builder_new (G_VARIANT_TYPE ("as"));
++  for (int i = 0; existing_features[i] != NULL; i++)
++    {
++      if (g_strcmp0 (existing_features[i], key) == 0)
++        {
++          if (enable)
++            have_fractional_scaling = TRUE;
++          else
++            continue;
++        }
++
++      g_variant_builder_add (builder, "s", existing_features[i]);
++    }
++  if (enable && !have_fractional_scaling && key)
++    g_variant_builder_add (builder, "s", key);
++
++  g_settings_set_value (priv->mutter_settings, MUTTER_EXPERIMENTAL_FEATURES_KEY,
++                        g_variant_builder_end (builder));
++}
++
+ static void
+ cc_display_config_init (CcDisplayConfig *self)
+ {
+@@ -487,6 +558,10 @@ cc_display_config_constructed (GObject *object)
+ 
+       ui_number += 1;
+     }
++
++  /* No need to connect to the setting, as we'll get notified by mutter */
++  priv->mutter_settings = g_settings_new (MUTTER_SCHEMA);
++  priv->fractional_scaling = get_fractional_scaling_active (self);
+ }
+ 
+ static void
+@@ -496,6 +571,7 @@ cc_display_config_finalize (GObject *object)
+   CcDisplayConfigPrivate *priv = cc_display_config_get_instance_private (self);
+ 
+   g_list_free (priv->ui_sorted_monitors);
++  g_clear_object (&priv->mutter_settings);
+ 
+   G_OBJECT_CLASS (cc_display_config_parent_class)->finalize (object);
+ }
+@@ -587,9 +663,16 @@ gboolean
+ cc_display_config_equal (CcDisplayConfig *self,
+                          CcDisplayConfig *other)
+ {
++  CcDisplayConfigPrivate *spriv = cc_display_config_get_instance_private (self);
++  CcDisplayConfigPrivate *opriv = cc_display_config_get_instance_private (other);
++
+   g_return_val_if_fail (CC_IS_DISPLAY_CONFIG (self), FALSE);
+   g_return_val_if_fail (CC_IS_DISPLAY_CONFIG (other), FALSE);
+ 
++  if (spriv->fractional_scaling_pending_disable !=
++      opriv->fractional_scaling_pending_disable)
++    return FALSE;
++
+   return CC_DISPLAY_CONFIG_GET_CLASS (self)->equal (self, other);
+ }
+ 
+@@ -597,6 +680,8 @@ gboolean
+ cc_display_config_apply (CcDisplayConfig *self,
+                          GError **error)
+ {
++  CcDisplayConfigPrivate *priv = cc_display_config_get_instance_private (self);
++
+   if (!CC_IS_DISPLAY_CONFIG (self))
+     {
+       g_warning ("Cannot apply invalid configuration");
+@@ -607,6 +692,12 @@ cc_display_config_apply (CcDisplayConfig *self,
+       return FALSE;
+     }
+ 
++  if (priv->fractional_scaling_pending_disable)
++    {
++      set_fractional_scaling_active (self, FALSE);
++      priv->fractional_scaling_pending_disable = FALSE;
++    }
++
+   return CC_DISPLAY_CONFIG_GET_CLASS (self)->apply (self, error);
+ }
+ 
+@@ -639,6 +730,14 @@ cc_display_config_is_layout_logical (CcDisplayConfig *self)
+   return CC_DISPLAY_CONFIG_GET_CLASS (self)->is_layout_logical (self);
+ }
+ 
++void
++cc_display_config_set_layout_logical (CcDisplayConfig *self,
++                                      gboolean         logical)
++{
++  g_return_if_fail (CC_IS_DISPLAY_CONFIG (self));
++  return CC_DISPLAY_CONFIG_GET_CLASS (self)->set_layout_logical (self, logical);
++}
++
+ void
+ cc_display_config_set_minimum_size (CcDisplayConfig *self,
+                                     int              width,
+@@ -648,13 +747,37 @@ cc_display_config_set_minimum_size (CcDisplayConfig *self,
+   CC_DISPLAY_CONFIG_GET_CLASS (self)->set_minimum_size (self, width, height);
+ }
+ 
++gint
++cc_display_config_get_legacy_ui_scale (CcDisplayConfig *self)
++{
++  return CC_DISPLAY_CONFIG_GET_CLASS (self)->get_legacy_ui_scale (self);
++}
++
++const char *
++cc_display_config_get_renderer (CcDisplayConfig *self)
++{
++  return CC_DISPLAY_CONFIG_GET_CLASS (self)->get_renderer (self);
++}
++
++static gboolean
++scale_value_is_fractional (double scale)
++{
++  return (int) scale != scale;
++}
++
+ gboolean
+ cc_display_config_is_scaled_mode_valid (CcDisplayConfig *self,
+                                         CcDisplayMode   *mode,
+                                         double           scale)
+ {
++  CcDisplayConfigPrivate *priv = cc_display_config_get_instance_private (self);
++
+   g_return_val_if_fail (CC_IS_DISPLAY_CONFIG (self), FALSE);
+   g_return_val_if_fail (CC_IS_DISPLAY_MODE (mode), FALSE);
++
++  if (priv->fractional_scaling_pending_disable && scale_value_is_fractional (scale))
++    return FALSE;
++
+   return CC_DISPLAY_CONFIG_GET_CLASS (self)->is_scaled_mode_valid (self, mode, scale);
+ }
+ 
+@@ -689,3 +812,124 @@ cc_display_config_get_maximum_scaling (CcDisplayConfig *self)
+ 
+   return max_scale;
+ }
++
++static gboolean
++set_monitors_scaling_to_preferred_integers (CcDisplayConfig *self)
++{
++  GList *l;
++  gboolean any_changed = FALSE;
++
++  for (l = cc_display_config_get_monitors (self); l; l = l->next)
++    {
++      CcDisplayMonitor *monitor = l->data;
++      gdouble monitor_scale = cc_display_monitor_get_scale (monitor);
++
++      if (scale_value_is_fractional (monitor_scale))
++        {
++          CcDisplayMode *preferred_mode;
++          double preferred_scale;
++          double *saved_scale;
++
++          preferred_mode = cc_display_monitor_get_preferred_mode (monitor);
++          preferred_scale = cc_display_mode_get_preferred_scale (preferred_mode);
++          cc_display_monitor_set_scale (monitor, preferred_scale);
++          any_changed = TRUE;
++
++          saved_scale = g_new (double, 1);
++          *saved_scale = monitor_scale;
++          g_object_set_data_full (G_OBJECT (monitor),
++                                  "previous-fractional-scale",
++                                  saved_scale, g_free);
++        }
++      else
++        {
++          g_signal_emit_by_name (monitor, "scale");
++        }
++    }
++
++  return any_changed;
++}
++
++static void
++reset_monitors_scaling_to_selected_values (CcDisplayConfig *self)
++{
++  GList *l;
++
++  for (l = cc_display_config_get_monitors (self); l; l = l->next)
++    {
++      CcDisplayMonitor *monitor = l->data;
++      gdouble *saved_scale;
++
++      saved_scale = g_object_get_data (G_OBJECT (monitor),
++                                       "previous-fractional-scale");
++
++      if (saved_scale)
++        {
++          cc_display_monitor_set_scale (monitor, *saved_scale);
++          g_object_set_data (G_OBJECT (monitor), "previous-fractional-scale", NULL);
++        }
++      else
++        {
++          g_signal_emit_by_name (monitor, "scale");
++        }
++    }
++}
++
++void
++cc_display_config_set_fractional_scaling (CcDisplayConfig *self,
++                                          gboolean         enabled)
++{
++  CcDisplayConfigPrivate *priv = cc_display_config_get_instance_private (self);
++
++  if (priv->fractional_scaling == enabled)
++    return;
++
++  priv->fractional_scaling = enabled;
++
++  if (!cc_display_config_layout_use_ui_scale (self))
++    cc_display_config_set_layout_logical (self, enabled);
++
++  if (priv->fractional_scaling)
++    {
++      if (priv->fractional_scaling_pending_disable)
++        {
++          priv->fractional_scaling_pending_disable = FALSE;
++          reset_monitors_scaling_to_selected_values (self);
++        }
++
++      if (!get_fractional_scaling_active (self))
++        set_fractional_scaling_active (self, enabled);
++    }
++  else
++    {
++      priv->fractional_scaling_pending_disable = TRUE;
++
++      if (!set_monitors_scaling_to_preferred_integers (self))
++        {
++          gboolean disable_now = FALSE;
++
++          if (cc_display_config_layout_use_ui_scale (self))
++            {
++              disable_now =
++                G_APPROX_VALUE (cc_display_config_get_legacy_ui_scale (self),
++                                cc_display_config_get_maximum_scaling (self),
++                                DBL_EPSILON);
++            }
++
++          if (disable_now)
++            {
++              priv->fractional_scaling_pending_disable = FALSE;
++              reset_monitors_scaling_to_selected_values (self);
++              set_fractional_scaling_active (self, enabled);
++            }
++        }
++    }
++}
++
++gboolean
++cc_display_config_get_fractional_scaling (CcDisplayConfig *self)
++{
++  CcDisplayConfigPrivate *priv = cc_display_config_get_instance_private (self);
++
++  return priv->fractional_scaling;
++}
+diff --git a/panels/display/cc-display-config.h b/panels/display/cc-display-config.h
+index c136f57..e206a02 100644
+--- a/panels/display/cc-display-config.h
++++ b/panels/display/cc-display-config.h
+@@ -167,6 +167,8 @@ struct _CcDisplayConfigClass
+                                  gboolean          clone);
+   GList*   (*generate_cloning_modes) (CcDisplayConfig  *self);
+   gboolean (*is_layout_logical) (CcDisplayConfig  *self);
++  void     (*set_layout_logical) (CcDisplayConfig  *self,
++                                 gboolean          enabled);
+   void     (*set_minimum_size)  (CcDisplayConfig  *self,
+                                  int               width,
+                                  int               height);
+@@ -175,6 +177,8 @@ struct _CcDisplayConfigClass
+                                     double            scale);
+   gboolean (* get_panel_orientation_managed) (CcDisplayConfig    *self);
+   gboolean (*layout_use_ui_scale) (CcDisplayConfig  *self);
++  gint     (*get_legacy_ui_scale) (CcDisplayConfig  *self);
++  const char * (*get_renderer)    (CcDisplayConfig  *self);
+ };
+ 
+ 
+@@ -195,6 +199,8 @@ void              cc_display_config_set_mode_on_all_outputs (CcDisplayConfig *co
+                                                              CcDisplayMode   *mode);
+ 
+ gboolean          cc_display_config_is_layout_logical       (CcDisplayConfig    *self);
++void              cc_display_config_set_layout_logical      (CcDisplayConfig    *self,
++                                                             gboolean            logical);
+ void              cc_display_config_set_minimum_size        (CcDisplayConfig    *self,
+                                                              int                 width,
+                                                              int                 height);
+@@ -204,8 +210,13 @@ gboolean          cc_display_config_is_scaled_mode_valid    (CcDisplayConfig
+ gboolean          cc_display_config_get_panel_orientation_managed
+                                                             (CcDisplayConfig    *self);
+ gboolean          cc_display_config_layout_use_ui_scale     (CcDisplayConfig    *self);
++gint              cc_display_config_get_legacy_ui_scale     (CcDisplayConfig    *self);
++const char*       cc_display_config_get_renderer            (CcDisplayConfig    *self);
+ 
+ double            cc_display_config_get_maximum_scaling     (CcDisplayConfig    *self);
++void              cc_display_config_set_fractional_scaling  (CcDisplayConfig    *self,
++                                                             gboolean            enabled);
++gboolean          cc_display_config_get_fractional_scaling  (CcDisplayConfig    *self);
+ 
+ const char*       cc_display_monitor_get_display_name       (CcDisplayMonitor   *monitor);
+ gboolean          cc_display_monitor_is_active              (CcDisplayMonitor   *monitor);
+diff --git a/panels/display/cc-display-settings.c b/panels/display/cc-display-settings.c
+index 7c33f49..885942f 100644
+--- a/panels/display/cc-display-settings.c
++++ b/panels/display/cc-display-settings.c
+@@ -23,6 +23,7 @@
+ #include <glib/gi18n.h>
+ #include <float.h>
+ #include <math.h>
++#include "cc-list-row.h"
+ #include "cc-display-settings.h"
+ #include "cc-display-config.h"
+ 
+@@ -55,6 +56,7 @@ struct _CcDisplaySettings
+   GtkWidget        *scale_bbox;
+   GtkWidget        *scale_buttons_row;
+   GtkWidget        *scale_combo_row;
++  GtkWidget        *scale_fractional_row;
+   GtkWidget        *underscanning_row;
+   GtkWidget        *underscanning_switch;
+ };
+@@ -77,7 +79,6 @@ static void on_scale_btn_active_changed_cb (GtkWidget         *widget,
+                                             GParamSpec        *pspec,
+                                             CcDisplaySettings *self);
+ 
+-
+ static gboolean
+ should_show_rotation (CcDisplaySettings *self)
+ {
+@@ -254,6 +255,7 @@ cc_display_settings_rebuild_ui (CcDisplaySettings *self)
+       gtk_widget_set_visible (self->resolution_row, FALSE);
+       gtk_widget_set_visible (self->scale_combo_row, FALSE);
+       gtk_widget_set_visible (self->scale_buttons_row, FALSE);
++      gtk_widget_set_visible (self->scale_fractional_row, FALSE);
+       gtk_widget_set_visible (self->underscanning_row, FALSE);
+ 
+       return G_SOURCE_REMOVE;
+@@ -462,6 +464,11 @@ cc_display_settings_rebuild_ui (CcDisplaySettings *self)
+     }
+   cc_display_settings_refresh_layout (self, self->folded);
+ 
++  gtk_widget_set_visible (self->scale_fractional_row, TRUE);
++  g_object_set (G_OBJECT (self->scale_fractional_row), "active",
++                cc_display_config_get_fractional_scaling (self->config),
++                NULL);
++
+   gtk_widget_set_visible (self->underscanning_row,
+                           cc_display_monitor_supports_underscanning (self->selected_output) &&
+                           !cc_display_config_is_cloning (self->config));
+@@ -757,6 +764,7 @@ cc_display_settings_class_init (CcDisplaySettingsClass *klass)
+   gtk_widget_class_bind_template_child (widget_class, CcDisplaySettings, scale_bbox);
+   gtk_widget_class_bind_template_child (widget_class, CcDisplaySettings, scale_buttons_row);
+   gtk_widget_class_bind_template_child (widget_class, CcDisplaySettings, scale_combo_row);
++  gtk_widget_class_bind_template_child (widget_class, CcDisplaySettings, scale_fractional_row);
+   gtk_widget_class_bind_template_child (widget_class, CcDisplaySettings, underscanning_row);
+   gtk_widget_class_bind_template_child (widget_class, CcDisplaySettings, underscanning_switch);
+ 
+@@ -768,6 +776,19 @@ cc_display_settings_class_init (CcDisplaySettingsClass *klass)
+   gtk_widget_class_bind_template_callback (widget_class, on_underscanning_switch_active_changed_cb);
+ }
+ 
++static void
++on_scale_fractional_toggled (CcDisplaySettings *self)
++{
++  gboolean active;
++
++  active = cc_list_row_get_active (CC_LIST_ROW (self->scale_fractional_row));
++
++  if (self->config)
++    cc_display_config_set_fractional_scaling (self->config, active);
++
++  g_signal_emit_by_name (G_OBJECT (self), "updated", self->selected_output);
++}
++
+ static void
+ cc_display_settings_init (CcDisplaySettings *self)
+ {
+@@ -803,6 +824,11 @@ cc_display_settings_init (CcDisplaySettings *self)
+   adw_combo_row_set_model (ADW_COMBO_ROW (self->resolution_row),
+                            G_LIST_MODEL (self->resolution_list));
+ 
++  g_signal_connect_object (self->scale_fractional_row,
++                           "notify::active",
++                           G_CALLBACK (on_scale_fractional_toggled),
++                           self, G_CONNECT_SWAPPED);
++
+   self->updating = FALSE;
+ }
+ 
+diff --git a/panels/display/cc-display-settings.ui b/panels/display/cc-display-settings.ui
+index 64c44d1..badd4e9 100644
+--- a/panels/display/cc-display-settings.ui
++++ b/panels/display/cc-display-settings.ui
+@@ -95,6 +95,15 @@
+             <signal name="notify::selected-item" handler="on_scale_selection_changed_cb" swapped="no"/>
+           </object>
+         </child>
++        <child>
++          <object class="CcListRow" id="scale_fractional_row">
++            <property name="width_request">100</property>
++            <property name="can_focus">True</property>
++            <property name="title" translatable="yes" context="display setting">Fractional Scaling</property>
++            <property name="subtitle" translatable="yes" context="display setting">May increase power usage, lower speed, or reduce display sharpness.</property>
++            <property name="show-switch">True</property>
++          </object>
++        </child>
+       </object>
+     </child>
+   </template>
diff -pruN 1:43.2-2/debian/patches/ubuntu/display-Support-UI-scaled-logical-monitor-mode.patch 1:44~alpha-0ubuntu1/debian/patches/ubuntu/display-Support-UI-scaled-logical-monitor-mode.patch
--- 1:43.2-2/debian/patches/ubuntu/display-Support-UI-scaled-logical-monitor-mode.patch	1970-01-01 00:00:00.000000000 +0000
+++ 1:44~alpha-0ubuntu1/debian/patches/ubuntu/display-Support-UI-scaled-logical-monitor-mode.patch	2023-01-13 16:48:57.000000000 +0000
@@ -0,0 +1,270 @@
+From: =?utf-8?b?Ik1hcmNvIFRyZXZpc2FuIChUcmV2acOxbyki?= <mail@3v1n0.net>
+Date: Wed, 27 Mar 2019 05:42:41 +0100
+Subject: display: Support UI scaled logical monitor mode
+
+When this mode is selected we need to assume that all the monitors are scaled
+by their scaling and the global UI scale.
+
+Origin: https://gitlab.gnome.org/3v1n0/gnome-control-center/commits/layout-global-scale
+Bug-Ubuntu: https://bugs.launchpad.net/ubuntu/+source/mutter/+bug/1820850
+Forwarded: No, MPs will follow shortly
+---
+ panels/display/cc-display-arrangement.c | 25 ++++++++++++++++----
+ panels/display/cc-display-config-dbus.c | 41 ++++++++++++++++++++++++++++++---
+ panels/display/cc-display-config.c      | 26 +++++++++++++++++++++
+ panels/display/cc-display-config.h      |  4 ++++
+ 4 files changed, 88 insertions(+), 8 deletions(-)
+
+diff --git a/panels/display/cc-display-arrangement.c b/panels/display/cc-display-arrangement.c
+index ae3541e..0928caa 100644
+--- a/panels/display/cc-display-arrangement.c
++++ b/panels/display/cc-display-arrangement.c
+@@ -99,6 +99,7 @@ apply_rotation_to_geometry (CcDisplayMonitor *output,
+ static void
+ get_scaled_geometry (CcDisplayConfig  *config,
+                      CcDisplayMonitor *output,
++                     double            max_scale,
+                      int              *x,
+                      int              *y,
+                      int              *w,
+@@ -117,6 +118,10 @@ get_scaled_geometry (CcDisplayConfig  *config,
+   if (cc_display_config_is_layout_logical (config))
+     {
+       double scale = cc_display_monitor_get_scale (output);
++
++      if (cc_display_config_layout_use_ui_scale (config))
++        scale /= ceil (max_scale);
++
+       *w = round (*w / scale);
+       *h = round (*h / scale);
+     }
+@@ -134,6 +139,7 @@ get_bounding_box (CcDisplayConfig *config,
+                   gint            *max_h)
+ {
+   GList *outputs, *l;
++  gdouble max_scale;
+ 
+   g_assert (x1 && y1 && x2 && y2);
+ 
+@@ -141,6 +147,7 @@ get_bounding_box (CcDisplayConfig *config,
+   *x2 = *y2 = G_MININT;
+   *max_w = 0;
+   *max_h = 0;
++  max_scale = cc_display_config_get_maximum_scaling (config);
+ 
+   outputs = cc_display_config_get_monitors (config);
+   for (l = outputs; l; l = l->next)
+@@ -151,7 +158,7 @@ get_bounding_box (CcDisplayConfig *config,
+       if (!cc_display_monitor_is_useful (output))
+         continue;
+ 
+-      get_scaled_geometry (config, output, &x, &y, &w, &h);
++      get_scaled_geometry (config, output, max_scale, &x, &y, &w, &h);
+ 
+       *x1 = MIN (*x1, x);
+       *y1 = MIN (*y1, y);
+@@ -171,8 +178,10 @@ monitor_get_drawing_rect (CcDisplayArrangement *self,
+                           gint                 *y2)
+ {
+   gdouble x, y;
++  gdouble max_scale;
+ 
+-  get_scaled_geometry (self->config, output, x1, y1, x2, y2);
++  max_scale = cc_display_config_get_maximum_scaling (self->config);
++  get_scaled_geometry (self->config, output, max_scale, x1, y1, x2, y2);
+ 
+   /* get_scaled_geometry returns the width and height */
+   *x2 = *x1 + *x2;
+@@ -325,10 +334,12 @@ find_best_snapping (CcDisplayConfig   *config,
+   GList *outputs, *l;
+   gint x1, y1, x2, y2;
+   gint w, h;
++  double max_scale;
+ 
+   g_assert (snap_data != NULL);
+ 
+-  get_scaled_geometry (config, snap_output, &x1, &y1, &w, &h);
++  max_scale = cc_display_config_get_maximum_scaling (config);
++  get_scaled_geometry (config, snap_output, max_scale, &x1, &y1, &w, &h);
+   x2 = x1 + w;
+   y2 = y1 + h;
+ 
+@@ -344,6 +355,7 @@ find_best_snapping (CcDisplayConfig   *config,
+       gint left_snap_pos;
+       gint right_snap_pos;
+       gdouble dist_x, dist_y;
++      gdouble max_scale;
+       gdouble tmp;
+ 
+       if (output == snap_output)
+@@ -352,7 +364,8 @@ find_best_snapping (CcDisplayConfig   *config,
+       if (!cc_display_monitor_is_useful (output))
+         continue;
+ 
+-      get_scaled_geometry (config, output, &_x1, &_y1, &_w, &_h);
++      max_scale = cc_display_config_get_maximum_scaling (config);
++      get_scaled_geometry (config, output, max_scale, &_x1, &_y1, &_w, &_h);
+       _x2 = _x1 + _w;
+       _y2 = _y1 + _h;
+ 
+@@ -955,6 +968,7 @@ cc_display_config_snap_output (CcDisplayConfig  *config,
+ {
+   SnapData snap_data;
+   gint x, y, w, h;
++  gdouble max_scale;
+ 
+   if (!cc_display_monitor_is_useful (output))
+     return;
+@@ -962,7 +976,8 @@ cc_display_config_snap_output (CcDisplayConfig  *config,
+   if (cc_display_config_count_useful_monitors (config) <= 1)
+     return;
+ 
+-  get_scaled_geometry (config, output, &x, &y, &w, &h);
++  max_scale = cc_display_config_get_maximum_scaling (config);
++  get_scaled_geometry (config, output, max_scale, &x, &y, &w, &h);
+ 
+   snap_data.snapped = SNAP_DIR_NONE;
+   snap_data.mon_x = x;
+diff --git a/panels/display/cc-display-config-dbus.c b/panels/display/cc-display-config-dbus.c
+index c3b269d..eea7d43 100644
+--- a/panels/display/cc-display-config-dbus.c
++++ b/panels/display/cc-display-config-dbus.c
+@@ -965,7 +965,8 @@ cc_display_monitor_dbus_new (GVariant *variant,
+ typedef enum _CcDisplayLayoutMode
+ {
+   CC_DISPLAY_LAYOUT_MODE_LOGICAL = 1,
+-  CC_DISPLAY_LAYOUT_MODE_PHYSICAL = 2
++  CC_DISPLAY_LAYOUT_MODE_PHYSICAL = 2,
++  CC_DISPLAY_LAYOUT_MODE_GLOBAL_UI_LOGICAL = 3
+ } CcDisplayLayoutMode;
+ 
+ typedef enum _CcDisplayConfigMethod
+@@ -1453,7 +1454,15 @@ cc_display_config_dbus_is_layout_logical (CcDisplayConfig *pself)
+ {
+   CcDisplayConfigDBus *self = CC_DISPLAY_CONFIG_DBUS (pself);
+ 
+-  return self->layout_mode == CC_DISPLAY_LAYOUT_MODE_LOGICAL;
++  return self->layout_mode == CC_DISPLAY_LAYOUT_MODE_LOGICAL ||
++         self->layout_mode == CC_DISPLAY_LAYOUT_MODE_GLOBAL_UI_LOGICAL;
++}
++
++static gboolean
++cc_display_config_dbus_layout_use_ui_scale (CcDisplayConfig *pself)
++{
++  CcDisplayConfigDBus *self = CC_DISPLAY_CONFIG_DBUS (pself);
++  return self->layout_mode == CC_DISPLAY_LAYOUT_MODE_GLOBAL_UI_LOGICAL;
+ }
+ 
+ static gboolean
+@@ -1814,7 +1823,7 @@ cc_display_config_dbus_constructed (GObject *object)
+           guint32 u = 0;
+           g_variant_get (v, "u", &u);
+           if (u >= CC_DISPLAY_LAYOUT_MODE_LOGICAL &&
+-              u <= CC_DISPLAY_LAYOUT_MODE_PHYSICAL)
++              u <= CC_DISPLAY_LAYOUT_MODE_GLOBAL_UI_LOGICAL)
+             self->layout_mode = u;
+         }
+     }
+@@ -1941,6 +1950,7 @@ cc_display_config_dbus_class_init (CcDisplayConfigDBusClass *klass)
+   parent_class->set_minimum_size = cc_display_config_dbus_set_minimum_size;
+   parent_class->get_panel_orientation_managed =
+     cc_display_config_dbus_get_panel_orientation_managed;
++  parent_class->layout_use_ui_scale = cc_display_config_dbus_layout_use_ui_scale;
+ 
+   pspec = g_param_spec_variant ("state",
+                                 "GVariant",
+@@ -2001,6 +2011,26 @@ logical_monitor_is_rotated (CcDisplayLogicalMonitor *lm)
+     }
+ }
+ 
++static double
++get_maximum_scale (CcDisplayConfig *config)
++{
++  GList *outputs, *l;
++  double max_scale = 1.0;
++  outputs = cc_display_config_get_monitors (config);
++
++  for (l = outputs; l; l = l->next)
++    {
++      CcDisplayMonitor *output = l->data;
++
++      if (!cc_display_monitor_is_useful (output))
++        continue;
++
++      max_scale = MAX (max_scale, cc_display_monitor_get_scale (output));
++    }
++
++  return max_scale;
++}
++
+ static int
+ logical_monitor_width (CcDisplayLogicalMonitor *lm)
+ {
+@@ -2019,6 +2049,11 @@ logical_monitor_width (CcDisplayLogicalMonitor *lm)
+ 
+   if (monitor->config->layout_mode == CC_DISPLAY_LAYOUT_MODE_LOGICAL)
+     return round (width / lm->scale);
++  if (monitor->config->layout_mode == CC_DISPLAY_LAYOUT_MODE_GLOBAL_UI_LOGICAL)
++    {
++      double max_scale = get_maximum_scale(CC_DISPLAY_CONFIG (monitor->config));
++      return round ((width * ceil (max_scale)) / lm->scale);
++    }
+   else
+     return width;
+ }
+diff --git a/panels/display/cc-display-config.c b/panels/display/cc-display-config.c
+index b7532f9..4c21aa8 100644
+--- a/panels/display/cc-display-config.c
++++ b/panels/display/cc-display-config.c
+@@ -663,3 +663,29 @@ cc_display_config_get_panel_orientation_managed (CcDisplayConfig *self)
+ {
+   return CC_DISPLAY_CONFIG_GET_CLASS (self)->get_panel_orientation_managed (self);
+ }
++
++gboolean
++cc_display_config_layout_use_ui_scale (CcDisplayConfig *self)
++{
++  return CC_DISPLAY_CONFIG_GET_CLASS (self)->layout_use_ui_scale (self);
++}
++
++double
++cc_display_config_get_maximum_scaling (CcDisplayConfig *self)
++{
++  GList *outputs, *l;
++  double max_scale = 1.0;
++  outputs = cc_display_config_get_monitors (self);
++
++  for (l = outputs; l; l = l->next)
++    {
++      CcDisplayMonitor *output = l->data;
++
++      if (!cc_display_monitor_is_useful (output))
++        continue;
++
++      max_scale = MAX (max_scale, cc_display_monitor_get_scale (output));
++    }
++
++  return max_scale;
++}
+diff --git a/panels/display/cc-display-config.h b/panels/display/cc-display-config.h
+index 1241adc..c136f57 100644
+--- a/panels/display/cc-display-config.h
++++ b/panels/display/cc-display-config.h
+@@ -174,6 +174,7 @@ struct _CcDisplayConfigClass
+                                     CcDisplayMode    *mode,
+                                     double            scale);
+   gboolean (* get_panel_orientation_managed) (CcDisplayConfig    *self);
++  gboolean (*layout_use_ui_scale) (CcDisplayConfig  *self);
+ };
+ 
+ 
+@@ -202,6 +203,9 @@ gboolean          cc_display_config_is_scaled_mode_valid    (CcDisplayConfig
+                                                              double              scale);
+ gboolean          cc_display_config_get_panel_orientation_managed
+                                                             (CcDisplayConfig    *self);
++gboolean          cc_display_config_layout_use_ui_scale     (CcDisplayConfig    *self);
++
++double            cc_display_config_get_maximum_scaling     (CcDisplayConfig    *self);
+ 
+ const char*       cc_display_monitor_get_display_name       (CcDisplayMonitor   *monitor);
+ gboolean          cc_display_monitor_is_active              (CcDisplayMonitor   *monitor);
diff -pruN 1:43.2-2/debian/patches/ubuntu/info-overview-Show-updates-in-software-propeties-instead-.patch 1:44~alpha-0ubuntu1/debian/patches/ubuntu/info-overview-Show-updates-in-software-propeties-instead-.patch
--- 1:43.2-2/debian/patches/ubuntu/info-overview-Show-updates-in-software-propeties-instead-.patch	1970-01-01 00:00:00.000000000 +0000
+++ 1:44~alpha-0ubuntu1/debian/patches/ubuntu/info-overview-Show-updates-in-software-propeties-instead-.patch	2023-01-13 16:48:57.000000000 +0000
@@ -0,0 +1,51 @@
+From: Robert Ancell <robert.ancell@canonical.com>
+Date: Mon, 3 Feb 2020 14:23:34 +1300
+Subject: info-overview: Show updates in software propeties instead of GNOME
+ Software
+
+---
+ panels/info-overview/cc-info-overview-panel.c | 16 +++++++++++-----
+ 1 file changed, 11 insertions(+), 5 deletions(-)
+
+diff --git a/panels/info-overview/cc-info-overview-panel.c b/panels/info-overview/cc-info-overview-panel.c
+index 148025f..21a684e 100644
+--- a/panels/info-overview/cc-info-overview-panel.c
++++ b/panels/info-overview/cc-info-overview-panel.c
+@@ -800,6 +800,13 @@ does_gnome_software_allow_updates (void)
+   return g_settings_get_boolean (settings, "allow-updates");
+ }
+ 
++static gboolean
++does_software_properties_exist (void)
++{
++  g_autofree gchar *path = g_find_program_in_path ("software-properties-gtk");
++  return path != NULL;
++}
++
+ static gboolean
+ does_gnome_software_exist (void)
+ {
+@@ -821,11 +828,10 @@ cc_info_panel_open_software_update (CcInfoOverviewPanel *self)
+   gboolean ret;
+   char *argv[3];
+ 
+-  if (does_gnome_software_exist ())
++  if (does_software_properties_exist ())
+     {
+-      argv[0] = "gnome-software";
+-      argv[1] = "--mode=updates";
+-      argv[2] = NULL;
++      argv[0] = "software-properties-gtk";
++      argv[1] = NULL;
+     }
+   else
+     {
+@@ -928,7 +934,7 @@ cc_info_overview_panel_init (CcInfoOverviewPanel *self)
+ 
+   g_resources_register (cc_info_overview_get_resource ());
+ 
+-  if ((!does_gnome_software_exist () || !does_gnome_software_allow_updates ()) && !does_gpk_update_viewer_exist ())
++  if (!does_software_properties_exist () && (!does_gnome_software_exist () || !does_gnome_software_allow_updates ()) && !does_gpk_update_viewer_exist ())
+     gtk_widget_set_visible (GTK_WIDGET (self->software_updates_row), FALSE);
+ 
+   info_overview_panel_setup_overview (self);
diff -pruN 1:43.2-2/debian/patches/ubuntu/keyboard-Add-launch-terminal-shortcut.patch 1:44~alpha-0ubuntu1/debian/patches/ubuntu/keyboard-Add-launch-terminal-shortcut.patch
--- 1:43.2-2/debian/patches/ubuntu/keyboard-Add-launch-terminal-shortcut.patch	1970-01-01 00:00:00.000000000 +0000
+++ 1:44~alpha-0ubuntu1/debian/patches/ubuntu/keyboard-Add-launch-terminal-shortcut.patch	2023-01-13 16:48:57.000000000 +0000
@@ -0,0 +1,21 @@
+From: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
+Date: Tue, 31 Jul 2018 04:44:12 +0100
+Subject: keyboard: Add launch terminal shortcut
+
+---
+ panels/keyboard/01-launchers.xml.in | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/panels/keyboard/01-launchers.xml.in b/panels/keyboard/01-launchers.xml.in
+index 67c8325..dd0292d 100644
+--- a/panels/keyboard/01-launchers.xml.in
++++ b/panels/keyboard/01-launchers.xml.in
+@@ -9,6 +9,8 @@
+ 
+ 	<KeyListEntry name="email" description="Launch email client"/>
+ 
++	<KeyListEntry name="terminal" description="Launch terminal"/>
++
+ 	<KeyListEntry name="www" description="Launch web browser"/>
+ 
+ 	<KeyListEntry name="home" description="Home folder"/>
diff -pruN 1:43.2-2/debian/patches/ubuntu/lock-Add-Lock-Screen-on-Suspend-option.patch 1:44~alpha-0ubuntu1/debian/patches/ubuntu/lock-Add-Lock-Screen-on-Suspend-option.patch
--- 1:43.2-2/debian/patches/ubuntu/lock-Add-Lock-Screen-on-Suspend-option.patch	1970-01-01 00:00:00.000000000 +0000
+++ 1:44~alpha-0ubuntu1/debian/patches/ubuntu/lock-Add-Lock-Screen-on-Suspend-option.patch	2023-01-13 16:48:57.000000000 +0000
@@ -0,0 +1,96 @@
+From: Tim Lunn <tim@feathertop.org>
+Date: Mon, 3 Jun 2013 17:27:45 +1000
+Subject: lock: Add "Lock Screen on Suspend" option
+
+https://bugs.launchpad.net/ubuntu/+source/gnome-settings-daemon/+bug/938076
+---
+ panels/screen/cc-screen-panel.c  | 22 ++++++++++++++++++++++
+ panels/screen/cc-screen-panel.ui | 14 ++++++++++++++
+ 2 files changed, 36 insertions(+)
+
+diff --git a/panels/screen/cc-screen-panel.c b/panels/screen/cc-screen-panel.c
+index 3c6f35b..d3ad034 100644
+--- a/panels/screen/cc-screen-panel.c
++++ b/panels/screen/cc-screen-panel.c
+@@ -54,6 +54,9 @@ struct _CcScreenPanel
+   GtkSwitch           *privacy_screen_switch;
+   GtkSwitch           *show_notifications_switch;
+   GtkSwitch           *usb_protection_switch;
++
++  AdwPreferencesGroup *lock_on_suspend_row;
++  GtkSwitch           *lock_on_suspend_switch;
+ };
+ 
+ CC_PANEL_REGISTER (CcScreenPanel, cc_screen_panel)
+@@ -279,6 +282,8 @@ cc_screen_panel_class_init (CcScreenPanelClass *klass)
+   gtk_widget_class_bind_template_child (widget_class, CcScreenPanel, show_notifications_switch);
+   gtk_widget_class_bind_template_child (widget_class, CcScreenPanel, usb_protection_row);
+   gtk_widget_class_bind_template_child (widget_class, CcScreenPanel, usb_protection_switch);
++  gtk_widget_class_bind_template_child (widget_class, CcScreenPanel, lock_on_suspend_row);
++  gtk_widget_class_bind_template_child (widget_class, CcScreenPanel, lock_on_suspend_switch);
+ 
+   gtk_widget_class_bind_template_callback (widget_class, lock_after_name_cb);
+   gtk_widget_class_bind_template_callback (widget_class, on_blank_screen_delay_changed_cb);
+@@ -321,6 +326,7 @@ update_display_config (CcScreenPanel *self)
+ static void
+ cc_screen_panel_init (CcScreenPanel *self)
+ {
++  g_autoptr(GSettingsSchema) schema = NULL;
+   guint value;
+ 
+   g_resources_register (cc_screen_get_resource ());
+@@ -334,6 +340,8 @@ cc_screen_panel_init (CcScreenPanel *self)
+   self->notification_settings = g_settings_new ("org.gnome.desktop.notifications");
+   self->session_settings = g_settings_new ("org.gnome.desktop.session");
+ 
++  g_object_get (self->lock_settings, "settings-schema", &schema, NULL);
++
+   g_settings_bind (self->lock_settings,
+                    "lock-enabled",
+                    self->automatic_screen_lock_switch,
+@@ -354,6 +362,20 @@ cc_screen_panel_init (CcScreenPanel *self)
+                    "active",
+                    G_SETTINGS_BIND_DEFAULT);
+ 
++  if (g_settings_schema_has_key (schema, "ubuntu-lock-on-suspend"))
++    {
++      g_settings_bind (self->lock_settings,
++                       "ubuntu-lock-on-suspend",
++                       self->lock_on_suspend_switch,
++                       "active",
++                       G_SETTINGS_BIND_DEFAULT);
++    }
++  else
++    {
++      g_warning ("No ubuntu-lock-on-suspend settings key found");
++      gtk_widget_set_visible (GTK_WIDGET (self->lock_on_suspend_row), FALSE);
++    }
++
+   value = g_settings_get_uint (self->session_settings, "idle-delay");
+   set_blank_screen_delay_value (self, value);
+ 
+diff --git a/panels/screen/cc-screen-panel.ui b/panels/screen/cc-screen-panel.ui
+index 6b68189..44c3f3b 100644
+--- a/panels/screen/cc-screen-panel.ui
++++ b/panels/screen/cc-screen-panel.ui
+@@ -80,6 +80,20 @@
+               </object>
+             </child>
+ 
++            <!-- Automatic Screen Lock Delay row -->
++            <child>
++              <object class="AdwActionRow" id="lock_on_suspend_row">
++                <property name="title" translatable="yes">Lock Screen on Suspend</property>
++                <property name="activatable-widget">lock_on_suspend_switch</property>
++                <property name="use-underline">true</property>
++                <child>
++                  <object class="GtkSwitch" id="lock_on_suspend_switch">
++                    <property name="valign">center</property>
++                  </object>
++                </child>
++              </object>
++            </child>
++
+             <!-- USB protection row -->
+             <child>
+               <object class="AdwActionRow" id="usb_protection_row">
diff -pruN 1:43.2-2/debian/patches/ubuntu/Modify-Mulitasking-assets-for-accent-colors.patch 1:44~alpha-0ubuntu1/debian/patches/ubuntu/Modify-Mulitasking-assets-for-accent-colors.patch
--- 1:43.2-2/debian/patches/ubuntu/Modify-Mulitasking-assets-for-accent-colors.patch	1970-01-01 00:00:00.000000000 +0000
+++ 1:44~alpha-0ubuntu1/debian/patches/ubuntu/Modify-Mulitasking-assets-for-accent-colors.patch	2023-01-13 16:48:57.000000000 +0000
@@ -0,0 +1,160 @@
+From: =?utf-8?b?Ik1hcmNvIFRyZXZpc2FuIChUcmV2acOxbyki?= <mail@3v1n0.net>
+Date: Sat, 4 Jun 2022 04:34:55 +0200
+Subject: Modify Mulitasking assets for accent-colors
+
+- Modified multitaksing-assets to use @theme_selected_bg_color.
+- added load_custom_css from ubuntu-panel to cc-multitasking-panel.c.
+- added style multitasking-assets to ubuntu/appearance.css and cc-multitasking-panel.ui.
+---
+ panels/multitasking/assets/active-screen-edges-rtl.svg  |  2 +-
+ panels/multitasking/assets/active-screen-edges.svg      |  2 +-
+ panels/multitasking/assets/hot-corner-rtl.svg           |  2 +-
+ panels/multitasking/assets/hot-corner.svg               |  2 +-
+ .../multitasking/assets/workspaces-primary-display.svg  |  6 +++++-
+ panels/multitasking/assets/workspaces-span-displays.svg |  6 +++++-
+ panels/multitasking/cc-multitasking-panel.c             | 17 +++++++++++++++++
+ panels/multitasking/cc-multitasking-panel.ui            | 13 ++++++++++++-
+ 8 files changed, 43 insertions(+), 7 deletions(-)
+
+diff --git a/panels/multitasking/assets/active-screen-edges-rtl.svg b/panels/multitasking/assets/active-screen-edges-rtl.svg
+index 4c2bd1a..346a900 100644
+--- a/panels/multitasking/assets/active-screen-edges-rtl.svg
++++ b/panels/multitasking/assets/active-screen-edges-rtl.svg
+@@ -1 +1 @@
+-<svg width="160" height="94" viewBox="0 0 42.333 24.871" xmlns="http://www.w3.org/2000/svg"><path style="display:inline;vector-effect:none;fill:none;fill-opacity:1;stroke:#3584e4;stroke-width:.529167;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" d="M.265.265h41.804v24.342H.265Z"/><path style="display:inline;opacity:.287;vector-effect:none;fill:#3584e4;fill-opacity:1;stroke:none;stroke-width:2.99998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal" d="M1.943 5.178v87.681h77.428V77.053h-68.39c-1.662 0-3-1.338-3-3V22.055c0-1.662 1.338-3 3-3h68.39V5.178Z" transform="matrix(.26459 0 0 .26459 0 0)"/><g transform="matrix(-.26458 0 0 .26458 424.372 1156.76)" style="display:inline"><rect ry="3" rx="3" y="-4353.007" x="1520.006" height="58" width="76" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#3584e4;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none"/><path overflow="visible" font-weight="400" style="color:#bebebe;font-weight:400;line-height:normal;font-family:'Andale Mono';-inkscape-font-specification:'Andale Mono';text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-transform:none;overflow:visible;fill:#3584e4;fill-opacity:1;marker:none" d="M1583-4348.006h1.031c.255.011.51.13.688.313l2.281 2.28 2.312-2.28c.266-.232.447-.307.688-.314h1v1c0 .286-.034.55-.25.75l-2.281 2.282 2.25 2.25c.188.188.281.454.281.72v1h-1c-.265 0-.53-.094-.719-.282l-2.281-2.28-2.281 2.28a1.015 1.015 0 0 1-.719.281h-1v-1c0-.265.093-.53.281-.719l2.281-2.25-2.28-2.28a.909.909 0 0 1-.282-.75z"/><g style="display:inline;fill:#fff;fill-opacity:1;stroke:#3584e4;stroke-opacity:1"><path style="color:#000;display:block;overflow:visible;visibility:visible;fill:#3584e4;fill-opacity:1;fill-rule:nonzero;stroke:#3584e4;stroke-width:.999998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" d="M1545.908-4344.757v26.838l-6.053-5.916-3.46 7.07c-.848 1.914-5.25.376-3.999-2.182l3.423-7.34h-7.64z"/></g></g><path style="fill:#3584e4;fill-opacity:1;stroke-width:.52917;stroke-linejoin:round;stop-color:#000" d="M0 0h42.334v1.852H0z"/></svg>
+\ No newline at end of file
++<svg width="160" height="94" viewBox="0 0 42.333 24.871" xmlns="http://www.w3.org/2000/svg"><path style="opacity:.8;fill:#fff;fill-opacity:1;stroke-width:9.92168" d="M80 7v11h.998c2.199 0 4 1.801 4 4v51.998c0 2.199-1.801 4-4 4H80V92h78V7H80zM11 20c-1.125 0-2 .875-2 2v51.998c0 1.125.875 2 2 2h69.998c1.125 0 2-.875 2-2V22c0-1.125-.875-2-2-2H11zm3.414 4 2.986 2.986L20.387 24l1.414 1.414-2.987 2.986 2.987 2.987-1.414 1.414-2.987-2.987-2.986 2.987L13 31.387l2.986-2.987L13 25.414 14.414 24zM58 26l.861.896 18.541 19.317h-8.027l3.086 6.621c.372.761.333 1.539.016 2.14-.318.603-.868 1.035-1.475 1.303-.607.27-1.28.382-1.912.278-.632-.105-1.246-.47-1.533-1.117l-3.149-6.432L58 55.27V26z" transform="matrix(.26459 0 0 .26459 0 0)"/><path style="fill:#fff;fill-opacity:1;stroke-width:3.70837;opacity:.4" d="M.529 1.852v22.49h20.638v-3.705H2.91a1.062 1.062 0 0 1-1.058-1.058V5.82c0-.582.476-1.058 1.058-1.058h18.257v-2.91z"/></svg>
+\ No newline at end of file
+diff --git a/panels/multitasking/assets/active-screen-edges.svg b/panels/multitasking/assets/active-screen-edges.svg
+index bc249ab..6191d5f 100644
+--- a/panels/multitasking/assets/active-screen-edges.svg
++++ b/panels/multitasking/assets/active-screen-edges.svg
+@@ -1 +1 @@
+-<svg width="160" height="94" viewBox="0 0 42.333 24.871" xmlns="http://www.w3.org/2000/svg"><path style="display:inline;vector-effect:none;fill:none;fill-opacity:1;stroke:#3584e4;stroke-width:.529167;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" d="M.265.265h41.804v24.342H.265Z"/><path style="display:inline;opacity:.287;vector-effect:none;fill:#3584e4;fill-opacity:1;stroke:none;stroke-width:2.99998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal" d="M1.943 5.178v87.681h77.428V77.053h-68.39c-1.662 0-3-1.338-3-3V22.055c0-1.662 1.338-3 3-3h68.39V5.178Z" transform="matrix(.26459 0 0 .26459 0 0)"/><g transform="translate(-400.062 1156.76) scale(.26458)" style="display:inline"><rect ry="3" rx="3" y="-4353.007" x="1520.006" height="58" width="76" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#3584e4;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none"/><path overflow="visible" font-weight="400" style="color:#bebebe;font-weight:400;line-height:normal;font-family:'Andale Mono';-inkscape-font-specification:'Andale Mono';text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-transform:none;overflow:visible;fill:#3584e4;fill-opacity:1;marker:none" d="M1583-4348.006h1.031c.255.011.51.13.688.313l2.281 2.28 2.312-2.28c.266-.232.447-.307.688-.314h1v1c0 .286-.034.55-.25.75l-2.281 2.282 2.25 2.25c.188.188.281.454.281.72v1h-1c-.265 0-.53-.094-.719-.282l-2.281-2.28-2.281 2.28a1.015 1.015 0 0 1-.719.281h-1v-1c0-.265.093-.53.281-.719l2.281-2.25-2.28-2.28a.909.909 0 0 1-.282-.75z"/><g style="display:inline;fill:#fff;fill-opacity:1;stroke:#3584e4;stroke-opacity:1"><path d="M26.605 2.318v16.44l3.712-3.624 2.122 4.331c.52 1.172 3.22.23 2.452-1.337l-2.099-4.496h4.685z" style="color:#000;display:block;overflow:visible;visibility:visible;fill:#fff;fill-opacity:1;fill-rule:nonzero;stroke:#3584e4;stroke-width:.612915;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" transform="matrix(1.6306 0 0 1.63249 1484.124 -4348.541)"/><path style="color:#000;display:block;overflow:visible;visibility:visible;fill:#3584e4;fill-opacity:1;fill-rule:nonzero;stroke:#3584e4;stroke-width:.612915;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" d="M26.605 2.318v16.44l3.712-3.624 2.122 4.331c.52 1.172 3.22.23 2.452-1.337l-2.099-4.496h4.685z" transform="matrix(1.6306 0 0 1.63249 1484.124 -4348.541)"/></g></g><path style="fill:#3584e4;fill-opacity:1;stroke-width:.52917;stroke-linejoin:round;stop-color:#000" d="M0 0h42.334v1.852H0z"/></svg>
+\ No newline at end of file
++<svg width="160" height="94" viewBox="0 0 42.333 24.871" xmlns="http://www.w3.org/2000/svg"><path style="opacity:.8;fill:#fff;fill-opacity:1;stroke-width:9.92168" d="M80 7v11h.998c2.199 0 4 1.801 4 4v51.998c0 2.199-1.801 4-4 4H80V92h78V7H80zM11 20c-1.125 0-2 .875-2 2v51.998c0 1.125.875 2 2 2h69.998c1.125 0 2-.875 2-2V22c0-1.125-.875-2-2-2H11zm61.414 4 2.986 2.986L78.387 24l1.414 1.414-2.987 2.986 2.987 2.987-1.414 1.414-2.987-2.987-2.986 2.987L71 31.387l2.986-2.987L71 25.414 72.414 24zM15 26l.861.896 18.541 19.317h-8.027l3.086 6.621c.372.761.333 1.539.016 2.14-.318.603-.868 1.035-1.475 1.303-.607.27-1.28.382-1.912.278-.632-.105-1.246-.47-1.533-1.117l-3.149-6.432L15 55.27V26z" transform="matrix(.26459 0 0 .26459 0 0)"/><path style="fill:#fff;fill-opacity:1;stroke-width:3.70837;opacity:.4" d="M.529 1.852v22.49h20.638v-3.705H2.91a1.062 1.062 0 0 1-1.058-1.058V5.82c0-.582.476-1.058 1.058-1.058h18.257v-2.91z"/></svg>
+\ No newline at end of file
+diff --git a/panels/multitasking/assets/hot-corner-rtl.svg b/panels/multitasking/assets/hot-corner-rtl.svg
+index 4eb3aba..908b8d9 100644
+--- a/panels/multitasking/assets/hot-corner-rtl.svg
++++ b/panels/multitasking/assets/hot-corner-rtl.svg
+@@ -1 +1 @@
+-<svg width="160" height="94" viewBox="0 0 42.333 24.871" xmlns="http://www.w3.org/2000/svg"><defs><clipPath id="a" clipPathUnits="userSpaceOnUse"><path style="opacity:1;vector-effect:none;fill:#3584e4;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal" d="M316-4731.007h162v95H316z"/></clipPath></defs><g style="display:inline"><path style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#3584e4;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" d="M1501.006-3631.007h158v92h-158z" transform="matrix(-.26458 0 0 .26458 439.199 960.969)"/></g><g clip-path="url(#a)" transform="matrix(-.26458 0 0 .26458 125.93 1251.746)" style="display:inline"><path style="color:#000;opacity:.249;fill:#3584e4;stroke-width:.999981;-inkscape-stroke:none" d="M159.96-79.697C115.93-79.697 80.2-43.972 80.2.06a79.352 79.352 0 0 0 13.98 45.082v-5.497C87.212 28.09 83.2 14.546 83.2.061c0-42.411 34.35-76.758 76.76-76.758 42.412 0 76.76 34.347 76.76 76.758 0 42.41-34.348 76.76-76.76 76.76-19.455 0-37.203-7.245-50.728-19.165h-4.402c14.327 13.718 33.742 22.164 55.13 22.164 44.033 0 79.76-35.727 79.76-79.76 0-44.032-35.727-79.757-79.76-79.757z" transform="matrix(-1.00002 0 0 1.00002 475.963 -4731.068)"/><path style="color:#000;opacity:.474;fill:#3584e4;stroke-width:.999981;-inkscape-stroke:none" d="M159.96-49.43c-27.314 0-49.491 22.175-49.491 49.49 0 7.333 1.61 14.287 4.476 20.55l3.178-.245A46.34 46.34 0 0 1 113.47.061c0-25.695 20.798-46.49 46.492-46.49S206.45-25.635 206.45.06c0 25.694-20.796 46.49-46.49 46.49a46.337 46.337 0 0 1-20.357-4.68l-.247 3.18a49.246 49.246 0 0 0 20.604 4.5c27.315 0 49.49-22.175 49.49-49.49 0-27.316-22.175-49.49-49.49-49.49z" transform="matrix(-1.00002 0 0 1.00002 475.963 -4731.068)"/><path style="color:#000;opacity:.705;fill:#3584e4;stroke-width:.999981;-inkscape-stroke:none" d="M159.96-28.297c-15.643 0-28.358 12.713-28.358 28.358 0 7.171 2.676 13.723 7.078 18.72l2.713-.209-.21 2.721c5.005 4.43 11.58 7.127 18.778 7.127 15.644 0 28.357-12.715 28.357-28.36 0-15.644-12.713-28.357-28.357-28.357zm0 3c14.024 0 25.358 11.335 25.358 25.358 0 14.022-11.334 25.359-25.357 25.359S134.6 14.083 134.6.06c0-14.022 11.337-25.357 25.36-25.357z" transform="matrix(-1.00002 0 0 1.00002 475.963 -4731.068)"/><circle r="16.568" cy="-4731.007" cx="316" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#3584e4;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal"/></g><path style="color:#000;display:inline;overflow:visible;visibility:visible;fill:none;fill-opacity:1;stroke:#3584e4;stroke-width:.262885;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:.95;stroke-opacity:1;marker:none;enable-background:accumulate" d="m30.31 9.024 1.341-1.38-2.121-2.123 7.88-.607-.606 7.89-2.122-2.124-3.288 3.292"/><g style="display:inline"><path style="color:#000;display:block;overflow:visible;visibility:visible;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#3584e4;stroke-width:.612915;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:1.22583,.612915;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" d="M29.691 6.634v16.44l3.712-3.624 2.122 4.331c.52 1.171 3.22.23 2.452-1.337l-2.099-4.497h4.685z" transform="matrix(.42866 0 0 .42916 12.191 7.553)"/></g><path style="fill:#3584e4;fill-opacity:1;stroke-width:.52917;stroke-linejoin:round;stop-color:#000" d="M0 0h42.334v1.852H0z"/></svg>
+\ No newline at end of file
++<svg width="160" height="94" viewBox="0 0 42.333 24.871" xmlns="http://www.w3.org/2000/svg"><path style="opacity:.8;fill:#fff;stroke-width:13.8049" d="M2 7v85h156V79.795c-20.075-.484-38.302-8.407-52.064-21.102h.408v-.89h1.986v.89h.629v-.498h.367v-.392h1.307l-.924-.96.725-.687 1.373 1.434-.495.478v.73h-.75c12.882 10.85 29.375 17.547 47.438 17.999v-27.29a49.185 49.185 0 0 1-18.059-4.212l-.234 3.059a.497.497 0 0 1-.844.314l-7.668-7.676-12.078 12.092-.351.352-.702-.704.352-.351 12.428-12.445a.497.497 0 0 1 .699 0l7.256 7.261 2.166-28.16-28.131 2.164 7.256 7.264a.497.497 0 0 1 .006.701l-5.073 5.211-.347.357-.71-.693.345-.355 4.73-4.864-7.672-7.681a.497.497 0 0 1 .313-.846l3.056-.234A49.103 49.103 0 0 1 110.998 7H83.528a76.332 76.332 0 0 0 10.779 32.83l.234-.223.752.782-.613.591v.96h-.996v.039h.496v.425h-.496v.526h.996v1.992h-.5v.04h-.11l-.029-.04h-.357v-.514A79.32 79.32 0 0 1 80.516 7H2zm112.023 0a46.164 46.164 0 0 0 3.887 12.816l20.354-1.568A28.283 28.283 0 0 1 132.504 7h-18.48zm21.579 0c2.837 10.025 11.673 17.51 22.398 18.344v-7.338c-6.634-.735-12.198-5.067-14.678-11.006h-7.72zm11.015 0A15.043 15.043 0 0 0 158 14.998V7h-11.383zm-5.15 11.002a.497.497 0 0 1 .387.144.493.493 0 0 0-.387-.144zm.502.326c.01.028.018.055.023.084a.497.497 0 0 0-.023-.084zm-.219 3.422-1.564 20.379A46.28 46.28 0 0 0 158 46.504v-18.16a28.23 28.23 0 0 1-16.25-6.594zM93.684 39.848v.105h.494l.111-.105h-.605zm2.296 1.257 1.38 1.432-.723.688-1.373-1.432.716-.688zm2.067 2.149 1.373 1.432-.717.693-1.373-1.44.717-.685zm2.058 2.154 1.381 1.434-.715.685-1.38-1.431.714-.688zm-6.421.502h.996v1.986h-.996V45.91zm8.49 1.647 1.373 1.433-.717.686-1.373-1.432.717-.687zm-8.49 1.336h.996v1.986h-.996v-1.986zm10.556.812 1.373 1.432-.717.695-1.373-1.44.717-.687zm2.059 2.156 1.38 1.432-.714.686-1.381-1.432.715-.686zm-12.615.014h.998v1.986h-.998v-1.986zm14.683 2.135 1.373 1.431-.717.686-1.373-1.432.717-.685zm-14.683.847h.998v1.987h-.998v-1.987zm9.744 2.946h1.92v.996h-.362l.03.06-.9.42-.688-1.476zm-9.744.029h.996v1.994h-.996v-1.994zm11.699.363h.17v.153c-.056-.052-.115-.1-.17-.153zm.053 1.565.841 1.8-.9.42-.842-1.8.9-.42zm-5.803.834.695.709-1.418 1.386-.693-.709 1.416-1.386zm-5.95.22h.997v1.987h-.996v-1.987zm7.264.327.88 1.785-.893.435-.88-1.779.893-.441zm5.752 1.32.834 1.8-.9.423-.836-1.801.902-.422zm-9.191.215.693.709-1.424 1.394-.693-.716 1.424-1.387zm-3.824 1.12h.998v1.64l.693-.678.693.715-1.423 1.388-.696-.709.377-.369h-.642v-1.986zm8.578.024.87 1.785-.892.436-.87-1.785.892-.436zm5.691 1.342.111.23.112.266.088.287.052.282.014.273-.021.266-.053.257-.08.25-.09.2-.9-.412.066-.149.045-.133.021-.14.016-.147-.008-.156-.03-.162-.052-.176-.088-.2-.103-.214.9-.422zm-4.385 1.338.51 1.041.067.125.066.096.08.08.09.066.05.031-.507.856-.104-.066-.193-.149-.176-.176-.148-.207-.112-.207-.515-1.054.892-.436zm3.108 1.121.613.775-.037.038-.207.132-.213.125-.223.112-.236.088-.228.082-.237.058-.244.045-.242.03-.236.007-.082-.008.037-.988h.037l.17-.008.17-.015.177-.037.17-.045.168-.051.17-.074.164-.075.154-.087.141-.096.014-.008z" transform="matrix(.26459 0 0 .26459 0 0)"/><path style="color:#000;opacity:.35;fill:#fff;stroke-width:.999999;-inkscape-stroke:none" d="M30.169 1.852a12.214 12.214 0 0 0 1.028 3.391l-.84.065a12.992 12.992 0 0 1-.989-3.456Zm6.922 9.295a12.245 12.245 0 0 0 4.713 1.157v.795a13.014 13.014 0 0 1-4.778-1.115z"/><path style="color:#000;opacity:.25;fill:#fff;stroke-width:.999999;-inkscape-stroke:none" d="M35.878 1.852a6.706 6.706 0 0 0 5.926 4.854v.793a7.47 7.47 0 0 1-4.3-1.744l.066-.851a.131.131 0 0 0-.14-.141l-.848.065a7.483 7.483 0 0 1-1.524-2.976Z"/><path style="color:#000;opacity:.05;fill:#3584e4;stroke-width:.999999;-inkscape-stroke:none" d="M38.792 1.852a3.98 3.98 0 0 0 3.012 2.116v.796a4.79 4.79 0 0 1-3.883-2.912Z"/><path style="color:#000;opacity:.45;fill:#fff;stroke-width:.999999;-inkscape-stroke:none" d="M21.303 1.852a20.987 20.987 0 0 0 3.484 9.898v-.192h.131v-.113h-.13v-.225h.13v-.113h-.13v-.226h.13v-.113h-.13v-.225h.167a20.197 20.197 0 0 1-2.855-8.69Zm3.506 9.931c.026.039.054.075.08.114h.03v-.114zm3.074 3.615.044.04v-.04zm.27 0v.131h-.124a21.01 21.01 0 0 0 13.775 5.584v-.794a20.213 20.213 0 0 1-12.637-4.832v.042h-.226v-.131h-.112v.131h-.226v-.131h-.112v.131h-.226v-.131z"/></svg>
+\ No newline at end of file
+diff --git a/panels/multitasking/assets/hot-corner.svg b/panels/multitasking/assets/hot-corner.svg
+index 66cee2a..4b3f506 100644
+--- a/panels/multitasking/assets/hot-corner.svg
++++ b/panels/multitasking/assets/hot-corner.svg
+@@ -1 +1 @@
+-<svg width="160" height="94" viewBox="0 0 42.333 24.871" xmlns="http://www.w3.org/2000/svg"><defs><clipPath id="a" clipPathUnits="userSpaceOnUse"><path style="opacity:1;vector-effect:none;fill:#3584e4;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal" d="M316-4731.007h162v95H316z"/></clipPath></defs><g style="display:inline"><path style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#3584e4;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" d="M1501.006-3631.007h158v92h-158z" transform="translate(-396.877 960.969) scale(.26458)"/></g><g clip-path="url(#a)" transform="translate(-83.608 1251.746) scale(.26458)" style="display:inline"><path style="color:#000;opacity:.249;fill:#3584e4;stroke-width:.999981;-inkscape-stroke:none" d="M-.002-79.697c-44.032 0-79.76 35.725-79.76 79.758 0 44.032 35.728 79.76 79.76 79.76 21.164 0 40.396-8.27 54.678-21.733v-4.156C40.756 68.058 21.408 76.82-.002 76.82c-42.41 0-76.76-34.349-76.76-76.76 0-42.41 34.35-76.757 76.76-76.757 42.41 0 76.76 34.347 76.76 76.758 0 17.32-5.734 33.29-15.4 46.13l2.085 2.174C73.672 34.955 79.758 18.22 79.758.061c0-44.033-35.728-79.758-79.76-79.758z" transform="matrix(1.00002 0 0 1.00002 316.002 -4731.068)"/><path style="color:#000;opacity:.474;fill:#3584e4;-inkscape-stroke:none" d="M316-4780.498c-27.316 0-49.492 22.176-49.492 49.492s22.176 49.49 49.492 49.49c7.56 0 14.733-1.697 21.146-4.732l-1.283-2.711a46.295 46.295 0 0 1-19.863 4.443c-25.695 0-46.492-20.795-46.492-46.49 0-25.694 20.797-46.492 46.492-46.492 25.695 0 46.492 20.798 46.492 46.492 0 7.094-1.58 13.792-4.416 19.803l2.92.835a49.266 49.266 0 0 0 4.496-20.638c0-27.316-22.176-49.492-49.492-49.492z"/><path style="color:#000;opacity:.705;fill:#3584e4;-inkscape-stroke:none" d="M316-4759.365c-15.644 0-28.36 12.715-28.36 28.36 0 15.644 12.716 28.357 28.36 28.357a28.277 28.277 0 0 0 18.967-7.275l.035-2.145 2.033.082a28.273 28.273 0 0 0 7.324-19.02c0-15.644-12.715-28.36-28.359-28.36zm0 3c14.023 0 25.36 11.336 25.36 25.36a25.247 25.247 0 0 1-7.864 18.355 25.253 25.253 0 0 1-17.496 7.002c-14.023 0-25.36-11.335-25.36-25.358s11.337-25.36 25.36-25.36z"/><circle r="16.568" cy="-4731.007" cx="316" style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#3584e4;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal"/></g><g style="display:inline"><path style="color:#000;display:inline;overflow:visible;visibility:visible;fill:none;stroke:#3584e4;stroke-width:.612915;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:.95;stroke-opacity:1;marker:none;enable-background:accumulate;fill-opacity:1" d="m275.62 271.75-3.13-3.214 4.95-4.95-18.385-1.414 1.414 18.385 4.95-4.95 7.671 7.672" transform="matrix(.42866 0 0 .42916 -106.135 -107.6)"/><g style="display:inline"><path style="color:#000;display:block;overflow:visible;visibility:visible;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#3584e4;stroke-width:.612915;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:1.22583,.612915;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" d="M29.691 6.634v16.44l3.712-3.624 2.122 4.331c.52 1.171 3.22.23 2.452-1.337l-2.099-4.497h4.685z" transform="matrix(.42866 0 0 .42916 1.739 7.533)"/></g></g><path style="fill:#3584e4;fill-opacity:1;stroke-width:.52917;stroke-linejoin:round;stop-color:#000" d="M0 0h42.334v1.852H0z"/></svg>
+\ No newline at end of file
++<svg width="160" height="94" viewBox="0 0 42.333 24.871" xmlns="http://www.w3.org/2000/svg"><path style="opacity:.8;fill:#fff;stroke-width:13.8049" d="M2 7v7.998A15.043 15.043 0 0 0 13.383 7H2zm14.678 0C14.198 12.94 8.634 17.271 2 18.006v7.338C12.725 24.51 21.56 17.024 24.398 7h-7.72zm10.818 0a28.283 28.283 0 0 1-5.76 11.248l20.354 1.568A46.163 46.163 0 0 0 45.977 7h-18.48zm21.506 0a49.103 49.103 0 0 1-3.74 13.06l3.056.235a.497.497 0 0 1 .313.846l-7.672 7.681 4.73 4.864.344.355-.709.693-.347-.357-5.073-5.211a.497.497 0 0 1 .006-.701l7.256-7.264-28.13-2.164 2.165 28.16 7.256-7.261a.497.497 0 0 1 .7 0L41.583 52.38l.352.351-.702.704-.351-.352-12.078-12.092-7.668 7.676a.497.497 0 0 1-.844-.314l-.234-3.06A49.185 49.185 0 0 1 2 49.509v27.289c20.276-.518 38.575-8.903 52-22.201v-.346h.352l.087-.086h.057v.086h.5v1.986H54v.485h.496v.427H54v.084h.996v1.987H54v-.5C40.249 71.39 22.046 79.3 2 79.795V92h156V7H79.45c-1.327 15.37-7.034 29.483-15.84 41.121l.251.262-.715.693-1.373-1.44.715-.685.09.092.053-.05-.592-.614-.357.344-.19-.198-.412.395-1.373-1.432.715-.685 1.267 1.32.055-.053-.168-.174A76.379 76.379 0 0 0 76.441 7H49.002zM18.533 18.002a.493.493 0 0 0-.387.144.497.497 0 0 1 .387-.144zm-.387.144a.493.493 0 0 0-.144.387.497.497 0 0 1 .144-.387zm.104 3.604A28.23 28.23 0 0 1 2 28.344v18.16a46.28 46.28 0 0 0 17.814-4.375L18.25 21.75zM54.855 39l.754.783-.613.582v.967H54v-1.984h.494l.361-.348zm1.44 1.498 1.373 1.432-.715.695-1.373-1.44.715-.687zM54 42.33h.996v1.984H54V42.33zm4.355.324 1.381 1.432-.716.687-1.381-1.433.716-.686zM54 45.304h.996v1.993H54v-1.992zm8.924 1.997-.053.05.59.614.053-.05-.59-.614zM54 48.287h.996v1.984H54v-1.984zm10.549.81 1.38 1.44-.716.688-1.381-1.432.717-.695zm2.066 2.157 1.373 1.432-.715.687-1.373-1.434.715-.685zM54 51.27h.996v1.984H54V51.27zm14.682 2.132 1.373 1.432-.715.687-1.381-1.433.723-.686zm2.06 2.149 1.381 1.44-.502.478v.724h-1.986v-.998h1.306l-.916-.95.717-.694zm-6.998 1.644h1.92v.998h-.363l.031.059-.902.42-.686-1.477zm2.908 0h1.994v.998h-1.994v-.998zm-.9 1.957.834 1.801-.9.422-.834-1.8.9-.423zm-5.803.834.696.71-1.418 1.394-.702-.715 1.424-1.389zM54 60.21h.996v1.992H54V60.21zm7.264.332.87 1.78-.892.44-.87-1.784.892-.436zm5.742 1.313.842 1.802-.9.42-.843-1.8.9-.422zm-9.19.214.694.717-1.416 1.387-.696-.71 1.418-1.394zM54 63.19h.996v1.641l.688-.672.7.707-1.425 1.389-.693-.71.377-.368H54v-1.987zm8.57.024L63.45 65l-.895.436-.877-1.78.892-.443zm5.7 1.344.103.228.117.274.082.279.051.281.016.274-.016.273-.05.258-.083.244-.095.207-.9-.422.066-.146.044-.135.03-.139.008-.148-.008-.155-.03-.162-.052-.17-.088-.207-.096-.214.9-.42zm-4.385 1.336.51 1.04.066.133.066.088.08.082.088.067.045.029-.51.856-.103-.06-.191-.153-.17-.178-.147-.207-.111-.207-.518-1.055.895-.435zm3.1 1.12.619.784-.043.03-.207.14-.215.117-.221.111-.229.088-.236.082-.236.059-.237.045-.244.029-.244.008h-.072l.037-.996H65.664l.168-.024.17-.029.178-.05.17-.053.17-.067.162-.08.148-.09.147-.096.007-.007z" transform="matrix(.26459 0 0 .26459 0 0)"/><path style="color:#000;opacity:.45;fill:#fff;stroke-width:.999999;-inkscape-stroke:none" d="M20.225 1.852a20.209 20.209 0 0 1-3.933 10.292l.044.046-.094.091.078.081.094-.09.157.161-.095.092.078.082.094-.092.156.162-.094.092.052.055a20.995 20.995 0 0 0 4.259-10.972Zm-5.821 12.479-.115.113h.13v-.113zm-.117.114A20.23 20.23 0 0 1 .53 20.32v.794a21.012 21.012 0 0 0 13.758-5.577v-.077h.087l.045-.041v-.072h-.132v-.225h.132v-.114h-.132v-.225h.132v-.113h-.132z"/><path style="color:#000;opacity:.35;fill:#fff;stroke-width:.999999;-inkscape-stroke:none" d="M12.164 1.852a12.214 12.214 0 0 1-1.028 3.391l.84.065c.479-1.083.818-2.242.989-3.456zm-6.922 9.295A12.245 12.245 0 0 1 .53 12.304v.795a13.014 13.014 0 0 0 4.778-1.115z"/><path style="color:#000;opacity:.25;fill:#fff;stroke-width:.999999;-inkscape-stroke:none" d="M6.455 1.852A6.706 6.706 0 0 1 .53 6.706v.793a7.47 7.47 0 0 0 4.3-1.744l-.066-.851a.131.131 0 0 1 .14-.141l.848.065a7.483 7.483 0 0 0 1.524-2.976z"/><path style="color:#000;fill:#3584e4;stroke-width:.999999;-inkscape-stroke:none;opacity:.05" d="M3.54 1.852A3.98 3.98 0 0 1 .53 3.968v.796a4.79 4.79 0 0 0 3.883-2.912z"/></svg>
+\ No newline at end of file
+diff --git a/panels/multitasking/assets/workspaces-primary-display.svg b/panels/multitasking/assets/workspaces-primary-display.svg
+index 3a3bed7..8ee8a39 100644
+--- a/panels/multitasking/assets/workspaces-primary-display.svg
++++ b/panels/multitasking/assets/workspaces-primary-display.svg
+@@ -1 +1,5 @@
+-<svg width="326" height="94" viewBox="0 0 86.255 24.871" xmlns="http://www.w3.org/2000/svg"><path style="display:inline;opacity:.287;vector-effect:none;fill:#3584e4;fill-opacity:1;stroke:#3584e4;stroke-width:.79375;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal" d="M.397.397h41.54v24.078H.397Z"/><path style="display:inline;vector-effect:none;fill:none;fill-opacity:1;stroke:#3584e4;stroke-width:.529167;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" d="M.265.265h41.804v24.342H.265Z"/><path style="vector-effect:none;fill:none;fill-opacity:1;stroke:#3584e4;stroke-width:.529162;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" d="M44.186.265H85.99v24.342H44.186z"/><path style="display:inline;opacity:.287;vector-effect:none;fill:#3584e4;fill-opacity:1;stroke:#3584e4;stroke-width:.79375;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal" d="M44.318.397h41.54v24.078h-41.54Z"/><rect style="opacity:1;fill:#3584e4;fill-opacity:1;stroke:#ed333b;stroke-width:0;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none" width="33.338" height="19.579" x="48.419" y="2.646" rx="1.323" ry="1.323"/><rect style="opacity:1;fill:#3584e4;fill-opacity:1;stroke:#ed333b;stroke-width:0;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none" width="26.459" height="15.346" x="7.937" y="4.763" rx="1.323" ry="1.323"/><path style="opacity:1;fill:#3584e4;stroke:#ed333b;stroke-width:0;stroke-linecap:round;fill-opacity:1" d="M38.365 4.763h3.44v15.345h-3.44a1.32 1.32 0 0 1-1.323-1.322v-12.7c0-.733.59-1.323 1.323-1.323zM3.969 4.763H.529v15.345h3.44a1.32 1.32 0 0 0 1.323-1.322v-12.7a1.32 1.32 0 0 0-1.323-1.323Z"/><path style="fill:#3584e4;fill-opacity:1;stroke-width:.52917;stroke-linejoin:round;stop-color:#000" d="M0 0h42.334v1.852H0z"/></svg>
+\ No newline at end of file
++<svg width="318" height="94" version="1.1" viewBox="0 0 84.138 24.871" xmlns="http://www.w3.org/2000/svg">
++ <g fill="#f37e40">
++  <path transform="matrix(.26459 0 0 .26459 0 -3.6827e-5)" d="m160 2v90h156v-90h-156zm-2.0996 4-155.9 0.0019531v12h12.9c2.7699 0 5 2.2282 5 4.998v48c0 2.7699-2.2301 5-5 5h-12.9v15.998h155.9v-85.998zm21.102 3.002h116c2.77 0 5 2.2302 5 5v63.998c0 2.77-2.2302 5-5 5h-116c-2.77 0-5-2.2302-5-5v-63.998c0-2.77 2.2302-5 5-5zm-144.1 9h90c2.7699 0 5 2.2282 5 4.998v48c0 2.7699-2.2301 5-5 5h-90c-2.7699 0-5-2.2301-5-5v-48c0-2.7699 2.2301-4.998 5-4.998zm110 0h13v58h-13c-2.7699 0-5-2.2301-5-5v-48c0-2.7699 2.2301-5 5-5z" fill="#fff" opacity=".8" style="paint-order:normal"/>
++ </g>
++</svg>
+diff --git a/panels/multitasking/assets/workspaces-span-displays.svg b/panels/multitasking/assets/workspaces-span-displays.svg
+index 571ee10..8e9eb01 100644
+--- a/panels/multitasking/assets/workspaces-span-displays.svg
++++ b/panels/multitasking/assets/workspaces-span-displays.svg
+@@ -1 +1,5 @@
+-<svg width="326" height="94" viewBox="0 0 86.255 24.871" xmlns="http://www.w3.org/2000/svg"><path style="display:inline;opacity:.287;vector-effect:none;fill:#3584e4;fill-opacity:1;stroke:#3584e4;stroke-width:.79375;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal" d="M.397.397h41.54v24.078H.397Z"/><path style="display:inline;vector-effect:none;fill:none;fill-opacity:1;stroke:#3584e4;stroke-width:.529167;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" d="M.265.265h41.804v24.342H.265Z"/><path style="vector-effect:none;fill:none;fill-opacity:1;stroke:#3584e4;stroke-width:.529162;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" d="M44.186.265H85.99v24.342H44.186z"/><path style="display:inline;opacity:.287;vector-effect:none;fill:#3584e4;fill-opacity:1;stroke:#3584e4;stroke-width:.79375;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal" d="M44.318.397h41.54v24.078h-41.54Z"/><rect style="opacity:1;fill:#3584e4;fill-opacity:1;stroke:#ed333b;stroke-width:0;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none" width="26.459" height="15.346" x="7.937" y="4.763" rx="1.323" ry="1.323"/><path style="opacity:1;fill:#3584e4;stroke:#ed333b;stroke-width:0;stroke-linecap:round;fill-opacity:1" d="M38.365 4.763h3.44V20.11h-3.44a1.32 1.32 0 0 1-1.323-1.323v-12.7c0-.733.59-1.323 1.323-1.323zM3.969 4.763H.529V20.11h3.44a1.32 1.32 0 0 0 1.323-1.323v-12.7a1.32 1.32 0 0 0-1.323-1.323z"/><g transform="translate(43.921 -.529)"><rect style="opacity:1;fill:#3584e4;fill-opacity:1;stroke:#ed333b;stroke-width:0;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none" width="26.459" height="15.346" x="7.937" y="5.292" rx="1.323" ry="1.323"/><path style="opacity:1;fill:#3584e4;stroke:#ed333b;stroke-width:0;stroke-linecap:round;fill-opacity:1" d="M38.365 5.292h3.44v15.346h-3.44a1.32 1.32 0 0 1-1.323-1.323v-12.7c0-.733.59-1.323 1.323-1.323zM3.969 5.292H.529v15.346h3.44a1.32 1.32 0 0 0 1.323-1.323v-12.7a1.32 1.32 0 0 0-1.323-1.323z"/></g><g style="stroke-width:.999999"><path style="fill:#3584e4;fill-opacity:1;stroke-width:.52917;stroke-linejoin:round;stop-color:#000" d="M0 0h42.334v1.852H0z"/></g></svg>
+\ No newline at end of file
++<svg width="318" height="94" version="1.1" viewBox="0 0 84.138 24.871" xmlns="http://www.w3.org/2000/svg">
++ <g transform="translate(0 .00027851)" fill="#f37e40">
++  <path transform="matrix(.26459 0 0 .26459 0 -.00031534)" d="m157.9 6-155.9 0.0019531v12h12.9c2.7699 0 5 2.2282 5 4.998v48c0 2.7699-2.2301 5-5 5h-12.9v15.998h155.9v-85.998zm158 0-155.9 0.0019531v11.998h-2v58h2v-57.998h12.9c2.7699 0 5 2.2282 5 4.998v48c0 2.7699-2.2301 5-5 5h-12.9v15.998h155.9v-85.998zm-281 12.002h90c2.7699 0 5 2.2282 5 4.998v48c0 2.7699-2.2301 5-5 5h-90c-2.7699 0-5-2.2301-5-5v-48c0-2.7699 2.2301-4.998 5-4.998zm110 0h13v58h-13c-2.7699 0-5-2.2301-5-5v-48c0-2.7699 2.2301-5 5-5zm48.002 0h90c2.7699 0 5 2.2282 5 4.998v48c0 2.7699-2.2301 5-5 5h-90c-2.7699 0-5-2.2301-5-5v-48c0-2.7699 2.2301-4.998 5-4.998zm110 0h13v58h-13c-2.7699 0-5-2.2301-5-5v-48c0-2.7699 2.2301-5 5-5z" fill="#fff" opacity=".8"/>
++ </g>
++</svg>
+diff --git a/panels/multitasking/cc-multitasking-panel.c b/panels/multitasking/cc-multitasking-panel.c
+index bcefb6d..28a3c99 100644
+--- a/panels/multitasking/cc-multitasking-panel.c
++++ b/panels/multitasking/cc-multitasking-panel.c
+@@ -71,6 +71,21 @@ keep_dock_settings_in_sync (CcMultitaskingPanel *self)
+     }
+ }
+ 
++static void
++load_custom_css (CcMultitaskingPanel *self)
++{
++  g_autoptr(GtkCssProvider) provider = NULL;
++
++  /* use custom CSS */
++  provider = gtk_css_provider_new ();
++  gtk_css_provider_load_from_data (provider,
++    "picture.multitasking-assets { background: @theme_selected_bg_color; }",
++    -1);
++  gtk_style_context_add_provider_for_display (gdk_display_get_default (),
++                                              GTK_STYLE_PROVIDER (provider),
++                                              GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
++}
++
+ /* GObject overrides */
+ 
+ static void
+@@ -219,4 +234,6 @@ cc_multitasking_panel_init (CcMultitaskingPanel *self)
+                        "active",
+                        G_SETTINGS_BIND_DEFAULT);
+     }
++
++  load_custom_css (self);
+ }
+diff --git a/panels/multitasking/cc-multitasking-panel.ui b/panels/multitasking/cc-multitasking-panel.ui
+index 1a8b587..320def6 100644
+--- a/panels/multitasking/cc-multitasking-panel.ui
++++ b/panels/multitasking/cc-multitasking-panel.ui
+@@ -1,4 +1,3 @@
+-<?xml version="1.0" encoding="UTF-8"?>
+ <interface>
+   <template class="CcMultitaskingPanel" parent="CcPanel">
+     <child type="content">
+@@ -22,6 +21,9 @@
+                 </child>
+                 <child type="artwork">
+                   <object class="GtkPicture" id="hot_corner_picture">
++                    <style>
++                      <class name="multitasking-assets" />
++                    </style>
+                     <property name="hexpand">True</property>
+                     <property name="halign">center</property>
+                     <property name="margin-top">18</property>
+@@ -49,6 +51,9 @@
+                 </child>
+                 <child type="artwork">
+                   <object class="GtkPicture" id="active_screen_edges_picture">
++                    <style>
++                      <class name="multitasking-assets" />
++                    </style>
+                     <property name="hexpand">True</property>
+                     <property name="halign">center</property>
+                     <property name="margin-top">18</property>
+@@ -136,6 +141,9 @@
+                 </child>
+                 <child type="artwork">
+                   <object class="GtkPicture">
++                    <style>
++                      <class name="multitasking-assets" />
++                    </style>
+                     <property name="hexpand">True</property>
+                     <property name="halign">center</property>
+                     <property name="margin-top">18</property>
+@@ -163,6 +171,9 @@
+                 </child>
+                 <child type="artwork">
+                   <object class="GtkPicture">
++                    <style>
++                      <class name="multitasking-assets" />
++                    </style>
+                     <property name="hexpand">True</property>
+                     <property name="halign">center</property>
+                     <property name="margin-top">18</property>
diff -pruN 1:43.2-2/debian/patches/ubuntu/multitasking-panel-Sync-workspace-and-monitor-isolation-d.patch 1:44~alpha-0ubuntu1/debian/patches/ubuntu/multitasking-panel-Sync-workspace-and-monitor-isolation-d.patch
--- 1:43.2-2/debian/patches/ubuntu/multitasking-panel-Sync-workspace-and-monitor-isolation-d.patch	1970-01-01 00:00:00.000000000 +0000
+++ 1:44~alpha-0ubuntu1/debian/patches/ubuntu/multitasking-panel-Sync-workspace-and-monitor-isolation-d.patch	2023-01-13 16:48:57.000000000 +0000
@@ -0,0 +1,172 @@
+From: =?utf-8?b?Ik1hcmNvIFRyZXZpc2FuIChUcmV2acOxbyki?= <mail@3v1n0.net>
+Date: Sat, 29 Jan 2022 20:36:34 +0100
+Subject: multitasking-panel: Sync workspace and monitor isolation dock
+ settings
+
+When using ubuntu-dock the multitasking panel setting doesn't fully
+apply, because even though the user selects to isolate workspaces, the
+dock may still continue to show icons from all the workspaces.
+
+As per this, ensure that the settings are applied also to the dock, plus
+include dock-specifc settings to control multi-monitor behavior.
+
+Forwarded: not-need
+---
+ panels/multitasking/cc-multitasking-panel.c  | 61 ++++++++++++++++++++++++++++
+ panels/multitasking/cc-multitasking-panel.ui | 36 ++++++++++++++++
+ 2 files changed, 97 insertions(+)
+
+diff --git a/panels/multitasking/cc-multitasking-panel.c b/panels/multitasking/cc-multitasking-panel.c
+index db4c47a..bcefb6d 100644
+--- a/panels/multitasking/cc-multitasking-panel.c
++++ b/panels/multitasking/cc-multitasking-panel.c
+@@ -31,6 +31,7 @@ struct _CcMultitaskingPanel
+   GSettings       *interface_settings;
+   GSettings       *mutter_settings;
+   GSettings       *shell_settings;
++  GSettings       *dock_settings;
+   GSettings       *wm_settings;
+ 
+   GtkPicture      *active_screen_edges_picture;
+@@ -44,10 +45,32 @@ struct _CcMultitaskingPanel
+   GtkSpinButton   *number_of_workspaces_spin;
+   GtkCheckButton  *workspaces_primary_display_radio;
+   GtkCheckButton  *workspaces_span_displays_radio;
++
++  AdwPreferencesGroup *monitor_isolation_group;
++  GtkCheckButton      *dock_monitors_isolation_radio;
++  GtkCheckButton      *dock_each_monitor_radio;
+ };
+ 
+ CC_PANEL_REGISTER (CcMultitaskingPanel, cc_multitasking_panel)
+ 
++static void
++keep_dock_settings_in_sync (CcMultitaskingPanel *self)
++{
++  gboolean switcher_isolate_workspaces;
++  gboolean dock_isolate_workspaces;
++
++  switcher_isolate_workspaces = g_settings_get_boolean (self->shell_settings,
++    "current-workspace-only");
++  dock_isolate_workspaces = g_settings_get_boolean (self->dock_settings,
++    "isolate-workspaces");
++
++  if (switcher_isolate_workspaces != dock_isolate_workspaces)
++    {
++      g_settings_set_boolean (self->dock_settings, "isolate-workspaces",
++                              switcher_isolate_workspaces);
++    }
++}
++
+ /* GObject overrides */
+ 
+ static void
+@@ -58,6 +81,7 @@ cc_multitasking_panel_finalize (GObject *object)
+   g_clear_object (&self->interface_settings);
+   g_clear_object (&self->mutter_settings);
+   g_clear_object (&self->shell_settings);
++  g_clear_object (&self->dock_settings);
+   g_clear_object (&self->wm_settings);
+ 
+   G_OBJECT_CLASS (cc_multitasking_panel_parent_class)->finalize (object);
+@@ -86,11 +110,18 @@ cc_multitasking_panel_class_init (CcMultitaskingPanelClass *klass)
+   gtk_widget_class_bind_template_child (widget_class, CcMultitaskingPanel, number_of_workspaces_spin);
+   gtk_widget_class_bind_template_child (widget_class, CcMultitaskingPanel, workspaces_primary_display_radio);
+   gtk_widget_class_bind_template_child (widget_class, CcMultitaskingPanel, workspaces_span_displays_radio);
++
++  gtk_widget_class_bind_template_child (widget_class, CcMultitaskingPanel, monitor_isolation_group);
++  gtk_widget_class_bind_template_child (widget_class, CcMultitaskingPanel, dock_monitors_isolation_radio);
++  gtk_widget_class_bind_template_child (widget_class, CcMultitaskingPanel, dock_each_monitor_radio);
+ }
+ 
+ static void
+ cc_multitasking_panel_init (CcMultitaskingPanel *self)
+ {
++  GSettingsSchemaSource *schema_source = g_settings_schema_source_get_default ();
++  g_autoptr(GSettingsSchema) schema = NULL;
++
+   g_resources_register (cc_multitasking_get_resource ());
+ 
+   gtk_widget_init_template (GTK_WIDGET (self));
+@@ -158,4 +189,34 @@ cc_multitasking_panel_init (CcMultitaskingPanel *self)
+       gtk_picture_set_resource (self->active_screen_edges_picture,
+                                 "/org/gnome/control-center/multitasking/assets/active-screen-edges-rtl.svg");
+     }
++
++  schema = g_settings_schema_source_lookup (schema_source,
++                                            "org.gnome.shell.extensions.dash-to-dock",
++                                            TRUE);
++  if (schema)
++    {
++      self->dock_settings = g_settings_new_full (schema, NULL, NULL);
++
++      g_signal_connect_object (self->shell_settings, "changed::current-workspace-only",
++                               G_CALLBACK (keep_dock_settings_in_sync), self,
++                               G_CONNECT_SWAPPED);
++      g_signal_connect_object (self->dock_settings, "changed::isolate-workspaces",
++                               G_CALLBACK (keep_dock_settings_in_sync), self,
++                               G_CONNECT_SWAPPED);
++
++      keep_dock_settings_in_sync (self);
++
++      gtk_widget_show (GTK_WIDGET (self->monitor_isolation_group));
++
++      if (g_settings_get_boolean (self->dock_settings, "isolate-monitors"))
++        gtk_check_button_set_active (self->dock_each_monitor_radio, TRUE);
++      else
++        gtk_check_button_set_active (self->dock_monitors_isolation_radio, TRUE);
++
++      g_settings_bind (self->dock_settings,
++                       "isolate-monitors",
++                       self->dock_each_monitor_radio,
++                       "active",
++                       G_SETTINGS_BIND_DEFAULT);
++    }
+ }
+diff --git a/panels/multitasking/cc-multitasking-panel.ui b/panels/multitasking/cc-multitasking-panel.ui
+index 28a5ce0..1a8b587 100644
+--- a/panels/multitasking/cc-multitasking-panel.ui
++++ b/panels/multitasking/cc-multitasking-panel.ui
+@@ -215,6 +215,42 @@
+           </object>
+         </child>
+ 
++        <child>
++          <object class="AdwPreferencesGroup" id="monitor_isolation_group">
++          <property name="visible">False</property>
++
++            <!-- All Monitors -->
++            <child>
++              <object class="CcMultitaskingRow">
++                <property name="activatable-widget">dock_monitors_isolation_radio</property>
++                <property name="title" translatable="yes">Include applications from all _monitors</property>
++                <property name="use_underline">True</property>
++                <child type="prefix">
++                  <object class="GtkCheckButton" id="dock_monitors_isolation_radio">
++                    <property name="valign">center</property>
++                  </object>
++                </child>
++              </object>
++            </child>
++
++            <!-- Monitor Isolation -->
++            <child>
++              <object class="CcMultitaskingRow">
++                <property name="activatable-widget">dock_each_monitor_radio</property>
++                <property name="title" translatable="yes">Include applications from _each monitor only</property>
++                <property name="use_underline">True</property>
++                <child type="prefix">
++                  <object class="GtkCheckButton" id="dock_each_monitor_radio">
++                    <property name="valign">center</property>
++                    <property name="group">dock_monitors_isolation_radio</property>
++                  </object>
++                </child>
++              </object>
++            </child>
++
++          </object>
++        </child>
++
+       </object>
+     </child>
+   </template>
diff -pruN 1:43.2-2/debian/patches/ubuntu/notifications-Handle-.desktop-files-that-got-renamed.patch 1:44~alpha-0ubuntu1/debian/patches/ubuntu/notifications-Handle-.desktop-files-that-got-renamed.patch
--- 1:43.2-2/debian/patches/ubuntu/notifications-Handle-.desktop-files-that-got-renamed.patch	1970-01-01 00:00:00.000000000 +0000
+++ 1:44~alpha-0ubuntu1/debian/patches/ubuntu/notifications-Handle-.desktop-files-that-got-renamed.patch	2023-01-13 16:48:57.000000000 +0000
@@ -0,0 +1,32 @@
+From: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
+Date: Tue, 31 Jul 2018 04:44:12 +0100
+Subject: notifications: Handle .desktop files that got renamed
+
+upstream, those use NoDisplay but the panel doesn't respect that key,
+skip known buggy entries for file-roller and nautilus
+Origin: ubuntu
+Bug-Ubuntu: https://launchpad.net/bugs/1716267
+Forwarded: not-needed
+---
+ panels/notifications/cc-notifications-panel.c | 8 ++++++++
+ 1 file changed, 8 insertions(+)
+
+diff --git a/panels/notifications/cc-notifications-panel.c b/panels/notifications/cc-notifications-panel.c
+index a1000d8..4493f83 100644
+--- a/panels/notifications/cc-notifications-panel.c
++++ b/panels/notifications/cc-notifications-panel.c
+@@ -360,6 +360,14 @@ process_app_info (CcNotificationsPanel *panel,
+   guint i;
+ 
+   app_id = app_info_get_id (app_info);
++
++  /* Ignore compatibility desktops (lp: #1716267) */
++  if (g_strcmp0 (app_id, "file-roller") == 0)
++    return;
++
++  if (g_strcmp0 (app_id, "nautilus") == 0)
++    return;
++
+   g_strcanon (app_id,
+               "0123456789"
+               "abcdefghijklmnopqrstuvwxyz"
diff -pruN 1:43.2-2/debian/patches/ubuntu/online-accounts-Hide-window-after-adding-an-online-accoun.patch 1:44~alpha-0ubuntu1/debian/patches/ubuntu/online-accounts-Hide-window-after-adding-an-online-accoun.patch
--- 1:43.2-2/debian/patches/ubuntu/online-accounts-Hide-window-after-adding-an-online-accoun.patch	1970-01-01 00:00:00.000000000 +0000
+++ 1:44~alpha-0ubuntu1/debian/patches/ubuntu/online-accounts-Hide-window-after-adding-an-online-accoun.patch	2023-01-13 16:48:57.000000000 +0000
@@ -0,0 +1,32 @@
+From: Andrea Azzarone <andrea.azzarone@canonical.com>
+Date: Tue, 31 Jul 2018 04:44:12 +0100
+Subject: online-accounts: Hide window after adding an online account from
+ another app
+
+Some applications (e.g. gnome-calendar, gnome-todo, etc.) use gnome-control-center
+to allow the user to add online accounts. This patch makes sure that g-c-c main window
+is closed after the user interacted with the new-account dialog.
+
+Bug-Ubuntu: https://launchpad.net/bugs/1754651
+Forwarded: no
+Last-Update: 2018-03-09
+---
+ panels/online-accounts/cc-online-accounts-panel.c | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+diff --git a/panels/online-accounts/cc-online-accounts-panel.c b/panels/online-accounts/cc-online-accounts-panel.c
+index f4d1a92..9b848dd 100644
+--- a/panels/online-accounts/cc-online-accounts-panel.c
++++ b/panels/online-accounts/cc-online-accounts-panel.c
+@@ -803,7 +803,10 @@ cc_online_accounts_panel_set_property (GObject      *object,
+             }
+ 
+           if (g_strcmp0 (first_arg, "add") == 0)
+-            command_add (CC_ONLINE_ACCOUNTS_PANEL (object), parameters);
++            {
++              command_add (CC_ONLINE_ACCOUNTS_PANEL (object), parameters);
++              g_application_quit (g_application_get_default ());
++            }
+           else if (first_arg != NULL)
+             select_account_by_id (CC_ONLINE_ACCOUNTS_PANEL (object), first_arg);
+ 
diff -pruN 1:43.2-2/debian/patches/ubuntu/printers-Temporarily-add-an-additional-advanced-printer-b.patch 1:44~alpha-0ubuntu1/debian/patches/ubuntu/printers-Temporarily-add-an-additional-advanced-printer-b.patch
--- 1:43.2-2/debian/patches/ubuntu/printers-Temporarily-add-an-additional-advanced-printer-b.patch	1970-01-01 00:00:00.000000000 +0000
+++ 1:44~alpha-0ubuntu1/debian/patches/ubuntu/printers-Temporarily-add-an-additional-advanced-printer-b.patch	2023-01-13 16:48:57.000000000 +0000
@@ -0,0 +1,96 @@
+From: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
+Date: Tue, 31 Jul 2018 04:44:12 +0100
+Subject: printers: Temporarily add an additional advanced printer button.
+
+The printers panel doesn't support printer sharing and other features.
+Workaround it for now by adding in multiple places an advanced printer
+button starting system-config-printer to avoid doubling the panel in Settings.
+Origin: ubuntu
+
+Bug-Ubuntu: https://launchpad.net/bugs/1706524a
+Bug: https://bugzilla.gnome.org/show_bug.cgi?id=692532
+---
+ panels/printers/cc-printers-panel.c | 24 ++++++++++++++++++++++++
+ panels/printers/printers.ui         | 13 +++++++++++++
+ 2 files changed, 37 insertions(+)
+
+diff --git a/panels/printers/cc-printers-panel.c b/panels/printers/cc-printers-panel.c
+index 8727b17..00729c0 100644
+--- a/panels/printers/cc-printers-panel.c
++++ b/panels/printers/cc-printers-panel.c
+@@ -25,6 +25,7 @@
+ #include "pp-printer.h"
+ 
+ #include <string.h>
++#include <gio/gdesktopappinfo.h>
+ #include <glib/gi18n-lib.h>
+ #include <glib/gstdio.h>
+ #include <polkit/polkit.h>
+@@ -993,6 +994,25 @@ printer_add_cb (CcPrintersPanel *self)
+   gtk_widget_show (GTK_WIDGET (self->pp_new_printer_dialog));
+ }
+ 
++static void
++show_system_config_printer (void)
++{
++  g_autoptr(GAppInfo) app_info = NULL;
++  g_autoptr(GdkAppLaunchContext) ctx = NULL;
++  g_autoptr(GError) error = NULL;
++
++  app_info = G_APP_INFO (g_desktop_app_info_new ("system-config-printer.desktop"));
++
++  if (app_info == NULL) {
++    g_warning ("Failed to launch system-config-printer: couldn't create GDesktopAppInfo");
++    return;
++  }
++
++  ctx = gdk_display_get_app_launch_context (gdk_display_get_default ());
++  if (!g_app_info_launch (app_info, NULL, G_APP_LAUNCH_CONTEXT (ctx), &error))
++    g_warning ("Failed to launch system-config-printer: %s", error->message);
++}
++
+ static void
+ update_sensitivity (gpointer user_data)
+ {
+@@ -1253,6 +1273,10 @@ cc_printers_panel_init (CcPrintersPanel *self)
+   self->notification = (GtkRevealer*)
+     gtk_builder_get_object (self->builder, "notification");
+ 
++  widget = (GtkWidget*) gtk_builder_get_object (self->builder, "system-config-printer-button1");
++  g_signal_connect_swapped (widget, "clicked",
++                            G_CALLBACK (show_system_config_printer), NULL);
++
+   widget = (GtkWidget*)
+     gtk_builder_get_object (self->builder, "notification-undo-button");
+   g_signal_connect_object (widget, "clicked", G_CALLBACK (on_printer_deletion_undone), self, G_CONNECT_SWAPPED);
+diff --git a/panels/printers/printers.ui b/panels/printers/printers.ui
+index 123795f..4c79a70 100644
+--- a/panels/printers/printers.ui
++++ b/panels/printers/printers.ui
+@@ -117,6 +117,7 @@
+                 <property name="vexpand">True</property>
+                 <child>
+                   <object class="GtkBox">
++                    <property name="orientation">vertical</property>
+                     <child>
+                       <object class="GtkListBox" id="content">
+                         <property name="selection-mode">GTK_SELECTION_NONE</property>
+@@ -127,6 +128,18 @@
+                         </style>
+                       </object>
+                     </child>
++
++                    <child>
++                      <object class="GtkButton" id="system-config-printer-button1">
++                        <property name="label" translatable="yes">Additional Printer Settings…</property>
++                        <property name="can_focus">True</property>
++                        <property name="receives_default">True</property>
++                        <property name="hexpand">False</property>
++                        <property name="halign">end</property>
++                        <property name="margin-end">60</property>
++                        <property name="margin-bottom">24</property>
++                      </object>
++                    </child>
+                   </object>
+                 </child>
+               </object>
diff -pruN 1:43.2-2/debian/patches/ubuntu/region-Add-Language-Selector-button.patch 1:44~alpha-0ubuntu1/debian/patches/ubuntu/region-Add-Language-Selector-button.patch
--- 1:43.2-2/debian/patches/ubuntu/region-Add-Language-Selector-button.patch	1970-01-01 00:00:00.000000000 +0000
+++ 1:44~alpha-0ubuntu1/debian/patches/ubuntu/region-Add-Language-Selector-button.patch	2023-01-13 16:48:57.000000000 +0000
@@ -0,0 +1,83 @@
+From: Jeremy Bicha <jbicha@ubuntu.com>
+Date: Thu, 14 Sep 2017 09:23:42 -0400
+Subject: region: Add Language Selector button
+
+Workaround for https://launchpad.net/bugs/1631750
+---
+ panels/region/cc-region-panel.c  | 21 +++++++++++++++++++++
+ panels/region/cc-region-panel.ui | 23 +++++++++++++++++++++++
+ 2 files changed, 44 insertions(+)
+
+diff --git a/panels/region/cc-region-panel.c b/panels/region/cc-region-panel.c
+index 0849045..00190f5 100644
+--- a/panels/region/cc-region-panel.c
++++ b/panels/region/cc-region-panel.c
+@@ -560,6 +560,26 @@ setup_language_section (CcRegionPanel *self)
+         update_region_from_setting (self);
+ }
+ 
++
++static void
++show_language_support (CcRegionPanel *self)
++{
++        g_autoptr(GAppInfo) app_info = NULL;
++        g_autoptr(GdkAppLaunchContext) ctx = NULL;
++        g_autoptr(GError) error = NULL;
++
++        app_info = G_APP_INFO (g_desktop_app_info_new ("gnome-language-selector.desktop"));
++
++        if (app_info == NULL) {
++                g_warning ("Failed to launch language-selector: couldn't create GDesktopAppInfo");
++                return;
++        }
++
++        ctx = gdk_display_get_app_launch_context (gdk_display_get_default ());
++        if (!g_app_info_launch (app_info, NULL, G_APP_LAUNCH_CONTEXT (ctx), &error))
++                g_warning ("Failed to launch language-selector: %s", error->message);
++}
++
+ static void
+ update_login_region (CcRegionPanel *self)
+ {
+@@ -848,6 +868,7 @@ cc_region_panel_class_init (CcRegionPanelClass * klass)
+         gtk_widget_class_bind_template_callback (widget_class, on_user_formats_row_activated_cb);
+         gtk_widget_class_bind_template_callback (widget_class, on_user_language_row_activated_cb);
+         gtk_widget_class_bind_template_callback (widget_class, restart_now);
++        gtk_widget_class_bind_template_callback (widget_class, show_language_support);
+ }
+ 
+ static void
+diff --git a/panels/region/cc-region-panel.ui b/panels/region/cc-region-panel.ui
+index 79d31d1..49accb1 100644
+--- a/panels/region/cc-region-panel.ui
++++ b/panels/region/cc-region-panel.ui
+@@ -46,6 +46,29 @@
+               </object>
+             </child>
+ 
++            <child>
++              <object class="AdwPreferencesGroup">
++                <property name="title" translatable="yes">System</property>
++
++                <child>
++                  <object class="AdwActionRow">
++                    <property name="use-underline">True</property>
++                    <property name="title" translatable="yes">Manage Installed Languages</property>
++                    <property name="activatable">True</property>
++                    <signal name="activated" handler="show_language_support" object="CcRegionPanel" swapped="no" />
++
++                    <child>
++                      <object class="GtkImage">
++                        <property name="valign">center</property>
++                        <property name="icon-name">go-next-symbolic</property>
++                      </object>
++                    </child>
++                  </object>
++                </child>
++
++              </object>
++            </child>
++
+             <child>
+               <object class="AdwPreferencesGroup">
+                 <property name="title" translatable="yes">Your Account</property>
diff -pruN 1:43.2-2/debian/patches/ubuntu/shell-Change-the-default-height-so-all-category-are-on-sc.patch 1:44~alpha-0ubuntu1/debian/patches/ubuntu/shell-Change-the-default-height-so-all-category-are-on-sc.patch
--- 1:43.2-2/debian/patches/ubuntu/shell-Change-the-default-height-so-all-category-are-on-sc.patch	1970-01-01 00:00:00.000000000 +0000
+++ 1:44~alpha-0ubuntu1/debian/patches/ubuntu/shell-Change-the-default-height-so-all-category-are-on-sc.patch	2023-01-13 16:48:57.000000000 +0000
@@ -0,0 +1,23 @@
+From: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
+Date: Mon, 19 Aug 2019 16:17:20 +0100
+Subject: shell: Change the default height so all category are on screen
+
+Ubuntu: https://bugs.launchpad.net/ubuntu/+source/gnome-control-center/+bug/1728450
+Upstream: https://bugzilla.gnome.org/show_bug.cgi?id=789372
+---
+ shell/cc-window.ui | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/shell/cc-window.ui b/shell/cc-window.ui
+index 07e1848..21a2fc3 100644
+--- a/shell/cc-window.ui
++++ b/shell/cc-window.ui
+@@ -2,7 +2,7 @@
+ <interface>
+   <template class="CcWindow" parent="AdwApplicationWindow">
+     <property name="default-width">980</property>
+-    <property name="default-height">640</property>
++    <property name="default-height">770</property>
+     <child>
+       <object class="AdwLeaflet" id="main_leaflet">
+         <property name="can-navigate-back">True</property>
diff -pruN 1:43.2-2/debian/patches/ubuntu/sound-Add-a-button-to-select-the-default-theme.patch 1:44~alpha-0ubuntu1/debian/patches/ubuntu/sound-Add-a-button-to-select-the-default-theme.patch
--- 1:43.2-2/debian/patches/ubuntu/sound-Add-a-button-to-select-the-default-theme.patch	1970-01-01 00:00:00.000000000 +0000
+++ 1:44~alpha-0ubuntu1/debian/patches/ubuntu/sound-Add-a-button-to-select-the-default-theme.patch	2023-01-13 16:48:57.000000000 +0000
@@ -0,0 +1,144 @@
+From: Robert Ancell <robert.ancell@canonical.com>
+Date: Thu, 19 Mar 2020 16:44:44 +1300
+Subject: sound: Add a button to select the default theme
+
+Chosen alert sound doesn't persist in the viewer
+https://gitlab.gnome.org/GNOME/gnome-control-center/-/issues/2026
+
+Also, on Ubuntu, the alert sound doesn't seem to actually change.
+That happens even without this patch.
+https://launchpad.net/bugs/1871320
+---
+ panels/sound/cc-alert-chooser.c  | 50 ++++++++++++++++++++++++++++++++++++----
+ panels/sound/cc-alert-chooser.ui |  7 ++++++
+ 2 files changed, 53 insertions(+), 4 deletions(-)
+
+diff --git a/panels/sound/cc-alert-chooser.c b/panels/sound/cc-alert-chooser.c
+index c4ce870..a264811 100644
+--- a/panels/sound/cc-alert-chooser.c
++++ b/panels/sound/cc-alert-chooser.c
+@@ -29,6 +29,7 @@ struct _CcAlertChooser
+ {
+   GtkBox         parent_instance;
+ 
++  GtkToggleButton *default_button;
+   GtkToggleButton *click_button;
+   GtkToggleButton *hum_button;
+   GtkToggleButton *string_button;
+@@ -123,6 +124,27 @@ set_sound_symlink (const gchar *alert_name,
+     g_warning ("Failed to make sound theme symbolic link %s->%s: %s", source_path, target_path, error->message);
+ }
+ 
++static void
++remove_sound_symlink (const gchar *alert_name)
++{
++  g_autofree gchar *dir = NULL;
++  g_autofree gchar *source_filename = NULL;
++  g_autofree gchar *source_path = NULL;
++  g_autoptr(GFile) file = NULL;
++  g_autoptr(GError) error = NULL;
++
++  dir = get_theme_dir ();
++  source_filename = g_strdup_printf ("%s.ogg", alert_name);
++  source_path = g_build_filename (dir, source_filename, NULL);
++
++  file = g_file_new_for_path (source_path);
++  if (!g_file_delete (file, NULL, &error))
++    {
++      if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_NOT_FOUND))
++        g_warning ("Failed to remove existing sound symbolic link %s: %s", source_path, error->message);
++    }
++}
++
+ static void
+ update_dir_mtime (const char *dir_path)
+ {
+@@ -197,6 +219,16 @@ set_custom_theme (CcAlertChooser *self,
+   g_settings_set_string (self->sound_settings, "theme-name", CUSTOM_THEME_NAME);
+ }
+ 
++static void
++set_default_theme (CcAlertChooser *self)
++{
++  remove_sound_symlink ("bell-terminal");
++  remove_sound_symlink ("bell-window-system");
++
++  g_settings_set_boolean (self->sound_settings, "event-sounds", TRUE);
++  g_settings_reset (self->sound_settings, "theme-name");
++}
++
+ static void
+ select_sound (CcAlertChooser *self,
+               const gchar    *name)
+@@ -231,6 +263,11 @@ clicked_cb (CcAlertChooser *self,
+ {
+   if (button == self->click_button)
+     select_sound (self, "click");
++  else if (button == self->default_button)
++    {
++      set_default_theme (self);
++      gtk_widget_error_bell (GTK_WIDGET (self));
++    }
+   else if (button == self->hum_button)
+     select_sound (self, "hum");
+   else if (button == self->string_button)
+@@ -241,6 +278,8 @@ clicked_cb (CcAlertChooser *self,
+   set_button (self, button, TRUE);
+   if (button != self->click_button)
+     set_button (self, self->click_button, FALSE);
++  if (button != self->default_button)
++    set_button (self, self->default_button, FALSE);
+   if (button != self->hum_button)
+     set_button (self, self->hum_button, FALSE);
+   if (button != self->string_button)
+@@ -271,6 +310,7 @@ cc_alert_chooser_class_init (CcAlertChooserClass *klass)
+   gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/control-center/sound/cc-alert-chooser.ui");
+ 
+   gtk_widget_class_bind_template_child (widget_class, CcAlertChooser, click_button);
++  gtk_widget_class_bind_template_child (widget_class, CcAlertChooser, default_button);
+   gtk_widget_class_bind_template_child (widget_class, CcAlertChooser, hum_button);
+   gtk_widget_class_bind_template_child (widget_class, CcAlertChooser, string_button);
+   gtk_widget_class_bind_template_child (widget_class, CcAlertChooser, swing_button);
+@@ -296,18 +336,20 @@ cc_alert_chooser_init (CcAlertChooser *self)
+ 
+   alert_name = get_alert_name ();
+ 
+-  /* If user has selected an old sound alert, migrate them to click. */
++  /* If user has selected an old sound alert, migrate them to default. */
+   if (g_strcmp0 (alert_name, "click") != 0 &&
+       g_strcmp0 (alert_name, "hum") != 0 &&
+       g_strcmp0 (alert_name, "string") != 0 &&
+       g_strcmp0 (alert_name, "swing") != 0)
+     {
+-      set_custom_theme (self, "click");
++      set_default_theme (self);
+       g_free (alert_name);
+-      alert_name = g_strdup ("click");
++      alert_name = get_alert_name();
+     }
+ 
+-  if (g_strcmp0 (alert_name, "click") == 0)
++  if (alert_name == NULL)
++    set_button (self, self->default_button, TRUE);
++  else if (g_strcmp0 (alert_name, "click") == 0)
+     set_button (self, self->click_button, TRUE);
+   else if (g_strcmp0 (alert_name, "hum") == 0)
+     set_button (self, self->hum_button, TRUE);
+diff --git a/panels/sound/cc-alert-chooser.ui b/panels/sound/cc-alert-chooser.ui
+index 603aff9..1512a2f 100644
+--- a/panels/sound/cc-alert-chooser.ui
++++ b/panels/sound/cc-alert-chooser.ui
+@@ -6,6 +6,13 @@
+     <style>
+       <class name="linked"/>
+     </style>
++    <child>
++      <object class="GtkToggleButton" id="default_button">
++        <property name="visible">True</property>
++        <property name="label" translatable="yes">Default</property>
++        <signal name="clicked" handler="clicked_cb" object="CcAlertChooser" swapped="yes"/>
++      </object>
++    </child>
+     <child>
+       <object class="GtkToggleButton" id="click_button">
+         <property name="visible">True</property>
diff -pruN 1:43.2-2/debian/patches/ubuntu/sound-Allow-volume-to-be-set-above-100.patch 1:44~alpha-0ubuntu1/debian/patches/ubuntu/sound-Allow-volume-to-be-set-above-100.patch
--- 1:43.2-2/debian/patches/ubuntu/sound-Allow-volume-to-be-set-above-100.patch	1970-01-01 00:00:00.000000000 +0000
+++ 1:44~alpha-0ubuntu1/debian/patches/ubuntu/sound-Allow-volume-to-be-set-above-100.patch	2023-01-13 16:48:57.000000000 +0000
@@ -0,0 +1,87 @@
+From: Jeremy Bicha <jbicha@debian.org>
+Date: Sat, 9 Feb 2019 16:32:03 -0500
+Subject: sound: Allow volume to be set above 100%.
+
+Some systems have low maximum volume set (like x220), allow, from an option
+in gnome-control-center to set it above that 100% limit from g-s-d
+(keyboard) and gnome-shell.
+Only show the above 100% volume option if:
+1. you are in an ubuntu session
+2. the selected output supports amplified volume. If so:
+   present the settings to google that on and off. It will enable
+   GNOME Shell and media keys to set the sound above 100%. If not
+   enabled, volume and sliders are all capped to 100%. (LP: #1706524)
+Modified from original patch in unity-control-center from Lars Uebernickel.
+Adapted for Ubuntu gnome-control-center by Didier Roche
+Updated for GNOME 3.32 by Jeremy Bicha
+Origin: ubuntu
+Bug-Ubuntu: https://launchpad.net/bugs/1706524
+Bug: https://bugzilla.gnome.org/show_bug.cgi?id=710424
+---
+ panels/sound/cc-sound-panel.c  | 10 ++++++++++
+ panels/sound/cc-sound-panel.ui | 10 ++++++++++
+ 2 files changed, 20 insertions(+)
+
+diff --git a/panels/sound/cc-sound-panel.c b/panels/sound/cc-sound-panel.c
+index 1641624..36387a2 100644
+--- a/panels/sound/cc-sound-panel.c
++++ b/panels/sound/cc-sound-panel.c
+@@ -35,6 +35,7 @@
+ #include "cc-device-combo-box.h"
+ #include "cc-fade-slider.h"
+ #include "cc-level-bar.h"
++#include "cc-list-row.h"
+ #include "cc-output-test-window.h"
+ #include "cc-profile-combo-box.h"
+ #include "cc-sound-panel.h"
+@@ -64,6 +65,7 @@ struct _CcSoundPanel
+   CcProfileComboBox *output_profile_combo_box;
+   GtkListBoxRow     *output_profile_row;
+   CcVolumeSlider    *output_volume_slider;
++  CcListRow         *allow_amplify_row;
+   CcStreamListBox   *stream_list_box;
+   GtkListBoxRow     *subwoofer_row;
+   CcSubwooferSlider *subwoofer_slider;
+@@ -262,6 +264,7 @@ cc_sound_panel_class_init (CcSoundPanelClass *klass)
+   gtk_widget_class_bind_template_child (widget_class, CcSoundPanel, output_profile_combo_box);
+   gtk_widget_class_bind_template_child (widget_class, CcSoundPanel, output_profile_row);
+   gtk_widget_class_bind_template_child (widget_class, CcSoundPanel, output_volume_slider);
++  gtk_widget_class_bind_template_child (widget_class, CcSoundPanel, allow_amplify_row);
+   gtk_widget_class_bind_template_child (widget_class, CcSoundPanel, stream_list_box);
+   gtk_widget_class_bind_template_child (widget_class, CcSoundPanel, subwoofer_row);
+   gtk_widget_class_bind_template_child (widget_class, CcSoundPanel, subwoofer_slider);
+@@ -296,6 +299,13 @@ cc_sound_panel_init (CcSoundPanel *self)
+                            G_CONNECT_SWAPPED);
+   allow_amplified_changed_cb (self);
+ 
++  if (strstr (g_getenv("XDG_CURRENT_DESKTOP"), "ubuntu") != NULL) {
++    g_settings_bind (self->sound_settings, "allow-volume-above-100-percent",
++                     self->allow_amplify_row, "active", G_SETTINGS_BIND_DEFAULT);
++  } else {
++    gtk_widget_set_visible (GTK_WIDGET (self->allow_amplify_row), FALSE);
++  }
++
+   self->mixer_control = gvc_mixer_control_new ("GNOME Settings");
+   gvc_mixer_control_open (self->mixer_control);
+ 
+diff --git a/panels/sound/cc-sound-panel.ui b/panels/sound/cc-sound-panel.ui
+index 39c89b7..e7c33bd 100644
+--- a/panels/sound/cc-sound-panel.ui
++++ b/panels/sound/cc-sound-panel.ui
+@@ -21,6 +21,16 @@
+                 </child>
+               </object>
+             </child>
++            <!-- Over-Amplification -->
++            <child>
++              <object class="CcListRow" id="allow_amplify_row">
++                <property name="title" translatable="yes">Over-Amplification</property>
++                <property name="subtitle" translatable="yes">Allows raising the volume above 100%. This can result in a loss of audio quality; it is better to increase application volume settings, if possible.</property>
++                <property name="subtitle-lines">6</property>
++                <property name="use-underline">True</property>
++                <property name="show-switch">True</property>
++              </object>
++            </child>
+           </object>
+         </child>
+         <child>
diff -pruN 1:43.2-2/debian/rules 1:44~alpha-0ubuntu1/debian/rules
--- 1:43.2-2/debian/rules	2023-01-25 12:01:34.000000000 +0000
+++ 1:44~alpha-0ubuntu1/debian/rules	2023-01-13 16:48:57.000000000 +0000
@@ -31,6 +31,7 @@ endif
 override_dh_auto_configure:
 	dh_auto_configure -- \
 		-Dprivileged_group=sudo \
+		-Dwhoopsie=true \
 		-Ddocumentation=true \
 		-Ddistributor_logo=$(DISTRIBUTOR_LOGO) \
 		-Ddark_mode_distributor_logo=$(DISTRIBUTOR_LOGO) \
diff -pruN 1:43.2-2/debian/source/include-binaries 1:44~alpha-0ubuntu1/debian/source/include-binaries
--- 1:43.2-2/debian/source/include-binaries	1970-01-01 00:00:00.000000000 +0000
+++ 1:44~alpha-0ubuntu1/debian/source/include-binaries	2023-01-13 16:48:57.000000000 +0000
@@ -0,0 +1,2 @@
+debian/ubuntu-logo-icon.png
+debian/ubuntu-logo-dark.png
diff -pruN 1:43.2-2/debian/source_gnome-control-center.py 1:44~alpha-0ubuntu1/debian/source_gnome-control-center.py
--- 1:43.2-2/debian/source_gnome-control-center.py	1970-01-01 00:00:00.000000000 +0000
+++ 1:44~alpha-0ubuntu1/debian/source_gnome-control-center.py	2023-01-13 16:48:57.000000000 +0000
@@ -0,0 +1,32 @@
+import os, apport.packaging, re
+import glob
+from apport.hookutils import *
+
+def add_info(report):
+	# the issue is not in the gnome-control-center code so reassign
+	if "Stacktrace" in report and "/control-center-1/" in report["Stacktrace"]:
+		for words in report["Stacktrace"].split():
+			if words.startswith("/usr/lib/") and "/control-center-1/" in words:
+			    if apport.packaging.get_file_package(words) != 'gnome-control-center':
+    				report.add_package_info(apport.packaging.get_file_package(words))
+    				return    				
+			    component = re.compile("lib(\w*).so").search(words).groups(1)[0]
+			    report['Title'] = '[%s]: %s' % (component, report.get('Title', report.standard_title()))
+			    report['Tags'] = '%s %s' % (report.get('Tags', ""), component)
+			    break # Stop on the first .so that's the interesting one
+
+	# collect informations on the /usr/lib/control-center-1 components 
+	plugin_packages = set()
+	for paneldir in (['/usr/lib/control-center-1'] + glob.glob('/usr/lib/*/control-center-1')):
+		for dirpath, dirnames, filenames in os.walk(paneldir):
+			for filename in filenames:
+				path = os.path.join(dirpath, filename)
+				package = apport.packaging.get_file_package(path)
+				if package == 'gnome-control-center':
+					continue
+				if not package:
+					continue
+
+				plugin_packages.add(package)
+		if plugin_packages:
+			report["usr_lib_gnome-control-center"] = package_versions(*sorted(plugin_packages))
Binary files 1:43.2-2/debian/ubuntu-logo-dark.png and 1:44~alpha-0ubuntu1/debian/ubuntu-logo-dark.png differ
Binary files 1:43.2-2/debian/ubuntu-logo-icon.png and 1:44~alpha-0ubuntu1/debian/ubuntu-logo-icon.png differ
diff -pruN 1:43.2-2/debian/ubuntu-panel-assets/scalable/apps/preferences-ubuntu-panel-symbolic.svg 1:44~alpha-0ubuntu1/debian/ubuntu-panel-assets/scalable/apps/preferences-ubuntu-panel-symbolic.svg
--- 1:43.2-2/debian/ubuntu-panel-assets/scalable/apps/preferences-ubuntu-panel-symbolic.svg	1970-01-01 00:00:00.000000000 +0000
+++ 1:44~alpha-0ubuntu1/debian/ubuntu-panel-assets/scalable/apps/preferences-ubuntu-panel-symbolic.svg	2023-01-13 16:48:57.000000000 +0000
@@ -0,0 +1,20 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16" viewBox="0 0 16 16">
+  <defs>
+    <polygon id="adwaita---appearance-icon---16x16-v1-a" points="0 .005 16 .005 16 12.006 0 12.006"/>
+    <polygon id="adwaita---appearance-icon---16x16-v1-c" points="0 15.995 16 15.995 16 1 0 1"/>
+  </defs>
+  <g fill="none" fill-rule="evenodd">
+    <path fill="#333" d="M9.998,8.0029 C9.445,8.0029 8.998,7.5549 8.998,7.0029 C8.998,6.4509 9.445,6.0029 9.998,6.0029 C10.55,6.0029 10.998,6.4509 10.998,7.0029 C10.998,7.5549 10.55,8.0029 9.998,8.0029 M9.991,5.0019 C8.587,5.0019 7.176,6.1009 6.321,6.9999 C7.128,7.8409 8.55,8.9869 9.991,8.9869 C11.545,8.9869 12.97,7.7419 13.68,6.9999 C12.963,6.2379 11.518,5.0019 9.991,5.0019"/>
+    <g transform="translate(0 .995)">
+      <mask id="adwaita---appearance-icon---16x16-v1-b" fill="#fff">
+        <use xlink:href="#adwaita---appearance-icon---16x16-v1-a"/>
+      </mask>
+      <path fill="#333" d="M9.9912,8.9931 C7.2362,8.9931 5.0022,6.0061 5.00319966,6.0061 C5.0042,6.0061 7.2362,3.0071 9.9912,3.0071 C12.7462,3.0071 14.9792,5.9461 14.9792,6.0271 C14.9792,6.0541 12.7462,8.9931 9.9912,8.9931 L9.9912,8.9931 Z M0.9972,4.0061 L2.9972,4.0061 L2.9972,2.0061 L0.9972,2.0061 L0.9972,4.0061 Z M0.9972,7.0041 L2.9972,7.0041 L2.9972,5.0041 L0.9972,5.0041 L0.9972,7.0041 Z M0.9972,10.0061 L2.9972,10.0061 L2.9972,8.0061 L0.9972,8.0061 L0.9972,10.0061 Z M14.3832,0.0051 L1.6162,0.0051 C0.7272,0.0051 0.0002,0.7331 0.0002,1.6221 L0.0002,10.3891 C0.0002,11.2771 0.7272,12.0061 1.6162,12.0061 L14.3832,12.0061 C15.2722,12.0061 16.0002,11.2771 16.0002,10.3891 L16.0002,1.6221 C16.0002,0.7331 15.2722,0.0051 14.3832,0.0051 L14.3832,0.0051 Z" mask="url(#adwaita---appearance-icon---16x16-v1-b)"/>
+    </g>
+    <mask id="adwaita---appearance-icon---16x16-v1-d" fill="#fff">
+      <use xlink:href="#adwaita---appearance-icon---16x16-v1-c"/>
+    </mask>
+    <polygon fill="#333" points="3.988 15.995 11.988 15.995 11.988 14.995 3.988 14.995" mask="url(#adwaita---appearance-icon---16x16-v1-d)"/>
+    <polygon fill="#333" points="5.998 15.003 9.998 15.003 9.998 13.003 5.998 13.003" mask="url(#adwaita---appearance-icon---16x16-v1-d)"/>
+  </g>
+</svg>
diff -pruN 1:43.2-2/docs/CODE_OF_CONDUCT.md 1:44~alpha-0ubuntu1/docs/CODE_OF_CONDUCT.md
--- 1:43.2-2/docs/CODE_OF_CONDUCT.md	1970-01-01 00:00:00.000000000 +0000
+++ 1:44~alpha-0ubuntu1/docs/CODE_OF_CONDUCT.md	2023-01-09 20:06:57.000000000 +0000
@@ -0,0 +1,184 @@
+# Code of Conduct
+
+GNOME Settings is a project developed based on GNOME Code of Conduct and GitHub's community
+guidelines. You can read it below:
+
+## Summary
+
+GNOME creates software for a better world. We achieve this by behaving well towards
+each other.
+
+Therefore this document suggests what we consider ideal behaviour, so you know what
+to expect when getting involved in GNOME. This is who we are and what we want to be.
+There is no official enforcement of these principles, and this should not be interpreted
+like a legal document.
+
+## Advice
+
+ * **Be respectful and considerate**: Disagreement is no excuse for poor behaviour or personal
+     attacks. Remember that a community where people feel uncomfortable is not a productive one.
+
+ * **Be patient and generous**: If someone asks for help it is because they need it. Do politely
+     suggest specific documentation or more appropriate venues where appropriate, but avoid
+     aggressive or vague responses such as "RTFM".
+
+ * **Assume people mean well**: Remember that decisions are often a difficult choice between
+     competing priorities. If you disagree, please do so politely. If something seems outrageous,
+     check that you did not misinterpret it. Ask for clarification, but do not assume the worst.
+
+ * **Try to be concise**: Avoid repeating what has been said already. Making a conversation larger
+     makes it difficult to follow, and people often feel personally attacked if they receive multiple
+     messages telling them the same thing.
+
+
+In the interest of fostering an open and welcoming environment, we as
+contributors and maintainers pledge to making participation in our project and
+our community a harassment-free experience for everyone, regardless of age, body
+size, disability, ethnicity, gender identity and expression, level of experience,
+nationality, personal appearance, race, religion, or sexual identity and
+orientation.
+
+## Communication Guidelines
+
+It is of ultimate importance to maintain a community in which everyone feels free to express
+themselves, review, and comment on each others ideas, both technical and otherwise. Correspondingly,
+an environment in which individuals are silenced, berated, or are otherwise afraid to speak up is
+unlikely to foster fruitful dialog.
+
+Everyone interacting with members of the community should always keep in mind the asymmetry of
+communication: while your interaction with community members (and in particular, maintainers and
+long-term contributors) may be singular and fleeting, these members generally interact with a high
+volume of individuals each day. Before writing a comment, opening a new issue, or engaging as part
+of any forum or IRC discussion, please take a moment to appreciate that fact.
+
+While communicating, it is expected that all involved participants be respectful and civil at all
+times and refrain from personal attacks.
+
+### Communication Rules
+
+The following behavior will not be tolerated on any occasion:
+
+ * **Threats of violence**: You may not threaten violence towards others or use the site to organize,
+   promote, or incite acts of real-world violence or terrorism. Think carefully about the words you
+   use, the images you post, and even the software you write, and how they may be interpreted by
+   others. Even if you mean something as a joke, it might not be received that way. If you think
+   that someone else might interpret the content you post as a threat or as promoting violence or
+   terrorism, stop. Don't post it. In extraordinary cases, we may report threats of violence to law
+   enforcement if we think there may be a genuine risk of physical harm or a threat to public safety.
+
+ * **Hate speech and discrimination**: While it is not forbidden to broach topics such as age, body
+   size, disability, ethnicity, gender identity and expression, level of experience, nationality,
+   personal appearance, race, religion, or sexual identity and orientation, we do not tolerate speech
+   that attacks a person or group of people on the basis of who they are. When approached in an
+   aggressive or insulting manner these (and other) sensitive topics can make others feel unwelcome,
+   or perhaps even unsafe. While there's always the potential for misunderstandings, we expect our
+   community members to remain respectful and civil when discussing sensitive topics.
+
+ * **Bullying and harassment**: We do not tolerate bullying, harassment, or any other means of
+   habitual badgering or intimidation targeted at a specific person or group of people. In general,
+   if your actions are unwanted and you cease to terminate this form of engagement, there is a good
+   chance that your behavior will be classified as bullying or harassment.
+
+ * **Impersonation**: You may not seek to mislead others as to your identity by copying another
+   person's avatar, posting content under their email address, using a similar username, or otherwise
+   posing as someone else. Impersonation and identity theft is a form of harassment.
+
+ * **Doxxing and invasion of privacy**: Don't post other people's personal information, such as phone
+   numbers, private email addresses, physical addresses, credit card numbers, Social Security/National
+   Identity numbers, or passwords. Depending on the context, we may consider such behavior to be an
+   invasion of privacy, with particularly egregious examples potentially escalating to the point of
+   legal action, such as when the released material presents a safety risk to the subject.
+
+ * **Obscene content**: In essence, do not post pornography, gore, or any other depiction of violence.
+
+### General Advice
+
+The following advice will help to increase the efficiency of communication with community members:
+
+ * Do not post "me too" comments. Use the GitLab reactions instead, e.g. “thumbs up” or “thumbs down”.
+ * Avoid adding priority, time, or relevance hints if you are not involved with the development of
+   the application. For example, `“This is an urgent issue”`, or `“This should be fixed now”`, or
+   even `“The majority of users need this feature”`.
+ * Do not use passive-aggressive communication tactics.
+ * When reporting technical problems with the application, such as misbehavior or crashes, focus on
+   sharing as many details as possible and avoid adding non-technical information to it.
+
+   An example of a **good** issue report:
+
+   ```
+   GNOME Settings crashes when opening the Wi-Fi panel with 3+ Wi-Fi adapters
+
+   Steps to reproduce (assuming 3+ Wi-Fi adapters are present):
+
+     1. Open GNOME Settings
+     2. Select the Wi-Fi panel
+     3. Observe the crash
+
+   This does not happen with 2 or less adapters. Here is a backtrace of the
+   crash: backtrace.txt
+   ```
+
+   In contrast, here is an example of a **bad** issue report:
+
+   ```
+   GNOME Settings crashed while I was trying to connect to the internet. How can such
+   a thing happen and nobody notice? Did you not test it before releasing it?
+
+   This should be fixed as quick as possible!
+   ```
+
+ * When asking for new features, try and add as much information as possible to justify its relevance,
+   why should it not be implemented as an auxiliary program, what problems it would solve, and offer
+   suggestions about how you think it should be implemented.
+
+   Example of a **good** feature request:
+
+   ```
+   GNOME Settings needs to expose IPv6 options
+
+   As of now, the connection editor dialog does not allow editing various IPv6
+   options. This is relevant because without some of these options, it is not
+   possible to have a valid IPv6 configuration and, consequently, not have access
+   to various websites and services.
+
+   The list of missing configurations that are essential is:
+
+    * <Feature A>
+    * <Feature B>
+
+   Optionally, the following configurations can also be added:
+
+    * <Feature C>
+    * <Feature D>
+
+   Here is a quick sketch I have made showing how I think these options
+   should be exposed as a user interface: sketch.png.
+   ```
+
+   Example of a **bad** feature request:
+
+   ```
+   Merge GNOME Tweaks in GNOME Settings
+
+   The options in GNOME Tweaks are absolutely essential to the majority of us
+   users. Why was it not merged already? This is an urgent issue and should
+   have been addressed years ago. You should allocate all your resources on
+   merging those two applications.
+   ```
+
+### What happens if someone breaks these rules or guidelines?
+
+Actions that may be taken in response to an abusive comment include but are not limited to:
+
+ * Content removal (when breaking any of the guidelines or rules)
+ * Content blocking (when breaking any of the guidelines or rules)
+ * Formal report to the Code of Conduct Committee (when breaking any of the rules)
+
+## Attribution
+
+This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
+available at [http://contributor-covenant.org/version/1/4][version]
+
+[homepage]: http://contributor-covenant.org
+[version]: http://contributor-covenant.org/version/1/4/
+[maintainers]: https://gitlab.gnome.org/GNOME/gnome-control-center/blob/main/docs/MAINTAINERS.md
diff -pruN 1:43.2-2/docs/CODING_STYLE.md 1:44~alpha-0ubuntu1/docs/CODING_STYLE.md
--- 1:43.2-2/docs/CODING_STYLE.md	1970-01-01 00:00:00.000000000 +0000
+++ 1:44~alpha-0ubuntu1/docs/CODING_STYLE.md	2023-01-09 20:06:57.000000000 +0000
@@ -0,0 +1,291 @@
+# Style
+
+GNOME Settings has a coding style based on GTK Coding Style, but with a few more
+rules. Please read them carefully and, if in doubt, ask a maintainer for directions.
+
+## General
+
+The most important rule is: **see the surrounding code, and copy its style**.
+
+That said, GNOME Settings assumes:
+
+ * 2 spaces of indentation
+ * 120 columns of line width
+ * Newline before `{`
+
+Another rule that applies to function declarations is that all parameters are
+aligned by the last '*'. There are plenty of examples below.
+
+## Comments
+
+Comment blocks should be formatted as following:
+
+```c
+/* Single line comment */
+
+/* Multiline comments start at the first line of the comment block,
+ * but have the closing slash a line after. Every line starts with
+ * an asterisk that is aligned with every the rest of the block.
+ */
+```
+
+## Conditionals
+
+Conditionals should either be all in one line, or one per line. Newlines inside
+conditionals are aligned by the last parenthesis.
+
+
+Some examples below:
+
+```c
+// Single line if
+if (a || b || (c && d))
+  return;
+
+// Multiline if with nested parenthesis
+if (long_boolean_variable_used_in_this_condition_a ||
+    long_boolean_variable_used_in_this_condition_b ||
+    (long_boolean_variable_used_in_this_condition_c &&
+     long_boolean_variable_used_in_this_condition_d))
+  {
+    return;
+  }
+
+// Another single line example with do {} while (...)
+do
+  {
+    /* something */
+  }
+while (a || b || (c && d));
+```
+
+## Structs and Enums
+
+Structures and enums are formatted as following:
+
+```c
+struct _FooBar
+{
+  guint32    field_one;
+  gchar     *text;
+};
+
+typedef struct
+{
+  FooParent     parent;
+
+  guint32       field_one;
+  gchar        *text;
+
+  struct
+  {
+    CustomType *something;
+    guint       something_else;
+  } inner_struct;
+
+  gboolean      flag : 1;
+} FooBar;
+
+enum
+{
+  FIRST,
+  SECOND,
+  LAST,
+};
+
+typedef enum
+{
+  FOO_BAR_FIRST,
+  FOO_BAR_SECOND,
+  FOO_BAR_LAST,
+} FooEnumBar;
+```
+
+## Header (.h) files
+
+It is organized by the following structure:
+
+ 1. GPL header
+ 2. Local includes
+ 3. System includes
+ 4. `G_BEGIN_DECLS`
+ 5. `#defines`
+ 6. `G_DECLARE_{FINAL,DERIVABLE}_TYPE`
+ 7. Public API
+ 8. `G_END_DECLS`
+
+The following style rules apply:
+
+ * The '*' and the type come together, without any spaces in between.
+ * Function names are aligned by the widest return value.
+ * Parenthesis after function name is aligned by the widest function name
+ * The last '*' in parameters are aligned by the widest parameter type
+ * No new line at the end of the file
+
+As an example, this is how a header file should look like (extracted from
+the `cc-object-storage.h` file):
+
+```c
+/* cc-object-storage.h
+ *
+ * Copyright 2018 Georges Basile Stavracas Neto <georges.stavracas@gmail.com>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#pragma once
+
+#include <glib-object.h>
+#include <gio/gio.h>
+
+G_BEGIN_DECLS
+
+/* Default storage keys */
+#define CC_OBJECT_NMCLIENT  "CcObjectStorage::nm-client"
+
+
+#define CC_TYPE_OBJECT_STORAGE (cc_object_storage_get_type())
+
+G_DECLARE_FINAL_TYPE (CcObjectStorage, cc_object_storage, CC, OBJECT_STORAGE, GObject)
+
+gboolean cc_object_storage_has_object             (const gchar         *key);
+
+void     cc_object_storage_add_object             (const gchar         *key,
+                                                   gpointer             object);
+
+gpointer cc_object_storage_get_object             (const gchar         *key);
+
+gpointer cc_object_storage_create_dbus_proxy_sync (GBusType             bus_type,
+                                                   GDBusProxyFlags     flags,
+                                                   const gchar         *name,
+                                                   const gchar         *path,
+                                                   const gchar         *interface,
+                                                   GCancellable        *cancellable,
+                                                   GError             **error);
+
+void     cc_object_storage_create_dbus_proxy      (GBusType              bus_type,
+                                                   GDBusProxyFlags       flags,
+                                                   const gchar          *name,
+                                                   const gchar          *path,
+                                                   const gchar          *interface,
+                                                   GCancellable         *cancellable,
+                                                   GAsyncReadyCallback   callback,
+                                                   gpointer              user_data);
+
+G_END_DECLS
+```
+
+## Source code
+
+The source file keeps an order of methods. The order will be as following:
+
+  1. GPL header
+  2. Structures
+  3. Function prototypes
+  4. G_DEFINE_TYPE()
+  5. Enums
+  6. Static variables
+  7. Auxiliary methods
+  8. Callbacks
+  9. Interface implementations
+  10. Parent class overrides
+  11. class_init and init
+  12. Public API
+
+### Structures
+
+The structures must have the first pointer asterisk aligned one space after the
+widest type name. For example:
+
+```c
+typedef struct
+{
+  GBusType         bus_type;
+  GDBusProxyFlags  flags;
+  gchar           *name;
+  gchar           *path;
+  gchar           *interface;
+  gboolean         cached;
+} TaskData;
+
+```
+
+### Function Prototypes
+
+Function prototypes must be formatted just like in header files.
+
+### Auxiliary Methods
+
+Auxiliary method names must have a verb in the dictionary form, and should always
+perform an action over something. They don't have the `cc_` prefix. For example:
+
+```c
+static void
+execute_something_on_data (Foo *data,
+                           Bar *bar)
+{
+  /* ... */
+}
+```
+
+### Callbacks
+
+ * Callbacks always have the `_cb` suffix
+ * Signal callbacks always have the `on_<object_name>` prefix
+ * Callback names must have the name of the signal in the past
+
+For example:
+
+```c
+static void
+on_foo_size_allocated_cb (GtkWidget     *widget,
+                          GtkAllocation *allocation,
+                          gpointer       user_data)
+{
+  /* ... */
+}
+```
+
+### Line Splitting
+
+Line splitting works following the GTK code style, but legibility comes over above
+all. If a function call looks unbalanced following the GTK style, it is fine to
+slightly escape the rules.
+
+For example, this feels extremelly unbalanced:
+
+```c
+foo_bar_do_somthing_sync (a,
+                          1,
+                          object,
+                          data,
+                          something
+                          cancellable,
+                          &error);
+```
+
+Notice the empty space before the arguments, and how empty and odd it looks. In
+comparison, it will look better if written like this:
+
+```c
+foo_bar_do_somthing_sync (a, 1, object, data,
+                          something
+                          cancellable,
+                          &error);
+```
+
+# Contributing guidelines
+
+See CONTRIBUTIONS.md file for the contribution guidelines, and the Code of Conduct
+that contributors are expected to follow.
\ No newline at end of file
diff -pruN 1:43.2-2/docs/CONTRIBUTING.md 1:44~alpha-0ubuntu1/docs/CONTRIBUTING.md
--- 1:43.2-2/docs/CONTRIBUTING.md	2022-12-23 11:11:35.000000000 +0000
+++ 1:44~alpha-0ubuntu1/docs/CONTRIBUTING.md	2023-01-09 20:06:57.000000000 +0000
@@ -1,212 +1,97 @@
 # Contributing
 
-When contributing to the development of GNOME Settings, please first discuss the change you wish to
-make via issue, email, or any other method with the maintainers before making a change.
+Thank you for considering contributing to Settings!
 
-Please note we have a Code of Conduct, please follow it in all your interactions with the project.
-
-## Pull Request Process
-
-1. Create a fork in GitLab and push your work to there
-2. Open a Merge Request
-  1. Always allow maintainer edits
-  2. Mark the Merge Request as WIP if your work is not ready to be reviewed
-3. Assign the correct maintainer to the Merge Request (see [`MAINTAINERS.md`][maintainers] to select
-   the correct maintainer)
-4. Format commit messages as follows:
-   ```
-   component: <summary>
-   ‌
-   A paragraph explaining the problem and its context.
-   ‌
-   Another one explaining how you solved that.
-   ‌
-   <link to the issue>
-   ```
-4. You may merge the pull request in once you have the sign-off of the maintainers, or if you
-   do not have permission to do that, you may request the second reviewer to merge it for you.
-
-## Code of Conduct
-
-GNOME Settings is a project developed based on GNOME Code of Conduct and GitHub's community
-guidelines. You can read it below:
-
-### Summary
-
-GNOME creates software for a better world. We achieve this by behaving well towards
-each other.
-
-Therefore this document suggests what we consider ideal behaviour, so you know what
-to expect when getting involved in GNOME. This is who we are and what we want to be.
-There is no official enforcement of these principles, and this should not be interpreted
-like a legal document.
-
-### Advice
-
- * **Be respectful and considerate**: Disagreement is no excuse for poor behaviour or personal
-     attacks. Remember that a community where people feel uncomfortable is not a productive one.
-
- * **Be patient and generous**: If someone asks for help it is because they need it. Do politely
-     suggest specific documentation or more appropriate venues where appropriate, but avoid
-     aggressive or vague responses such as "RTFM".
-
- * **Assume people mean well**: Remember that decisions are often a difficult choice between
-     competing priorities. If you disagree, please do so politely. If something seems outrageous,
-     check that you did not misinterpret it. Ask for clarification, but do not assume the worst.
-
- * **Try to be concise**: Avoid repeating what has been said already. Making a conversation larger
-     makes it difficult to follow, and people often feel personally attacked if they receive multiple
-     messages telling them the same thing.
+All code contributions are made using merge requests.
 
+Please note we have a Code of Conduct, please follow it in all your interactions with the project.
 
-In the interest of fostering an open and welcoming environment, we as
-contributors and maintainers pledge to making participation in our project and
-our community a harassment-free experience for everyone, regardless of age, body
-size, disability, ethnicity, gender identity and expression, level of experience,
-nationality, personal appearance, race, religion, or sexual identity and
-orientation.
-
-### Communication Guidelines
-
-It is of ultimate importance to maintain a community in which everyone feels free to express
-themselves, review, and comment on each others ideas, both technical and otherwise. Correspondingly,
-an environment in which individuals are silenced, berated, or are otherwise afraid to speak up is
-unlikely to foster fruitful dialog.
-
-Everyone interacting with members of the community should always keep in mind the asymmetry of
-communication: while your interaction with community members (and in particular, maintainers and
-long-term contributors) may be singular and fleeting, these members generally interact with a high
-volume of individuals each day. Before writing a comment, opening a new issue, or engaging as part
-of any forum or IRC discussion, please take a moment to appreciate that fact.
-
-While communicating, it is expected that all involved participants be respectful and civil at all
-times and refrain from personal attacks.
-
-#### Communication Rules
-
-The following behavior will not be tolerated on any occasion:
-
- * **Threats of violence**: You may not threaten violence towards others or use the site to organize,
-   promote, or incite acts of real-world violence or terrorism. Think carefully about the words you
-   use, the images you post, and even the software you write, and how they may be interpreted by
-   others. Even if you mean something as a joke, it might not be received that way. If you think
-   that someone else might interpret the content you post as a threat or as promoting violence or
-   terrorism, stop. Don't post it. In extraordinary cases, we may report threats of violence to law
-   enforcement if we think there may be a genuine risk of physical harm or a threat to public safety.
-
- * **Hate speech and discrimination**: While it is not forbidden to broach topics such as age, body
-   size, disability, ethnicity, gender identity and expression, level of experience, nationality,
-   personal appearance, race, religion, or sexual identity and orientation, we do not tolerate speech
-   that attacks a person or group of people on the basis of who they are. When approached in an
-   aggressive or insulting manner these (and other) sensitive topics can make others feel unwelcome,
-   or perhaps even unsafe. While there's always the potential for misunderstandings, we expect our
-   community members to remain respectful and civil when discussing sensitive topics.
-
- * **Bullying and harassment**: We do not tolerate bullying, harassment, or any other means of
-   habitual badgering or intimidation targeted at a specific person or group of people. In general,
-   if your actions are unwanted and you cease to terminate this form of engagement, there is a good
-   chance that your behavior will be classified as bullying or harassment.
-
- * **Impersonation**: You may not seek to mislead others as to your identity by copying another
-   person's avatar, posting content under their email address, using a similar username, or otherwise
-   posing as someone else. Impersonation and identity theft is a form of harassment.
-
- * **Doxxing and invasion of privacy**: Don't post other people's personal information, such as phone
-   numbers, private email addresses, physical addresses, credit card numbers, Social Security/National
-   Identity numbers, or passwords. Depending on the context, we may consider such behavior to be an
-   invasion of privacy, with particularly egregious examples potentially escalating to the point of
-   legal action, such as when the released material presents a safety risk to the subject.
-
- * **Obscene content**: In essence, do not post pornography, gore, or any other depiction of violence.
+## Creating Merge Requests
 
-#### General Advice
+To open a merge request fork the Settings project, and then create a branch for your change.
+When the change is ready, submit a merge request.
 
-The following advice will help to increase the efficiency of communication with community members:
+The following guidelines will help your change be successfully merged:
 
- * Do not post "me too" comments. Use the GitLab reactions instead, e.g. “thumbs up” or “thumbs down”.
- * Avoid adding priority, time, or relevance hints if you are not involved with the development of
-   the application. For example, `“This is an urgent issue”`, or `“This should be fixed now”`, or
-   even `“The majority of users need this feature”`.
- * Do not use passive-aggressive communication tactics.
- * When reporting technical problems with the application, such as misbehavior or crashes, focus on
-   sharing as many details as possible and avoid adding non-technical information to it.
+ * Keep the change as small as possible. If you can split it into multiple merge requests please do
+   so.
+ * Use multiple commits. This makes is easier to review and helps to diagnose bugs in the future.
+ * Use clear commit messages (see below).
+ * Attach screenshots of the change.
+ * Link to relevant issues this change is related to.
+ * Always set the merge request to allow maintainer edits - this makes it easier
+   for a maintainer to make small improvements to land the change faster.
 
-   An example of a **good** issue report:
+Please format commit messages as follows:
 
-   ```
-   GNOME Settings crashes when opening the Wi-Fi panel with 3+ Wi-Fi adapters
+```
+component: <summary>
 
-   Steps to reproduce (assuming 3+ Wi-Fi adapters are present):
+A paragraph explaining the problem and its context.
 
-     1. Open GNOME Settings
-     2. Select the Wi-Fi panel
-     3. Observe the crash
+Another one explaining how you solved that.
 
-   This does not happen with 2 or less adapters. Here is a backtrace of the
-   crash: backtrace.txt
-   ```
+<link to issue(s) this change fixes>
+```
 
-   In contrast, here is an example of a **bad** issue report:
+## Bug Fixes
 
-   ```
-   GNOME Settings crashed while I was trying to connect to the internet. How can such
-   a thing happen and nobody notice? Did you not test it before releasing it?
+Changes that fix bugs include:
 
-   This should be fixed as quick as possible!
-   ```
+ * Correcting code that crashes.
+ * Spelling mistakes in labels.
+ * Small layout issues (e.g. spacing).
+ * Use of deprecated APIs.
+ * Restructuring of code for improved safety.
 
- * When asking for new features, try and add as much information as possible to justify its relevance,
-   why should it not be implemented as an auxiliary program, what problems it would solve, and offer
-   suggestions about how you think it should be implemented.
+Please include clear information in the commit message(s) and merge request that indicate what is
+being fixed by the change.
 
-   Example of a **good** feature request:
+These changes will be reviewed for correctness, and then merged once this is complete.
 
-   ```
-   GNOME Settings needs to expose IPv6 options
+## User Experience Changes
 
-   As of now, the connection editor dialog does not allow editing various IPv6
-   options. This is relevant because without some of these options, it is not
-   possible to have a valid IPv6 configuration and, consequently, not have access
-   to various websites and services.
+Changes that impact the user experience of Settings require approval from the
+[Design Team][design-team]. This includes:
 
-   The list of missing configurations that are essential is:
+ * Addition or removal of features in existing panels.
+ * Changes to the layout of panels.
+ * New panels.
 
-    * <Feature A>
-    * <Feature B>
+Please include before/after screenshots in the merge request to show what is being changed.
 
-   Optionally, the following configurations can also be added:
+For one of these changes to be merged one of the following is required:
 
-    * <Feature C>
-    * <Feature D>
+ * The change is shown in an existing mockup done by the design team (linked to in the merge request
+   or issue).
+ * A comment from a design team member in the merge request or issue approving the change.
 
-   Here is a quick sketch I have made showing how I think these options
-   should be exposed as a user interface: sketch.png.
-   ```
+If a merge request is opened without the above the "Needs Design" label attached to it and will not
+be merged until design approval is received.
 
-   Example of a **bad** feature request:
+Once design approval is obtained, the change will be reviewed for correctness, and then merged once
+this is complete.
+If design approval is not obtained, the merge request will be closed.
 
-   ```
-   Merge GNOME Tweaks in GNOME Settings
+[design-team]: https://gitlab.gnome.org/Teams/Design
 
-   The options in GNOME Tweaks are absolutely essential to the majority of us
-   users. Why was it not merged already? This is an urgent issue and should
-   have been addressed years ago. You should allocate all your resources on
-   merging those two applications.
-   ```
+## Reviews
 
-#### What happens if someone breaks these rules or guidelines?
+All changes require approval from one or more Settings maintainers.
+Reviews are likely to ask for changes to be made, please respond to these as soon as you are able
+and ask for clarification if the requests are not clear.
 
-Actions that may be taken in response to an abusive comment include but are not limited to:
+When the change is ready to land a maintainer will mark it as approved.
+Then the change can be merged by either a maintainer or the submitter if they have suitable
+permissions.
 
- * Content removal (when breaking any of the guidelines or rules)
- * Content blocking (when breaking any of the guidelines or rules)
- * Formal report to the Code of Conduct Committee (when breaking any of the rules)
+## Draft Merge Requests
 
-### Attribution
+Merge requests marked as draft will not be reviewed by Settings maintainers or merged.
+When the change is ready for review please mark the merge request as ready.
 
-This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
-available at [http://contributor-covenant.org/version/1/4][version]
+## Inactive Merge Requests
 
-[homepage]: http://contributor-covenant.org
-[version]: http://contributor-covenant.org/version/1/4/
-[maintainers]: https://gitlab.gnome.org/GNOME/gnome-control-center/blob/main/docs/MAINTAINERS.md
+If a merge request has comments from maintainers that have not been responded to within 4 weeks this
+merge request is considered to be inactive and will be closed. The reporter may re-open it at a
+later date if they respond to the comments.
diff -pruN 1:43.2-2/docs/HACKING.md 1:44~alpha-0ubuntu1/docs/HACKING.md
--- 1:43.2-2/docs/HACKING.md	2022-12-23 11:11:35.000000000 +0000
+++ 1:44~alpha-0ubuntu1/docs/HACKING.md	1970-01-01 00:00:00.000000000 +0000
@@ -1,291 +0,0 @@
-# Style
-
-GNOME Settings has a coding style based on GTK Coding Style, but with a few more
-rules. Please read them carefully and, if in doubt, ask a maintainer for directions.
-
-## General
-
-The most important rule is: **see the surrounding code, and copy its style**.
-
-That said, GNOME Settings assumes:
-
- * 2 spaces of indentation
- * 120 columns of line width
- * Newline before `{`
-
-Another rule that applies to function declarations is that all parameters are
-aligned by the last '*'. There are plenty of examples below.
-
-## Comments
-
-Comment blocks should be formatted as following:
-
-```c
-/* Single line comment */
-
-/* Multiline comments start at the first line of the comment block,
- * but have the closing slash a line after. Every line starts with
- * an asterisk that is aligned with every the rest of the block.
- */
-```
-
-## Conditionals
-
-Conditionals should either be all in one line, or one per line. Newlines inside
-conditionals are aligned by the last parenthesis.
-
-
-Some examples below:
-
-```c
-// Single line if
-if (a || b || (c && d))
-  return;
-
-// Multiline if with nested parenthesis
-if (long_boolean_variable_used_in_this_condition_a ||
-    long_boolean_variable_used_in_this_condition_b ||
-    (long_boolean_variable_used_in_this_condition_c &&
-     long_boolean_variable_used_in_this_condition_d))
-  {
-    return;
-  }
-
-// Another single line example with do {} while (...)
-do
-  {
-    /* something */
-  }
-while (a || b || (c && d));
-```
-
-## Structs and Enums
-
-Structures and enums are formatted as following:
-
-```c
-struct _FooBar
-{
-  guint32    field_one;
-  gchar     *text;
-};
-
-typedef struct
-{
-  FooParent     parent;
-
-  guint32       field_one;
-  gchar        *text;
-
-  struct
-  {
-    CustomType *something;
-    guint       something_else;
-  } inner_struct;
-
-  gboolean      flag : 1;
-} FooBar;
-
-enum
-{
-  FIRST,
-  SECOND,
-  LAST,
-};
-
-typedef enum
-{
-  FOO_BAR_FIRST,
-  FOO_BAR_SECOND,
-  FOO_BAR_LAST,
-} FooEnumBar;
-```
-
-## Header (.h) files
-
-It is organized by the following structure:
-
- 1. GPL header
- 2. Local includes
- 3. System includes
- 4. `G_BEGIN_DECLS`
- 5. `#defines`
- 6. `G_DECLARE_{FINAL,DERIVABLE}_TYPE`
- 7. Public API
- 8. `G_END_DECLS`
-
-The following style rules apply:
-
- * The '*' and the type come together, without any spaces in between.
- * Function names are aligned by the widest return value.
- * Parenthesis after function name is aligned by the widest function name
- * The last '*' in parameters are aligned by the widest parameter type
- * No new line at the end of the file
-
-As an example, this is how a header file should look like (extracted from
-the `cc-object-storage.h` file):
-
-```c
-/* cc-object-storage.h
- *
- * Copyright 2018 Georges Basile Stavracas Neto <georges.stavracas@gmail.com>
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-#pragma once
-
-#include <glib-object.h>
-#include <gio/gio.h>
-
-G_BEGIN_DECLS
-
-/* Default storage keys */
-#define CC_OBJECT_NMCLIENT  "CcObjectStorage::nm-client"
-
-
-#define CC_TYPE_OBJECT_STORAGE (cc_object_storage_get_type())
-
-G_DECLARE_FINAL_TYPE (CcObjectStorage, cc_object_storage, CC, OBJECT_STORAGE, GObject)
-
-gboolean cc_object_storage_has_object             (const gchar         *key);
-
-void     cc_object_storage_add_object             (const gchar         *key,
-                                                   gpointer             object);
-
-gpointer cc_object_storage_get_object             (const gchar         *key);
-
-gpointer cc_object_storage_create_dbus_proxy_sync (GBusType             bus_type,
-                                                   GDBusProxyFlags     flags,
-                                                   const gchar         *name,
-                                                   const gchar         *path,
-                                                   const gchar         *interface,
-                                                   GCancellable        *cancellable,
-                                                   GError             **error);
-
-void     cc_object_storage_create_dbus_proxy      (GBusType              bus_type,
-                                                   GDBusProxyFlags       flags,
-                                                   const gchar          *name,
-                                                   const gchar          *path,
-                                                   const gchar          *interface,
-                                                   GCancellable         *cancellable,
-                                                   GAsyncReadyCallback   callback,
-                                                   gpointer              user_data);
-
-G_END_DECLS
-```
-
-## Source code
-
-The source file keeps an order of methods. The order will be as following:
-
-  1. GPL header
-  2. Structures
-  3. Function prototypes
-  4. G_DEFINE_TYPE()
-  5. Enums
-  6. Static variables
-  7. Auxiliary methods
-  8. Callbacks
-  9. Interface implementations
-  10. Parent class overrides
-  11. class_init and init
-  12. Public API
-
-### Structures
-
-The structures must have the first pointer asterisk aligned one space after the
-widest type name. For example:
-
-```c
-typedef struct
-{
-  GBusType         bus_type;
-  GDBusProxyFlags  flags;
-  gchar           *name;
-  gchar           *path;
-  gchar           *interface;
-  gboolean         cached;
-} TaskData;
-
-```
-
-### Function Prototypes
-
-Function prototypes must be formatted just like in header files.
-
-### Auxiliary Methods
-
-Auxiliary method names must have a verb in the dictionary form, and should always
-perform an action over something. They don't have the `cc_` prefix. For example:
-
-```c
-static void
-execute_something_on_data (Foo *data,
-                           Bar *bar)
-{
-  /* ... */
-}
-```
-
-### Callbacks
-
- * Callbacks always have the `_cb` suffix
- * Signal callbacks always have the `on_<object_name>` prefix
- * Callback names must have the name of the signal in the past
-
-For example:
-
-```c
-static void
-on_foo_size_allocated_cb (GtkWidget     *widget,
-                          GtkAllocation *allocation,
-                          gpointer       user_data)
-{
-  /* ... */
-}
-```
-
-### Line Splitting
-
-Line splitting works following the GTK code style, but legibility comes over above
-all. If a function call looks unbalanced following the GTK style, it is fine to
-slightly escape the rules.
-
-For example, this feels extremelly unbalanced:
-
-```c
-foo_bar_do_somthing_sync (a,
-                          1,
-                          object,
-                          data,
-                          something
-                          cancellable,
-                          &error);
-```
-
-Notice the empty space before the arguments, and how empty and odd it looks. In
-comparison, it will look better if written like this:
-
-```c
-foo_bar_do_somthing_sync (a, 1, object, data,
-                          something
-                          cancellable,
-                          &error);
-```
-
-# Contributing guidelines
-
-See CONTRIBUTIONS.md file for the contribution guidelines, and the Code of Conduct
-that contributors are expected to follow.
\ No newline at end of file
diff -pruN 1:43.2-2/.gitlab/issue_templates/Bug.md 1:44~alpha-0ubuntu1/.gitlab/issue_templates/Bug.md
--- 1:43.2-2/.gitlab/issue_templates/Bug.md	2022-12-23 11:11:35.000000000 +0000
+++ 1:44~alpha-0ubuntu1/.gitlab/issue_templates/Bug.md	2023-01-09 20:06:57.000000000 +0000
@@ -4,7 +4,7 @@ Not following the communication guidelin
 will be removed. Read it carefully before submitting this issue.
 
 
-[1] https://gitlab.gnome.org/GNOME/gnome-control-center/blob/main/docs/CONTRIBUTING.md#communication-guidelines
+[1] https://gitlab.gnome.org/GNOME/gnome-control-center/blob/main/docs/CODE_OF_CONDUCT.md#communication-guidelines
 
  -->
 
diff -pruN 1:43.2-2/.gitlab/issue_templates/Feature.md 1:44~alpha-0ubuntu1/.gitlab/issue_templates/Feature.md
--- 1:43.2-2/.gitlab/issue_templates/Feature.md	2022-12-23 11:11:35.000000000 +0000
+++ 1:44~alpha-0ubuntu1/.gitlab/issue_templates/Feature.md	2023-01-09 20:06:57.000000000 +0000
@@ -4,7 +4,7 @@ Not following the communication guidelin
 will be removed. Read it carefully before submitting this issue.
 
 
-[1] https://gitlab.gnome.org/GNOME/gnome-control-center/blob/main/docs/CONTRIBUTING.md#communication-guidelines
+[1] https://gitlab.gnome.org/GNOME/gnome-control-center/blob/main/docs/CODE_OF_CONDUCT.md#communication-guidelines
 
  -->
 
diff -pruN 1:43.2-2/.gitlab-ci.yml 1:44~alpha-0ubuntu1/.gitlab-ci.yml
--- 1:43.2-2/.gitlab-ci.yml	2022-12-23 11:11:35.000000000 +0000
+++ 1:44~alpha-0ubuntu1/.gitlab-ci.yml	2023-01-09 20:06:57.000000000 +0000
@@ -106,7 +106,7 @@ build.container.fedora@x86_64:
       libnotify-devel
       libpwquality-devel
       libsmbclient-devel
-      libsoup-devel
+      libsoup3-devel
       libudisks2-devel
       libwacom-devel
       libX11-devel
@@ -122,13 +122,14 @@ build.container.fedora@x86_64:
       xorg-x11-server-Xvfb
       mesa-dri-drivers
       libsecret-devel
-      geocode-glib-devel
+      geocode-glib2-devel
       libgweather-devel
       lcms2-devel
       geoclue2-devel
       libnotify-devel
       alsa-lib-devel
       nss-devel
+      gcr3-devel
       gcr-devel
       setxkbmap
     FDO_DISTRIBUTION_EXEC: |-
diff -pruN 1:43.2-2/gnome-control-center.doap 1:44~alpha-0ubuntu1/gnome-control-center.doap
--- 1:43.2-2/gnome-control-center.doap	2022-12-23 11:11:35.000000000 +0000
+++ 1:44~alpha-0ubuntu1/gnome-control-center.doap	2023-01-09 20:06:57.000000000 +0000
@@ -49,7 +49,7 @@
     </foaf:Person>
   </maintainer>
 
-  <!-- Mouse & Touchpad, Printers -->
+  <!-- About, Camera, File History & Trash, Location, Microphone, Mouse & Touchpad, Printers, Search, Thunderbolt, User Accounts -->
   <maintainer>
     <foaf:Person>
       <foaf:name>Felipe Borges</foaf:name>
diff -pruN 1:43.2-2/meson.build 1:44~alpha-0ubuntu1/meson.build
--- 1:43.2-2/meson.build	2022-12-23 11:11:35.000000000 +0000
+++ 1:44~alpha-0ubuntu1/meson.build	2023-01-09 20:06:57.000000000 +0000
@@ -1,6 +1,6 @@
 project(
   'gnome-control-center', 'c',
-        version : '43.2',
+        version : '44.alpha',
         license : 'GPL2+',
   meson_version : '>= 0.57.0'
 )
@@ -25,9 +25,6 @@ host_is_linux_not_s390 = host_is_linux a
 
 cc = meson.get_compiler('c')
 
-# Tracing
-enable_tracing = get_option('tracing')
-
 config_h = configuration_data()
 
 py = import('python')
@@ -35,6 +32,13 @@ python = py.find_installation('python3')
 
 config_h.set_quoted('TEST_NM_PYTHON', python.path())
 
+if get_option('profile') == 'development'
+    profile = 'Devel'
+else
+    profile = ''
+endif
+application_id = 'org.gnome.Settings@0@'.format(profile)
+
 # defines
 set_defines = [
   # package
@@ -151,7 +155,7 @@ common_deps = [
   libadwaita_dep,
   dependency('gio-unix-2.0'),
   dependency('gthread-2.0'),
-  dependency('gtk4', version: '>= 4.4'),
+  dependency('gtk4', version: '>= 4.8'),
 ]
 
 polkit_gobject_dep = dependency('polkit-gobject-1', version: '>= 0.103')
@@ -222,10 +226,11 @@ config_h.set('HAVE_MALCONTENT', enable_m
 
 if host_is_linux
   # network manager
+  mm_dep =  dependency('mm-glib', version: '>= 0.7')
   network_manager_deps = [
     dependency('libnm', version: '>= 1.24.0'),
-    dependency('libnma-gtk4', version: '>= 1.8.0'),
-    dependency('mm-glib', version: '>= 0.7')
+    dependency('libnma-gtk4', version: '>= 1.10.2'),
+    mm_dep,
   ]
 endif
 config_h.set('BUILD_NETWORK', host_is_linux,
@@ -267,9 +272,6 @@ gnome = import('gnome')
 i18n = import('i18n')
 pkg = import('pkgconfig')
 
-desktop_conf = configuration_data()
-desktop_conf.set('VERSION', meson.project_version())
-
 po_dir = join_paths(meson.source_root(), 'po')
 its_dir = join_paths(meson.source_root(), 'gettext')
 
@@ -308,7 +310,6 @@ configure_file(
 summary({
   'Documentation': get_option('documentation'),
   'Tests': get_option('tests'),
-  'Tracing': enable_tracing,
   'Optimized': control_center_optimized,
 })
 
diff -pruN 1:43.2-2/meson_options.txt 1:44~alpha-0ubuntu1/meson_options.txt
--- 1:43.2-2/meson_options.txt	2022-12-23 11:11:35.000000000 +0000
+++ 1:44~alpha-0ubuntu1/meson_options.txt	2023-01-09 20:06:57.000000000 +0000
@@ -3,7 +3,6 @@ option('ibus', type: 'boolean', value: t
 option('privileged_group', type: 'string', value: 'wheel', description: 'name of group that has elevated permissions')
 option('snap', type: 'boolean', value: false, description: 'build with Snap support')
 option('tests', type: 'boolean', value: true, description: 'build tests')
-option('tracing', type: 'boolean', value: false, description: 'add extra debugging information')
 option('wayland', type: 'boolean', value: true, description: 'build with Wayland support')
 option('profile', type: 'combo', choices: ['default','development'], value: 'default')
 option('malcontent', type: 'boolean', value: false, description: 'build with malcontent support')
diff -pruN 1:43.2-2/NEWS 1:44~alpha-0ubuntu1/NEWS
--- 1:43.2-2/NEWS	2022-12-23 11:11:35.000000000 +0000
+++ 1:44~alpha-0ubuntu1/NEWS	2023-01-09 20:06:57.000000000 +0000
@@ -1,39 +1,35 @@
 ================
-Version 43.2
+Version 44.alpha
 ================
 
+- Redesigned Accessibility panel
+- Many consistency improvements
 - Updated translations
 
 About
-- Update distro logo when dark-mode changes
+- Add "Firmware Version" row
 
-Applications
-- Don't recurse into symlinks when clearing cache
+Accessibility
+- Redesign the panel with new a navigation pattern
 
 Cellular
-- Avoid duplicated entries in SIM providers list
+- Various fixes
 
-Color
-- Fix crash when first device row is non-existent
+Date & Time
+- Improve month selector
 
-Common
-- Make list row switches work when annimations are OFF
+Device Security
+- Improve date and time formatting
+- Simplify technical descriptions
 
 Display
-- Allow the Night Light error label to wrap for small screens
+- Improve error state of Night Light
 
-Mouse
-- Fix activation of rows while navigating with keyboard
+Sound
+- Start implementing the new designs
 
-Network
-- Fix crashes when EAP password is missing
-- Fix wrong signal of SEA password visibility toggle
-
-Notifications
-- Sync lock screen notification setting string
-
-Users
-- Show a missing-avatar image when avatars cannot be loaded
+Thunderbolt
+- Hide panel if no Thunderbolt device is found
 
 ================
 Version 43.1
diff -pruN 1:43.2-2/panels/applications/cc-applications-panel.c 1:44~alpha-0ubuntu1/panels/applications/cc-applications-panel.c
--- 1:43.2-2/panels/applications/cc-applications-panel.c	2022-12-23 11:11:35.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/applications/cc-applications-panel.c	2023-01-09 20:06:57.000000000 +0000
@@ -847,7 +847,7 @@ add_static_permissions (CcApplicationsPa
   if (str && g_str_equal (str, "talk"))
     added += add_static_permission_row (self, _("Settings"), _("Can change settings"));
 
-  text = g_strdup_printf (_("%s has the following permissions built-in. These cannot be altered. If you are concerned about these permissions, consider removing this application."), g_app_info_get_display_name (info));
+  text = g_strdup_printf (_("%s requires access to the following system resources. To stop this access, the application must be removed."), g_app_info_get_display_name (info));
   adw_preferences_group_set_description (self->builtin_group, text);
 
   return added > 0;
@@ -901,7 +901,7 @@ update_integration_section (CcApplicatio
     }
   else
     {
-      gtk_widget_hide (GTK_WIDGET (self->shortcuts));
+      gtk_widget_set_visible (GTK_WIDGET (self->shortcuts), FALSE);
     }
 
 #ifdef HAVE_SNAP
@@ -970,17 +970,17 @@ update_integration_section (CcApplicatio
       gtk_widget_set_visible (GTK_WIDGET (self->notification), set);
       has_any |= set;
 
-      gtk_widget_hide (GTK_WIDGET (self->background));
-      gtk_widget_hide (GTK_WIDGET (self->wallpaper));
-      gtk_widget_hide (GTK_WIDGET (self->screenshot));
-      gtk_widget_hide (GTK_WIDGET (self->sound));
-      gtk_widget_hide (GTK_WIDGET (self->no_sound));
-      gtk_widget_hide (GTK_WIDGET (self->camera));
-      gtk_widget_hide (GTK_WIDGET (self->no_camera));
-      gtk_widget_hide (GTK_WIDGET (self->microphone));
-      gtk_widget_hide (GTK_WIDGET (self->no_microphone));
-      gtk_widget_hide (GTK_WIDGET (self->location));
-      gtk_widget_hide (GTK_WIDGET (self->no_location));
+      gtk_widget_set_visible (GTK_WIDGET (self->background), FALSE);
+      gtk_widget_set_visible (GTK_WIDGET (self->wallpaper), FALSE);
+      gtk_widget_set_visible (GTK_WIDGET (self->screenshot), FALSE);
+      gtk_widget_set_visible (GTK_WIDGET (self->sound), FALSE);
+      gtk_widget_set_visible (GTK_WIDGET (self->no_sound), FALSE);
+      gtk_widget_set_visible (GTK_WIDGET (self->camera), FALSE);
+      gtk_widget_set_visible (GTK_WIDGET (self->no_camera), FALSE);
+      gtk_widget_set_visible (GTK_WIDGET (self->microphone), FALSE);
+      gtk_widget_set_visible (GTK_WIDGET (self->no_microphone), FALSE);
+      gtk_widget_set_visible (GTK_WIDGET (self->location), FALSE);
+      gtk_widget_set_visible (GTK_WIDGET (self->no_location), FALSE);
     }
 
   gtk_widget_set_visible (GTK_WIDGET (self->integration_section), has_any);
@@ -1029,7 +1029,7 @@ add_scheme (CcApplicationsPanel *self,
   g_object_set_data_full (G_OBJECT (button), "type", g_strdup (type), g_free);
   g_signal_connect_object (button, "clicked", G_CALLBACK (unset_cb), self, G_CONNECT_SWAPPED);
 
-  gtk_widget_show (GTK_WIDGET (self->handler_link_group));
+  gtk_widget_set_visible (GTK_WIDGET (self->handler_link_group), TRUE);
   adw_preferences_group_add (self->handler_link_group, GTK_WIDGET (row));
 
   self->link_handler_rows = g_list_prepend (self->link_handler_rows, row);
@@ -1061,7 +1061,7 @@ add_file_type (CcApplicationsPanel *self
   g_object_set_data_full (G_OBJECT (button), "type", g_strdup (type), g_free);
   g_signal_connect_object (button, "clicked", G_CALLBACK (unset_cb), self, G_CONNECT_SWAPPED);
 
-  gtk_widget_show (GTK_WIDGET (self->handler_file_group));
+  gtk_widget_set_visible (GTK_WIDGET (self->handler_file_group), TRUE);
   adw_preferences_group_add (self->handler_file_group, GTK_WIDGET (row));
 
   self->file_handler_rows = g_list_prepend (self->file_handler_rows, row);
@@ -1071,7 +1071,7 @@ static void
 add_handler_row (CcApplicationsPanel *self,
                  const gchar         *type)
 {
-  gtk_widget_show (GTK_WIDGET (self->handler_row));
+  gtk_widget_set_visible (GTK_WIDGET (self->handler_row), TRUE);
 
   if (g_content_type_is_a (type, "x-scheme-handler/*"))
     add_scheme (self, type);
@@ -1154,9 +1154,9 @@ update_handler_dialog (CcApplicationsPan
 
   remove_all_handler_rows (self);
 
-  gtk_widget_hide (GTK_WIDGET (self->handler_row));
-  gtk_widget_hide (GTK_WIDGET (self->handler_file_group));
-  gtk_widget_hide (GTK_WIDGET (self->handler_link_group));
+  gtk_widget_set_visible (GTK_WIDGET (self->handler_row), FALSE);
+  gtk_widget_set_visible (GTK_WIDGET (self->handler_file_group), FALSE);
+  gtk_widget_set_visible (GTK_WIDGET (self->handler_link_group), FALSE);
 
   types = g_app_info_get_supported_types (info);
   if (types == NULL || types[0] == NULL)
@@ -1414,7 +1414,7 @@ update_panel (CcApplicationsPanel *self,
     {
       adw_window_title_set_title (self->header_title, _("Applications"));
       gtk_stack_set_visible_child (self->stack, self->empty_box);
-      gtk_widget_hide (GTK_WIDGET (GTK_WIDGET (self->view_details_button)));
+      gtk_widget_set_visible (GTK_WIDGET (self->view_details_button), FALSE);
       return;
     }
 
diff -pruN 1:43.2-2/panels/applications/cc-applications-panel.ui 1:44~alpha-0ubuntu1/panels/applications/cc-applications-panel.ui
--- 1:43.2-2/panels/applications/cc-applications-panel.ui	2022-12-23 11:11:35.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/applications/cc-applications-panel.ui	2023-01-09 20:06:57.000000000 +0000
@@ -91,7 +91,7 @@
                         </child>
                         <child>
                           <object class="GtkButton" id="view_details_button">
-                            <property name="label" translatable="yes">View Details</property>
+                            <property name="label" translatable="yes">App Details</property>
                             <style>
                               <class name="pill" />
                             </style>
@@ -110,35 +110,35 @@
                 <child>
                   <object class="CcToggleRow" id="search">
                     <property name="title" translatable="yes">Search</property>
-                    <property name="subtitle" translatable="yes">Receive system searches and send results.</property>
+                    <property name="subtitle" translatable="yes">Receive system searches and send results</property>
                     <signal name="notify::allowed" handler="search_cb" object="CcApplicationsPanel" swapped="yes"/>
                   </object>
                 </child>
                 <child>
                   <object class="CcInfoRow" id="no_search">
                     <property name="title" translatable="yes">Search</property>
-                    <property name="subtitle" translatable="yes">Receive system searches and send results.</property>
+                    <property name="subtitle" translatable="yes">Receive system searches and send results</property>
                     <property name="info" translatable="yes">Disabled</property>
                   </object>
                 </child>
                 <child>
                   <object class="CcToggleRow" id="notification">
                     <property name="title" translatable="yes">Notifications</property>
-                    <property name="subtitle" translatable="yes">Show system notifications.</property>
+                    <property name="subtitle" translatable="yes">Show system notifications</property>
                     <signal name="notify::allowed" handler="notification_cb" object="CcApplicationsPanel" swapped="yes"/>
                   </object>
                 </child>
                 <child>
                   <object class="CcToggleRow" id="background">
                     <property name="title" translatable="yes">Run in Background</property>
-                    <property name="subtitle" translatable="yes">Allow activity when the app is closed.</property>
+                    <property name="subtitle" translatable="yes">Allow activity when the app is closed</property>
                     <signal name="notify::allowed" handler="background_cb" swapped="yes"/>
                   </object>
                 </child>
                 <child>
                   <object class="CcToggleRow" id="screenshot">
                     <property name="title" translatable="yes">Screenshots</property>
-                    <property name="subtitle" translatable="yes">Take pictures of the screen at any time.</property>
+                    <property name="subtitle" translatable="yes">Take pictures of the screen at any time</property>
                     <signal name="notify::allowed" handler="screenshot_cb" object="CcApplicationsPanel" swapped="yes"/>
                   </object>
                 </child>
@@ -159,56 +159,56 @@
                 <child>
                   <object class="CcInfoRow" id="no_sound">
                     <property name="title" translatable="yes">Sounds</property>
-                    <property name="subtitle" translatable="yes">Reproduce sounds.</property>
+                    <property name="subtitle" translatable="yes">Reproduce sounds</property>
                     <property name="info" translatable="yes">Disabled</property>
                   </object>
                 </child>
                 <child>
                   <object class="CcToggleRow" id="shortcuts">
                     <property name="title" translatable="yes">Inhibit Shortcuts</property>
-                    <property name="subtitle" translatable="yes">Block standard keyboard shortcuts.</property>
+                    <property name="subtitle" translatable="yes">Block standard keyboard shortcuts</property>
                     <signal name="notify::allowed" handler="shortcuts_cb" swapped="yes"/>
                   </object>
                 </child>
                 <child>
                   <object class="CcToggleRow" id="camera">
                     <property name="title" translatable="yes">Camera</property>
-                    <property name="subtitle" translatable="yes">Take pictures with the camera.</property>
+                    <property name="subtitle" translatable="yes">Take pictures with the camera</property>
                     <signal name="notify::allowed" handler="camera_cb" object="CcApplicationsPanel" swapped="yes"/>
                   </object>
                 </child>
                 <child>
                   <object class="CcInfoRow" id="no_camera">
                     <property name="title" translatable="yes">Camera</property>
-                    <property name="subtitle" translatable="yes">Take pictures with the camera.</property>
+                    <property name="subtitle" translatable="yes">Take pictures with the camera</property>
                     <property name="info" translatable="yes">Disabled</property>
                   </object>
                 </child>
                 <child>
                   <object class="CcToggleRow" id="microphone">
                     <property name="title" translatable="yes">Microphone</property>
-                    <property name="subtitle" translatable="yes">Record audio with the microphone.</property>
+                    <property name="subtitle" translatable="yes">Record audio with the microphone</property>
                     <signal name="notify::allowed" handler="microphone_cb" object="CcApplicationsPanel" swapped="yes"/>
                   </object>
                 </child>
                 <child>
                   <object class="CcInfoRow" id="no_microphone">
                     <property name="title" translatable="yes">Microphone</property>
-                    <property name="subtitle" translatable="yes">Record audio with the microphone.</property>
+                    <property name="subtitle" translatable="yes">Record audio with the microphone</property>
                     <property name="info" translatable="yes">Disabled</property>
                   </object>
                 </child>
                 <child>
                   <object class="CcToggleRow" id="location">
                     <property name="title" translatable="yes">Location Services</property>
-                    <property name="subtitle" translatable="yes">Access device location data.</property>
+                    <property name="subtitle" translatable="yes">Access device location data</property>
                     <signal name="notify::allowed" handler="location_cb" object="CcApplicationsPanel" swapped="yes"/>
                   </object>
                 </child>
                 <child>
                   <object class="CcInfoRow" id="no_location">
                     <property name="title" translatable="yes">Location Services</property>
-                    <property name="subtitle" translatable="yes">Access device location data.</property>
+                    <property name="subtitle" translatable="yes">Access device location data</property>
                     <property name="info" translatable="yes">Disabled</property>
                   </object>
                 </child>
@@ -219,7 +219,7 @@
               <object class="AdwPreferencesGroup" id="usage_section">
                 <child>
                   <object class="CcInfoRow" id="builtin">
-                    <property name="title" translatable="yes">Built-in Permissions</property>
+                    <property name="title" translatable="yes">Required Access</property>
                     <property name="subtitle" translatable="yes">System access that is required by the app</property>
                     <property name="has-expander">True</property>
                     <property name="is-link">True</property>
@@ -323,7 +323,7 @@
 
   <!-- Built-in Permissions dialog -->
   <object class="GtkDialog" id="builtin_dialog">
-    <property name="title" translatable="yes">Built-in Permissions</property>
+    <property name="title" translatable="yes">Required Access</property>
     <property name="modal">1</property>
     <property name="use-header-bar">1</property>
     <property name="resizable">True</property>
diff -pruN 1:43.2-2/panels/applications/gnome-applications-panel.desktop.in 1:44~alpha-0ubuntu1/panels/applications/gnome-applications-panel.desktop.in
--- 1:43.2-2/panels/applications/gnome-applications-panel.desktop.in	1970-01-01 00:00:00.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/applications/gnome-applications-panel.desktop.in	2023-01-09 20:06:57.000000000 +0000
@@ -0,0 +1,16 @@
+[Desktop Entry]
+Name=Applications
+Comment=Control various application permissions and settings
+Exec=gnome-control-center applications
+# FIXME
+# Translators: Do NOT translate or transliterate this text (this is an icon file name)!
+Icon=org.gnome.Settings-applications-symbolic
+Terminal=false
+Type=Application
+NoDisplay=true
+StartupNotify=true
+Categories=GNOME;GTK;Settings;DesktopSettings;X-GNOME-Settings-Panel;X-GNOME-AccountSettings;
+OnlyShowIn=GNOME;Unity;
+# Translators: Search terms to find the Applications panel. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon!
+Keywords=application;flatpak;permission;setting;
+X-GNOME-ControlCenter-HasSidebar=true
diff -pruN 1:43.2-2/panels/applications/gnome-applications-panel.desktop.in.in 1:44~alpha-0ubuntu1/panels/applications/gnome-applications-panel.desktop.in.in
--- 1:43.2-2/panels/applications/gnome-applications-panel.desktop.in.in	2022-12-23 11:11:35.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/applications/gnome-applications-panel.desktop.in.in	1970-01-01 00:00:00.000000000 +0000
@@ -1,16 +0,0 @@
-[Desktop Entry]
-Name=Applications
-Comment=Control various application permissions and settings
-Exec=gnome-control-center applications
-# FIXME
-# Translators: Do NOT translate or transliterate this text (this is an icon file name)!
-Icon=org.gnome.Settings-applications-symbolic
-Terminal=false
-Type=Application
-NoDisplay=true
-StartupNotify=true
-Categories=GNOME;GTK;Settings;DesktopSettings;X-GNOME-Settings-Panel;X-GNOME-AccountSettings;
-OnlyShowIn=GNOME;Unity;
-# Translators: Search terms to find the Applications panel. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon!
-Keywords=application;flatpak;permission;setting;
-X-GNOME-ControlCenter-HasSidebar=true
diff -pruN 1:43.2-2/panels/applications/meson.build 1:44~alpha-0ubuntu1/panels/applications/meson.build
--- 1:43.2-2/panels/applications/meson.build	2022-12-23 11:11:35.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/applications/meson.build	2023-01-09 20:06:57.000000000 +0000
@@ -1,15 +1,9 @@
 panels_list += cappletname
 desktop = 'gnome-@0@-panel.desktop'.format(cappletname)
 
-desktop_in = configure_file(
-          input : desktop + '.in.in',
-         output : desktop + '.in',
-  configuration : desktop_conf
-)
-
 i18n.merge_file(
          type : 'desktop',
-        input : desktop_in,
+        input : desktop + '.in',
        output : desktop,
        po_dir : po_dir,
       install : true,
diff -pruN 1:43.2-2/panels/background/gnome-background-panel.desktop.in 1:44~alpha-0ubuntu1/panels/background/gnome-background-panel.desktop.in
--- 1:43.2-2/panels/background/gnome-background-panel.desktop.in	1970-01-01 00:00:00.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/background/gnome-background-panel.desktop.in	2023-01-09 20:06:57.000000000 +0000
@@ -0,0 +1,14 @@
+[Desktop Entry]
+Name=Appearance
+Comment=Change your background image or the UI colors
+Exec=gnome-control-center background
+# Translators: Do NOT translate or transliterate this text (this is an icon file name)!
+Icon=org.gnome.Settings-appearance-symbolic
+Terminal=false
+Type=Application
+NoDisplay=true
+StartupNotify=true
+Categories=GNOME;GTK;Settings;DesktopSettings;X-GNOME-Settings-Panel;X-GNOME-PersonalizationSettings;
+OnlyShowIn=GNOME;
+# Translators: Search terms to find the Appearance panel. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon!
+Keywords=Background;Wallpaper;Screen;Desktop;Style;Light;Dark;Appearance;
diff -pruN 1:43.2-2/panels/background/gnome-background-panel.desktop.in.in 1:44~alpha-0ubuntu1/panels/background/gnome-background-panel.desktop.in.in
--- 1:43.2-2/panels/background/gnome-background-panel.desktop.in.in	2022-12-23 11:11:35.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/background/gnome-background-panel.desktop.in.in	1970-01-01 00:00:00.000000000 +0000
@@ -1,14 +0,0 @@
-[Desktop Entry]
-Name=Appearance
-Comment=Change your background image or the UI colors
-Exec=gnome-control-center background
-# Translators: Do NOT translate or transliterate this text (this is an icon file name)!
-Icon=org.gnome.Settings-appearance-symbolic
-Terminal=false
-Type=Application
-NoDisplay=true
-StartupNotify=true
-Categories=GNOME;GTK;Settings;DesktopSettings;X-GNOME-Settings-Panel;X-GNOME-PersonalizationSettings;
-OnlyShowIn=GNOME;
-# Translators: Search terms to find the Appearance panel. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon!
-Keywords=Background;Wallpaper;Screen;Desktop;Style;Light;Dark;Appearance;
diff -pruN 1:43.2-2/panels/background/meson.build 1:44~alpha-0ubuntu1/panels/background/meson.build
--- 1:43.2-2/panels/background/meson.build	2022-12-23 11:11:35.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/background/meson.build	2023-01-09 20:06:57.000000000 +0000
@@ -1,15 +1,9 @@
 panels_list += cappletname
 desktop = 'gnome-@0@-panel.desktop'.format(cappletname)
 
-desktop_in = configure_file(
-  input: desktop + '.in.in',
-  output: desktop + '.in',
-  configuration: desktop_conf
-)
-
 i18n.merge_file(
   type: 'desktop',
-  input: desktop_in,
+  input: desktop + '.in',
   output: desktop,
   po_dir: po_dir,
   install: true,
diff -pruN 1:43.2-2/panels/bluetooth/gnome-bluetooth-panel.desktop.in 1:44~alpha-0ubuntu1/panels/bluetooth/gnome-bluetooth-panel.desktop.in
--- 1:43.2-2/panels/bluetooth/gnome-bluetooth-panel.desktop.in	1970-01-01 00:00:00.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/bluetooth/gnome-bluetooth-panel.desktop.in	2023-01-09 20:06:57.000000000 +0000
@@ -0,0 +1,14 @@
+[Desktop Entry]
+Name=Bluetooth
+Comment=Turn Bluetooth on and off and connect your devices
+# Translators: Do NOT translate or transliterate this text (this is an icon file name)!
+Icon=org.gnome.Settings-bluetooth-symbolic
+Exec=gnome-control-center bluetooth
+Terminal=false
+Type=Application
+NoDisplay=true
+Categories=GTK;GNOME;Settings;X-GNOME-NetworkSettings;HardwareSettings;X-GNOME-Settings-Panel;X-GNOME-ConnectivitySettings;
+OnlyShowIn=GNOME;Unity;
+StartupNotify=true
+# Translators: Search terms to find the Bluetooth panel. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon!
+Keywords=share;sharing;bluetooth;obex;
diff -pruN 1:43.2-2/panels/bluetooth/gnome-bluetooth-panel.desktop.in.in 1:44~alpha-0ubuntu1/panels/bluetooth/gnome-bluetooth-panel.desktop.in.in
--- 1:43.2-2/panels/bluetooth/gnome-bluetooth-panel.desktop.in.in	2022-12-23 11:11:35.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/bluetooth/gnome-bluetooth-panel.desktop.in.in	1970-01-01 00:00:00.000000000 +0000
@@ -1,18 +0,0 @@
-[Desktop Entry]
-Name=Bluetooth
-Comment=Turn Bluetooth on and off and connect your devices
-# Translators: Do NOT translate or transliterate this text (this is an icon file name)!
-Icon=org.gnome.Settings-bluetooth-symbolic
-Exec=gnome-control-center bluetooth
-Terminal=false
-Type=Application
-NoDisplay=true
-Categories=GTK;GNOME;Settings;X-GNOME-NetworkSettings;HardwareSettings;X-GNOME-Settings-Panel;X-GNOME-ConnectivitySettings;
-OnlyShowIn=GNOME;Unity;
-StartupNotify=true
-X-GNOME-Bugzilla-Bugzilla=GNOME
-X-GNOME-Bugzilla-Product=gnome-bluetooth
-X-GNOME-Bugzilla-Component=properties
-X-GNOME-Bugzilla-Version=@VERSION@
-# Translators: Search terms to find the Bluetooth panel. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon!
-Keywords=share;sharing;bluetooth;obex;
diff -pruN 1:43.2-2/panels/bluetooth/meson.build 1:44~alpha-0ubuntu1/panels/bluetooth/meson.build
--- 1:43.2-2/panels/bluetooth/meson.build	2022-12-23 11:11:35.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/bluetooth/meson.build	2023-01-09 20:06:57.000000000 +0000
@@ -1,15 +1,9 @@
 panels_list += cappletname
 desktop = 'gnome-@0@-panel.desktop'.format(cappletname)
 
-desktop_in = configure_file(
-  input: desktop + '.in.in',
-  output: desktop + '.in',
-  configuration: desktop_conf
-)
-
 i18n.merge_file(
   type: 'desktop',
-  input: desktop_in,
+  input: desktop + '.in',
   output: desktop,
   po_dir: po_dir,
   install: true,
diff -pruN 1:43.2-2/panels/camera/cc-camera-panel.ui 1:44~alpha-0ubuntu1/panels/camera/cc-camera-panel.ui
--- 1:43.2-2/panels/camera/cc-camera-panel.ui	2022-12-23 11:11:35.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/camera/cc-camera-panel.ui	2023-01-09 20:06:57.000000000 +0000
@@ -22,7 +22,7 @@
               <object class="AdwStatusPage">
                 <property name="icon-name">camera-disabled-symbolic</property>
                 <property name="title" translatable="yes">Camera is Turned Off</property>
-                <property name="description" translatable="yes">No applications can capture photos or video.</property>
+                <property name="description" translatable="yes">No sandboxed applications can capture photos or video.</property>
               </object>
             </property>
           </object>
@@ -36,9 +36,7 @@
               <object class="AdwPreferencesPage">
                 <child>
                   <object class="AdwPreferencesGroup">
-                    <property name="description" translatable="yes">Use of the camera allows applications to capture photos and video. Disabling the camera may cause some applications to not function properly.
-
-Allow the applications below to use your camera.</property>
+                    <property name="description" translatable="yes">The following sandboxed applications have been given permission to use cameras. Applications that are not sandboxed can use cameras without asking for permission.</property>
                     <child>
                       <object class="GtkListBox" id="camera_apps_list_box">
                         <property name="selection-mode">none</property>
@@ -52,7 +50,7 @@ Allow the applications below to use your
                             <property name="margin-end">18</property>
                             <property name="margin-top">18</property>
                             <property name="margin-bottom">18</property>
-                            <property name="label" translatable="yes">No Applications Have Asked for Camera Access</property>
+                            <property name="label" translatable="yes">No sandboxed applications have asked for camera access</property>
                             <property name="wrap">true</property>
                             <property name="max-width-chars">50</property>
                             <style>
diff -pruN 1:43.2-2/panels/camera/gnome-camera-panel.desktop.in 1:44~alpha-0ubuntu1/panels/camera/gnome-camera-panel.desktop.in
--- 1:43.2-2/panels/camera/gnome-camera-panel.desktop.in	1970-01-01 00:00:00.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/camera/gnome-camera-panel.desktop.in	2023-01-09 20:06:57.000000000 +0000
@@ -0,0 +1,15 @@
+[Desktop Entry]
+Name=Camera
+Comment=Protect your pictures
+Exec=gnome-control-center camera
+# FIXME
+# Translators: Do NOT translate or transliterate this text (this is an icon file name)!
+Icon=org.gnome.Settings-camera-symbolic
+Terminal=false
+Type=Application
+NoDisplay=true
+StartupNotify=true
+Categories=GNOME;GTK;Settings;DesktopSettings;X-GNOME-Settings-Panel;X-GNOME-PrivacySettings;
+OnlyShowIn=GNOME;Unity;
+# Translators: Search terms to find the Camera panel. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon!
+Keywords=camera;photos;video;webcam;lock;private;privacy;
diff -pruN 1:43.2-2/panels/camera/gnome-camera-panel.desktop.in.in 1:44~alpha-0ubuntu1/panels/camera/gnome-camera-panel.desktop.in.in
--- 1:43.2-2/panels/camera/gnome-camera-panel.desktop.in.in	2022-12-23 11:11:35.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/camera/gnome-camera-panel.desktop.in.in	1970-01-01 00:00:00.000000000 +0000
@@ -1,19 +0,0 @@
-[Desktop Entry]
-Name=Camera
-Comment=Protect your pictures
-Exec=gnome-control-center camera
-# FIXME
-# Translators: Do NOT translate or transliterate this text (this is an icon file name)!
-Icon=org.gnome.Settings-camera-symbolic
-Terminal=false
-Type=Application
-NoDisplay=true
-StartupNotify=true
-Categories=GNOME;GTK;Settings;DesktopSettings;X-GNOME-Settings-Panel;X-GNOME-PrivacySettings;
-OnlyShowIn=GNOME;Unity;
-X-GNOME-Bugzilla-Bugzilla=GNOME
-X-GNOME-Bugzilla-Product=gnome-control-center
-X-GNOME-Bugzilla-Component=privacy
-X-GNOME-Bugzilla-Version=@VERSION@
-# Translators: Search terms to find the Camera panel. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon!
-Keywords=camera;photos;video;webcam;lock;private;privacy;
diff -pruN 1:43.2-2/panels/camera/meson.build 1:44~alpha-0ubuntu1/panels/camera/meson.build
--- 1:43.2-2/panels/camera/meson.build	2022-12-23 11:11:35.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/camera/meson.build	2023-01-09 20:06:57.000000000 +0000
@@ -1,15 +1,9 @@
 panels_list += cappletname
 desktop = 'gnome-@0@-panel.desktop'.format(cappletname)
 
-desktop_in = configure_file(
-  input: desktop + '.in.in',
-  output: desktop + '.in',
-  configuration: desktop_conf
-)
-
 i18n.merge_file(
   type: 'desktop',
-  input: desktop_in,
+  input: desktop + '.in',
   output: desktop,
   po_dir: po_dir,
   install: true,
diff -pruN 1:43.2-2/panels/color/cc-color-device.c 1:44~alpha-0ubuntu1/panels/color/cc-color-device.c
--- 1:43.2-2/panels/color/cc-color-device.c	2022-12-23 11:11:35.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/color/cc-color-device.c	2023-01-09 20:06:57.000000000 +0000
@@ -253,7 +253,6 @@ cc_color_device_clicked_expander_cb (CcC
 static void
 cc_color_device_init (CcColorDevice *color_device)
 {
-  GtkStyleContext *context;
   GtkWidget *box;
 
   /* description */
@@ -290,8 +289,7 @@ cc_color_device_init (CcColorDevice *col
 
   /* not calibrated */
   color_device->widget_nocalib = gtk_label_new (_("Not calibrated"));
-  context = gtk_widget_get_style_context (color_device->widget_nocalib);
-  gtk_style_context_add_class (context, "dim-label");
+  gtk_widget_add_css_class (color_device->widget_nocalib, "dim-label");
   gtk_widget_set_margin_end (color_device->widget_nocalib, 18);
   gtk_box_append (GTK_BOX (box), color_device->widget_nocalib);
 
diff -pruN 1:43.2-2/panels/color/gnome-color-panel.desktop.in 1:44~alpha-0ubuntu1/panels/color/gnome-color-panel.desktop.in
--- 1:43.2-2/panels/color/gnome-color-panel.desktop.in	1970-01-01 00:00:00.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/color/gnome-color-panel.desktop.in	2023-01-09 20:06:57.000000000 +0000
@@ -0,0 +1,16 @@
+[Desktop Entry]
+Name=Color
+Comment=Calibrate the color of your devices, such as displays, cameras or printers
+Exec=gnome-control-center color
+# Translators: Do NOT translate or transliterate this text (this is an icon file name)!
+Icon=org.gnome.Settings-color-symbolic
+Terminal=false
+Type=Application
+NoDisplay=true
+StartupNotify=true
+Categories=GNOME;GTK;Settings;X-GNOME-Settings-Panel;HardwareSettings;X-GNOME-DevicesSettings;
+OnlyShowIn=GNOME;Unity;
+# Translators: Search terms to find the Color panel. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon!
+Keywords=Color;ICC;Profile;Calibrate;Printer;Display;
+# Notifications are emitted by gnome-settings-daemon
+X-GNOME-UsesNotifications=true
diff -pruN 1:43.2-2/panels/color/gnome-color-panel.desktop.in.in 1:44~alpha-0ubuntu1/panels/color/gnome-color-panel.desktop.in.in
--- 1:43.2-2/panels/color/gnome-color-panel.desktop.in.in	2022-12-23 11:11:35.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/color/gnome-color-panel.desktop.in.in	1970-01-01 00:00:00.000000000 +0000
@@ -1,20 +0,0 @@
-[Desktop Entry]
-Name=Color
-Comment=Calibrate the color of your devices, such as displays, cameras or printers
-Exec=gnome-control-center color
-# Translators: Do NOT translate or transliterate this text (this is an icon file name)!
-Icon=org.gnome.Settings-color-symbolic
-Terminal=false
-Type=Application
-NoDisplay=true
-StartupNotify=true
-Categories=GNOME;GTK;Settings;X-GNOME-Settings-Panel;HardwareSettings;X-GNOME-DevicesSettings;
-OnlyShowIn=GNOME;Unity;
-X-GNOME-Bugzilla-Bugzilla=GNOME
-X-GNOME-Bugzilla-Product=gnome-control-center
-X-GNOME-Bugzilla-Component=color
-X-GNOME-Bugzilla-Version=@VERSION@
-# Translators: Search terms to find the Color panel. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon!
-Keywords=Color;ICC;Profile;Calibrate;Printer;Display;
-# Notifications are emitted by gnome-settings-daemon
-X-GNOME-UsesNotifications=true
diff -pruN 1:43.2-2/panels/color/meson.build 1:44~alpha-0ubuntu1/panels/color/meson.build
--- 1:43.2-2/panels/color/meson.build	2022-12-23 11:11:35.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/color/meson.build	2023-01-09 20:06:57.000000000 +0000
@@ -1,15 +1,9 @@
 panels_list += cappletname
 desktop = 'gnome-@0@-panel.desktop'.format(cappletname)
 
-desktop_in = configure_file(
-  input: desktop + '.in.in',
-  output: desktop + '.in',
-  configuration: desktop_conf
-)
-
 i18n.merge_file(
   type: 'desktop',
-  input: desktop_in,
+  input: desktop + '.in',
   output: desktop,
   po_dir: po_dir,
   install: true,
diff -pruN 1:43.2-2/panels/common/cc-hostname-entry.c 1:44~alpha-0ubuntu1/panels/common/cc-hostname-entry.c
--- 1:43.2-2/panels/common/cc-hostname-entry.c	2022-12-23 11:11:35.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/common/cc-hostname-entry.c	2023-01-09 20:06:57.000000000 +0000
@@ -27,13 +27,13 @@
 
 struct _CcHostnameEntry
 {
-  GtkEntry             parent;
+  AdwEntryRow          parent;
 
   GDBusProxy          *hostnamed_proxy;
   guint                set_hostname_timeout_source_id;
 };
 
-G_DEFINE_TYPE (CcHostnameEntry, cc_hostname_entry, GTK_TYPE_ENTRY)
+G_DEFINE_TYPE (CcHostnameEntry, cc_hostname_entry, ADW_TYPE_ENTRY_ROW)
 
 #define SET_HOSTNAME_TIMEOUT 1
 
@@ -235,6 +235,8 @@ cc_hostname_entry_constructed (GObject *
     gtk_editable_set_text (GTK_EDITABLE (self), "");
 
   g_signal_connect (self, "changed", G_CALLBACK (text_changed_cb), NULL);
+
+  adw_entry_row_set_show_apply_button (ADW_ENTRY_ROW (self), TRUE);
 }
 
 static void
diff -pruN 1:43.2-2/panels/common/cc-hostname-entry.h 1:44~alpha-0ubuntu1/panels/common/cc-hostname-entry.h
--- 1:43.2-2/panels/common/cc-hostname-entry.h	2022-12-23 11:11:35.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/common/cc-hostname-entry.h	2023-01-09 20:06:57.000000000 +0000
@@ -19,13 +19,13 @@
 
 #pragma once
 
-#include <gtk/gtk.h>
+#include <adwaita.h>
 
 G_BEGIN_DECLS
 
 #define CC_TYPE_HOSTNAME_ENTRY (cc_hostname_entry_get_type())
 
-G_DECLARE_FINAL_TYPE (CcHostnameEntry, cc_hostname_entry, CC, HOSTNAME_ENTRY, GtkEntry)
+G_DECLARE_FINAL_TYPE (CcHostnameEntry, cc_hostname_entry, CC, HOSTNAME_ENTRY, AdwEntryRow)
 
 CcHostnameEntry *cc_hostname_entry_new (void);
 gchar* cc_hostname_entry_get_hostname (CcHostnameEntry *entry);
diff -pruN 1:43.2-2/panels/common/cc-util.c 1:44~alpha-0ubuntu1/panels/common/cc-util.c
--- 1:43.2-2/panels/common/cc-util.c	2022-12-23 11:11:35.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/common/cc-util.c	2023-01-09 20:06:57.000000000 +0000
@@ -145,6 +145,23 @@ cc_util_get_smart_date (GDateTime *date)
           }
 }
 
+char *
+cc_util_get_smart_date_time (GDateTime *date)
+{
+  g_autofree gchar *date_str = NULL;
+  g_autofree gchar *smart_date = NULL;
+
+  if (date == NULL)
+    return NULL;
+
+  smart_date = cc_util_get_smart_date (date);
+  date_str = g_date_time_format (date, "\%X");
+  /* TRANSLATORS: This is the datetime format in the style of
+     "Aug 1, 10:10:10 PM", "Feb 24, 2013, 10:10:10 PM", "Today, 10:10:10 AM",
+     and "Yesterday, 10:10:10 AM" */
+  return g_strdup_printf (_("%1$s, %2$s"), smart_date, date_str);
+}
+
 /* Copied from src/plugins/properties/bacon-video-widget-properties.c
  * in totem */
 char *
diff -pruN 1:43.2-2/panels/common/cc-util.h 1:44~alpha-0ubuntu1/panels/common/cc-util.h
--- 1:43.2-2/panels/common/cc-util.h	2022-12-23 11:11:35.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/common/cc-util.h	2023-01-09 20:06:57.000000000 +0000
@@ -24,4 +24,5 @@
 
 char * cc_util_normalize_casefold_and_unaccent (const char *str);
 char * cc_util_get_smart_date                  (GDateTime *date);
+char * cc_util_get_smart_date_time             (GDateTime *date);
 char * cc_util_time_to_string_text             (gint64 msecs);
diff -pruN 1:43.2-2/panels/datetime/cc-datetime-panel.c 1:44~alpha-0ubuntu1/panels/datetime/cc-datetime-panel.c
--- 1:43.2-2/panels/datetime/cc-datetime-panel.c	2022-12-23 11:11:35.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/datetime/cc-datetime-panel.c	2023-01-09 20:06:57.000000000 +0000
@@ -26,7 +26,7 @@
 
 #include <langinfo.h>
 #include <sys/time.h>
-#include "cc-timezone-map.h"
+#include "cc-tz-dialog.h"
 #include "timedated.h"
 #include "date-endian.h"
 #define GNOME_DESKTOP_USE_UNSTABLE_API
@@ -45,12 +45,6 @@
 #define DEFAULT_TZ "Europe/London"
 #define GETTEXT_PACKAGE_TIMEZONES GETTEXT_PACKAGE "-timezones"
 
-enum {
-  CITY_COL_CITY_HUMAN_READABLE,
-  CITY_COL_ZONE,
-  CITY_NUM_COLS
-};
-
 #define DATETIME_PERMISSION "org.gnome.controlcenter.datetime.configure"
 #define DATETIME_TZ_PERMISSION "org.freedesktop.timedate1.set-timezone"
 #define LOCATION_SETTINGS "org.gnome.system.location"
@@ -68,8 +62,6 @@ struct _CcDateTimePanel
 {
   CcPanel parent_instance;
 
-  GtkWidget *map;
-
   GList *toplevels;
 
   TzLocation *current_location;
@@ -82,12 +74,9 @@ struct _CcDateTimePanel
   GSettings *datetime_settings;
   GSettings *filechooser_settings;
   GDesktopClockFormat clock_format;
-  GtkFrame *aspectmap;
   GtkWidget *auto_datetime_row;
   GtkWidget *auto_timezone_row;
   GtkWidget *auto_timezone_switch;
-  GtkListStore *city_liststore;
-  GtkTreeModelSort *city_modelsort;
   GtkWidget *date_grid;
   GtkWidget *datetime_button;
   GtkWidget *datetime_dialog;
@@ -98,14 +87,15 @@ struct _CcDateTimePanel
   GtkLockButton *lock_button;
   GtkListBox *date_box;
   GtkListBoxRow *day_row;
-  AdwComboRow *month_row;
+  GtkSingleSelection *month_model;
+  GtkPopover  *month_popover;
+  GtkListBoxRow *month_row;
   GtkListBoxRow *year_row;
   GtkWidget *network_time_switch;
   GtkWidget *time_editor;
   GtkWidget *timezone_button;
   GtkWidget *timezone_dialog;
   GtkWidget *timezone_label;
-  GtkWidget *timezone_searchentry;
   GtkWidget *year_spinbutton;
 
   GnomeWallClock *clock_tracker;
@@ -254,7 +244,7 @@ update_time (CcDateTimePanel *self)
     }
 
   self->month = g_date_time_get_month (self->date);
-  adw_combo_row_set_selected (self->month_row, self->month - 1);
+  gtk_single_selection_set_selected (self->month_model, self->month - 1);
   gtk_label_set_text (GTK_LABEL (self->datetime_label), label);
 }
 
@@ -381,25 +371,6 @@ change_date (CcDateTimePanel *self)
   queue_set_datetime (self);
 }
 
-static gboolean
-city_changed_cb (CcDateTimePanel    *self,
-                 GtkTreeModel       *model,
-                 GtkTreeIter        *iter,
-                 GtkEntryCompletion *completion)
-{
-  GtkWidget *entry;
-  g_autofree gchar *zone = NULL;
-
-  gtk_tree_model_get (model, iter,
-                      CITY_COL_ZONE, &zone, -1);
-  cc_timezone_map_set_timezone (CC_TIMEZONE_MAP (self->map), zone);
-
-  entry = gtk_entry_completion_get_entry (completion);
-  gtk_editable_set_text (GTK_EDITABLE (entry), "");
-
-  return TRUE;
-}
-
 static char *
 translated_city_name (TzLocation *loc)
 {
@@ -430,18 +401,8 @@ translated_city_name (TzLocation *loc)
 static void
 update_timezone (CcDateTimePanel *self)
 {
-  g_autofree gchar *bubble_text = NULL;
   g_autofree gchar *city_country = NULL;
   g_autofree gchar *label = NULL;
-  g_autofree gchar *time_label = NULL;
-  g_autofree gchar *utc_label = NULL;
-  g_autofree gchar *tz_desc = NULL;
-  gboolean use_ampm;
-
-  if (self->clock_format == G_DESKTOP_CLOCK_FORMAT_12H)
-    use_ampm = TRUE;
-  else
-    use_ampm = FALSE;
 
   city_country = translated_city_name (self->current_location);
 
@@ -451,62 +412,6 @@ update_timezone (CcDateTimePanel *self)
                            g_date_time_get_timezone_abbreviation (self->date),
                            city_country);
   gtk_label_set_text (GTK_LABEL (self->timezone_label), label);
-
-  /* Translators: UTC here means the Coordinated Universal Time.
-   * %:::z will be replaced by the offset from UTC e.g. UTC+02 */
-  utc_label = g_date_time_format (self->date, _("UTC%:::z"));
-
-  if (use_ampm)
-    {
-      /* Translators: This is the time format used in 12-hour mode. */
-      time_label = g_date_time_format (self->date, _("%l:%M %p"));
-    }
-  else
-    {
-      /* Translators: This is the time format used in 24-hour mode. */
-      time_label = g_date_time_format (self->date, _("%R"));
-    }
-
-  /* Update the text bubble in the timezone map */
-  /* Translators: "timezone (utc shift)" */
-  tz_desc = g_strdup_printf (C_("timezone map", "%s (%s)"),
-                             g_date_time_get_timezone_abbreviation (self->date),
-                             utc_label);
-  bubble_text = g_strdup_printf ("<b>%s</b>\n"
-                                 "<small>%s</small>\n"
-                                 "<b>%s</b>",
-                                 tz_desc,
-                                 city_country,
-                                 time_label);
-  cc_timezone_map_set_bubble_text (CC_TIMEZONE_MAP (self->map), bubble_text);
-}
-
-static void
-location_changed_cb (CcDateTimePanel *self,
-                     TzLocation      *location)
-{
-  g_autoptr(GDateTime) old_date = NULL;
-  g_autoptr(GTimeZone) timezone = NULL;
-
-  g_debug ("location changed to %s/%s", location->country, location->zone);
-
-  self->current_location = location;
-
-  timezone = g_time_zone_new_identifier (location->zone);
-  if (!timezone)
-    {
-      g_warning ("Could not find timezone \"%s\", using UTC instead", location->zone);
-      timezone = g_time_zone_new_utc ();
-    }
-
-  old_date = self->date;
-  self->date = g_date_time_to_timezone (old_date, timezone);
-  cc_time_editor_set_time (CC_TIME_EDITOR (self->time_editor),
-                           g_date_time_get_hour (self->date),
-                           g_date_time_get_minute (self->date));
-
-  update_timezone (self);
-  queue_set_timezone (self);
 }
 
 static void
@@ -517,35 +422,14 @@ get_initial_timezone (CcDateTimePanel *s
   timezone = timedate1_get_timezone (self->dtm);
 
   if (timezone == NULL ||
-      !cc_timezone_map_set_timezone (CC_TIMEZONE_MAP (self->map), timezone))
+      !cc_tz_dialog_set_tz (CC_TZ_DIALOG (self->timezone_dialog), timezone))
     {
       g_warning ("Timezone '%s' is unhandled, setting %s as default", timezone ? timezone : "(null)", DEFAULT_TZ);
-      cc_timezone_map_set_timezone (CC_TIMEZONE_MAP (self->map), DEFAULT_TZ);
+      cc_tz_dialog_set_tz (CC_TZ_DIALOG (self->timezone_dialog), DEFAULT_TZ);
     }
-  self->current_location = cc_timezone_map_get_location (CC_TIMEZONE_MAP (self->map));
-  update_timezone (self);
-}
 
-static void
-load_cities (TzLocation   *loc,
-             GtkListStore *city_store)
-{
-  g_autofree gchar *human_readable = NULL;
-
-  human_readable = translated_city_name (loc);
-  gtk_list_store_insert_with_values (city_store, NULL, 0,
-                                     CITY_COL_CITY_HUMAN_READABLE, human_readable,
-                                     CITY_COL_ZONE, loc->zone,
-                                     -1);
-}
-
-static void
-load_regions_model (GtkListStore *cities)
-{
-  g_autoptr(TzDB) db = NULL;
-
-  db = tz_load_db ();
-  g_ptr_array_foreach (db->locations, (GFunc) load_cities, cities);
+  self->current_location = cc_tz_dialog_get_selected_location (CC_TZ_DIALOG (self->timezone_dialog));
+  update_timezone (self);
 }
 
 static void
@@ -578,20 +462,29 @@ month_year_changed (CcDateTimePanel *sel
 }
 
 static void
-on_month_row_selected_changed_cb (AdwComboRow     *month_row,
-                                  GParamSpec      *pspec,
-                                  CcDateTimePanel *self)
+on_date_box_row_activated_cb (CcDateTimePanel *self,
+                              GtkListBoxRow   *row)
+{
+  g_assert (CC_IS_DATE_TIME_PANEL (self));
+
+  if (row == self->month_row)
+    gtk_popover_popup (self->month_popover);
+}
+
+static void
+on_month_selection_changed_cb (CcDateTimePanel *self)
 {
-  unsigned int i;
+  guint i;
 
   g_assert (CC_IS_DATE_TIME_PANEL (self));
-  g_assert (ADW_IS_COMBO_ROW (month_row));
 
-  i = adw_combo_row_get_selected (month_row);
+  i = gtk_single_selection_get_selected (self->month_model);
   g_assert (i >= 0 && i < 12);
 
   self->month = i + 1;
   month_year_changed (self);
+
+  gtk_popover_popdown (self->month_popover);
 }
 
 static void
@@ -687,9 +580,7 @@ on_can_ntp_changed (CcDateTimePanel *sel
 static void
 on_timezone_changed (CcDateTimePanel *self)
 {
-  g_signal_handlers_block_by_func (self->map, location_changed_cb, self);
   get_initial_timezone (self);
-  g_signal_handlers_unblock_by_func (self->map, location_changed_cb, self);
 }
 
 static void
@@ -785,6 +676,15 @@ bind_switch_to_row (CcDateTimePanel *sel
 }
 
 static void
+panel_tz_selection_changed_cb (CcDateTimePanel *self)
+{
+  g_assert (CC_IS_DATE_TIME_PANEL (self));
+
+  self->current_location = cc_tz_dialog_get_selected_location (CC_TZ_DIALOG (self->timezone_dialog));
+  queue_set_timezone (self);
+}
+
+static void
 list_box_row_activated (CcDateTimePanel *self,
                         GtkListBoxRow   *row)
 
@@ -821,24 +721,6 @@ time_changed_cb (CcDateTimePanel *self,
 }
 
 static void
-setup_timezone_dialog (CcDateTimePanel *self)
-{
-  g_autoptr(GtkEntryCompletion) completion = NULL;
-
-  /* set up timezone map */
-  self->map = (GtkWidget *) cc_timezone_map_new ();
-  gtk_frame_set_child (self->aspectmap, self->map);
-
-  /* Create the completion object */
-  completion = gtk_entry_completion_new ();
-  gtk_entry_set_completion (GTK_ENTRY (self->timezone_searchentry), completion);
-
-  gtk_entry_completion_set_model (completion, GTK_TREE_MODEL (self->city_modelsort));
-
-  gtk_entry_completion_set_text_column (completion, CITY_COL_CITY_HUMAN_READABLE);
-}
-
-static void
 setup_datetime_dialog (CcDateTimePanel *self)
 {
   GtkAdjustment *adjustment;
@@ -853,6 +735,9 @@ setup_datetime_dialog (CcDateTimePanel *
                                    ".gnome-control-center-datetime-setup-time>label {\n"
                                    "    font-size: 250%;\n"
                                    "}\n"
+                                   "gridview.month-grid > child {\n"
+                                   "  background: transparent;\n"
+                                   "}\n"
                                    ".gnome-control-center-datetime-setup-time>spinbutton>entry {\n"
                                    "    padding: 8px 13px;\n"
                                    "}", -1);
@@ -882,7 +767,7 @@ setup_datetime_dialog (CcDateTimePanel *
 
   /* Month */
   self->month = g_date_time_get_month (self->date);
-  adw_combo_row_set_selected (self->month_row, self->month - 1);
+  gtk_single_selection_set_selected (self->month_model, self->month - 1);
 }
 
 static int
@@ -942,12 +827,9 @@ cc_date_time_panel_class_init (CcDateTim
 
   gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/control-center/datetime/cc-datetime-panel.ui");
 
-  gtk_widget_class_bind_template_child (widget_class, CcDateTimePanel, aspectmap);
   gtk_widget_class_bind_template_child (widget_class, CcDateTimePanel, auto_datetime_row);
   gtk_widget_class_bind_template_child (widget_class, CcDateTimePanel, auto_timezone_row);
   gtk_widget_class_bind_template_child (widget_class, CcDateTimePanel, auto_timezone_switch);
-  gtk_widget_class_bind_template_child (widget_class, CcDateTimePanel, city_liststore);
-  gtk_widget_class_bind_template_child (widget_class, CcDateTimePanel, city_modelsort);
   gtk_widget_class_bind_template_child (widget_class, CcDateTimePanel, date_box);
   gtk_widget_class_bind_template_child (widget_class, CcDateTimePanel, datetime_button);
   gtk_widget_class_bind_template_child (widget_class, CcDateTimePanel, datetime_dialog);
@@ -956,21 +838,24 @@ cc_date_time_panel_class_init (CcDateTim
   gtk_widget_class_bind_template_child (widget_class, CcDateTimePanel, day_spinbutton);
   gtk_widget_class_bind_template_child (widget_class, CcDateTimePanel, timeformat_row);
   gtk_widget_class_bind_template_child (widget_class, CcDateTimePanel, lock_button);
+  gtk_widget_class_bind_template_child (widget_class, CcDateTimePanel, month_model);
+  gtk_widget_class_bind_template_child (widget_class, CcDateTimePanel, month_popover);
   gtk_widget_class_bind_template_child (widget_class, CcDateTimePanel, month_row);
   gtk_widget_class_bind_template_child (widget_class, CcDateTimePanel, network_time_switch);
   gtk_widget_class_bind_template_child (widget_class, CcDateTimePanel, time_editor);
   gtk_widget_class_bind_template_child (widget_class, CcDateTimePanel, timezone_button);
   gtk_widget_class_bind_template_child (widget_class, CcDateTimePanel, timezone_dialog);
   gtk_widget_class_bind_template_child (widget_class, CcDateTimePanel, timezone_label);
-  gtk_widget_class_bind_template_child (widget_class, CcDateTimePanel, timezone_searchentry);
   gtk_widget_class_bind_template_child (widget_class, CcDateTimePanel, year_row);
   gtk_widget_class_bind_template_child (widget_class, CcDateTimePanel, year_spinbutton);
 
+  gtk_widget_class_bind_template_callback (widget_class, panel_tz_selection_changed_cb);
   gtk_widget_class_bind_template_callback (widget_class, list_box_row_activated);
   gtk_widget_class_bind_template_callback (widget_class, time_changed_cb);
   gtk_widget_class_bind_template_callback (widget_class, change_clock_settings);
   gtk_widget_class_bind_template_callback (widget_class, format_clock_name_cb);
-  gtk_widget_class_bind_template_callback (widget_class, on_month_row_selected_changed_cb);
+  gtk_widget_class_bind_template_callback (widget_class, on_date_box_row_activated_cb);
+  gtk_widget_class_bind_template_callback (widget_class, on_month_selection_changed_cb);
 
   bind_textdomain_codeset (GETTEXT_PACKAGE_TIMEZONES, "UTF-8");
 
@@ -1030,7 +915,7 @@ cc_date_time_panel_init (CcDateTimePanel
   self->toplevels = g_list_append (self->toplevels, self->datetime_dialog);
   self->toplevels = g_list_append (self->toplevels, self->timezone_dialog);
 
-  setup_timezone_dialog (self);
+  /* setup_timezone_dialog (self); */
   setup_datetime_dialog (self);
 
   /* set up network time switch */
@@ -1070,21 +955,10 @@ cc_date_time_panel_init (CcDateTimePanel
 
   update_time (self);
 
-  load_regions_model (GTK_LIST_STORE (self->city_liststore));
-
-  gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (self->city_modelsort), CITY_COL_CITY_HUMAN_READABLE,
-                                        GTK_SORT_ASCENDING);
-
   /* After the initial setup, so we can be sure that
    * the model is filled up */
   get_initial_timezone (self);
 
-  g_signal_connect_object (gtk_entry_get_completion (GTK_ENTRY (self->timezone_searchentry)),
-                           "match-selected", G_CALLBACK (city_changed_cb), self, G_CONNECT_SWAPPED);
-
-  g_signal_connect_object (self->map, "location-changed",
-                           G_CALLBACK (location_changed_cb), self, G_CONNECT_SWAPPED);
-
   /* Watch changes of timedated remote service properties */
   g_signal_connect_object (self->dtm, "g-properties-changed",
                            G_CALLBACK (on_timedated_properties_changed), self, G_CONNECT_SWAPPED);
diff -pruN 1:43.2-2/panels/datetime/cc-datetime-panel.ui 1:44~alpha-0ubuntu1/panels/datetime/cc-datetime-panel.ui
--- 1:43.2-2/panels/datetime/cc-datetime-panel.ui	2022-12-23 11:11:35.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/datetime/cc-datetime-panel.ui	2023-01-09 20:06:57.000000000 +0000
@@ -1,16 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <interface>
-  <object class="GtkListStore" id="city_liststore">
-    <columns>
-      <!-- column-name city-human-readable -->
-      <column type="gchararray"/>
-      <!-- column-name zone -->
-      <column type="gchararray"/>
-    </columns>
-  </object>
-  <object class="GtkTreeModelSort" id="city_modelsort">
-    <property name="model">city_liststore</property>
+
+  <object class="CcTzDialog" id="timezone_dialog">
+    <signal name="tz-selected" handler="panel_tz_selection_changed_cb" swapped="yes"/>
   </object>
+
   <object class="GtkDialog" id="datetime_dialog">
     <property name="title" translatable="yes">Date &amp; Time</property>
     <property name="modal">True</property>
@@ -40,6 +34,7 @@
               <object class="GtkListBox" id="date_box">
                 <property name="width-request">320</property>
                 <property name="selection-mode">none</property>
+                <signal name="row-activated" handler="on_date_box_row_activated_cb" swapped="yes"/>
                 <style>
                   <class name="boxed-list"/>
                 </style>
@@ -62,27 +57,28 @@
 
                 <!-- Month row -->
                 <child>
-                  <object class="AdwComboRow" id="month_row">
+                  <object class="CcListRow" id="month_row">
                     <property name="title" translatable="yes">Month</property>
-                    <signal name="notify::selected" handler="on_month_row_selected_changed_cb" object="CcDateTimePanel" swapped="no" />
-                    <property name="model">
-                      <object class="GtkStringList">
-                        <items>
-                          <item translatable="yes">January</item>
-                          <item translatable="yes">February</item>
-                          <item translatable="yes">March</item>
-                          <item translatable="yes">April</item>
-                          <item translatable="yes">May</item>
-                          <item translatable="yes">June</item>
-                          <item translatable="yes">July</item>
-                          <item translatable="yes">August</item>
-                          <item translatable="yes">September</item>
-                          <item translatable="yes">October</item>
-                          <item translatable="yes">November</item>
-                          <item translatable="yes">December</item>
-                        </items>
+                    <binding name="secondary-label">
+                      <lookup name="string" type="GtkStringObject">
+                        <lookup name="selected-item">month_model</lookup>
+                      </lookup>
+                    </binding>
+                    <child type="suffix">
+                      <object class="GtkBox">
+                        <property name="valign">center</property>
+                        <child>
+                          <object class="GtkImage">
+                            <property name="icon-name">pan-down-symbolic</property>
+                          </object>
+                        </child>
+                        <child>
+                          <object class="GtkPopover" id="month_popover">
+                            <property name="child">month_grid</property>
+                          </object>
+                        </child>
                       </object>
-                    </property>
+                    </child>
                   </object>
                 </child>
 
@@ -109,44 +105,6 @@
       </object>
     </child>
   </object>
-  <object class="GtkDialog" id="timezone_dialog">
-    <property name="title" translatable="yes">Time Zone</property>
-    <property name="resizable">False</property>
-    <property name="modal">True</property>
-    <property name="use_header_bar">1</property>
-    <property name="hide-on-close">True</property>
-    <child internal-child="headerbar">
-      <object class="GtkHeaderBar" id="dialog_header_bar">
-        <property name="show-title-buttons">True</property>
-        <child type="title">
-            <object class="GtkEntry" id="timezone_searchentry">
-                <property name="halign">center</property>
-                <property name="margin_start">5</property>
-                <property name="margin_end">5</property>
-                <property name="width_chars">40</property>
-                <property name="primary_icon_name">edit-find-symbolic</property>
-                <property name="primary_icon_activatable">False</property>
-                <property name="primary_icon_sensitive">False</property>
-                <property name="placeholder_text" translatable="yes">Search for a city</property>
-            </object>
-        </child>
-      </object>
-    </child>
-    <child>
-      <object class="GtkBox" id="dialog_vbox7">
-        <property name="orientation">vertical</property>
-        <property name="spacing">2</property>
-        <child>
-          <object class="GtkFrame" id="aspectmap">
-            <property name="margin_start">5</property>
-            <property name="margin_end">5</property>
-            <property name="margin_top">5</property>
-            <property name="margin_bottom">5</property>
-          </object>
-        </child>
-      </object>
-    </child>
-  </object>
   <template class="CcDateTimePanel" parent="CcPanel">
 
     <child type="titlebar-end">
@@ -260,4 +218,49 @@
       </object>
     </child>
   </template>
+
+  <object class="GtkGridView" id="month_grid">
+    <property name="halign">start</property>
+    <property name="margin-start">3</property>
+    <property name="margin-end">3</property>
+    <property name="margin-top">3</property>
+    <property name="margin-bottom">3</property>
+    <property name="orientation">horizontal</property>
+    <property name="max-columns">6</property>
+    <property name="min-columns">6</property>
+    <property name="enable-rubberband">False</property>
+    <style>
+      <class name="month-grid"/>
+    </style>
+    <property name="factory">
+      <object class="GtkBuilderListItemFactory">
+        <property name="resource">/org/gnome/control-center/datetime/cc-month-row.ui</property>
+      </object>
+    </property>
+    <property name="model">
+      <object class="GtkSingleSelection" id="month_model">
+        <property name="autoselect">False</property>
+        <signal name="selection-changed" handler="on_month_selection_changed_cb" swapped="yes"/>
+        <property name="model">
+          <object class="GtkStringList">
+            <items>
+              <item translatable="yes">January</item>
+              <item translatable="yes">February</item>
+              <item translatable="yes">March</item>
+              <item translatable="yes">April</item>
+              <item translatable="yes">May</item>
+              <item translatable="yes">June</item>
+              <item translatable="yes">July</item>
+              <item translatable="yes">August</item>
+              <item translatable="yes">September</item>
+              <item translatable="yes">October</item>
+              <item translatable="yes">November</item>
+              <item translatable="yes">December</item>
+            </items>
+          </object>
+        </property>
+      </object>
+    </property>
+  </object>
+
 </interface>
diff -pruN 1:43.2-2/panels/datetime/cc-month-row.ui 1:44~alpha-0ubuntu1/panels/datetime/cc-month-row.ui
--- 1:43.2-2/panels/datetime/cc-month-row.ui	1970-01-01 00:00:00.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/datetime/cc-month-row.ui	2023-01-09 20:06:57.000000000 +0000
@@ -0,0 +1,55 @@
+<interface>
+  <template class="GtkListItem">
+    <property name="activatable">False</property>
+    <property name="child">
+      <object class="GtkBox">
+        <property name="margin-start">6</property>
+        <property name="margin-end">6</property>
+        <property name="margin-top">6</property>
+        <property name="margin-bottom">6</property>
+
+        <!-- Month name -->
+        <child>
+          <object class="GtkLabel">
+             <property name="ellipsize">end</property>
+            <property name="xalign">0</property>
+            <property name="width-request">96</property>
+            <style>
+              <class name="title"/>
+            </style>
+            <binding name="label">
+              <lookup name="string" type="GtkStringObject">
+                <lookup name="item">GtkListItem</lookup>
+              </lookup>
+            </binding>
+          </object>
+        </child>
+
+        <!-- Check Image -->
+        <child>
+          <object class="GtkImage" id="select_image">
+            <property name="visible" bind-source="GtkListItem" bind-property="selected" bind-flags="sync-create" />
+            <property name="icon-name">object-select-symbolic</property>
+          </object>
+        </child>
+
+        <!-- Placeholder too keep check image space intact -->
+        <child>
+          <object class="AdwBin" id="image_placeholder">
+            <property name="visible" bind-source="select_image" bind-flags="sync-create|invert-boolean" />
+          </object>
+        </child>
+
+      </object>
+    </property>
+  </template>
+
+  <object class="GtkSizeGroup">
+    <property name="mode">both</property>
+    <widgets>
+      <widget name="select_image"/>
+      <widget name="image_placeholder"/>
+    </widgets>
+  </object>
+
+</interface>
diff -pruN 1:43.2-2/panels/datetime/cc-timezone-map.c 1:44~alpha-0ubuntu1/panels/datetime/cc-timezone-map.c
--- 1:43.2-2/panels/datetime/cc-timezone-map.c	2022-12-23 11:11:35.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/datetime/cc-timezone-map.c	1970-01-01 00:00:00.000000000 +0000
@@ -1,530 +0,0 @@
-/*
- * Copyright (C) 2010 Intel, Inc
- *
- * Portions from Ubiquity, Copyright (C) 2009 Canonical Ltd.
- * Written by Evan Dandrea <evand@ubuntu.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, see <http://www.gnu.org/licenses/>.
- *
- * Author: Thomas Wood <thomas.wood@intel.com>
- *
- */
-
-#include "cc-timezone-map.h"
-#include <math.h>
-#include <string.h>
-#include "tz.h"
-
-#define PIN_HOT_POINT_X 8
-#define PIN_HOT_POINT_Y 15
-
-#define DATETIME_RESOURCE_PATH "/org/gnome/control-center/datetime"
-
-typedef struct
-{
-  gdouble offset;
-  guchar red;
-  guchar green;
-  guchar blue;
-  guchar alpha;
-} CcTimezoneMapOffset;
-
-struct _CcTimezoneMap
-{
-  GtkWidget parent_instance;
-
-  GdkTexture *orig_background;
-  GdkTexture *orig_background_dim;
-
-  GdkTexture *background;
-  GdkTexture *pin;
-
-  TzDB *tzdb;
-  TzLocation *location;
-
-  gchar *bubble_text;
-};
-
-G_DEFINE_TYPE (CcTimezoneMap, cc_timezone_map, GTK_TYPE_WIDGET)
-
-enum
-{
-  LOCATION_CHANGED,
-  LAST_SIGNAL
-};
-
-static guint signals[LAST_SIGNAL];
-
-static GdkTexture *
-texture_from_resource (const gchar  *resource_path,
-                       GError      **error)
-{
-  g_autofree gchar *full_path = g_strdup_printf ("resource://%s", resource_path);
-  g_autoptr(GFile) file = g_file_new_for_uri (full_path);
-  g_autoptr(GdkTexture) texture = gdk_texture_new_from_file (file, error);
-
-  return g_steal_pointer (&texture);
-}
-
-static void
-cc_timezone_map_dispose (GObject *object)
-{
-  CcTimezoneMap *self = CC_TIMEZONE_MAP (object);
-
-  g_clear_object (&self->orig_background);
-  g_clear_object (&self->orig_background_dim);
-  g_clear_object (&self->background);
-  g_clear_object (&self->pin);
-  g_clear_pointer (&self->bubble_text, g_free);
-
-  G_OBJECT_CLASS (cc_timezone_map_parent_class)->dispose (object);
-}
-
-static void
-cc_timezone_map_finalize (GObject *object)
-{
-  CcTimezoneMap *self = CC_TIMEZONE_MAP (object);
-
-  g_clear_pointer (&self->tzdb, tz_db_free);
-
-  G_OBJECT_CLASS (cc_timezone_map_parent_class)->finalize (object);
-}
-
-/* GtkWidget functions */
-static void
-cc_timezone_map_measure (GtkWidget      *widget,
-                         GtkOrientation  orientation,
-                         gint            for_size,
-                         gint           *minimum,
-                         gint           *natural,
-                         gint           *minimum_baseline,
-                         gint           *natural_baseline)
-{
-  CcTimezoneMap *map = CC_TIMEZONE_MAP (widget);
-  gint size;
-
-  switch (orientation)
-    {
-    case GTK_ORIENTATION_HORIZONTAL:
-      size = gdk_texture_get_width (map->orig_background);
-      break;
-
-    case GTK_ORIENTATION_VERTICAL:
-      size = gdk_texture_get_height (map->orig_background);
-      break;
-    }
-
-  if (minimum != NULL)
-    *minimum = size;
-  if (natural != NULL)
-    *natural = size;
-}
-
-static void
-cc_timezone_map_size_allocate (GtkWidget *widget,
-                               gint       width,
-                               gint       height,
-                               gint       baseline)
-{
-  CcTimezoneMap *map = CC_TIMEZONE_MAP (widget);
-  GdkTexture *texture;
-
-  if (!gtk_widget_is_sensitive (widget))
-    texture = map->orig_background_dim;
-  else
-    texture = map->orig_background;
-
-  g_clear_object (&map->background);
-  map->background = g_object_ref (texture);
-
-  GTK_WIDGET_CLASS (cc_timezone_map_parent_class)->size_allocate (widget,
-                                                                  width,
-                                                                  height,
-                                                                  baseline);
-}
-
-static gdouble
-convert_longitude_to_x (gdouble longitude, gint map_width)
-{
-  const gdouble xdeg_offset = -6;
-  gdouble x;
-
-  x = (map_width * (180.0 + longitude) / 360.0)
-    + (map_width * xdeg_offset / 180.0);
-
-  return x;
-}
-
-static gdouble
-radians (gdouble degrees)
-{
-  return (degrees / 360.0) * G_PI * 2;
-}
-
-static gdouble
-convert_latitude_to_y (gdouble latitude, gdouble map_height)
-{
-  gdouble bottom_lat = -59;
-  gdouble top_lat = 81;
-  gdouble top_per, y, full_range, top_offset, map_range;
-
-  top_per = top_lat / 180.0;
-  y = 1.25 * log (tan (G_PI_4 + 0.4 * radians (latitude)));
-  full_range = 4.6068250867599998;
-  top_offset = full_range * top_per;
-  map_range = fabs (1.25 * log (tan (G_PI_4 + 0.4 * radians (bottom_lat))) - top_offset);
-  y = fabs (y - top_offset);
-  y = y / map_range;
-  y = y * map_height;
-  return y;
-}
-
-static void
-draw_text_bubble (CcTimezoneMap *map,
-                  GtkSnapshot   *snapshot,
-                  gint           width,
-                  gint           height,
-                  gdouble        pointx,
-                  gdouble        pointy)
-{
-  static const double corner_radius = 9.0;
-  static const double margin_top = 12.0;
-  static const double margin_bottom = 12.0;
-  static const double margin_left = 24.0;
-  static const double margin_right = 24.0;
-
-  GskRoundedRect rounded_rect;
-  PangoRectangle text_rect;
-  PangoLayout *layout;
-  GdkRGBA rgba;
-  double x;
-  double y;
-  double bubble_width;
-  double bubble_height;
-
-  if (!map->bubble_text)
-    return;
-
-  layout = gtk_widget_create_pango_layout (GTK_WIDGET (map), NULL);
-
-  /* Layout the text */
-  pango_layout_set_alignment (layout, PANGO_ALIGN_CENTER);
-  pango_layout_set_spacing (layout, 3);
-  pango_layout_set_markup (layout, map->bubble_text, -1);
-
-  pango_layout_get_pixel_extents (layout, NULL, &text_rect);
-
-  /* Calculate the bubble size based on the text layout size */
-  bubble_width = text_rect.width + margin_left + margin_right;
-  bubble_height = text_rect.height + margin_top + margin_bottom;
-
-  if (pointx < width / 2)
-    x = pointx + 25;
-  else
-    x = pointx - bubble_width - 25;
-
-  y = pointy - bubble_height / 2;
-
-  /* Make sure it fits in the visible area */
-  x = CLAMP (x, 0, width - bubble_width);
-  y = CLAMP (y, 0, height - bubble_height);
-
-  gtk_snapshot_save (snapshot);
-
-  gsk_rounded_rect_init (&rounded_rect,
-                         &GRAPHENE_RECT_INIT (x, y, bubble_width, bubble_height),
-                         &GRAPHENE_SIZE_INIT (corner_radius, corner_radius),
-                         &GRAPHENE_SIZE_INIT (corner_radius, corner_radius),
-                         &GRAPHENE_SIZE_INIT (corner_radius, corner_radius),
-                         &GRAPHENE_SIZE_INIT (corner_radius, corner_radius));
-
-  gtk_snapshot_push_rounded_clip (snapshot, &rounded_rect);
-
-  rgba = (GdkRGBA) {
-    .red = 0.2,
-    .green = 0.2,
-    .blue = 0.2,
-    .alpha = 0.7,
-  };
-  gtk_snapshot_append_color (snapshot,
-                             &rgba,
-                             &GRAPHENE_RECT_INIT (x, y, bubble_width, bubble_height));
-
-
-  rgba = (GdkRGBA) {
-    .red = 1.0,
-    .green = 1.0,
-    .blue = 1.0,
-    .alpha = 1.0,
-  };
-  gtk_snapshot_translate (snapshot, &GRAPHENE_POINT_INIT (x + margin_left, y + margin_top));
-  gtk_snapshot_append_layout (snapshot, layout, &rgba);
-
-  gtk_snapshot_pop (snapshot);
-  gtk_snapshot_restore (snapshot);
-
-  g_object_unref (layout);
-}
-
-static void
-cc_timezone_map_snapshot (GtkWidget   *widget,
-                          GtkSnapshot *snapshot)
-{
-  CcTimezoneMap *map = CC_TIMEZONE_MAP (widget);
-  gdouble pointx, pointy;
-  gint width, height;
-
-  width = gtk_widget_get_width (widget);
-  height = gtk_widget_get_height (widget);
-
-  /* paint background */
-  gtk_snapshot_append_texture (snapshot,
-                               map->background,
-                               &GRAPHENE_RECT_INIT (0, 0, width, height));
-
-  if (map->location)
-    {
-      pointx = convert_longitude_to_x (map->location->longitude, width);
-      pointy = convert_latitude_to_y (map->location->latitude, height);
-
-      pointx = CLAMP (floor (pointx), 0, width);
-      pointy = CLAMP (floor (pointy), 0, height);
-
-      draw_text_bubble (map, snapshot, width, height, pointx, pointy);
-
-      if (map->pin)
-        {
-          gtk_snapshot_append_texture (snapshot,
-                                       map->pin,
-                                       &GRAPHENE_RECT_INIT (pointx - PIN_HOT_POINT_X,
-                                                            pointy - PIN_HOT_POINT_Y,
-                                                            gdk_texture_get_width (map->pin),
-                                                            gdk_texture_get_height (map->pin)));
-        }
-    }
-}
-
-static void
-update_cursor (GtkWidget *widget)
-{
-  const gchar *cursor_name = NULL;
-
-  if (!gtk_widget_get_realized (widget))
-    return;
-
-  if (gtk_widget_is_sensitive (widget))
-    cursor_name = "pointer";
-
-  gtk_widget_set_cursor_from_name (widget, cursor_name);
-}
-
-static void
-cc_timezone_map_state_flags_changed (GtkWidget     *widget,
-                                     GtkStateFlags  prev_state)
-{
-  update_cursor (widget);
-
-  if (GTK_WIDGET_CLASS (cc_timezone_map_parent_class)->state_flags_changed)
-    GTK_WIDGET_CLASS (cc_timezone_map_parent_class)->state_flags_changed (widget, prev_state);
-}
-
-
-static void
-cc_timezone_map_class_init (CcTimezoneMapClass *klass)
-{
-  GObjectClass *object_class = G_OBJECT_CLASS (klass);
-  GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
-
-  object_class->dispose = cc_timezone_map_dispose;
-  object_class->finalize = cc_timezone_map_finalize;
-
-  widget_class->measure = cc_timezone_map_measure;
-  widget_class->size_allocate = cc_timezone_map_size_allocate;
-  widget_class->snapshot = cc_timezone_map_snapshot;
-  widget_class->state_flags_changed = cc_timezone_map_state_flags_changed;
-
-  signals[LOCATION_CHANGED] = g_signal_new ("location-changed",
-                                            CC_TYPE_TIMEZONE_MAP,
-                                            G_SIGNAL_RUN_FIRST,
-                                            0,
-                                            NULL,
-                                            NULL,
-                                            g_cclosure_marshal_VOID__POINTER,
-                                            G_TYPE_NONE, 1,
-                                            G_TYPE_POINTER);
-}
-
-
-static gint
-sort_locations (TzLocation *a,
-                TzLocation *b)
-{
-  if (a->dist > b->dist)
-    return 1;
-
-  if (a->dist < b->dist)
-    return -1;
-
-  return 0;
-}
-
-static void
-set_location (CcTimezoneMap *map,
-              TzLocation    *location)
-{
-  g_autoptr(TzInfo) info = NULL;
-
-  map->location = location;
-
-  info = tz_info_from_location (map->location);
-
-  gtk_widget_queue_draw (GTK_WIDGET (map));
-
-  g_signal_emit (map, signals[LOCATION_CHANGED], 0, map->location);
-}
-
-static gboolean
-map_clicked_cb (GtkGestureClick *self,
-                gint             n_press,
-                gdouble          x,
-                gdouble          y,
-                CcTimezoneMap   *map)
-{
-  const GPtrArray *array;
-  gint width, height;
-  GList *distances = NULL;
-  gint i;
-
-  /* work out the coordinates */
-
-  array = tz_get_locations (map->tzdb);
-
-  width = gtk_widget_get_width (GTK_WIDGET (map));
-  height = gtk_widget_get_height (GTK_WIDGET (map));
-
-  for (i = 0; i < array->len; i++)
-    {
-      gdouble pointx, pointy, dx, dy;
-      TzLocation *loc = array->pdata[i];
-
-      pointx = convert_longitude_to_x (loc->longitude, width);
-      pointy = convert_latitude_to_y (loc->latitude, height);
-
-      dx = pointx - x;
-      dy = pointy - y;
-
-      loc->dist = dx * dx + dy * dy;
-      distances = g_list_prepend (distances, loc);
-
-    }
-  distances = g_list_sort (distances, (GCompareFunc) sort_locations);
-
-
-  set_location (map, (TzLocation*) distances->data);
-
-  g_list_free (distances);
-
-  return TRUE;
-}
-
-static void
-cc_timezone_map_init (CcTimezoneMap *map)
-{
-  GtkGesture *click_gesture;
-  GError *err = NULL;
-
-  map->orig_background = texture_from_resource (DATETIME_RESOURCE_PATH "/bg.png", &err);
-  if (!map->orig_background)
-    {
-      g_warning ("Could not load background image: %s",
-                 (err) ? err->message : "Unknown error");
-      g_clear_error (&err);
-    }
-
-  map->orig_background_dim = texture_from_resource (DATETIME_RESOURCE_PATH "/bg_dim.png", &err);
-  if (!map->orig_background_dim)
-    {
-      g_warning ("Could not load background image: %s",
-                 (err) ? err->message : "Unknown error");
-      g_clear_error (&err);
-    }
-
-  map->pin = texture_from_resource (DATETIME_RESOURCE_PATH "/pin.png", &err);
-  if (!map->pin)
-    {
-      g_warning ("Could not load pin icon: %s",
-                 (err) ? err->message : "Unknown error");
-      g_clear_error (&err);
-    }
-
-  map->tzdb = tz_load_db ();
-
-  click_gesture = gtk_gesture_click_new ();
-  g_signal_connect (click_gesture, "pressed", G_CALLBACK (map_clicked_cb), map);
-  gtk_widget_add_controller (GTK_WIDGET (map), GTK_EVENT_CONTROLLER (click_gesture));
-}
-
-CcTimezoneMap *
-cc_timezone_map_new (void)
-{
-  return g_object_new (CC_TYPE_TIMEZONE_MAP, NULL);
-}
-
-gboolean
-cc_timezone_map_set_timezone (CcTimezoneMap *map,
-                              const gchar   *timezone)
-{
-  GPtrArray *locations;
-  guint i;
-  g_autofree gchar *real_tz = NULL;
-  gboolean ret;
-
-  real_tz = tz_info_get_clean_name (map->tzdb, timezone);
-
-  locations = tz_get_locations (map->tzdb);
-  ret = FALSE;
-
-  for (i = 0; i < locations->len; i++)
-    {
-      TzLocation *loc = locations->pdata[i];
-
-      if (!g_strcmp0 (loc->zone, real_tz ? real_tz : timezone))
-        {
-          set_location (map, loc);
-          ret = TRUE;
-          break;
-        }
-    }
-
-  if (ret)
-    gtk_widget_queue_draw (GTK_WIDGET (map));
-
-  return ret;
-}
-
-void
-cc_timezone_map_set_bubble_text (CcTimezoneMap *map,
-                                 const gchar   *text)
-{
-  g_free (map->bubble_text);
-  map->bubble_text = g_strdup (text);
-
-  gtk_widget_queue_draw (GTK_WIDGET (map));
-}
-
-TzLocation *
-cc_timezone_map_get_location (CcTimezoneMap *map)
-{
-  return map->location;
-}
diff -pruN 1:43.2-2/panels/datetime/cc-timezone-map.h 1:44~alpha-0ubuntu1/panels/datetime/cc-timezone-map.h
--- 1:43.2-2/panels/datetime/cc-timezone-map.h	2022-12-23 11:11:35.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/datetime/cc-timezone-map.h	1970-01-01 00:00:00.000000000 +0000
@@ -1,39 +0,0 @@
-/*
- * Copyright (C) 2010 Intel, Inc
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, see <http://www.gnu.org/licenses/>.
- *
- * Author: Thomas Wood <thomas.wood@intel.com>
- *
- */
-
-#pragma once
-
-#include <gtk/gtk.h>
-#include "tz.h"
-
-G_BEGIN_DECLS
-
-#define CC_TYPE_TIMEZONE_MAP (cc_timezone_map_get_type ())
-G_DECLARE_FINAL_TYPE (CcTimezoneMap, cc_timezone_map, CC, TIMEZONE_MAP, GtkWidget)
-
-CcTimezoneMap *cc_timezone_map_new (void);
-
-gboolean cc_timezone_map_set_timezone (CcTimezoneMap *map,
-                                       const gchar   *timezone);
-void cc_timezone_map_set_bubble_text (CcTimezoneMap *map,
-                                      const gchar   *text);
-TzLocation * cc_timezone_map_get_location (CcTimezoneMap *map);
-
-G_END_DECLS
diff -pruN 1:43.2-2/panels/datetime/cc-tz-dialog.c 1:44~alpha-0ubuntu1/panels/datetime/cc-tz-dialog.c
--- 1:43.2-2/panels/datetime/cc-tz-dialog.c	1970-01-01 00:00:00.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/datetime/cc-tz-dialog.c	2023-01-09 20:06:57.000000000 +0000
@@ -0,0 +1,327 @@
+/* -*- mode: c; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* cc-tz-dialog.c
+ *
+ * Copyright 2022 Purism SPC
+ * Copyright 2022 Mohammed Sadiq <sadiq@sadiqpk.org>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * Author(s):
+ *   Mohammed Sadiq <sadiq@sadiqpk.org>
+ *
+ * SPDX-License-Identifier: GPL-3.0-or-later
+ */
+
+#undef G_LOG_DOMAIN
+#define G_LOG_DOMAIN "cc-tz-dialog"
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#define _GNU_SOURCE
+#include <string.h>
+#include <glib/gi18n.h>
+
+#include "cc-tz-dialog.h"
+#include "tz.h"
+
+struct _CcTzDialog
+{
+  AdwWindow           parent_instance;
+
+  GtkSearchEntry     *location_entry;
+
+  GtkStack           *main_stack;
+  AdwStatusPage      *empty_page;
+  GtkScrolledWindow  *tz_page;
+  GtkListView        *tz_view;
+
+  TzDB               *tz_db;
+  GListStore         *tz_store;
+  GtkFilterListModel *tz_filtered_model;
+  GtkNoSelection     *tz_selection_model;
+
+  CcTzItem           *selected_item;
+};
+
+G_DEFINE_TYPE (CcTzDialog, cc_tz_dialog, ADW_TYPE_WINDOW)
+
+enum {
+  TZ_SELECTED,
+  N_SIGNALS
+};
+
+static guint signals[N_SIGNALS];
+
+static gboolean
+match_tz_item (CcTzItem   *item,
+               CcTzDialog *self)
+{
+  g_auto(GStrv) strv = NULL;
+  g_autofree char *country = NULL;
+  g_autofree char *name = NULL;
+  g_autofree char *zone = NULL;
+  const char *search_terms;
+
+  g_assert (CC_IS_TZ_ITEM (item));
+  g_assert (CC_IS_TZ_DIALOG (self));
+
+  search_terms = gtk_editable_get_text (GTK_EDITABLE (self->location_entry));
+
+  if (!search_terms || !*search_terms)
+    return TRUE;
+
+  g_object_get (item,
+                "country", &country,
+                "name", &name,
+                "zone", &zone,
+                NULL);
+
+  if (!name || !zone || !country)
+    return FALSE;
+
+  /* Search for each word separated by spaces */
+  strv = g_strsplit (search_terms, " ", 0);
+
+  /*
+   * List the item only if the value contain each word.
+   * ie, for a search "as kol" it will match "Asia/Kolkata"
+   * not "Asia/Karachi"
+   */
+  for (guint i = 0; strv[i]; i++)
+    {
+      const char *str = strv[i];
+
+      if (!str || !*str)
+        continue;
+
+      if (!strcasestr (name, str) &&
+          !strcasestr (zone, str) &&
+          !strcasestr (country, str))
+        return FALSE;
+    }
+
+  return TRUE;
+}
+
+static void
+load_tz (CcTzDialog *self)
+{
+  GPtrArray *locations;
+
+  g_assert (CC_IS_TZ_DIALOG (self));
+
+  self->tz_db = tz_load_db ();
+  g_assert (self->tz_db);
+
+  locations = tz_get_locations (self->tz_db);
+  g_assert (locations);
+
+  for (guint i = 0; i < locations->len; i++)
+    {
+      g_autoptr(CcTzItem) item = NULL;
+      TzLocation *location;
+
+      location = locations->pdata[i];
+      item = cc_tz_item_new (location);
+
+      g_list_store_append (self->tz_store, item);
+    }
+}
+
+static void
+tz_selection_model_changed_cb (CcTzDialog *self)
+{
+  guint n_items;
+
+  g_assert (CC_IS_TZ_DIALOG (self));
+
+  n_items = g_list_model_get_n_items (G_LIST_MODEL (self->tz_selection_model));
+
+  if (n_items)
+    gtk_stack_set_visible_child (self->main_stack, GTK_WIDGET (self->tz_page));
+  else
+    gtk_stack_set_visible_child (self->main_stack, GTK_WIDGET (self->empty_page));
+}
+
+static void
+tz_dialog_search_changed_cb (CcTzDialog *self)
+{
+  GtkFilter *filter;
+
+  g_assert (CC_IS_TZ_DIALOG (self));
+
+  filter = gtk_filter_list_model_get_filter (self->tz_filtered_model);
+
+  gtk_filter_changed (filter, GTK_FILTER_CHANGE_DIFFERENT);
+}
+
+static void
+tz_dialog_row_activated_cb (CcTzDialog *self,
+                            guint       position)
+{
+  GListModel *model;
+
+  g_assert (CC_IS_TZ_DIALOG (self));
+
+  g_clear_object (&self->selected_item);
+
+  model = G_LIST_MODEL (self->tz_selection_model);
+  self->selected_item = g_list_model_get_item (model, position);
+
+  gtk_window_close (GTK_WINDOW (self));
+  g_signal_emit (self, signals[TZ_SELECTED], 0);
+}
+
+static void
+cc_tz_dialog_map (GtkWidget *widget)
+{
+  CcTzDialog *self = (CcTzDialog *)widget;
+
+  gtk_editable_set_text (GTK_EDITABLE (self->location_entry), "");
+  gtk_widget_grab_focus (GTK_WIDGET (self->location_entry));
+
+  GTK_WIDGET_CLASS (cc_tz_dialog_parent_class)->map (widget);
+}
+
+static void
+cc_tz_dialog_finalize (GObject *object)
+{
+  CcTzDialog *self = (CcTzDialog *)object;
+
+  g_clear_object (&self->tz_store);
+  g_clear_pointer (&self->tz_db, tz_db_free);
+
+  G_OBJECT_CLASS (cc_tz_dialog_parent_class)->finalize (object);
+}
+
+static void
+cc_tz_dialog_class_init (CcTzDialogClass *klass)
+{
+  GObjectClass *object_class = G_OBJECT_CLASS (klass);
+  GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
+
+  object_class->finalize = cc_tz_dialog_finalize;
+
+  widget_class->map = cc_tz_dialog_map;
+
+  signals[TZ_SELECTED] =
+    g_signal_new ("tz-selected",
+                  G_TYPE_FROM_CLASS (klass),
+                  G_SIGNAL_RUN_LAST,
+                  0, NULL, NULL, NULL,
+                  G_TYPE_NONE, 0);
+
+  gtk_widget_class_set_template_from_resource (widget_class,
+                                               "/org/gnome/control-center/"
+                                               "datetime/cc-tz-dialog.ui");
+
+  gtk_widget_class_bind_template_child (widget_class, CcTzDialog, location_entry);
+
+  gtk_widget_class_bind_template_child (widget_class, CcTzDialog, main_stack);
+  gtk_widget_class_bind_template_child (widget_class, CcTzDialog, empty_page);
+  gtk_widget_class_bind_template_child (widget_class, CcTzDialog, tz_page);
+  gtk_widget_class_bind_template_child (widget_class, CcTzDialog, tz_view);
+
+  gtk_widget_class_bind_template_callback (widget_class, tz_dialog_search_changed_cb);
+  gtk_widget_class_bind_template_callback (widget_class, tz_dialog_row_activated_cb);
+}
+
+static void
+cc_tz_dialog_init (CcTzDialog *self)
+{
+  GtkSortListModel *tz_sorted_model;
+  GtkExpression *expression;
+  GtkSorter *sorter;
+  GtkFilter *filter;
+
+  gtk_widget_init_template (GTK_WIDGET (self));
+
+  self->tz_store = g_list_store_new (CC_TYPE_TZ_ITEM);
+  load_tz (self);
+
+  /* Sort items by name */
+  expression = gtk_property_expression_new (CC_TYPE_TZ_ITEM, NULL, "name");
+  sorter = GTK_SORTER (gtk_string_sorter_new (expression));
+  tz_sorted_model = gtk_sort_list_model_new (G_LIST_MODEL (self->tz_store), sorter);
+
+  filter = (GtkFilter *)gtk_custom_filter_new ((GtkCustomFilterFunc) match_tz_item, self, NULL);
+  self->tz_filtered_model = gtk_filter_list_model_new (G_LIST_MODEL (tz_sorted_model), filter);
+  self->tz_selection_model = gtk_no_selection_new (G_LIST_MODEL (self->tz_filtered_model));
+
+  g_signal_connect_object (self->tz_selection_model, "items-changed",
+                           G_CALLBACK (tz_selection_model_changed_cb),
+                           self, G_CONNECT_SWAPPED);
+  tz_selection_model_changed_cb (self);
+
+  gtk_list_view_set_model (self->tz_view, GTK_SELECTION_MODEL (self->tz_selection_model));
+}
+
+GtkWidget *
+cc_tz_dialog_new (void)
+{
+  return g_object_new (CC_TYPE_TZ_DIALOG, NULL);
+}
+
+gboolean
+cc_tz_dialog_set_tz (CcTzDialog *self,
+                     const char *timezone)
+{
+  g_autofree gchar *tz = NULL;
+  guint n_items;
+
+  g_return_val_if_fail (CC_IS_TZ_DIALOG (self), FALSE);
+  g_return_val_if_fail (timezone && *timezone, FALSE);
+
+  n_items = g_list_model_get_n_items (G_LIST_MODEL (self->tz_store));
+  tz = tz_info_get_clean_name (self->tz_db, timezone);
+
+  for (guint i = 0; i < n_items; i++)
+    {
+      g_autoptr(CcTzItem) item = NULL;
+      TzLocation *loc;
+
+      item = g_list_model_get_item (G_LIST_MODEL (self->tz_store), i);
+      loc = cc_tz_item_get_location (item);
+
+      if (g_strcmp0 (loc->zone, tz ? tz : timezone) == 0)
+        {
+          g_set_object (&self->selected_item, item);
+
+          return TRUE;
+        }
+    }
+
+  return FALSE;
+}
+
+CcTzItem *
+cc_tz_dialog_get_selected_tz (CcTzDialog *self)
+{
+  g_return_val_if_fail (CC_IS_TZ_DIALOG (self), NULL);
+
+  return self->selected_item;
+}
+
+TzLocation *
+cc_tz_dialog_get_selected_location (CcTzDialog *self)
+{
+  g_return_val_if_fail (CC_IS_TZ_DIALOG (self), NULL);
+
+  if (!self->selected_item)
+    return NULL;
+
+  return cc_tz_item_get_location (self->selected_item);
+}
diff -pruN 1:43.2-2/panels/datetime/cc-tz-dialog.h 1:44~alpha-0ubuntu1/panels/datetime/cc-tz-dialog.h
--- 1:43.2-2/panels/datetime/cc-tz-dialog.h	1970-01-01 00:00:00.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/datetime/cc-tz-dialog.h	2023-01-09 20:06:57.000000000 +0000
@@ -0,0 +1,19 @@
+#pragma once
+
+#include <adwaita.h>
+
+#include "cc-tz-item.h"
+
+G_BEGIN_DECLS
+
+#define CC_TYPE_TZ_DIALOG (cc_tz_dialog_get_type ())
+
+G_DECLARE_FINAL_TYPE (CcTzDialog, cc_tz_dialog, CC, TZ_DIALOG, AdwWindow)
+
+GtkWidget   *cc_tz_dialog_new                   (void);
+gboolean     cc_tz_dialog_set_tz                (CcTzDialog *self,
+                                                 const char *timezone);
+CcTzItem    *cc_tz_dialog_get_selected_tz       (CcTzDialog *self);
+TzLocation  *cc_tz_dialog_get_selected_location (CcTzDialog *self);
+
+G_END_DECLS
diff -pruN 1:43.2-2/panels/datetime/cc-tz-dialog.ui 1:44~alpha-0ubuntu1/panels/datetime/cc-tz-dialog.ui
--- 1:43.2-2/panels/datetime/cc-tz-dialog.ui	1970-01-01 00:00:00.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/datetime/cc-tz-dialog.ui	2023-01-09 20:06:57.000000000 +0000
@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+  <template class="CcTzDialog" parent="AdwWindow">
+    <property name="modal">True</property>
+    <property name="hide-on-close">True</property>
+    <property name="title" translatable="yes">Select Time Zone</property>
+    <property name="width-request">360</property>
+    <property name="height-request">300</property>
+    <property name="default-height">540</property>
+
+    <property name="content">
+      <object class="GtkBox">
+        <property name="orientation">vertical</property>
+
+        <child>
+          <object class="AdwHeaderBar">
+            <property name="show-start-title-buttons">True</property>
+            <property name="show-end-title-buttons">True</property>
+          </object>
+        </child>
+
+        <!-- SearchBar -->
+        <child>
+          <object class="GtkSearchEntry" id="location_entry">
+            <property name="halign">center</property>
+            <property name="margin-top">6</property>
+            <property name="margin-bottom">6</property>
+            <property name="width-chars">24</property>
+            <signal name="search-changed" handler="tz_dialog_search_changed_cb" swapped="yes"/>
+          </object>
+        </child>
+
+        <child>
+          <object class="GtkStack" id="main_stack">
+            <property name="vexpand">True</property>
+
+            <child>
+              <object class="AdwStatusPage" id="empty_page">
+                <property name="margin-top">18</property>
+                <property name="title" translatable="yes">No Results</property>
+                <property name="icon-name">system-search-symbolic</property>
+              </object>
+            </child>
+
+            <child>
+              <object class="GtkScrolledWindow" id="tz_page">
+                <property name="hscrollbar-policy">never</property>
+                <property name="vexpand">True</property>
+                <child>
+                  <object class="AdwClampScrollable">
+                    <child>
+                      <object class="GtkListView" id="tz_view">
+                        <property name="show-separators">True</property>
+                        <property name="single-click-activate">True</property>
+                        <signal name="activate" handler="tz_dialog_row_activated_cb" swapped="yes"/>
+                        <style>
+                         /* fixme: 'boxed-list' gives nice rounded borders, but we can't use
+                          * it here as it works only with GtkListBox, not with GtkListView */
+                           <class name="frame"/>
+                        </style>
+                        <property name="factory">
+                          <object class="GtkBuilderListItemFactory">
+                            <property name="resource">/org/gnome/control-center/datetime/cc-tz-row.ui</property>
+                          </object>
+                        </property>
+                      </object>
+                    </child>
+                  </object>
+                </child>
+              </object>
+            </child>
+
+          </object>
+        </child>
+
+      </object>
+    </property>
+  </template>
+</interface>
diff -pruN 1:43.2-2/panels/datetime/cc-tz-item.c 1:44~alpha-0ubuntu1/panels/datetime/cc-tz-item.c
--- 1:43.2-2/panels/datetime/cc-tz-item.c	1970-01-01 00:00:00.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/datetime/cc-tz-item.c	2023-01-09 20:06:57.000000000 +0000
@@ -0,0 +1,285 @@
+/* -*- mode: c; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/*
+ * Copyright 2022 Purism SPC
+ * Copyright 2022 Mohammed Sadiq <sadiq@sadiqpk.org>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * Author(s):
+ *   Mohammed Sadiq <sadiq@sadiqpk.org>
+ *
+ * SPDX-License-Identifier: GPL-3.0-or-later
+ */
+
+#undef G_LOG_DOMAIN
+#define G_LOG_DOMAIN "cc-tz-item"
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <glib/gi18n.h>
+#define GNOME_DESKTOP_USE_UNSTABLE_API
+#include <libgnome-desktop/gnome-languages.h>
+#include <libgnome-desktop/gnome-wall-clock.h>
+
+#include "cc-tz-item.h"
+
+#define DEFAULT_TZ "Europe/London"
+#define GETTEXT_PACKAGE_TIMEZONES GETTEXT_PACKAGE "-timezones"
+
+struct _CcTzItem
+{
+  GObject         parent_instance;
+
+  GSettings      *desktop_settings;
+  GTimeZone      *tz;
+  GnomeWallClock *wall_clock;
+
+  TzLocation     *tz_location;
+  TzInfo         *tz_info;
+
+  char           *name;
+  char           *country;
+  char           *time;
+  char           *offset;    /* eg: UTC+530 */
+  char           *zone;
+};
+
+G_DEFINE_TYPE (CcTzItem, cc_tz_item, G_TYPE_OBJECT)
+
+enum {
+  PROP_0,
+  PROP_COUNTRY,
+  PROP_NAME,
+  PROP_OFFSET,
+  PROP_TIME,
+  PROP_ZONE,
+  N_PROPS
+};
+
+static GParamSpec *properties[N_PROPS];
+
+/* Adapted from cc-datetime-panel.c */
+static void
+generate_city_name (CcTzItem   *self,
+                    TzLocation *loc)
+{
+  g_auto(GStrv) split_translated = NULL;
+  gint length;
+
+  /* Load the translation for it */
+  self->zone = g_strdup (dgettext (GETTEXT_PACKAGE_TIMEZONES, loc->zone));
+  g_strdelimit (self->zone, "_", ' ');
+  split_translated = g_regex_split_simple ("[\\x{2044}\\x{2215}\\x{29f8}\\x{ff0f}/]",
+                                           self->zone,
+                                           0, 0);
+
+  length = g_strv_length (split_translated);
+  self->country = gnome_get_country_from_code (loc->country, NULL);
+  self->name = g_strdup (split_translated[length-1]);
+}
+
+static const char *
+tz_item_get_time (CcTzItem *self)
+{
+  g_autoptr(GDateTime) now = NULL;
+  GDesktopClockFormat format;
+
+  g_assert (CC_IS_TZ_ITEM (self));
+
+  if (self->time)
+    return self->time;
+
+  now = g_date_time_new_now (self->tz);
+  format = g_settings_get_enum (self->desktop_settings, "clock-format");
+
+  self->time = gnome_wall_clock_string_for_datetime (self->wall_clock, now, format, TRUE, FALSE, FALSE);
+
+  return self->time;
+}
+
+static void
+tz_item_clock_changed_cb (CcTzItem *self)
+{
+  gboolean had_time;
+
+  g_assert (CC_IS_TZ_ITEM (self));
+
+  had_time = !!self->time;
+
+  /* Clear the time, so that it'll be re-created when asked for one */
+  g_clear_pointer (&self->time, g_free);
+
+  if (had_time)
+    g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_TIME]);
+}
+
+static void
+cc_tz_item_get_property (GObject    *object,
+                         guint       prop_id,
+                         GValue     *value,
+                         GParamSpec *pspec)
+{
+  CcTzItem *self = (CcTzItem *)object;
+
+  switch (prop_id)
+    {
+    case PROP_COUNTRY:
+      g_value_set_string (value, self->country);
+      break;
+
+    case PROP_NAME:
+      g_value_set_string (value, self->name);
+      break;
+
+    case PROP_OFFSET:
+      g_value_set_string (value, self->offset);
+      break;
+
+    case PROP_TIME:
+      g_value_set_string (value, tz_item_get_time (self));
+      break;
+
+    case PROP_ZONE:
+      g_value_set_string (value, self->zone);
+      break;
+
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+    }
+}
+
+static void
+cc_tz_item_finalize (GObject *object)
+{
+  CcTzItem *self = (CcTzItem *)object;
+
+  g_clear_object (&self->desktop_settings);
+  g_clear_object (&self->wall_clock);
+
+  g_clear_pointer (&self->tz, g_time_zone_unref);
+  g_clear_pointer (&self->tz_info, tz_info_free);
+
+  g_clear_pointer (&self->name, g_free);
+  g_clear_pointer (&self->country, g_free);
+  g_clear_pointer (&self->time, g_free);
+  g_clear_pointer (&self->offset, g_free);
+  g_clear_pointer (&self->zone, g_free);
+
+  G_OBJECT_CLASS (cc_tz_item_parent_class)->finalize (object);
+}
+
+static void
+cc_tz_item_class_init (CcTzItemClass *klass)
+{
+  GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+  object_class->get_property = cc_tz_item_get_property;
+  object_class->finalize = cc_tz_item_finalize;
+
+  properties[PROP_COUNTRY] =
+    g_param_spec_string ("country",
+                         "Timezone Country",
+                         "Timezone Country",
+                         NULL,
+                         G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
+
+  properties[PROP_NAME] =
+    g_param_spec_string ("name",
+                         "Timezone Name",
+                         "Timezone Name",
+                         NULL,
+                         G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
+
+  properties[PROP_OFFSET] =
+    g_param_spec_string ("offset",
+                         "Timezone offset",
+                         "Timezone offset",
+                         NULL,
+                         G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
+
+  properties[PROP_TIME] =
+    g_param_spec_string ("time",
+                         "Timezone time",
+                         "Timezone time",
+                         NULL,
+                         G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
+
+  properties[PROP_ZONE] =
+    g_param_spec_string ("zone",
+                         "Timezone zone",
+                         "Timezone zone",
+                         NULL,
+                         G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
+
+  g_object_class_install_properties (object_class, N_PROPS, properties);
+}
+
+static void
+cc_tz_item_init (CcTzItem *self)
+{
+  self->desktop_settings = g_settings_new ("org.gnome.desktop.interface");
+  self->wall_clock = gnome_wall_clock_new ();
+
+  g_signal_connect_object (self->wall_clock, "notify::clock",
+                           G_CALLBACK (tz_item_clock_changed_cb),
+                           self,
+                           G_CONNECT_SWAPPED);
+  g_signal_connect_object (self->desktop_settings, "changed::clock-format",
+                           G_CALLBACK (tz_item_clock_changed_cb),
+                           self,
+                           G_CONNECT_SWAPPED);
+}
+
+CcTzItem *
+cc_tz_item_new (TzLocation *location)
+{
+  CcTzItem *self;
+  GString *offset;
+
+  g_return_val_if_fail (location, NULL);
+
+  self = g_object_new (CC_TYPE_TZ_ITEM, NULL);
+  self->tz_location = location;
+  self->tz_info = tz_info_from_location (location);
+  generate_city_name (self, location);
+
+  self->tz = g_time_zone_new_offset (self->tz_info->utc_offset);
+
+  offset = g_string_new (g_time_zone_get_identifier (self->tz));
+  /* Strip the seconds, eg: +05:30:00 -> +05:30 */
+  g_string_set_size (offset, offset->len - 3);
+  /* eg: +05:30 -> +0530*/
+  g_string_replace (offset, ":", "", 0);
+
+  /* If the timezone is UTC remove the time, which will always be [+]0000 */
+  if (g_str_has_suffix (offset->str, "0000"))
+    g_string_set_size (offset, 0);
+
+  /* eg: +0530 -> UTC+0530 */
+  g_string_prepend (offset, "UTC");
+
+  self->offset = g_string_free (offset, FALSE);
+
+  return self;
+}
+
+TzLocation *
+cc_tz_item_get_location (CcTzItem *self)
+{
+  g_return_val_if_fail (CC_IS_TZ_ITEM (self), NULL);
+
+  return self->tz_location;
+}
diff -pruN 1:43.2-2/panels/datetime/cc-tz-item.h 1:44~alpha-0ubuntu1/panels/datetime/cc-tz-item.h
--- 1:43.2-2/panels/datetime/cc-tz-item.h	1970-01-01 00:00:00.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/datetime/cc-tz-item.h	2023-01-09 20:06:57.000000000 +0000
@@ -0,0 +1,40 @@
+/* -*- mode: c; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/*
+ * Copyright 2022 Purism SPC
+ * Copyright 2022 Mohammed Sadiq <sadiq@sadiqpk.org>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * Author(s):
+ *   Mohammed Sadiq <sadiq@sadiqpk.org>
+ *
+ * SPDX-License-Identifier: GPL-3.0-or-later
+ */
+
+#pragma once
+
+#include <glib-object.h>
+
+#include "tz.h"
+
+G_BEGIN_DECLS
+
+#define CC_TYPE_TZ_ITEM (cc_tz_item_get_type ())
+
+G_DECLARE_FINAL_TYPE (CcTzItem, cc_tz_item, CC, TZ_ITEM, GObject)
+
+CcTzItem   *cc_tz_item_new            (TzLocation *location);
+TzLocation *cc_tz_item_get_location   (CcTzItem *self);
+
+G_END_DECLS
diff -pruN 1:43.2-2/panels/datetime/cc-tz-row.ui 1:44~alpha-0ubuntu1/panels/datetime/cc-tz-row.ui
--- 1:43.2-2/panels/datetime/cc-tz-row.ui	1970-01-01 00:00:00.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/datetime/cc-tz-row.ui	2023-01-09 20:06:57.000000000 +0000
@@ -0,0 +1,129 @@
+<interface>
+  <template class="GtkListItem">
+    <property name="child">
+      <object class="GtkGrid">
+        <property name="margin-start">12</property>
+        <property name="margin-end">12</property>
+        <property name="margin-top">12</property>
+        <property name="margin-bottom">12</property>
+        <property name="row-spacing">6</property>
+        <property name="column-spacing">6</property>
+
+        <!-- Location -->
+        <child>
+          <object class="GtkLabel">
+            <property name="ellipsize">end</property>
+            <property name="xalign">0</property>
+            <style>
+              <class name="title"/>
+            </style>
+            <binding name="label">
+              <lookup name="name" type="CcTzItem">
+                <lookup name="item">GtkListItem</lookup>
+              </lookup>
+            </binding>
+            <layout>
+              <property name="column">0</property>
+              <property name="row">0</property>
+            </layout>
+          </object>
+        </child>
+
+        <!-- Country -->
+        <child>
+          <object class="GtkLabel">
+            <property name="hexpand">True</property>
+            <property name="ellipsize">end</property>
+            <property name="xalign">0</property>
+            <style>
+             <class name="heading"/>
+            </style>
+            <binding name="label">
+              <lookup name="country" type="CcTzItem">
+                <lookup name="item">GtkListItem</lookup>
+              </lookup>
+            </binding>
+            <layout>
+              <property name="column">1</property>
+              <property name="row">0</property>
+            </layout>
+          </object>
+        </child>
+
+        <child>
+          <object class="GtkBox">
+            <property name="spacing">3</property>
+            <style>
+             <class name="caption"/>
+             <class name="dim-label"/>
+            </style>
+            <layout>
+              <property name="column">0</property>
+              <property name="row">1</property>
+              <property name="column-span">2</property>
+            </layout>
+
+            <!-- Zone Name -->
+            <child>
+              <object class="GtkLabel">
+                <property name="xalign">0</property>
+                <binding name="label">
+                  <lookup name="zone" type="CcTzItem">
+                    <lookup name="item">GtkListItem</lookup>
+                  </lookup>
+                </binding>
+              </object>
+            </child>
+
+            <!-- Zone Name -->
+            <child>
+              <object class="GtkLabel">
+                <property name="margin-start">3</property>
+                <property name="margin-end">3</property>
+                <property name="label">•</property>
+              </object>
+            </child>
+
+            <!-- Offset from GMT -->
+            <child>
+              <object class="GtkLabel">
+                <property name="xalign">0</property>
+                <binding name="label">
+                  <lookup name="offset" type="CcTzItem">
+                    <lookup name="item">GtkListItem</lookup>
+                  </lookup>
+                </binding>
+              </object>
+            </child>
+
+          </object>
+        </child>
+
+        <!-- Current time for the given timezone -->
+        <child>
+          <object class="GtkLabel">
+            <property name="xalign">0</property>
+            <property name="halign">end</property>
+            <attributes>
+              <attribute name="font-features" value="tnum"/>
+            </attributes>
+            <style>
+              <class name="dim-label"/>
+            </style>
+            <binding name="label">
+              <lookup name="time" type="CcTzItem">
+                <lookup name="item">GtkListItem</lookup>
+              </lookup>
+            </binding>
+            <layout>
+              <property name="column">2</property>
+              <property name="row">0</property>
+              <property name="row-span">2</property>
+            </layout>
+          </object>
+        </child>
+
+      </object>
+    </property>
+  </template>
+</interface>
Binary files 1:43.2-2/panels/datetime/data/bg_dim.png and 1:44~alpha-0ubuntu1/panels/datetime/data/bg_dim.png differ
Binary files 1:43.2-2/panels/datetime/data/bg.png and 1:44~alpha-0ubuntu1/panels/datetime/data/bg.png differ
Binary files 1:43.2-2/panels/datetime/data/pin.png and 1:44~alpha-0ubuntu1/panels/datetime/data/pin.png differ
diff -pruN 1:43.2-2/panels/datetime/datetime.gresource.xml 1:44~alpha-0ubuntu1/panels/datetime/datetime.gresource.xml
--- 1:43.2-2/panels/datetime/datetime.gresource.xml	2022-12-23 11:11:35.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/datetime/datetime.gresource.xml	2023-01-09 20:06:57.000000000 +0000
@@ -2,9 +2,9 @@
 <gresources>
   <gresource prefix="/org/gnome/control-center/datetime">
     <file preprocess="xml-stripblanks">cc-datetime-panel.ui</file>
+    <file preprocess="xml-stripblanks">cc-month-row.ui</file>
+    <file preprocess="xml-stripblanks">cc-tz-dialog.ui</file>
+    <file preprocess="xml-stripblanks">cc-tz-row.ui</file>
     <file>backward</file>
-    <file alias="bg.png">data/bg.png</file>
-    <file alias="bg_dim.png">data/bg_dim.png</file>
-    <file alias="pin.png">data/pin.png</file>
   </gresource>
 </gresources>
diff -pruN 1:43.2-2/panels/datetime/gnome-datetime-panel.desktop.in 1:44~alpha-0ubuntu1/panels/datetime/gnome-datetime-panel.desktop.in
--- 1:43.2-2/panels/datetime/gnome-datetime-panel.desktop.in	1970-01-01 00:00:00.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/datetime/gnome-datetime-panel.desktop.in	2023-01-09 20:06:57.000000000 +0000
@@ -0,0 +1,16 @@
+[Desktop Entry]
+Name=Date & Time
+Comment=Change the date and time, including time zone
+Exec=gnome-control-center datetime
+# Translators: Do NOT translate or transliterate this text (this is an icon file name)!
+Icon=org.gnome.Settings-time-symbolic
+Terminal=false
+Type=Application
+NoDisplay=true
+StartupNotify=true
+Categories=GNOME;GTK;Settings;X-GNOME-Settings-Panel;X-GNOME-DetailsSettings;
+OnlyShowIn=GNOME;
+# Translators: Search terms to find the Date and Time panel. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon!
+Keywords=Clock;Timezone;Location;
+# Notifications are emitted by gnome-settings-daemon
+X-GNOME-UsesNotifications=true
diff -pruN 1:43.2-2/panels/datetime/gnome-datetime-panel.desktop.in.in 1:44~alpha-0ubuntu1/panels/datetime/gnome-datetime-panel.desktop.in.in
--- 1:43.2-2/panels/datetime/gnome-datetime-panel.desktop.in.in	2022-12-23 11:11:35.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/datetime/gnome-datetime-panel.desktop.in.in	1970-01-01 00:00:00.000000000 +0000
@@ -1,16 +0,0 @@
-[Desktop Entry]
-Name=Date & Time
-Comment=Change the date and time, including time zone
-Exec=gnome-control-center datetime
-# Translators: Do NOT translate or transliterate this text (this is an icon file name)!
-Icon=org.gnome.Settings-time-symbolic
-Terminal=false
-Type=Application
-NoDisplay=true
-StartupNotify=true
-Categories=GNOME;GTK;Settings;X-GNOME-Settings-Panel;X-GNOME-DetailsSettings;
-OnlyShowIn=GNOME;
-# Translators: Search terms to find the Date and Time panel. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon!
-Keywords=Clock;Timezone;Location;
-# Notifications are emitted by gnome-settings-daemon
-X-GNOME-UsesNotifications=true
diff -pruN 1:43.2-2/panels/datetime/meson.build 1:44~alpha-0ubuntu1/panels/datetime/meson.build
--- 1:43.2-2/panels/datetime/meson.build	2022-12-23 11:11:35.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/datetime/meson.build	2023-01-09 20:06:57.000000000 +0000
@@ -1,15 +1,9 @@
 panels_list += cappletname
 desktop = 'gnome-@0@-panel.desktop'.format(cappletname)
 
-desktop_in = configure_file(
-  input: desktop + '.in.in',
-  output: desktop + '.in',
-  configuration: desktop_conf
-)
-
 i18n.merge_file(
   type: 'desktop',
-  input: desktop_in,
+  input: desktop + '.in',
   output: desktop,
   po_dir: po_dir,
   install: true,
@@ -27,11 +21,10 @@ i18n.merge_file(
 )
 
 resource_data = files(
-  'data/bg_dim.png',
-  'data/bg.png',
-  'data/pin.png',
   'backward',
   'cc-datetime-panel.ui',
+  'cc-tz-dialog.ui',
+  'cc-tz-row.ui',
 )
 
 resources = gnome.compile_resources(
@@ -44,7 +37,8 @@ resources = gnome.compile_resources(
 
 sources = files(
   'cc-datetime-panel.c',
-  'cc-timezone-map.c',
+  'cc-tz-item.c',
+  'cc-tz-dialog.c',
   'date-endian.c',
   'tz.c'
 )
diff -pruN 1:43.2-2/panels/default-apps/cc-default-apps-panel.c 1:44~alpha-0ubuntu1/panels/default-apps/cc-default-apps-panel.c
--- 1:43.2-2/panels/default-apps/cc-default-apps-panel.c	2022-12-23 11:11:35.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/default-apps/cc-default-apps-panel.c	2023-01-09 20:06:57.000000000 +0000
@@ -20,10 +20,15 @@
  */
 
 #include <config.h>
+#ifdef BUILD_WWAN
+#include <libmm-glib.h>
+#endif
 
 #include "cc-default-apps-panel.h"
 #include "cc-default-apps-resources.h"
 
+#include "shell/cc-object-storage.h"
+
 typedef struct
 {
   const char *content_type;
@@ -46,6 +51,12 @@ struct _CcDefaultAppsPanel
   GtkWidget *music_label;
   GtkWidget *video_label;
   GtkWidget *photos_label;
+  GtkWidget *calls_label;
+  GtkWidget *sms_label;
+
+#ifdef BUILD_WWAN
+  MMManager *mm_manager;
+#endif
 };
 
 
@@ -125,8 +136,8 @@ default_app_changed (CcDefaultAppsPanel
 static void
 info_panel_setup_default_app (CcDefaultAppsPanel *self,
                               DefaultAppData     *data,
-                              guint               left_attach,
-                              guint               top_attach)
+                              guint               column,
+                              guint               row)
 {
   GtkWidget *button;
   GtkWidget *label;
@@ -135,13 +146,14 @@ info_panel_setup_default_app (CcDefaultA
   g_object_set_data (G_OBJECT (button), "cc-default-app-data", data);
 
   gtk_app_chooser_button_set_show_default_item (GTK_APP_CHOOSER_BUTTON (button), TRUE);
-  gtk_grid_attach (GTK_GRID (self->default_apps_grid), button, left_attach, top_attach,
-                   1, 1);
+  gtk_grid_attach (GTK_GRID (self->default_apps_grid), button, column, row, 1, 1);
   g_signal_connect_object (G_OBJECT (button), "changed",
                            G_CALLBACK (default_app_changed), self, G_CONNECT_SWAPPED);
 
   label = WIDGET_FROM_OFFSET (data->label_offset);
   gtk_label_set_mnemonic_widget (GTK_LABEL (label), button);
+
+  g_object_bind_property (G_OBJECT (label), "visible", G_OBJECT (button), "visible", G_BINDING_SYNC_CREATE);
 }
 
 static DefaultAppData preferred_app_infos[] = {
@@ -150,7 +162,9 @@ static DefaultAppData preferred_app_info
   { "text/calendar", OFFSET (calendar_label), NULL },
   { "audio/x-vorbis+ogg", OFFSET (music_label), "audio/*" },
   { "video/x-ogm+ogg", OFFSET (video_label), "video/*" },
-  { "image/jpeg", OFFSET (photos_label), "image/*" }
+  { "image/jpeg", OFFSET (photos_label), "image/*" },
+  { "x-scheme-handler/tel", OFFSET(calls_label), NULL},
+  { "x-scheme-handler/sms", OFFSET(sms_label), NULL},
 };
 
 static void
@@ -165,6 +179,35 @@ info_panel_setup_default_apps (CcDefault
     }
 }
 
+#ifdef BUILD_WWAN
+static void
+update_modem_apps_visibility (CcDefaultAppsPanel *self)
+{
+  GList *devices;
+  GtkWidget *calls_button;
+  GtkWidget *sms_button;
+  int count, row;
+  gboolean visible;
+
+  devices = g_dbus_object_manager_get_objects (G_DBUS_OBJECT_MANAGER (self->mm_manager));
+  count = g_list_length (devices);
+
+  gtk_grid_query_child (GTK_GRID (self->default_apps_grid), self->calls_label, NULL, &row, NULL, NULL);
+  calls_button = gtk_grid_get_child_at (GTK_GRID (self->default_apps_grid), 1, row);
+
+  gtk_grid_query_child (GTK_GRID (self->default_apps_grid), self->sms_label, NULL, &row, NULL, NULL);
+  sms_button = gtk_grid_get_child_at (GTK_GRID (self->default_apps_grid), 1, row);
+
+  visible = count > 0;
+  gtk_widget_set_visible (self->calls_label, visible);
+  gtk_widget_set_visible (self->sms_label, visible);
+  gtk_widget_set_visible (calls_button, visible);
+  gtk_widget_set_visible (sms_button, visible);
+
+  g_list_free_full (devices, (GDestroyNotify)g_object_unref);
+}
+#endif
+
 static void
 cc_default_apps_panel_class_init (CcDefaultAppsPanelClass *klass)
 {
@@ -178,6 +221,8 @@ cc_default_apps_panel_class_init (CcDefa
   gtk_widget_class_bind_template_child (widget_class, CcDefaultAppsPanel, music_label);
   gtk_widget_class_bind_template_child (widget_class, CcDefaultAppsPanel, video_label);
   gtk_widget_class_bind_template_child (widget_class, CcDefaultAppsPanel, photos_label);
+  gtk_widget_class_bind_template_child (widget_class, CcDefaultAppsPanel, calls_label);
+  gtk_widget_class_bind_template_child (widget_class, CcDefaultAppsPanel, sms_label);
 }
 
 static void
@@ -188,6 +233,20 @@ cc_default_apps_panel_init (CcDefaultApp
   gtk_widget_init_template (GTK_WIDGET (self));
 
   info_panel_setup_default_apps (self);
+
+#ifdef BUILD_WWAN
+  if (cc_object_storage_has_object ("CcObjectStorage::mm-manager"))
+    {
+      self->mm_manager = cc_object_storage_get_object ("CcObjectStorage::mm-manager");
+
+      g_signal_connect_swapped (self->mm_manager, "object-added",
+                                G_CALLBACK (update_modem_apps_visibility), self);
+      g_signal_connect_swapped (self->mm_manager, "object-removed",
+                                G_CALLBACK (update_modem_apps_visibility), self);
+
+      update_modem_apps_visibility (self);
+    }
+#endif
 }
 
 GtkWidget *
diff -pruN 1:43.2-2/panels/default-apps/cc-default-apps-panel.ui 1:44~alpha-0ubuntu1/panels/default-apps/cc-default-apps-panel.ui
--- 1:43.2-2/panels/default-apps/cc-default-apps-panel.ui	2022-12-23 11:11:35.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/default-apps/cc-default-apps-panel.ui	2023-01-09 20:06:57.000000000 +0000
@@ -84,57 +84,27 @@
               </object>
             </child>
             <child>
-              <object class="GtkLabel" id="label25">
-                <property name="label">    </property>
-                <layout>
-                  <property name="column">2</property>
-                  <property name="row">0</property>
-                </layout>
-              </object>
-            </child>
-            <child>
-              <object class="GtkLabel" id="label26">
-                <property name="label">    </property>
-                <layout>
-                  <property name="column">2</property>
-                  <property name="row">1</property>
-                </layout>
-              </object>
-            </child>
-            <child>
-              <object class="GtkLabel" id="label27">
-                <property name="label">    </property>
-                <layout>
-                  <property name="column">2</property>
-                  <property name="row">2</property>
-                </layout>
-              </object>
-            </child>
-            <child>
-              <object class="GtkLabel" id="label28">
-                <property name="label">    </property>
-                <layout>
-                  <property name="column">2</property>
-                  <property name="row">3</property>
-                </layout>
-              </object>
-            </child>
-            <child>
-              <object class="GtkLabel" id="label29">
-                <property name="label">    </property>
+              <object class="GtkLabel" id="photos_label">
+                <property name="xalign">1</property>
+                <property name="label" translatable="yes">_Photos</property>
+                <property name="use_underline">True</property>
                 <layout>
-                  <property name="column">2</property>
-                  <property name="row">4</property>
+                  <property name="row">5</property>
+                  <property name="column">0</property>
                 </layout>
+                <style>
+                 <class name="dim-label"/>
+                </style>
               </object>
             </child>
             <child>
-              <object class="GtkLabel" id="photos_label">
+              <object class="GtkLabel" id="calls_label">
                 <property name="xalign">1</property>
-                <property name="label" translatable="yes">_Photos</property>
+                <property name="label" translatable="yes">Ca_lls</property>
                 <property name="use_underline">True</property>
+                <property name="visible">False</property>
                 <layout>
-                  <property name="row">5</property>
+                  <property name="row">6</property>
                   <property name="column">0</property>
                 </layout>
                 <style>
@@ -143,12 +113,18 @@
               </object>
             </child>
             <child>
-              <object class="GtkLabel" id="label33">
-                <property name="label">    </property>
+              <object class="GtkLabel" id="sms_label">
+                <property name="xalign">1</property>
+                <property name="label" translatable="yes">_SMS</property>
+                <property name="use_underline">True</property>
+                <property name="visible">False</property>
                 <layout>
-                  <property name="column">2</property>
-                  <property name="row">5</property>
+                  <property name="row">7</property>
+                  <property name="column">0</property>
                 </layout>
+                <style>
+                 <class name="dim-label"/>
+                </style>
               </object>
             </child>
           </object>
diff -pruN 1:43.2-2/panels/default-apps/gnome-default-apps-panel.desktop.in 1:44~alpha-0ubuntu1/panels/default-apps/gnome-default-apps-panel.desktop.in
--- 1:43.2-2/panels/default-apps/gnome-default-apps-panel.desktop.in	1970-01-01 00:00:00.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/default-apps/gnome-default-apps-panel.desktop.in	2023-01-09 20:06:57.000000000 +0000
@@ -0,0 +1,14 @@
+[Desktop Entry]
+Name=Default Applications
+Comment=Configure Default Applications
+Exec=gnome-control-center default-apps
+# Translators: Do NOT translate or transliterate this text (this is an icon file name)!
+Icon=org.gnome.Settings-default-apps-symbolic
+Terminal=false
+Type=Application
+NoDisplay=true
+StartupNotify=true
+Categories=GNOME;GTK;Settings;X-GNOME-Settings-Panel;X-GNOME-DetailsSettings;
+OnlyShowIn=GNOME;Unity;
+# Translators: Search terms to find the Default Applications panel. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon!
+Keywords=default;application;preferred;media;
diff -pruN 1:43.2-2/panels/default-apps/gnome-default-apps-panel.desktop.in.in 1:44~alpha-0ubuntu1/panels/default-apps/gnome-default-apps-panel.desktop.in.in
--- 1:43.2-2/panels/default-apps/gnome-default-apps-panel.desktop.in.in	2022-12-23 11:11:35.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/default-apps/gnome-default-apps-panel.desktop.in.in	1970-01-01 00:00:00.000000000 +0000
@@ -1,18 +0,0 @@
-[Desktop Entry]
-Name=Default Applications
-Comment=Configure Default Applications
-Exec=gnome-control-center default-apps
-# Translators: Do NOT translate or transliterate this text (this is an icon file name)!
-Icon=org.gnome.Settings-default-apps-symbolic
-Terminal=false
-Type=Application
-NoDisplay=true
-StartupNotify=true
-Categories=GNOME;GTK;Settings;X-GNOME-Settings-Panel;X-GNOME-DetailsSettings;
-OnlyShowIn=GNOME;Unity;
-X-GNOME-Bugzilla-Bugzilla=GNOME
-X-GNOME-Bugzilla-Product=gnome-control-center
-X-GNOME-Bugzilla-Component=info
-X-GNOME-Bugzilla-Version=@VERSION@
-# Translators: Search terms to find the Default Applications panel. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon!
-Keywords=default;application;preferred;media;
diff -pruN 1:43.2-2/panels/default-apps/meson.build 1:44~alpha-0ubuntu1/panels/default-apps/meson.build
--- 1:43.2-2/panels/default-apps/meson.build	2022-12-23 11:11:35.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/default-apps/meson.build	2023-01-09 20:06:57.000000000 +0000
@@ -1,15 +1,14 @@
 panels_list += cappletname
 desktop = 'gnome-@0@-panel.desktop'.format(cappletname)
 
-desktop_in = configure_file(
-  input: desktop + '.in.in',
-  output: desktop + '.in',
-  configuration: desktop_conf
-)
+deps = common_deps
+if host_is_linux
+  deps += mm_dep
+endif
 
 i18n.merge_file(
   type: 'desktop',
-  input: desktop_in,
+  input: desktop + '.in',
   output: desktop,
   po_dir: po_dir,
   install: true,
@@ -36,7 +35,7 @@ panels_libs += static_library(
   cappletname,
   sources: sources,
   include_directories: [ top_inc, common_inc ],
-  dependencies: common_deps,
+  dependencies: deps,
   c_args: cflags
 )
 
diff -pruN 1:43.2-2/panels/diagnostics/gnome-diagnostics-panel.desktop.in 1:44~alpha-0ubuntu1/panels/diagnostics/gnome-diagnostics-panel.desktop.in
--- 1:43.2-2/panels/diagnostics/gnome-diagnostics-panel.desktop.in	1970-01-01 00:00:00.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/diagnostics/gnome-diagnostics-panel.desktop.in	2023-01-09 20:06:57.000000000 +0000
@@ -0,0 +1,15 @@
+[Desktop Entry]
+Name=Diagnostics
+Comment=Report your problems
+Exec=gnome-control-center diagnostics
+# FIXME
+# Translators: Do NOT translate or transliterate this text (this is an icon file name)!
+Icon=org.gnome.Settings-diagnostics-symbolic
+Terminal=false
+Type=Application
+NoDisplay=true
+StartupNotify=true
+Categories=GNOME;GTK;Settings;DesktopSettings;X-GNOME-Settings-Panel;X-GNOME-PrivacySettings;
+OnlyShowIn=GNOME;Unity;
+# Translators: Search terms to find the Diagnostics panel. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon!
+Keywords=diagnostics;crash;
diff -pruN 1:43.2-2/panels/diagnostics/gnome-diagnostics-panel.desktop.in.in 1:44~alpha-0ubuntu1/panels/diagnostics/gnome-diagnostics-panel.desktop.in.in
--- 1:43.2-2/panels/diagnostics/gnome-diagnostics-panel.desktop.in.in	2022-12-23 11:11:35.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/diagnostics/gnome-diagnostics-panel.desktop.in.in	1970-01-01 00:00:00.000000000 +0000
@@ -1,19 +0,0 @@
-[Desktop Entry]
-Name=Diagnostics
-Comment=Report your problems
-Exec=gnome-control-center diagnostics
-# FIXME
-# Translators: Do NOT translate or transliterate this text (this is an icon file name)!
-Icon=org.gnome.Settings-diagnostics-symbolic
-Terminal=false
-Type=Application
-NoDisplay=true
-StartupNotify=true
-Categories=GNOME;GTK;Settings;DesktopSettings;X-GNOME-Settings-Panel;X-GNOME-PrivacySettings;
-OnlyShowIn=GNOME;Unity;
-X-GNOME-Bugzilla-Bugzilla=GNOME
-X-GNOME-Bugzilla-Product=gnome-control-center
-X-GNOME-Bugzilla-Component=privacy
-X-GNOME-Bugzilla-Version=@VERSION@
-# Translators: Search terms to find the Diagnostics panel. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon!
-Keywords=diagnostics;crash;
diff -pruN 1:43.2-2/panels/diagnostics/meson.build 1:44~alpha-0ubuntu1/panels/diagnostics/meson.build
--- 1:43.2-2/panels/diagnostics/meson.build	2022-12-23 11:11:35.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/diagnostics/meson.build	2023-01-09 20:06:57.000000000 +0000
@@ -1,15 +1,9 @@
 panels_list += cappletname
 desktop = 'gnome-@0@-panel.desktop'.format(cappletname)
 
-desktop_in = configure_file(
-  input: desktop + '.in.in',
-  output: desktop + '.in',
-  configuration: desktop_conf
-)
-
 i18n.merge_file(
   type: 'desktop',
-  input: desktop_in,
+  input: desktop + '.in',
   output: desktop,
   po_dir: po_dir,
   install: true,
diff -pruN 1:43.2-2/panels/display/cc-display-config-dbus.c 1:44~alpha-0ubuntu1/panels/display/cc-display-config-dbus.c
--- 1:43.2-2/panels/display/cc-display-config-dbus.c	2022-12-23 11:11:35.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/display/cc-display-config-dbus.c	2023-01-09 20:06:57.000000000 +0000
@@ -1680,6 +1680,8 @@ construct_monitors (CcDisplayConfigDBus
                                  self, G_CONNECT_SWAPPED);
     }
 
+  self->monitors = g_list_reverse (self->monitors);
+
   while (TRUE)
     {
       g_autoptr(GVariant) variant = NULL;
diff -pruN 1:43.2-2/panels/display/cc-display-panel.c 1:44~alpha-0ubuntu1/panels/display/cc-display-panel.c
--- 1:43.2-2/panels/display/cc-display-panel.c	2022-12-23 11:11:35.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/display/cc-display-panel.c	2023-01-09 20:06:57.000000000 +0000
@@ -29,6 +29,7 @@
 #include "shell/cc-object-storage.h"
 #include <libupower-glib/upower.h>
 
+#include "cc-list-row.h"
 #include "cc-display-config-manager-dbus.h"
 #include "cc-display-config.h"
 #include "cc-display-arrangement.h"
@@ -74,7 +75,7 @@ struct _CcDisplayPanel
   guint           focus_id;
 
   CcNightLightPage *night_light_page;
-  GtkLabel *night_light_state_label;
+  CcListRow        *night_light_row;
 
   UpClient *up_client;
   gboolean lid_is_closed;
@@ -400,7 +401,7 @@ reset_titlebar (CcDisplayPanel *self)
 {
   gtk_event_controller_set_propagation_phase (GTK_EVENT_CONTROLLER (self->toplevel_shortcuts),
                                               GTK_PHASE_NONE);
-  gtk_widget_hide (self->apply_titlebar);
+  gtk_widget_set_visible (self->apply_titlebar, FALSE);
 }
 
 static void
@@ -489,9 +490,9 @@ on_night_light_enabled_changed_cb (GSett
                                    CcDisplayPanel *self)
 {
   if (g_settings_get_boolean (self->display_settings, "night-light-enabled"))
-    gtk_label_set_label (self->night_light_state_label, _("On"));
+    cc_list_row_set_secondary_label (self->night_light_row, _("On"));
   else
-    gtk_label_set_label (self->night_light_state_label, _("Off"));
+    cc_list_row_set_secondary_label (self->night_light_row, _("Off"));
 }
 
 static void
@@ -595,7 +596,7 @@ cc_display_panel_class_init (CcDisplayPa
   gtk_widget_class_bind_template_child (widget_class, CcDisplayPanel, escape_shortcut);
   gtk_widget_class_bind_template_child (widget_class, CcDisplayPanel, leaflet);
   gtk_widget_class_bind_template_child (widget_class, CcDisplayPanel, night_light_page);
-  gtk_widget_class_bind_template_child (widget_class, CcDisplayPanel, night_light_state_label);
+  gtk_widget_class_bind_template_child (widget_class, CcDisplayPanel, night_light_row);
   gtk_widget_class_bind_template_child (widget_class, CcDisplayPanel, primary_display_row);
   gtk_widget_class_bind_template_child (widget_class, CcDisplayPanel, single_display_settings_group);
   gtk_widget_class_bind_template_child (widget_class, CcDisplayPanel, toplevel_shortcuts);
@@ -696,7 +697,7 @@ move_display_settings_to_main_page (CcDi
                              GTK_WIDGET (self->settings));
   g_object_unref (self->settings);
 
-  gtk_widget_show (GTK_WIDGET (self->single_display_settings_group));
+  gtk_widget_set_visible (GTK_WIDGET (self->single_display_settings_group), TRUE);
 }
 
 static void
@@ -714,7 +715,7 @@ move_display_settings_to_separate_page (
                      GTK_WIDGET (self->settings));
   g_object_unref (self->settings);
 
-  gtk_widget_hide (GTK_WIDGET (self->single_display_settings_group));
+  gtk_widget_set_visible (GTK_WIDGET (self->single_display_settings_group), FALSE);
 }
 
 static void
@@ -921,7 +922,7 @@ on_screen_changed (CcDisplayPanel *panel
 static void
 show_apply_titlebar (CcDisplayPanel *panel, gboolean is_applicable)
 {
-  gtk_widget_show (panel->apply_titlebar);
+  gtk_widget_set_visible (panel->apply_titlebar, TRUE);
   gtk_widget_set_sensitive (panel->apply_button, is_applicable);
 
   if (is_applicable)
diff -pruN 1:43.2-2/panels/display/cc-display-panel.ui 1:44~alpha-0ubuntu1/panels/display/cc-display-panel.ui
--- 1:43.2-2/panels/display/cc-display-panel.ui	2022-12-23 11:11:35.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/display/cc-display-panel.ui	2023-01-09 20:06:57.000000000 +0000
@@ -172,23 +172,11 @@
                         <child>
                           <object class="AdwPreferencesGroup">
                             <child>
-                              <object class="AdwActionRow">
+                              <object class="CcListRow" id="night_light_row">
                                 <property name="activatable">True</property>
                                 <property name="title" translatable="yes" comments="This is the redshift functionality where we suppress blue light when the sun has gone down">Night Light</property>
+                                <property name="show-arrow">True</property>
                                 <signal name="activated" handler="on_night_light_row_activated_cb" object="CcDisplayPanel" swapped="no" />
-
-                                <child type="suffix">
-                                  <object class="GtkLabel" id="night_light_state_label">
-                                    <property name="label">On</property>
-                                  </object>
-                                </child>
-
-                                <child type="suffix">
-                                  <object class="GtkImage">
-                                    <property name="icon-name">go-next-symbolic</property>
-                                  </object>
-                                </child>
-
                               </object>
                             </child>
                           </object>
diff -pruN 1:43.2-2/panels/display/cc-night-light-page.c 1:44~alpha-0ubuntu1/panels/display/cc-night-light-page.c
--- 1:43.2-2/panels/display/cc-night-light-page.c	2022-12-23 11:11:35.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/display/cc-night-light-page.c	2023-01-09 20:06:57.000000000 +0000
@@ -40,6 +40,7 @@ struct _CcNightLightPage {
   GtkButton           *button_to_am;
   GtkButton           *button_to_pm;
   GtkWidget           *infobar_unsupported;
+  GtkWidget           *infobar_unsupported_description;
   GtkWidget           *infobar_disabled;
   GtkListBox          *listbox;
   GtkWidget           *scale_color_temperature;
@@ -125,6 +126,49 @@ dialog_adjustments_set_frac_hours (CcNig
   gtk_stack_set_visible_child (stack, is_pm ? GTK_WIDGET (button_pm) : GTK_WIDGET (button_am));
 }
 
+static gboolean
+is_virtualized ()
+{
+  g_autoptr(GDBusConnection) connection = NULL;
+  g_autoptr(GError) error = NULL;
+  g_autoptr(GVariant) variant = NULL;
+  g_autoptr(GVariant) chassis_variant = NULL;
+  const gchar *chassis_type;
+
+  connection = g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, &error);
+  if (!connection)
+    {
+      g_warning ("System bus not available: %s", error->message);
+
+      return FALSE;
+    }
+
+  variant = g_dbus_connection_call_sync (connection,
+                                         "org.freedesktop.hostname1",
+                                         "/org/freedesktop/hostname1",
+                                         "org.freedesktop.DBus.Properties",
+                                         "Get",
+                                         g_variant_new ("(ss)",
+                                                        "org.freedesktop.hostname1",
+                                                        "Chassis"),
+                                         NULL,
+                                         G_DBUS_CALL_FLAGS_NONE,
+                                         -1,
+                                         NULL,
+                                         &error);
+  if (!variant)
+   {
+     g_warning ("Cannot get org.freedesktop.hostname1.Chassis: %s", error->message);
+
+     return FALSE;
+   }
+
+   g_variant_get (variant, "(v)", &chassis_variant);
+   chassis_type = g_variant_get_string (chassis_variant, NULL);
+
+   return (g_strcmp0 (chassis_type, "vm") == 0);
+}
+
 static void
 dialog_update_state (CcNightLightPage *self)
 {
@@ -218,6 +262,12 @@ dialog_update_state (CcNightLightPage *s
       gtk_widget_set_visible (self->infobar_unsupported, TRUE);
       gtk_widget_set_visible (self->infobar_disabled, FALSE);
       gtk_widget_set_sensitive (self->night_light_settings, FALSE);
+
+      if (is_virtualized ())
+        {
+          gtk_label_set_text (GTK_LABEL (self->infobar_unsupported_description),
+                              _("Night Light cannot be used from a virtual machine."));
+        }
     }
 }
 
@@ -612,6 +662,7 @@ cc_night_light_page_class_init (CcNightL
   gtk_widget_class_bind_template_child (widget_class, CcNightLightPage, button_to_am);
   gtk_widget_class_bind_template_child (widget_class, CcNightLightPage, button_to_pm);
   gtk_widget_class_bind_template_child (widget_class, CcNightLightPage, infobar_unsupported);
+  gtk_widget_class_bind_template_child (widget_class, CcNightLightPage, infobar_unsupported_description);
   gtk_widget_class_bind_template_child (widget_class, CcNightLightPage, infobar_disabled);
   gtk_widget_class_bind_template_child (widget_class, CcNightLightPage, listbox);
   gtk_widget_class_bind_template_child (widget_class, CcNightLightPage, night_light_toggle_switch);
diff -pruN 1:43.2-2/panels/display/cc-night-light-page.ui 1:44~alpha-0ubuntu1/panels/display/cc-night-light-page.ui
--- 1:43.2-2/panels/display/cc-night-light-page.ui	2022-12-23 11:11:35.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/display/cc-night-light-page.ui	2023-01-09 20:06:57.000000000 +0000
@@ -13,21 +13,23 @@
               <object class="GtkBox">
                 <property name="orientation">vertical</property>
                 <property name="hexpand">True</property>
-                <property name="spacing">16</property>
+                <property name="margin-top">10</property>
+                <property name="margin-bottom">10</property>
+                <property name="margin-start">10</property>
+                <property name="margin-end">10</property>
+                <property name="spacing">10</property>
                 <child>
                   <object class="GtkLabel">
                     <property name="halign">start</property>
-                    <property name="margin-start">6</property>
                     <property name="hexpand">False</property>
-                    <property name="label" translatable="yes">Night Light unavailable</property>
+                    <property name="label" translatable="yes">Night Light Unavailable</property>
                     <attributes>
                       <attribute name="weight" value="bold"/>
                     </attributes>
                   </object>
                 </child>
                 <child>
-                  <object class="GtkLabel">
-                    <property name="margin-start">6</property>
+                  <object class="GtkLabel" id="infobar_unsupported_description">
                     <property name="label" translatable="yes">This could be the result of the graphics driver being used, or the desktop being used remotely</property>
                     <property name="wrap">True</property>
                     <property name="xalign">0.0</property>
diff -pruN 1:43.2-2/panels/display/gnome-display-panel.desktop.in 1:44~alpha-0ubuntu1/panels/display/gnome-display-panel.desktop.in
--- 1:43.2-2/panels/display/gnome-display-panel.desktop.in	1970-01-01 00:00:00.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/display/gnome-display-panel.desktop.in	2023-01-09 20:06:57.000000000 +0000
@@ -0,0 +1,14 @@
+[Desktop Entry]
+Name=Displays
+Comment=Use Night Light and choose how to use connected monitors and projectors
+Exec=gnome-control-center display
+# Translators: Do NOT translate or transliterate this text (this is an icon file name)!
+Icon=org.gnome.Settings-display-symbolic
+Terminal=false
+Type=Application
+NoDisplay=true
+StartupNotify=true
+Categories=GNOME;GTK;Settings;HardwareSettings;X-GNOME-Settings-Panel;X-GNOME-DevicesSettings;
+OnlyShowIn=GNOME;Unity;
+# Translators: Search terms to find the Displays panel. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon!
+Keywords=Panel;Projector;xrandr;Screen;Resolution;Refresh;Monitor;Night;Light;Blue;redshift;color;sunset;sunrise;
diff -pruN 1:43.2-2/panels/display/gnome-display-panel.desktop.in.in 1:44~alpha-0ubuntu1/panels/display/gnome-display-panel.desktop.in.in
--- 1:43.2-2/panels/display/gnome-display-panel.desktop.in.in	2022-12-23 11:11:35.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/display/gnome-display-panel.desktop.in.in	1970-01-01 00:00:00.000000000 +0000
@@ -1,18 +0,0 @@
-[Desktop Entry]
-Name=Displays
-Comment=Choose how to use connected monitors and projectors
-Exec=gnome-control-center display
-# Translators: Do NOT translate or transliterate this text (this is an icon file name)!
-Icon=org.gnome.Settings-display-symbolic
-Terminal=false
-Type=Application
-NoDisplay=true
-StartupNotify=true
-Categories=GNOME;GTK;Settings;HardwareSettings;X-GNOME-Settings-Panel;X-GNOME-DevicesSettings;
-OnlyShowIn=GNOME;Unity;
-X-GNOME-Bugzilla-Bugzilla=GNOME
-X-GNOME-Bugzilla-Product=gnome-control-center
-X-GNOME-Bugzilla-Component=Screen resolution
-X-GNOME-Bugzilla-Version=@VERSION@
-# Translators: Search terms to find the Displays panel. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon!
-Keywords=Panel;Projector;xrandr;Screen;Resolution;Refresh;Monitor;Night;Light;Blue;redshift;color;sunset;sunrise;
diff -pruN 1:43.2-2/panels/display/meson.build 1:44~alpha-0ubuntu1/panels/display/meson.build
--- 1:43.2-2/panels/display/meson.build	2022-12-23 11:11:35.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/display/meson.build	2023-01-09 20:06:57.000000000 +0000
@@ -1,15 +1,9 @@
 panels_list += cappletname
 desktop = 'gnome-@0@-panel.desktop'.format(cappletname)
 
-desktop_in = configure_file(
-  input: desktop + '.in.in',
-  output: desktop + '.in',
-  configuration: desktop_conf
-)
-
 i18n.merge_file(
   type: 'desktop',
-  input: desktop_in,
+  input: desktop + '.in',
   output: desktop,
   po_dir: po_dir,
   install: true,
diff -pruN 1:43.2-2/panels/firmware-security/cc-firmware-security-dialog.c 1:44~alpha-0ubuntu1/panels/firmware-security/cc-firmware-security-dialog.c
--- 1:43.2-2/panels/firmware-security/cc-firmware-security-dialog.c	2022-12-23 11:11:35.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/firmware-security/cc-firmware-security-dialog.c	2023-01-09 20:06:57.000000000 +0000
@@ -23,6 +23,10 @@
 #include "config.h"
 
 #include <glib/gi18n-lib.h>
+#include <glibtop/fsusage.h>
+#include <glibtop/mountlist.h>
+#include <glibtop/mem.h>
+#include <glibtop/sysinfo.h>
 
 #include "cc-firmware-security-panel.h"
 #include "cc-firmware-security-dialog.h"
@@ -32,15 +36,9 @@ struct _CcFirmwareSecurityDialog
 {
   AdwWindow            parent;
 
-  GtkWidget           *dialog_hsi_circle_box;
-  GtkWidget           *dialog_hsi_circle_number;
+  GtkWidget           *firmware_security_dialog_icon;
+
 
-  GtkWidget           *hsi1_icon;
-  GtkWidget           *hsi2_icon;
-  GtkWidget           *hsi3_icon;
-  GtkWidget           *hsi1_title;
-  GtkWidget           *hsi2_title;
-  GtkWidget           *hsi3_title;
 
   GtkWidget           *firmware_security_dialog_title_label;
   GtkWidget           *firmware_security_dialog_body_label;
@@ -50,9 +48,9 @@ struct _CcFirmwareSecurityDialog
   GtkWidget           *firmware_security_dialog_hsi1_pg;
   GtkWidget           *firmware_security_dialog_hsi2_pg;
   GtkWidget           *firmware_security_dialog_hsi3_pg;
-  GtkWidget           *firmware_security_dialog_hsi_label;
   AdwLeaflet          *leaflet;
   AdwWindowTitle      *second_page_title;
+  AdwToastOverlay     *toast_overlay;
 
   gboolean             is_created;
 
@@ -60,6 +58,9 @@ struct _CcFirmwareSecurityDialog
   GHashTable          *hsi2_dict;
   GHashTable          *hsi3_dict;
   GHashTable          *hsi4_dict;
+  GHashTable          *runtime_dict;
+
+  GString             *event_log_str;
 
   guint                hsi_number;
 };
@@ -68,74 +69,37 @@ G_DEFINE_TYPE (CcFirmwareSecurityDialog,
 
 static void
 set_dialog_item_layer1 (CcFirmwareSecurityDialog *self,
-                        const gchar              *circle_str,
+                        const gchar              *icon_name,
                         const gchar              *title,
                         const gchar              *body)
 {
   g_autofree gchar *str = NULL;
 
-  gtk_label_set_label (GTK_LABEL (self->dialog_hsi_circle_number), circle_str);
+  gtk_image_set_from_icon_name (GTK_IMAGE (self->firmware_security_dialog_icon), icon_name);
   gtk_label_set_text (GTK_LABEL (self->firmware_security_dialog_title_label), title);
   gtk_label_set_text (GTK_LABEL (self->firmware_security_dialog_body_label), body);
 
   if (self->hsi_number == G_MAXUINT)
     {
-        gtk_widget_add_css_class (self->dialog_hsi_circle_box, "level1");
-        gtk_widget_add_css_class (self->dialog_hsi_circle_number, "hsi1");
-        gtk_widget_hide (self->hsi1_icon);
-        gtk_widget_hide (self->hsi2_icon);
-        gtk_widget_hide (self->hsi3_icon);
-        gtk_widget_hide (self->hsi1_title);
-        gtk_widget_hide (self->hsi2_title);
-        gtk_widget_hide (self->hsi3_title);
-        gtk_widget_hide (self->firmware_security_dialog_hsi_label);
+        gtk_widget_add_css_class (self->firmware_security_dialog_icon, "neutral");
         return;
     }
 
-  gtk_image_set_from_icon_name (GTK_IMAGE (self->hsi1_icon), self->hsi_number >= 1 ? "emblem-ok" : "process-stop");
-  gtk_label_set_text (GTK_LABEL (self->hsi1_title), self->hsi_number >= 1 ? _("Passed") : _("Failed"));
-  gtk_image_set_from_icon_name (GTK_IMAGE (self->hsi2_icon), self->hsi_number >= 2 ? "emblem-ok" : "process-stop");
-  gtk_label_set_text (GTK_LABEL (self->hsi2_title), self->hsi_number >= 2 ? _("Passed") : _("Failed"));
-  gtk_image_set_from_icon_name (GTK_IMAGE (self->hsi3_icon), self->hsi_number >= 3 ? "emblem-ok" : "process-stop");
-  gtk_label_set_text (GTK_LABEL (self->hsi3_title), self->hsi_number >= 3 ? _("Passed") : _("Failed"));
-
-  gtk_widget_add_css_class (self->firmware_security_dialog_min_row,
-                            self->hsi_number >= 1 ? "success-hsi-icon" : "error-hsi-icon");
-  gtk_widget_add_css_class (self->firmware_security_dialog_min_row,
-                            self->hsi_number >= 1 ? "success-title" : "error-title");
-  gtk_widget_add_css_class (self->firmware_security_dialog_basic_row,
-                            self->hsi_number >= 2 ? "success-hsi-icon" : "error-hsi-icon");
-  gtk_widget_add_css_class (self->firmware_security_dialog_basic_row,
-                            self->hsi_number >= 2 ? "success-title" : "error-title");
-  gtk_widget_add_css_class (self->firmware_security_dialog_extend_row,
-                            self->hsi_number >= 3 ? "success-hsi-icon" : "error-hsi-icon");
-  gtk_widget_add_css_class (self->firmware_security_dialog_extend_row,
-                            self->hsi_number >= 3 ? "success-title" : "error-title");
-
   switch (self->hsi_number)
     {
       case 0:
-        gtk_widget_add_css_class (self->dialog_hsi_circle_box, "level0");
-        gtk_widget_add_css_class (self->dialog_hsi_circle_number, "hsi0");
+        gtk_widget_add_css_class (self->firmware_security_dialog_icon, "error");
         break;
       case 1:
-        gtk_widget_add_css_class (self->dialog_hsi_circle_box, "level1");
-        gtk_widget_add_css_class (self->dialog_hsi_circle_number, "hsi1");
-        break;
       case 2:
-        gtk_widget_add_css_class (self->dialog_hsi_circle_box, "level2");
-        gtk_widget_add_css_class (self->dialog_hsi_circle_number, "hsi2");
-        break;
       case 3:
       case 4:
-        gtk_widget_add_css_class (self->dialog_hsi_circle_box, "level3");
-        gtk_widget_add_css_class (self->dialog_hsi_circle_number, "hsi3");
+      case 5:
+        gtk_widget_add_css_class (self->firmware_security_dialog_icon, "good");
         break;
+      default:
+        gtk_widget_add_css_class (self->firmware_security_dialog_icon, "neutral");
     }
-
-  /* TRANSLATORS: HSI stands for Host Security ID and device refers to the computer as a whole */
-  str = g_strdup_printf (_("Device conforms to HSI level %d"), self->hsi_number);
-  gtk_label_set_text (GTK_LABEL (self->firmware_security_dialog_hsi_label), str);
 }
 
 static void
@@ -145,241 +109,290 @@ update_dialog (CcFirmwareSecurityDialog
     {
     case 0:
       set_dialog_item_layer1 (self,
-                              "0",
-                              _("Security Level 0"),
-                              _("This device has no protection against hardware security issues. This could "
-                                "be because of a hardware or firmware configuration issue. It is "
-                                "recommended to contact your IT support provider."));
+                              "dialog-warning-symbolic",
+                              _("Checks Failed"),
+                              /* TRANSLATORS: This is the description to describe the failure on
+                                 checking the security items. */
+                              _("Hardware does not pass checks. "
+                                "This means that you are not protected against common hardware security issues."
+                                "\n\n"
+                                "It may be possible to resolve hardware security issues by updating your firmware or changing device configuration options. "
+                                "However, failures can stem from the physical hardware itself, and may not be reversible."));
       break;
 
     case 1:
+      gtk_window_set_default_size (GTK_WINDOW (&self->parent), 380, 380);
       set_dialog_item_layer1 (self,
-                              "1",
-                              _("Security Level 1"),
-                              _("This device has minimal protection against hardware security issues. This "
-                                "is the lowest device security level and only provides protection against "
-                                "simple security threats."));
+                              "emblem-default-symbolic",
+                              _("Checks Passed"),
+                              /* TRANSLATORS: This description describes the device passing the
+                                 minimum requirement of security check.*/
+                              _("Hardware meets security requirements. "
+                                "This device has protection against common hardware security threats."));
       break;
 
     case 2:
-      set_dialog_item_layer1 (self,
-                              "2",
-                              _("Security Level 2"),
-                              _("This device has basic protection against hardware security issues. This "
-                                "provides protection against some common security threats."));
-      break;
-
     case 3:
     case 4:
+    case 5:
+      gtk_window_set_default_size (GTK_WINDOW (&self->parent), 400, 390);
       set_dialog_item_layer1 (self,
-                              "3",
-                              _("Security Level 3"),
-                              _("This device has extended protection against hardware security issues. This "
-                                "is the highest device security level and provides protection against "
-                                "advanced security threats."));
+                              "security-high-symbolic",
+                              _("Protected"),
+                              /* TRANSLATOR: This description describes the devices passing
+                                 the extended security check. */
+                              _("Device hardware meets security requirements. "
+                                "This device has protection against a range of the most common hardware security threats."));
       break;
 
     default:
+      gtk_window_set_default_size (GTK_WINDOW (&self->parent), 400, 390);
       set_dialog_item_layer1 (self,
-                              "?",
-                              _("Security Level"),
-                              _("Security levels are not available for this device."));
+                              "dialog-question-symbolic",
+                              _("Checks Unavailable"),
+                              /* TRANSLATORS: When the security result is unavailable, this description is shown. */
+                              _("Device security checks are not available for this device. "
+                                "It is not possible to tell whether it meets security requirements."));
     }
 }
 
-static gchar *
-fu_security_attr_get_description_for_dialog (FwupdSecurityAttr *attr)
+static void
+on_fw_back_button_clicked_cb (GtkWidget *widget,
+                              gpointer   data)
 {
-  GString *str = g_string_new (attr->description);
+  CcFirmwareSecurityDialog *self = CC_FIRMWARE_SECURITY_DIALOG (data);
 
-  if (attr->flags & FWUPD_SECURITY_ATTR_FLAG_ACTION_CONTACT_OEM &&
-      attr->flags & FWUPD_SECURITY_ATTR_FLAG_ACTION_CONFIG_FW &&
-      attr->flags & FWUPD_SECURITY_ATTR_FLAG_ACTION_CONFIG_FW)
-    {
-      g_string_append_printf (str, "\n\n%s %s",
-                              /* TRANSLATORS: hardware manufacturer as in OEM */
-                              _("Contact your hardware manufacturer for help with security updates."),
-                              /* TRANSLATORS: support technician as in someone with root */
-                              _("It might be possible to resolve this issue in the device’s UEFI "
-                                "firmware settings, or by a support technician."));
-    }
-  else if (attr->flags & FWUPD_SECURITY_ATTR_FLAG_ACTION_CONTACT_OEM &&
-           attr->flags & FWUPD_SECURITY_ATTR_FLAG_ACTION_CONFIG_FW)
-    {
-      g_string_append_printf (str, "\n\n%s %s",
-                              /* TRANSLATORS: hardware manufacturer as in OEM */
-                              _("Contact your hardware manufacturer for help with security updates."),
-                              _("It might be possible to resolve this issue in the device’s UEFI firmware settings."));
-    }
-  else if (attr->flags & FWUPD_SECURITY_ATTR_FLAG_ACTION_CONTACT_OEM)
-    {
-      g_string_append_printf (str, "\n\n%s",
-                              /* TRANSLATORS: hardware manufacturer as in OEM */
-                              _("Contact your hardware manufacturer for help with security updates."));
-    }
-  else if (attr->flags & FWUPD_SECURITY_ATTR_FLAG_ACTION_CONFIG_FW)
-    {
-      g_string_append_printf (str, "\n\n%s",
-                              _("It might be possible to resolve this issue in the device’s UEFI firmware settings."));
-    }
-  else if (attr->flags & FWUPD_SECURITY_ATTR_FLAG_ACTION_CONFIG_OS)
-    {
-      g_string_append_printf (str, "\n\n%s",
-                              /* TRANSLATORS: support technician as in someone with root */
-                              _("It might be possible for a support technician to resolve this issue."));
-    }
+  adw_leaflet_navigate (self->leaflet, ADW_NAVIGATION_DIRECTION_BACK);
 
-  return g_string_free (str, FALSE);
+  gtk_widget_set_visible (self->firmware_security_dialog_hsi1_pg, FALSE);
+  gtk_widget_set_visible (self->firmware_security_dialog_hsi2_pg, FALSE);
+  gtk_widget_set_visible (self->firmware_security_dialog_hsi3_pg, FALSE);
 }
 
-static GtkWidget *
-hsi_create_pg_row (const gchar *icon_name,
-                   const gchar *style,
-                   FwupdSecurityAttr *attr)
-{
-  GtkWidget *row;
-  GtkWidget *status_icon;
-  GtkWidget *status_label;
-  GtkWidget *actions_parent;
-  const gchar *result_str = NULL;
-
-  row = adw_expander_row_new ();
-  adw_preferences_row_set_title (ADW_PREFERENCES_ROW (row), attr->title);
-
-  result_str = fwupd_security_attr_result_to_string(attr->result);
-  if (result_str)
-    {
-      status_label = gtk_label_new (result_str);
-      if (firmware_security_attr_has_flag (attr, FWUPD_SECURITY_ATTR_FLAG_SUCCESS))
-          status_icon = gtk_image_new_from_icon_name ("emblem-ok");
-      else
-          status_icon = gtk_image_new_from_icon_name ("process-stop");
+static gchar *
+get_os_name (void)
+{
+  g_autofree gchar *name = NULL;
+  g_autofree gchar *version_id = NULL;
+  g_autofree gchar *pretty_name = NULL;
+
+  name = g_get_os_info (G_OS_INFO_KEY_NAME);
+  version_id = g_get_os_info (G_OS_INFO_KEY_VERSION_ID);
+  pretty_name = g_get_os_info (G_OS_INFO_KEY_PRETTY_NAME);
+
+  if (pretty_name)
+    return g_steal_pointer (&pretty_name);
+  else if (name && version_id)
+    return g_strdup_printf ("%s %s", name, version_id);
+  else
+    return g_strdup (_("Unknown"));
+}
 
-      adw_expander_row_add_action (ADW_EXPANDER_ROW (row), status_label);
-      adw_expander_row_add_action (ADW_EXPANDER_ROW (row), status_icon);
+static gchar*
+cpu_get_model ()
+{
+  gchar *model;
+  const glibtop_sysinfo * sysinfo;
 
-      gtk_widget_add_css_class (status_icon, "icon");
-      gtk_widget_add_css_class (status_label, "hsi_label");
+  glibtop_init();
+  sysinfo = glibtop_get_sysinfo ();
+  model = g_strdup (g_hash_table_lookup (sysinfo->cpuinfo [1].values, "model name"));
+  glibtop_close ();
 
-      actions_parent = gtk_widget_get_parent (status_icon);
-      gtk_box_set_spacing (GTK_BOX (actions_parent), 6);
-      gtk_widget_set_margin_end (actions_parent, 12);
-    }
+  return model;
+}
 
-  if (attr->description != NULL)
-    {
-      GtkWidget *subrow = adw_action_row_new ();
-      g_autofree gchar *str = fu_security_attr_get_description_for_dialog (attr);
-      adw_action_row_set_subtitle (ADW_ACTION_ROW (subrow), str);
-      adw_expander_row_add_row (ADW_EXPANDER_ROW (row), subrow);
-      gtk_widget_add_css_class (subrow, "security-description-row");
-    }
-  else
+static gchar*
+fwupd_get_property (const char *property_name)
+{
+  g_autoptr(GDBusConnection) connection = NULL;
+  g_autoptr(GError) error = NULL;
+  g_autoptr(GVariant) inner = NULL;
+  g_autoptr(GVariant) variant = NULL;
+  const gchar *ret_property;
+
+  connection = g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, &error);
+  if (!connection)
+    {
+      g_warning ("system bus not available: %s", error->message);
+      return NULL;
+    }
+  variant = g_dbus_connection_call_sync (connection,
+                                         "org.freedesktop.fwupd",
+                                         "/",
+                                         "org.freedesktop.DBus.Properties",
+                                         "Get",
+                                         g_variant_new ("(ss)",
+                                                        "org.freedesktop.fwupd",
+                                                        property_name),
+                                         NULL,
+                                         G_DBUS_CALL_FLAGS_NONE,
+                                         -1,
+                                         NULL,
+                                         &error);
+  if (!variant)
     {
-      adw_expander_row_set_enable_expansion (ADW_EXPANDER_ROW (row), FALSE);
-      gtk_widget_add_css_class (row, "hide-arrow");
+      g_warning ("Cannot get org.freedesktop.fwupd: %s", error->message);
+      return NULL;
     }
+  g_variant_get (variant, "(v)", &inner);
+  ret_property = g_variant_get_string (inner, NULL);
 
-  return row;
+  return g_strdup (ret_property);
 }
 
 static void
-update_hsi_listbox (CcFirmwareSecurityDialog *self,
-                    const gint                hsi_level)
+on_hsi_detail_button_clicked_cb (GtkWidget *widget,
+                                 gpointer  *data)
 {
-  g_autoptr (GList) hash_keys = NULL;
+  CcFirmwareSecurityDialog *self = CC_FIRMWARE_SECURITY_DIALOG (data);
+  GdkClipboard *clip_board;
+  GdkDisplay *display; 
+  g_autoptr (GList) hash_keys;
+  g_autoptr (GString) result_str;
+  g_autofree gchar *date_string = NULL;
+  g_autoptr (GDateTime) date = NULL;
+  g_autofree gchar *fwupd_ver = NULL;
+  g_autofree gchar *vendor = NULL;
+  g_autofree gchar *product = NULL;
+  g_autofree gchar *os_name = NULL;
+  g_autofree gchar *hsi_level = NULL;
+  g_autofree gchar *cpu_model = NULL;
+  const gchar *hsi_result;
+  g_autoptr (GString) tmp_str;
+  
   GHashTable *hsi_dict = NULL;
-  GtkWidget *pg_row;
-  GtkWidget *hsi_pg;
 
-  switch (hsi_level)
-    {
-      case 1:
-        hsi_dict = self->hsi1_dict;
-        hsi_pg = self->firmware_security_dialog_hsi1_pg;
-        break;
-      case 2:
-        hsi_dict = self->hsi2_dict;
-        hsi_pg = self->firmware_security_dialog_hsi2_pg;
-        break;
-      case 3:
-        hsi_dict = self->hsi3_dict;
-        hsi_pg = self->firmware_security_dialog_hsi3_pg;
-        break;
-      case 4:
-        hsi_dict = self->hsi4_dict;
-        hsi_pg = self->firmware_security_dialog_hsi3_pg;
-        break;
-    }
+  tmp_str = g_string_new (NULL);
 
-  hash_keys = g_hash_table_get_keys (hsi_dict);
-  for (GList *item = g_list_first (hash_keys); item != NULL; item = g_list_next (item))
-    {
-      FwupdSecurityAttr *attr = g_hash_table_lookup (hsi_dict, item->data);
-      if (g_strcmp0 (attr->appstream_id, FWUPD_SECURITY_ATTR_ID_SUPPORTED_CPU) == 0)
-        continue;
-      if (attr->title == NULL)
-        continue;
-      if (firmware_security_attr_has_flag (attr, FWUPD_SECURITY_ATTR_FLAG_SUCCESS))
+  result_str = g_string_new (NULL);
+
+  g_string_append (result_str, _("Device Security Report"));
+  g_string_append (result_str, "\n======================\n\n");
+
+  g_string_append (result_str, _("Report details"));
+  g_string_append (result_str, "\n");
+
+  g_string_append (result_str, "  ");
+  hsi_report_title_print_padding (_("Date generated:"), result_str, 0);
+  date = g_date_time_new_now_local ();
+  date_string = g_date_time_format (date, "%Y-%m-%d %H:%M:%S");
+
+  g_string_append_printf (result_str, "%s\n", date_string);
+
+  g_string_append (result_str, "  ");
+  /* TRANSLATOR: This is the title for showing the version of fwupd service. */
+  hsi_report_title_print_padding (_("fwupd version:"), result_str, 00);
+  fwupd_ver = fwupd_get_property ("DaemonVersion");
+  g_string_append_printf (result_str, "%s", fwupd_ver);
+  g_string_append (result_str, "\n\n");
+
+  g_string_append (result_str, "System details");
+  g_string_append (result_str, "\n");
+
+  g_string_append (result_str, "  ");
+  hsi_report_title_print_padding (_("Hardware model:"), result_str, 0);
+  vendor = fwupd_get_property ("HostVendor");
+  product = fwupd_get_property ("HostProduct");
+  g_string_append_printf (result_str, "%s %s\n", vendor, product);
+
+  g_string_append (result_str, "  ");
+  /* TRANSLATOR: "Processor" indicates the CPU model name. */
+  hsi_report_title_print_padding (_("Processor:"), result_str, 0);
+  cpu_model = cpu_get_model ();
+  g_string_append_printf (result_str, "%s\n", cpu_model);
+
+  g_string_append (result_str, "  ");
+  /* TRANSLATOR: "OS" indicates the OS name, ex: Fedora 38. */
+  hsi_report_title_print_padding (_("OS:"), result_str, 0);
+  os_name = get_os_name ();
+  g_string_append_printf (result_str, "%s\n", os_name);
+
+  g_string_append (result_str, "  ");
+  /* TRANSLATOR: This is the title for device security level. */
+  hsi_report_title_print_padding (_("Security level:"), result_str, 0);
+  hsi_level = fwupd_get_property ("HostSecurityId");
+  g_string_append_printf (result_str, "%s\n", hsi_level);
+  g_string_append (result_str, "\n");
+
+  for (int i = 1; i <=5; i++)
+    {
+      switch (i)
+      {
+        case 1:
+          hsi_dict = self->hsi1_dict;
+          break;
+        case 2:
+          hsi_dict = self->hsi2_dict;
+          break;
+        case 3:
+          hsi_dict = self->hsi3_dict;
+          break;
+        case 4:
+          hsi_dict = self->hsi4_dict;
+          break;
+        case 5:
+          hsi_dict = self->runtime_dict;
+      }
+
+      if (i <= 4)
         {
-          pg_row = hsi_create_pg_row ("emblem-ok", "color_green", attr);
-          gtk_widget_add_css_class (pg_row, "success-icon");
-          gtk_widget_add_css_class (pg_row, "success-title");
-        }
+          g_string_append_printf (result_str, "HSI-");
+          g_string_append_printf (result_str, "%i ", i);
+          /* TRANSLATOR: This is the postfix of "HSI-n Tests" title. */
+          g_string_append (result_str, _("Tests"));
+          g_string_append (result_str, "\n");
+        } 
       else
         {
-          pg_row = hsi_create_pg_row ("process-stop", "color_dim", attr);
-          gtk_widget_add_css_class (pg_row, "error-icon");
-          gtk_widget_add_css_class (pg_row, "error-title");
+          g_string_append (result_str, _("Runtime Tests"));
+          g_string_append (result_str, "\n");
         }
-      adw_preferences_group_add (ADW_PREFERENCES_GROUP (hsi_pg), GTK_WIDGET (pg_row));
-    }
-  self->is_created = TRUE;
-}
 
-static void
-on_hsi_clicked_cb (GtkWidget                *widget,
-                   CcFirmwareSecurityDialog *self)
-{
-  adw_leaflet_navigate (self->leaflet, ADW_NAVIGATION_DIRECTION_FORWARD);
-
-  if (!self->is_created)
-    {
-      update_hsi_listbox (self, 1);
-      update_hsi_listbox (self, 2);
-      update_hsi_listbox (self, 3);
-      update_hsi_listbox (self, 4);
-      self->is_created = TRUE;
-    }
-
-  if (widget == self->firmware_security_dialog_min_row)
-    {
-      adw_window_title_set_title (self->second_page_title, _("Security Level 1"));
-      gtk_widget_set_visible (self->firmware_security_dialog_hsi1_pg, TRUE);
-    }
-  else if (widget == self->firmware_security_dialog_basic_row)
-    {
-      adw_window_title_set_title (self->second_page_title, _("Security Level 2"));
-      gtk_widget_set_visible (self->firmware_security_dialog_hsi2_pg, TRUE);
-    }
-  else if (widget == self->firmware_security_dialog_extend_row)
-    {
-      adw_window_title_set_title (self->second_page_title, _("Security Level 3"));
-      gtk_widget_set_visible (self->firmware_security_dialog_hsi3_pg, TRUE);
+      hash_keys = g_hash_table_get_keys (hsi_dict);
+      for (GList *item = g_list_first (hash_keys); item != NULL; item = g_list_next (item))
+        {
+          FwupdSecurityAttr *attr = g_hash_table_lookup (hsi_dict, item->data);
+          if (g_strcmp0 (attr->appstream_id, FWUPD_SECURITY_ATTR_ID_SUPPORTED_CPU) == 0)
+            continue;
+          if (attr->title == NULL)
+            continue;
+          g_string_printf (tmp_str, "%s:", attr->title);
+          g_string_append (result_str, "  ");
+          hsi_report_title_print_padding (tmp_str->str, result_str, 0);
+          if (firmware_security_attr_has_flag (attr, FWUPD_SECURITY_ATTR_FLAG_SUCCESS))
+            {
+              /* Passed */
+              /* TRANSLATOR: If the status for security attribute is success, "Pass " is shown. */
+              g_string_append (result_str, _("Pass"));
+              g_string_append (result_str, " ");
+            }
+          else
+            {
+              /* Failed */
+              /* TRANSLATOR: If the status for security attribute is success, "! Fail " is shown. */
+              result_str = g_string_overwrite (result_str, result_str->len-2, _("! Fail"));
+              g_string_append (result_str, " ");
+            }
+          hsi_result = fwupd_security_attr_result_to_string (attr->result);
+          if (hsi_result) {
+            g_string_append_printf (result_str, "(%s)", hsi_result);
+          }
+          g_string_append (result_str, "\n");
+        }
+        g_string_append (result_str, "\n");
     }
-}
 
-static void
-on_fw_back_button_clicked_cb (GtkWidget *widget,
-                              gpointer   data)
-{
-  CcFirmwareSecurityDialog *self = CC_FIRMWARE_SECURITY_DIALOG (data);
-
-  adw_leaflet_navigate (self->leaflet, ADW_NAVIGATION_DIRECTION_BACK);
-
-  gtk_widget_set_visible (self->firmware_security_dialog_hsi1_pg, FALSE);
-  gtk_widget_set_visible (self->firmware_security_dialog_hsi2_pg, FALSE);
-  gtk_widget_set_visible (self->firmware_security_dialog_hsi3_pg, FALSE);
+    g_string_append (result_str, _("Host security events"));
+    g_string_append (result_str, "\n");
+    g_string_append (result_str, self->event_log_str->str);
+    g_string_append (result_str, "\n");
+    g_string_append (result_str, _("For information on the contents of this report, see https://fwupd.github.io/hsi.html"));
+
+    display = gdk_display_get_default ();
+    clip_board = gdk_display_get_clipboard (display);
+    gdk_clipboard_set_text (clip_board, result_str->str);
+    adw_toast_overlay_add_toast (self->toast_overlay, adw_toast_new (_("Report copied to clipboard")));
 }
 
 static void
@@ -389,28 +402,18 @@ cc_firmware_security_dialog_class_init (
 
   gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/control-center/firmware-security/cc-firmware-security-dialog.ui");
 
-  gtk_widget_class_bind_template_child (widget_class, CcFirmwareSecurityDialog, dialog_hsi_circle_box);
-  gtk_widget_class_bind_template_child (widget_class, CcFirmwareSecurityDialog, dialog_hsi_circle_number);
-  gtk_widget_class_bind_template_child (widget_class, CcFirmwareSecurityDialog, hsi1_icon);
-  gtk_widget_class_bind_template_child (widget_class, CcFirmwareSecurityDialog, hsi2_icon);
-  gtk_widget_class_bind_template_child (widget_class, CcFirmwareSecurityDialog, hsi3_icon);
-  gtk_widget_class_bind_template_child (widget_class, CcFirmwareSecurityDialog, hsi1_title);
-  gtk_widget_class_bind_template_child (widget_class, CcFirmwareSecurityDialog, hsi2_title);
-  gtk_widget_class_bind_template_child (widget_class, CcFirmwareSecurityDialog, hsi3_title);
+  gtk_widget_class_bind_template_child (widget_class, CcFirmwareSecurityDialog, firmware_security_dialog_icon);
   gtk_widget_class_bind_template_child (widget_class, CcFirmwareSecurityDialog, firmware_security_dialog_title_label);
   gtk_widget_class_bind_template_child (widget_class, CcFirmwareSecurityDialog, firmware_security_dialog_body_label);
-  gtk_widget_class_bind_template_child (widget_class, CcFirmwareSecurityDialog, firmware_security_dialog_hsi_label);
-  gtk_widget_class_bind_template_child (widget_class, CcFirmwareSecurityDialog, firmware_security_dialog_min_row);
-  gtk_widget_class_bind_template_child (widget_class, CcFirmwareSecurityDialog, firmware_security_dialog_basic_row);
-  gtk_widget_class_bind_template_child (widget_class, CcFirmwareSecurityDialog, firmware_security_dialog_extend_row);
   gtk_widget_class_bind_template_child (widget_class, CcFirmwareSecurityDialog, firmware_security_dialog_hsi1_pg);
   gtk_widget_class_bind_template_child (widget_class, CcFirmwareSecurityDialog, firmware_security_dialog_hsi2_pg);
   gtk_widget_class_bind_template_child (widget_class, CcFirmwareSecurityDialog, firmware_security_dialog_hsi3_pg);
   gtk_widget_class_bind_template_child (widget_class, CcFirmwareSecurityDialog, leaflet);
   gtk_widget_class_bind_template_child (widget_class, CcFirmwareSecurityDialog, second_page_title);
+  gtk_widget_class_bind_template_child (widget_class, CcFirmwareSecurityDialog, toast_overlay);
 
-  gtk_widget_class_bind_template_callback (widget_class, on_hsi_clicked_cb);
   gtk_widget_class_bind_template_callback (widget_class, on_fw_back_button_clicked_cb);
+  gtk_widget_class_bind_template_callback (widget_class, on_hsi_detail_button_clicked_cb);
 }
 
 static void
@@ -425,7 +428,9 @@ cc_firmware_security_dialog_new (guint
                                  GHashTable *hsi1_dict,
                                  GHashTable *hsi2_dict,
                                  GHashTable *hsi3_dict,
-                                 GHashTable *hsi4_dict)
+                                 GHashTable *hsi4_dict,
+                                 GHashTable *runtime_dict,
+                                 GString    *event_log_str)
 {
   CcFirmwareSecurityDialog *dialog;
 
@@ -436,6 +441,8 @@ cc_firmware_security_dialog_new (guint
   dialog->hsi2_dict = hsi2_dict;
   dialog->hsi3_dict = hsi3_dict;
   dialog->hsi4_dict = hsi4_dict;
+  dialog->runtime_dict = runtime_dict;
+  dialog->event_log_str = event_log_str;
   update_dialog (dialog);
 
   return GTK_WIDGET (dialog);
diff -pruN 1:43.2-2/panels/firmware-security/cc-firmware-security-dialog.h 1:44~alpha-0ubuntu1/panels/firmware-security/cc-firmware-security-dialog.h
--- 1:43.2-2/panels/firmware-security/cc-firmware-security-dialog.h	2022-12-23 11:11:35.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/firmware-security/cc-firmware-security-dialog.h	2023-01-09 20:06:57.000000000 +0000
@@ -33,6 +33,8 @@ GtkWidget * cc_firmware_security_dialog_
                                              GHashTable *hsi1_dict,
                                              GHashTable *hsi2_dict,
                                              GHashTable *hsi3_dict,
-                                             GHashTable *hsi4_dict);
+                                             GHashTable *hsi4_dict,
+                                             GHashTable *runtime_dict,
+                                             GString    *event_log_str);
 
 G_END_DECLS
diff -pruN 1:43.2-2/panels/firmware-security/cc-firmware-security-dialog.ui 1:44~alpha-0ubuntu1/panels/firmware-security/cc-firmware-security-dialog.ui
--- 1:43.2-2/panels/firmware-security/cc-firmware-security-dialog.ui	2022-12-23 11:11:35.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/firmware-security/cc-firmware-security-dialog.ui	2023-01-09 20:06:57.000000000 +0000
@@ -2,7 +2,7 @@
 <interface>
   <template class="CcFirmwareSecurityDialog" parent="AdwWindow">
     <property name="default-width">500</property>
-    <property name="default-height">550</property>
+    <property name="default-height">470</property>
     <property name="modal">True</property>
     <child>
       <object class="AdwLeaflet" id="leaflet">
@@ -19,192 +19,83 @@
                     <property name="show-title-buttons">True</property>
                     <property name="title-widget">
                       <object class="AdwWindowTitle">
-                        <property name="title" translatable="yes">Security Level</property>
+                        <property name="title" translatable="yes">Device Security Status</property>
                       </object>
                     </property>
                   </object>
                 </child>
 
                 <child>
-                  <object class="AdwPreferencesPage">
-                    <property name="vexpand-set">True</property>
-
-                    <child>
-                      <object class="AdwPreferencesGroup">
-                        <child>
-                          <object class="GtkBox" id="dialog_hsi_circle_box">
-                            <property name="orientation">vertical</property>
-                            <property name="halign">center</property>
-                            <property name="valign">center</property>
-                            <child>
-                              <object class="GtkLabel" id="dialog_hsi_circle_number">
+                  <object class="AdwToastOverlay" id="toast_overlay">
+                    <property name="hexpand">True</property>
+                    <property name="valign">baseline</property>
+                    <property name="vexpand">True</property>
+                    <property name="child">
+                      <object class="AdwPreferencesPage">
+                        <property name="vexpand-set">True</property>
+                        <child>
+                          <object class="AdwPreferencesGroup">
+                            <child>
+                              <object class="GtkImage" id="firmware_security_dialog_icon">
+                                <property name="margin-start">16</property>
+                                <property name="margin-end">16</property>
+                                <property name="margin-top">16</property>
+                                <property name="pixel-size">32</property>
                                 <property name="halign">center</property>
                                 <property name="valign">center</property>
-                                <property name="vexpand">True</property>
-                                <property name="justify">center</property>
-                                <property name="label">9</property>
+                                <property name="icon-name">dialog-question-symbolic</property>
                                 <style>
-                                  <class name="hsi-level-font" />
+                                  <class name="security-level-icon"/>
                                 </style>
                               </object>
                             </child>
-                            <style>
-                              <class name="hsi-level-box" />
-                            </style>
-                          </object>
-                        </child>
-                      </object>
-                    </child>
-
-                    <child>
-                      <object class="AdwPreferencesGroup">
-                        <child>
-                          <object class="GtkLabel" id="firmware_security_dialog_title_label">
-                            <style>
-                              <class name="title-2" />
-                            </style>
                           </object>
                         </child>
-                      </object>
-                    </child>
 
-                    <child>
-                      <object class="AdwPreferencesGroup">
                         <child>
-                          <object class="GtkLabel" id="firmware_security_dialog_body_label">
-                            <property name="wrap">True</property>
-                            <property name="justify">center</property>
-                          </object>
-                        </child>
-                      </object>
-                    </child>
-
-                    <child>
-                      <object class="AdwPreferencesGroup">
-                        <child>
-                          <object class="AdwActionRow" id="firmware_security_dialog_min_row">
-                            <property name="use-underline">True</property>
-                            <property name="activatable">True</property>
-                            <property name="title" translatable="yes">Level 1</property>
-                            <signal name="activated" handler="on_hsi_clicked_cb" swapped="no" />
+                          <object class="AdwPreferencesGroup">
                             <child>
-                              <object class="GtkImage" id="hsi1_icon">
-                                <property name="icon-name">process-stop</property>
+                              <object class="GtkLabel" id="firmware_security_dialog_title_label">
                                 <style>
-                                  <class name="hsi_icon" />
-                                  <class name="error-hsi-icon" />
+                                  <class name="title-2" />
                                 </style>
                               </object>
                             </child>
-                            <child>
-                              <object class="GtkLabel" id="hsi1_title">
-                                <property name="halign">start</property>
-                                <property name="valign">center</property>
-                                <property name="vexpand">True</property>
-                                <property name="justify">left</property>
-                                <property name="label">Failed</property>
-                                <property name="margin-end">6</property>
-                                <style>
-                                  <class name="hsi_label" />
-                                  <class name="error-title" />
-                                </style>
-                              </object>
-                            </child>
-                            <child>
-                              <object class="GtkImage">
-                                <property name="icon-name">go-next-symbolic</property>
-                              </object>
-                            </child>
                           </object>
                         </child>
+
                         <child>
-                          <object class="AdwActionRow" id="firmware_security_dialog_basic_row">
-                            <property name="use-underline">True</property>
-                            <property name="activatable">True</property>
-                            <property name="title" translatable="yes">Level 2</property>
-                            <signal name="activated" handler="on_hsi_clicked_cb" swapped="no" />
+                          <object class="AdwPreferencesGroup">
                             <child>
-                              <object class="GtkImage" id="hsi2_icon">
-                                <property name="icon-name">process-stop</property>
-                                <style>
-                                  <class name="hsi_icon" />
-                                  <class name="error-hsi-icon" />
-                                </style>
-                              </object>
-                            </child>
-                            <child>
-                              <object class="GtkLabel" id="hsi2_title">
-                                <property name="halign">start</property>
-                                <property name="valign">center</property>
-                                <property name="vexpand">True</property>
-                                <property name="justify">left</property>
-                                <property name="label">Failed</property>
-                                <property name="margin-end">6</property>
-                                <style>
-                                  <class name="hsi_label" />
-                                  <class name="error-title" />
-                                </style>
-                              </object>
-                            </child>
-                            <child>
-                              <object class="GtkImage">
-                                <property name="icon-name">go-next-symbolic</property>
+                              <object class="GtkLabel" id="firmware_security_dialog_body_label">
+                                <property name="wrap">True</property>
+                                <property name="justify">center</property>
+                                <property name="margin-start">32</property>
+                                <property name="margin-end">32</property>
                               </object>
                             </child>
                           </object>
                         </child>
-                        <child>
-                          <object class="AdwActionRow" id="firmware_security_dialog_extend_row">
-                            <property name="use-underline">True</property>
-                            <property name="activatable">True</property>
-                            <property name="title" translatable="yes">Level 3</property>
-                            <signal name="activated" handler="on_hsi_clicked_cb" swapped="no" />
-                            <child>
-                              <object class="GtkImage" id="hsi3_icon">
-                                <property name="icon-name">process-stop</property>
-                                <style>
-                                  <class name="hsi_icon" />
-                                  <class name="error-hsi-icon" />
-                                </style>
-                              </object>
-                            </child>
+
+                         <child>
+                          <object class="AdwPreferencesGroup">
                             <child>
-                              <object class="GtkLabel" id="hsi3_title">
-                                <property name="halign">start</property>
-                                <property name="valign">center</property>
-                                <property name="vexpand">True</property>
-                                <property name="justify">left</property>
-                                <property name="label">Failed</property>
-                                <property name="margin-end">6</property>
+                              <object class="GtkButton" id="status_download_button">
+                                <property name="receives-default">True</property>
+                                <property name="sensitive">True</property>
+                                <property name="halign">center</property>
+                                <property name="label">Copy Technical Report</property>
+                                <signal name="clicked" handler="on_hsi_detail_button_clicked_cb" swapped="no" />
                                 <style>
-                                  <class name="hsi_label" />
-                                  <class name="error-title" />
+                                  <class name="pill" />
                                 </style>
                               </object>
                             </child>
-                            <child>
-                              <object class="GtkImage">
-                                <property name="icon-name">go-next-symbolic</property>
-                              </object>
-                            </child>
                           </object>
                         </child>
-                      </object>
-                    </child>
 
-                    <child>
-                      <object class="AdwPreferencesGroup">
-                        <child>
-                          <object class="GtkLabel" id="firmware_security_dialog_hsi_label">
-                            <property name="label">Device conform text</property>
-                            <style>
-                              <class name="dim-label" />
-                            </style>
-                          </object>
-                        </child>
                       </object>
-                    </child>
-
+                    </property>
                   </object>
                 </child>
 
@@ -230,6 +121,8 @@
                       <object class="GtkButton">
                         <property name="halign">center</property>
                         <property name="valign">center</property>
+                        <property name="height-request">12</property>
+
                         <property name="icon-name">go-previous-symbolic</property>
                         <signal name="clicked" handler="on_fw_back_button_clicked_cb" swapped="no" />
                         <style>
diff -pruN 1:43.2-2/panels/firmware-security/cc-firmware-security-help-dialog.c 1:44~alpha-0ubuntu1/panels/firmware-security/cc-firmware-security-help-dialog.c
--- 1:43.2-2/panels/firmware-security/cc-firmware-security-help-dialog.c	1970-01-01 00:00:00.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/firmware-security/cc-firmware-security-help-dialog.c	2023-01-09 20:06:57.000000000 +0000
@@ -0,0 +1,55 @@
+/* cc-firmware-security-dialog.c
+ *
+ * Copyright (C) 2022 Red Hat, Inc
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see <http://www.gnu.org/licenses/>.
+ *
+ * Author: Kate Hsuan <hpa@redhat.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+
+#include "config.h"
+
+#include <glib/gi18n-lib.h>
+
+#include "cc-firmware-security-help-dialog.h"
+
+struct _CcFirmwareSecurityHelpDialog
+{
+  GtkWindow  parent;
+};
+
+G_DEFINE_TYPE (CcFirmwareSecurityHelpDialog, cc_firmware_security_help_dialog, GTK_TYPE_WINDOW)
+
+
+static void
+cc_firmware_security_help_dialog_class_init (CcFirmwareSecurityHelpDialogClass *klass)
+{
+  GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
+
+  gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/control-center/firmware-security/cc-firmware-security-help-dialog.ui");
+}
+
+static void
+cc_firmware_security_help_dialog_init (CcFirmwareSecurityHelpDialog *dialog)
+{
+  gtk_widget_init_template (GTK_WIDGET (dialog));
+}
+
+GtkWidget *
+cc_firmware_security_help_dialog_new (void)
+{
+  return g_object_new (CC_TYPE_FIRMWARE_SECURITY_HELP_DIALOG, NULL);
+}
diff -pruN 1:43.2-2/panels/firmware-security/cc-firmware-security-help-dialog.h 1:44~alpha-0ubuntu1/panels/firmware-security/cc-firmware-security-help-dialog.h
--- 1:43.2-2/panels/firmware-security/cc-firmware-security-help-dialog.h	1970-01-01 00:00:00.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/firmware-security/cc-firmware-security-help-dialog.h	2023-01-09 20:06:57.000000000 +0000
@@ -0,0 +1,35 @@
+/* cc-firmware-security-dialog.h
+ *
+ * Copyright (C) 2022 Red Hat, Inc
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see <http://www.gnu.org/licenses/>.
+ *
+ * Author: Kate Hsuan <hpa@redhat.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+
+#pragma once
+
+#include <gtk/gtk.h>
+
+G_BEGIN_DECLS
+
+#define CC_TYPE_FIRMWARE_SECURITY_HELP_DIALOG (cc_firmware_security_help_dialog_get_type ())
+G_DECLARE_FINAL_TYPE (CcFirmwareSecurityHelpDialog, cc_firmware_security_help_dialog,
+                      CC, FIRMWARE_SECURITY_HELP_DIALOG, GtkWindow)
+
+GtkWidget * cc_firmware_security_help_dialog_new (void);
+
+G_END_DECLS
diff -pruN 1:43.2-2/panels/firmware-security/cc-firmware-security-help-dialog.ui 1:44~alpha-0ubuntu1/panels/firmware-security/cc-firmware-security-help-dialog.ui
--- 1:43.2-2/panels/firmware-security/cc-firmware-security-help-dialog.ui	1970-01-01 00:00:00.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/firmware-security/cc-firmware-security-help-dialog.ui	2023-01-09 20:06:57.000000000 +0000
@@ -0,0 +1,135 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+  <template class="CcFirmwareSecurityHelpDialog" parent="GtkWindow">
+    <property name="default-width">500</property>
+    <property name="modal">True</property>
+    <property name="title" translatable="yes">About Device Security</property>
+
+    <child type="titlebar">
+      <object class="GtkHeaderBar">
+        <property name="show-title-buttons">True</property>
+      </object>
+    </child>
+
+    <child>
+      <object class="GtkBox">
+        <property name="orientation">vertical</property>
+        <property name="margin-top">32</property>
+        <property name="margin-start">32</property>
+        <property name="margin-end">32</property>
+        <property name="margin-bottom">32</property>
+        <child>
+          <object class="GtkBox">
+            <property name="orientation">vertical</property>
+
+            <child>
+              <object class="GtkLabel" id="help_description_section1">
+                <property name="wrap">True</property>
+                <property name="justify">left</property>
+                <property name="halign">start</property>
+                <property name="hexpand">true</property>
+                <property name="label" translatable="yes">Device security provides information about how protected your device is against security issues which target the hardware itself.</property>
+              </object>
+            </child>
+
+            <child>
+              <object class="GtkLabel">
+                <property name="wrap">True</property>
+                <property name="justify">left</property>
+                <property name="hexpand">true</property>
+                <property name="halign">start</property>
+                <property name="label"> </property>
+              </object>
+            </child>
+
+            <child>
+              <object class="GtkLabel" id="help_description_section2">
+                <property name="wrap">True</property>
+                <property name="justify">left</property>
+                <property name="halign">start</property>
+                <property name="hexpand">true</property>
+                <property name="label" translatable="yes">Aspects of hardware that affect security include:</property>
+              </object>
+            </child>
+
+            <child>
+              <object class="GtkLabel">
+                <property name="wrap">True</property>
+                <property name="justify">left</property>
+                <property name="halign">start</property>
+              </object>
+            </child>
+
+            <child>
+              <object class="GtkLabel" id="help_description_section3">
+                <property name="wrap">True</property>
+                <property name="justify">left</property>
+                <property name="halign">start</property>
+                <property name="hexpand">true</property>
+                <property name="label" translatable="yes">• security features that are built into a hardware itself;</property>
+              </object>
+            </child>
+
+            <child>
+              <object class="GtkLabel" id="help_description_section4">
+                <property name="wrap">True</property>
+                <property name="justify">left</property>
+                <property name="halign">start</property>
+                <property name="hexpand">true</property>
+                <property name="label" translatable="yes">• how the hardware is configured to protect against security issues;</property>
+              </object>
+            </child>
+
+            <child>
+              <object class="GtkLabel" id="help_description_section5">
+                <property name="wrap">True</property>
+                <property name="justify">left</property>
+                <property name="halign">start</property>
+                <property name="hexpand">true</property>
+                <property name="label" translatable="yes">• the security of the software runs directly on the hardware.</property>
+              </object>
+            </child>
+
+            <child>
+              <object class="GtkLabel">
+                <property name="wrap">True</property>
+                <property name="justify">left</property>
+                <property name="halign">start</property>
+              </object>
+            </child>
+
+            <child>
+              <object class="GtkLabel" id="help_description_section6">
+                <property name="wrap">True</property>
+                <property name="justify">left</property>
+                <property name="halign">start</property>
+                <property name="hexpand">true</property>
+                <property name="label" translatable="yes">Security threats which affect hardware include malware and viruses that target the software that runs directly on the hardware. It also includes physical tampering, such as physical connection to the hardware to read data and implant malware.</property>
+              </object>
+            </child>
+
+            <child>
+              <object class="GtkLabel">
+                <property name="wrap">True</property>
+                <property name="justify">left</property>
+                <property name="halign">start</property>
+              </object>
+            </child>
+
+            <child>
+              <object class="GtkLabel" id="help_description_section7">
+                <property name="wrap">True</property>
+                <property name="justify">left</property>
+                <property name="halign">start</property>
+                <property name="hexpand">true</property>
+                <property name="label" translatable="yes">Device security is just one aspect of security, and does not reflect the overall security status of the system and applications.</property>
+              </object>
+            </child>
+
+          </object>
+        </child>
+      </object>
+    </child>
+
+  </template>
+</interface>
diff -pruN 1:43.2-2/panels/firmware-security/cc-firmware-security-panel.c 1:44~alpha-0ubuntu1/panels/firmware-security/cc-firmware-security-panel.c
--- 1:43.2-2/panels/firmware-security/cc-firmware-security-panel.c	2022-12-23 11:11:35.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/firmware-security/cc-firmware-security-panel.c	2023-01-09 20:06:57.000000000 +0000
@@ -26,6 +26,7 @@
 #include "cc-firmware-security-resources.h"
 #include "cc-firmware-security-dialog.h"
 #include "cc-firmware-security-boot-dialog.h"
+#include "cc-firmware-security-help-dialog.h"
 #include "cc-firmware-security-utils.h"
 #include "cc-util.h"
 
@@ -39,11 +40,15 @@ struct _CcfirmwareSecurityPanel
   GtkButton        *hsi_button;
   GtkButton        *secure_boot_button;
 
+  /* Leaflet */
+  GtkWidget        *panel_leaflet;
+
   /* HSI button */
   GtkWidget        *hsi_grid;
 
   GtkWidget        *hsi_circle_box;
   GtkWidget        *hsi_circle_number;
+  GtkWidget        *hsi_icon;
 
   GtkWidget        *hsi_label;
   GtkWidget        *hsi_description;
@@ -66,6 +71,8 @@ struct _CcfirmwareSecurityPanel
   GHashTable       *hsi2_dict;
   GHashTable       *hsi3_dict;
   GHashTable       *hsi4_dict;
+  GHashTable       *runtime_dict;
+  GString          *event_log_output;
 
   guint             hsi_number;
   SecureBootState   secure_boot_state;
@@ -183,9 +190,6 @@ parse_event_variant_iter (CcfirmwareSecu
     return;
 
   /* build new row */
-  date = g_date_time_new_from_unix_local (attr->timestamp);
-  date_string = g_date_time_format (date, "\%F \%H:\%m:\%S");
-
   row = adw_expander_row_new ();
   if (attr->flags & FWUPD_SECURITY_ATTR_FLAG_SUCCESS)
     {
@@ -212,6 +216,29 @@ parse_event_variant_iter (CcfirmwareSecu
     }
 
   adw_preferences_row_set_title (ADW_PREFERENCES_ROW (row), attr->title);
+
+  g_string_append (self->event_log_output, "  ");
+  date = g_date_time_new_from_unix_local (attr->timestamp);
+  date_string = g_date_time_format (date, "%Y-%m-%d %H:%M:%S");
+  /* TRANSLATOR: this is the date in "%Y-%m-%d %H:%M:%S" format,
+     for example: 2022-08-01 22:48:00 */
+  g_string_append_printf (self->event_log_output, _("%1$s"), date_string);
+  g_string_append (self->event_log_output, "   ");
+  hsi_report_title_print_padding (attr->title, self->event_log_output, 30);
+
+  if (attr->flags & FWUPD_SECURITY_ATTR_FLAG_SUCCESS)
+    /* TRANSLATOR: This is the text event status output when the event status is "success" */
+    g_string_append (self->event_log_output, _("Pass"));
+  else
+    /* TRANSLATOR: This is the text event status output when the event status is not "success" */
+    g_string_overwrite (self->event_log_output, self->event_log_output->len-2, _("! Fail"));
+
+  g_string_append (self->event_log_output, " ");
+  g_string_append_printf (self->event_log_output, _("(%1$s → %2$s)"),
+                          fwupd_security_attr_result_to_string (attr->result_fallback),
+                          fwupd_security_attr_result_to_string (attr->result));
+  g_string_append (self->event_log_output, "\n");
+
   adw_expander_row_set_subtitle (ADW_EXPANDER_ROW (row), date_string);
   adw_preferences_group_add (ADW_PREFERENCES_GROUP (self->firmware_security_log_pgroup), GTK_WIDGET (row));
 
@@ -262,6 +289,10 @@ parse_variant_iter (CcfirmwareSecurityPa
                              g_strdup (appstream_id),
                              g_steal_pointer (&attr));
         break;
+      default:
+        g_hash_table_insert (self->runtime_dict,
+                             g_strdup (appstream_id),
+                             g_steal_pointer (&attr));
     }
 }
 
@@ -337,6 +368,28 @@ on_bus_event_done_cb (GObject      *sour
 }
 
 static void
+show_loading_page (CcfirmwareSecurityPanel *self, const gchar *page_name)
+{
+  adw_leaflet_set_visible_child_name (ADW_LEAFLET(self->panel_leaflet), page_name);
+}
+
+static int
+on_timeout_cb (gpointer user_data)
+{
+  CcfirmwareSecurityPanel *self = CC_FIRMWARE_SECURITY_PANEL (user_data);
+  show_loading_page (self, "panel_show");
+  return 0;
+}
+
+static int
+on_timeout_unavaliable (gpointer user_data)
+{
+  CcfirmwareSecurityPanel *self = CC_FIRMWARE_SECURITY_PANEL (user_data);
+  show_loading_page (self, "panel_unavaliable");
+  return 0;
+}
+
+static void
 on_bus_done (GObject      *source,
              GAsyncResult *res,
              gpointer      user_data)
@@ -348,17 +401,13 @@ on_bus_done (GObject      *source,
   val = g_dbus_proxy_call_finish (G_DBUS_PROXY (source), res, &error);
   if (val == NULL)
     {
-      CcApplication *application = CC_APPLICATION (g_application_get_default ());
-      g_warning ("failed to get Security Attribute: %s", error->message);
-      cc_shell_model_set_panel_visibility (cc_application_get_model (application),
-                                           "firmware-security",
-                                           CC_PANEL_HIDDEN);
-      set_secure_boot_button_view (self);
+      g_timeout_add (1500, on_timeout_unavaliable, self);
       return;
     }
 
   parse_array_from_variant (self, val, FALSE);
   set_secure_boot_button_view (self);
+  g_timeout_add (1500, on_timeout_cb, self);
 }
 
 static void
@@ -410,7 +459,9 @@ on_hsi_button_clicked_cb (GtkWidget *wid
                                             self->hsi1_dict,
                                             self->hsi2_dict,
                                             self->hsi3_dict,
-                                            self->hsi4_dict);
+                                            self->hsi4_dict,
+                                            self->runtime_dict,
+                                            self->event_log_output);
   shell = cc_panel_get_shell (CC_PANEL (self));
   toplevel = cc_shell_get_toplevel (shell);
   gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (toplevel));
@@ -434,6 +485,22 @@ on_secure_boot_button_clicked_cb (GtkWid
 }
 
 static void
+on_fw_help_button_clicked_cb (GtkWidget *widget,
+                              gpointer   data)
+{
+  CcfirmwareSecurityPanel *self = CC_FIRMWARE_SECURITY_PANEL (data);
+  GtkWidget *help_dialog;
+  GtkWidget *toplevel;
+  CcShell *shell;
+
+  help_dialog = cc_firmware_security_help_dialog_new ();
+  shell = cc_panel_get_shell (CC_PANEL (self));
+  toplevel = cc_shell_get_toplevel (shell);
+  gtk_window_set_transient_for (GTK_WINDOW (help_dialog), GTK_WINDOW (toplevel));
+  gtk_window_present (GTK_WINDOW (help_dialog));
+}
+
+static void
 set_hsi_button_view_contain (CcfirmwareSecurityPanel *self,
                              guint                    hsi_number,
                              gchar                   *title,
@@ -442,30 +509,22 @@ set_hsi_button_view_contain (CcfirmwareS
   switch (hsi_number)
     {
       case 0:
-        gtk_label_set_label (GTK_LABEL (self->hsi_circle_number), "0");
-        gtk_widget_add_css_class (self->hsi_circle_box, "level0");
-        gtk_widget_add_css_class (self->hsi_circle_number, "hsi0");
+        gtk_image_set_from_icon_name (GTK_IMAGE (self->hsi_icon), "dialog-warning-symbolic");
+        gtk_widget_add_css_class (self->hsi_icon, "error");
         break;
       case 1:
-        gtk_label_set_label (GTK_LABEL (self->hsi_circle_number), "1");
-        gtk_widget_add_css_class (self->hsi_circle_box, "level1");
-        gtk_widget_add_css_class (self->hsi_circle_number, "hsi1");
+        gtk_image_set_from_icon_name (GTK_IMAGE (self->hsi_icon), "emblem-default-symbolic");
+        gtk_widget_add_css_class (self->hsi_icon, "good");
         break;
       case 2:
-        gtk_label_set_label (GTK_LABEL (self->hsi_circle_number), "2");
-        gtk_widget_add_css_class (self->hsi_circle_box, "level2");
-        gtk_widget_add_css_class (self->hsi_circle_number, "hsi2");
-        break;
       case 3:
       case 4:
-        gtk_label_set_label (GTK_LABEL (self->hsi_circle_number), "3");
-        gtk_widget_add_css_class (self->hsi_circle_box, "level3");
-        gtk_widget_add_css_class (self->hsi_circle_number, "hsi3");
+        gtk_image_set_from_icon_name (GTK_IMAGE (self->hsi_icon), "security-high-symbolic");
+        gtk_widget_add_css_class (self->hsi_icon, "good");
         break;
       default:
-        gtk_label_set_label (GTK_LABEL (self->hsi_circle_number), "?");
-        gtk_widget_add_css_class (self->hsi_circle_box, "level1");
-        gtk_widget_add_css_class (self->hsi_circle_number, "hsi1");
+        gtk_image_set_from_icon_name (GTK_IMAGE (self->hsi_icon), "dialog-question-symbolic");
+        gtk_widget_add_css_class (self->hsi_icon, "neutral");
         break;
     }
 
@@ -482,43 +541,30 @@ set_hsi_button_view (CcfirmwareSecurityP
         set_hsi_button_view_contain (self,
                                      self->hsi_number,
                                      /* TRANSLATORS: in reference to firmware protection: 0/4 stars */
-                                     _("Security Level 0"),
-                                     _("Exposed to serious security threats."));
+                                     _("Checks Failed"),
+                                     _("Hardware does not pass checks."));
         break;
       case 1:
         set_hsi_button_view_contain (self,
                                      self->hsi_number,
                                      /* TRANSLATORS: in reference to firmware protection: 1/4 stars */
-                                     _("Security Level 1"),
-                                     _("Limited protection against simple security threats."));
+                                     _("Checks Passed"),
+                                     _("Hardware meets security requirements."));
         break;
       case 2:
-        set_hsi_button_view_contain (self,
-                                     self->hsi_number,
-                                     /* TRANSLATORS: in reference to firmware protection: 2/4 stars */
-                                     _("Security Level 2"),
-                                     _("Protected against common security threats."));
-        break;
       case 3:
-        set_hsi_button_view_contain (self,
-                                     self->hsi_number,
-                                     /* TRANSLATORS: in reference to firmware protection: 3/4 stars */
-                                     _("Security Level 3"),
-                                     _("Protected against a wide range of security threats."));
-        break;
       case 4:
         set_hsi_button_view_contain (self,
-                                     /* Based on current HSI definition, the max HSI value would be 3. */
-                                     3,
-                                     /* TRANSLATORS: in reference to firmware protection: 4/4 stars */
-                                     _("Comprehensive Protection"),
-                                     _("Protected against a wide range of security threats."));
+                                     self->hsi_number,
+                                     /* TRANSLATORS: in reference to firmware protection: 2~4 stars */
+                                     _("Protected"),
+                                     _("Hardware has a good level of protection."));
         break;
       case G_MAXUINT:
         set_hsi_button_view_contain (self,
                                      self->hsi_number,
                                      /* TRANSLATORS: in reference to firmware protection: ??? stars */
-                                     _("Security Level"),
+                                     _("Checks Unavailable"),
                                      _("Security levels are not available for this device."));
         break;
       default:
@@ -648,6 +694,8 @@ cc_firmware_security_panel_finalize (GOb
   g_clear_pointer (&self->hsi2_dict, g_hash_table_unref);
   g_clear_pointer (&self->hsi3_dict, g_hash_table_unref);
   g_clear_pointer (&self->hsi4_dict, g_hash_table_unref);
+  g_clear_pointer (&self->runtime_dict, g_hash_table_unref);
+  g_string_free (self->event_log_output, TRUE);
 
   g_clear_object (&self->bus_proxy);
   g_clear_object (&self->properties_bus_proxy);
@@ -670,16 +718,17 @@ cc_firmware_security_panel_class_init (C
   gtk_widget_class_bind_template_child (widget_class, CcfirmwareSecurityPanel, firmware_security_log_stack);
   gtk_widget_class_bind_template_child (widget_class, CcfirmwareSecurityPanel, hsi_button);
   gtk_widget_class_bind_template_child (widget_class, CcfirmwareSecurityPanel, hsi_description);
-  gtk_widget_class_bind_template_child (widget_class, CcfirmwareSecurityPanel, hsi_circle_box);
-  gtk_widget_class_bind_template_child (widget_class, CcfirmwareSecurityPanel, hsi_circle_number);
+  gtk_widget_class_bind_template_child (widget_class, CcfirmwareSecurityPanel, hsi_icon);
   gtk_widget_class_bind_template_child (widget_class, CcfirmwareSecurityPanel, hsi_label);
   gtk_widget_class_bind_template_child (widget_class, CcfirmwareSecurityPanel, secure_boot_button);
   gtk_widget_class_bind_template_child (widget_class, CcfirmwareSecurityPanel, secure_boot_description);
   gtk_widget_class_bind_template_child (widget_class, CcfirmwareSecurityPanel, secure_boot_icon);
   gtk_widget_class_bind_template_child (widget_class, CcfirmwareSecurityPanel, secure_boot_label);
+  gtk_widget_class_bind_template_child (widget_class, CcfirmwareSecurityPanel, panel_leaflet);
 
   gtk_widget_class_bind_template_callback (widget_class, on_hsi_button_clicked_cb);
   gtk_widget_class_bind_template_callback (widget_class, on_secure_boot_button_clicked_cb);
+  gtk_widget_class_bind_template_callback (widget_class, on_fw_help_button_clicked_cb);
 }
 
 static void
@@ -693,6 +742,8 @@ cc_firmware_security_panel_init (Ccfirmw
   self->hsi2_dict = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, (GDestroyNotify) fu_security_attr_free);
   self->hsi3_dict = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, (GDestroyNotify) fu_security_attr_free);
   self->hsi4_dict = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, (GDestroyNotify) fu_security_attr_free);
+  self->runtime_dict = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, (GDestroyNotify) fu_security_attr_free);
+  self->event_log_output = g_string_new (NULL);
 
   load_custom_css ("/org/gnome/control-center/firmware-security/security-level.css");
 
diff -pruN 1:43.2-2/panels/firmware-security/cc-firmware-security-panel.ui 1:44~alpha-0ubuntu1/panels/firmware-security/cc-firmware-security-panel.ui
--- 1:43.2-2/panels/firmware-security/cc-firmware-security-panel.ui	2022-12-23 11:11:35.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/firmware-security/cc-firmware-security-panel.ui	2023-01-09 20:06:57.000000000 +0000
@@ -1,176 +1,262 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <interface>
   <template class="CcfirmwareSecurityPanel" parent="CcPanel">
+    <child type="titlebar-end">
+      <object class="GtkButton" id="fw_help_button">
+        <property name="halign">center</property>
+        <property name="valign">center</property>
+        <property name="icon-name">help-about-symbolic</property>
+           <signal name="clicked" handler="on_fw_help_button_clicked_cb" swapped="no" />
+        <style>
+          <class name="image-button" />
+        </style>
+      </object>
+    </child>
+
     <child type="content">
-      <object class="AdwPreferencesPage">
+      <object class="AdwLeaflet" id="panel_leaflet">
+        <property name="can-unfold">False</property>
 
         <child>
-          <object class="AdwPreferencesGroup">
-
-            <child>
-              <object class="GtkBox" id="firmware_security_hbox">
-                <property name="spacing">24</property>
-                <property name="homogeneous">True</property>
+          <object class="AdwLeafletPage">
+            <property name="name">panel_loading</property>
+            <property name="child">
+              <object class="AdwPreferencesPage">
                 <child>
-                  <object class="GtkButton" id="hsi_button">
-                    <property name="receives-default">True</property>
-                    <property name="sensitive">True</property>
-                    <property name="vexpand-set">True</property>
-                    <signal name="clicked" handler="on_hsi_button_clicked_cb" swapped="no" />
-                    <style>
-                      <class name="card" />
-                    </style>
+                  <object class="AdwPreferencesGroup">
                     <child>
-                      <object class="GtkBox" id="hsi_box">
+
+                      <object class="GtkBox">
+                        <property name="spacing">12</property>
+                        <property name="homogeneous">True</property>
                         <property name="orientation">vertical</property>
-                        <property name="halign">fill</property>
-                        <property name="valign">start</property>
-                        <property name="margin-start">12</property>
-                        <property name="margin-end">12</property>
-                        <property name="margin-top">24</property>
-                        <property name="margin-bottom">24</property>
-                        <property name="spacing">6</property>
+                        <property name="halign">center</property>
+                        <property name="valign">center</property>
+                        <property name="hexpand">true</property>
+                        <property name="vexpand">true</property>
                         <child>
-                          <object class="GtkBox" id="hsi_circle_box">
-                            <property name="orientation">vertical</property>
+                          <object class="GtkSpinner">
                             <property name="halign">center</property>
                             <property name="valign">center</property>
-                            <property name="margin-bottom">6</property>
-                            <child>
-                              <object class="GtkLabel" id="hsi_circle_number">
-                                <property name="halign">center</property>
-                                <property name="valign">center</property>
-                                <property name="vexpand">True</property>
-                                <property name="justify">center</property>
-                                <property name="label">9</property>
-                                <style>
-                                  <class name="hsi-level-font" />
-                                </style>
-                              </object>
-                            </child>
-                            <style>
-                              <class name="hsi-level-box" />
-                            </style>
+                            <property name="spinning">true</property>
                           </object>
                         </child>
                         <child>
-                          <object class="GtkLabel" id="hsi_label">
+                          <object class="GtkLabel">
                             <property name="justify">center</property>
                             <property name="wrap">True</property>
+                            <property name="halign">0.0</property>
+                            <property name="valign">0.0</property>
+                            <property name="label" translatable="yes">Starting Device Security…</property>
                             <style>
                               <class name="heading" />
                             </style>
                           </object>
                         </child>
-                        <child>
-                          <object class="GtkLabel" id="hsi_description">
-                            <property name="wrap">True</property>
-                            <property name="justify">center</property>
-                            <property name="ellipsize">none</property>
-                            <property name="lines">2</property>
-                            <style>
-                              <class name="caption" />
-                            </style>
-                          </object>
-                        </child>
                       </object>
                     </child>
                   </object>
                 </child>
+              </object>
+            </property>
+          </object>
+        </child>
+
+        <child>
+          <object class="AdwLeafletPage">
+            <property name="name">panel_unavaliable</property>
+            <property name="child">
+              <object class="AdwPreferencesPage">
                 <child>
-                  <object class="GtkButton" id="secure_boot_button">
-                    <property name="receives-default">True</property>
-                    <signal name="clicked" handler="on_secure_boot_button_clicked_cb" swapped="no" />
-                    <style>
-                      <class name="card" />
-                    </style>
+                  <object class="AdwPreferencesGroup">
                     <child>
-                      <object class="GtkBox" id="secure_boot_box">
-                        <property name="orientation">vertical</property>
-                        <property name="halign">fill</property>
-                        <property name="valign">start</property>
-                        <property name="margin-start">12</property>
-                        <property name="margin-end">12</property>
-                        <property name="margin-top">24</property>
-                        <property name="margin-bottom">24</property>
-                        <property name="spacing">6</property>
-                        <child>
-                          <object class="GtkImage" id="secure_boot_icon">
-                            <property name="pixel-size">32</property>
-                            <property name="halign">center</property>
-                            <property name="valign">center</property>
-                            <property name="icon-name">channel-insecure</property>
-                            <property name="margin-bottom">6</property>
-                            <style>
-                              <class name="security-level-icon" />
-                            </style>
-                          </object>
-                        </child>
+                      <object class="AdwStatusPage">
+                        <property name="vexpand">True</property>
+                        <property name="opacity">0.5</property>
+                        <property name="title" translatable="yes">Device Security Unavailable</property>
+                        <property name="icon-name">security-high-symbolic</property>
+                        <property name="description" translatable="yes">Device Security is only available on physical hardware. No physical hardware has been detected.</property>
+
+                      </object>
+                    </child>
+                  </object>
+                </child>
+              </object>
+            </property>
+          </object>
+        </child>
+
+        <child>
+          <object class="AdwLeafletPage">
+            <property name="name">panel_show</property>
+            <property name="child">
+              <object class="AdwPreferencesPage">
+                <child>
+                  <object class="AdwPreferencesGroup">
+
+                    <child>
+                      <object class="GtkBox" id="firmware_security_hbox">
+                        <property name="spacing">24</property>
+                        <property name="homogeneous">True</property>
                         <child>
-                          <object class="GtkLabel" id="secure_boot_label">
-                            <property name="justify">center</property>
-                            <property name="wrap">True</property>
+                          <object class="GtkButton" id="hsi_button">
+                            <property name="receives-default">True</property>
+                            <property name="sensitive">True</property>
+                            <property name="vexpand-set">True</property>
+                            <signal name="clicked" handler="on_hsi_button_clicked_cb" swapped="no" />
                             <style>
-                              <class name="heading" />
+                              <class name="card" />
                             </style>
+                            <child>
+                              <object class="GtkBox" id="hsi_box">
+                                <property name="orientation">vertical</property>
+                                <property name="halign">fill</property>
+                                <property name="valign">start</property>
+                                <property name="margin-start">12</property>
+                                <property name="margin-end">12</property>
+                                <property name="margin-top">24</property>
+                                <property name="margin-bottom">24</property>
+                                <property name="spacing">6</property>
+                                <child>
+                                  <object class="GtkImage" id="hsi_icon">
+                                    <property name="halign">center</property>
+                                    <property name="valign">center</property>
+                                    <property name="icon-name">dialog-question-symbolic</property>
+                                    <property name="pixel-size">32</property>
+                                    <property name="margin-bottom">6</property>
+                                    <style>
+                                      <class name="security-level-icon"/>
+                                    </style>
+                                  </object>
+                                </child>
+                                <child>
+                                  <object class="GtkLabel" id="hsi_label">
+                                    <property name="justify">center</property>
+                                    <property name="wrap">True</property>
+                                    <style>
+                                      <class name="heading" />
+                                    </style>
+                                  </object>
+                                </child>
+                                <child>
+                                  <object class="GtkLabel" id="hsi_description">
+                                    <property name="wrap">True</property>
+                                    <property name="justify">center</property>
+                                    <property name="ellipsize">none</property>
+                                    <property name="lines">2</property>
+                                    <style>
+                                      <class name="caption" />
+                                    </style>
+                                  </object>
+                                </child>
+                              </object>
+                            </child>
                           </object>
                         </child>
                         <child>
-                          <object class="GtkLabel" id="secure_boot_description">
-                            <property name="wrap">True</property>
-                            <property name="justify">center</property>
-                            <property name="ellipsize">none</property>
-                            <property name="lines">2</property>
+                          <object class="GtkButton" id="secure_boot_button">
+                            <property name="receives-default">True</property>
+                            <signal name="clicked" handler="on_secure_boot_button_clicked_cb" swapped="no" />
                             <style>
-                              <class name="caption" />
+                              <class name="card" />
                             </style>
+                            <child>
+                              <object class="GtkBox" id="secure_boot_box">
+                                <property name="orientation">vertical</property>
+                                <property name="halign">fill</property>
+                                <property name="valign">start</property>
+                                <property name="margin-start">12</property>
+                                <property name="margin-end">12</property>
+                                <property name="margin-top">24</property>
+                                <property name="margin-bottom">24</property>
+                                <property name="spacing">6</property>
+                                <child>
+                                  <object class="GtkImage" id="secure_boot_icon">
+                                    <property name="pixel-size">32</property>
+                                    <property name="halign">center</property>
+                                    <property name="valign">center</property>
+                                    <property name="icon-name">channel-insecure</property>
+                                    <property name="margin-bottom">6</property>
+                                    <style>
+                                      <class name="security-level-icon" />
+                                    </style>
+                                  </object>
+                                </child>
+                                <child>
+                                  <object class="GtkLabel" id="secure_boot_label">
+                                    <property name="justify">center</property>
+                                    <property name="wrap">True</property>
+                                    <style>
+                                      <class name="heading" />
+                                    </style>
+                                  </object>
+                                </child>
+                                <child>
+                                  <object class="GtkLabel" id="secure_boot_description">
+                                    <property name="wrap">True</property>
+                                    <property name="justify">center</property>
+                                    <property name="ellipsize">none</property>
+                                    <property name="lines">2</property>
+                                    <style>
+                                      <class name="caption" />
+                                    </style>
+                                  </object>
+                                </child>
+                              </object>
+                            </child>
                           </object>
                         </child>
                       </object>
                     </child>
                   </object>
                 </child>
-              </object>
-            </child>
-          </object>
-        </child>
 
-        <child>
-          <object class="AdwPreferencesGroup">
-            <property name="title">Security Events</property>
-            <child>
-              <object class="AdwViewStack" id="firmware_security_log_stack">
                 <child>
-                  <object class="AdwViewStackPage">
-                    <property name="name">no_event</property>
-                    <property name="child">
-                      <object class="AdwStatusPage">
-                        <property name="vexpand">True</property>
-                        <property name="opacity">0.5</property>
-                        <property name="title" translatable="yes">No Events</property>
-                        <property name="icon-name">document-open-recent-symbolic</property>
-                        <style>
-                          <class name="card" />
-                          <class name="compact" />
-                        </style>
+                  <object class="AdwPreferencesGroup">
+                    <property name="title" translatable="yes">Security Events</property>
+                    <child>
+                      <object class="AdwViewStack" id="firmware_security_log_stack">
+                        <child>
+                          <object class="AdwViewStackPage">
+                            <property name="name">no_event</property>
+                            <property name="child">
+                              <object class="AdwStatusPage">
+                                <property name="vexpand">True</property>
+                                <property name="opacity">0.5</property>
+                                <property name="title" translatable="yes">No Events</property>
+                                <property name="icon-name">document-open-recent-symbolic</property>
+                                <style>
+                                  <class name="card" />
+                                  <class name="compact" />
+                                </style>
+                              </object>
+                            </property>
+                          </object>
+                        </child>
+                        <child>
+                          <object class="AdwViewStackPage">
+                            <property name="name">page2</property>
+                            <property name="child">
+                              <object class="AdwPreferencesGroup" id="firmware_security_log_pgroup" />
+                            </property>
+                          </object>
+                        </child>
                       </object>
-                    </property>
-                  </object>
-                </child>
-                <child>
-                  <object class="AdwViewStackPage">
-                    <property name="name">page2</property>
-                    <property name="child">
-                      <object class="AdwPreferencesGroup" id="firmware_security_log_pgroup" />
-                    </property>
+                    </child>
                   </object>
                 </child>
+
               </object>
-            </child>
+            </property>
           </object>
         </child>
 
       </object>
+
+
+
+
+
     </child>
   </template>
 </interface>
diff -pruN 1:43.2-2/panels/firmware-security/cc-firmware-security-utils.c 1:44~alpha-0ubuntu1/panels/firmware-security/cc-firmware-security-utils.c
--- 1:43.2-2/panels/firmware-security/cc-firmware-security-utils.c	2022-12-23 11:11:35.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/firmware-security/cc-firmware-security-utils.c	2023-01-09 20:06:57.000000000 +0000
@@ -26,208 +26,6 @@
 
 #include "cc-firmware-security-utils.h"
 
-/* we don't need to keep this up to date, as any new attrs added by fwupd >= 1.8.3 will also
- * come with translated titles *and* descriptions */
-static const gchar *
-fu_security_attr_get_title_fallback (const gchar *appstream_id)
-{
-  if (g_strcmp0 (appstream_id, FWUPD_SECURITY_ATTR_ID_SPI_BIOSWE) == 0)
-    {
-      /* TRANSLATORS: Title: firmware refers to the flash chip in the computer */
-      return _("Firmware Write Protection");
-    }
-  if (g_strcmp0 (appstream_id, FWUPD_SECURITY_ATTR_ID_SPI_BLE) == 0)
-    {
-      /* TRANSLATORS: Title: firmware refers to the flash chip in the computer */
-      return _("Firmware Write Protection Lock");
-    }
-  if (g_strcmp0 (appstream_id, FWUPD_SECURITY_ATTR_ID_SPI_SMM_BWP) == 0)
-    {
-      /* TRANSLATORS: Title: SPI refers to the flash chip in the computer */
-      return _("Firmware BIOS Region");
-    }
-  if (g_strcmp0 (appstream_id, FWUPD_SECURITY_ATTR_ID_SPI_DESCRIPTOR) == 0)
-    {
-      /* TRANSLATORS: Title: firmware refers to the flash chip in the computer */
-      return _("Firmware BIOS Descriptor");
-    }
-  if (g_strcmp0 (appstream_id, FWUPD_SECURITY_ATTR_ID_PREBOOT_DMA_PROTECTION) == 0)
-    {
-      /* TRANSLATORS: Title: DMA as in https://en.wikipedia.org/wiki/DMA_attack  */
-      return _("Pre-boot DMA Protection");
-    }
-  if (g_strcmp0 (appstream_id, FWUPD_SECURITY_ATTR_ID_INTEL_BOOTGUARD_ENABLED) == 0)
-    {
-      /* TRANSLATORS: Title: BootGuard is a trademark from Intel */
-      return _("Intel BootGuard");
-    }
-  if (g_strcmp0 (appstream_id, FWUPD_SECURITY_ATTR_ID_INTEL_BOOTGUARD_VERIFIED) == 0)
-    {
-      /* TRANSLATORS: Title: BootGuard is a trademark from Intel,
-       * verified boot refers to the way the boot process is verified */
-      return _("Intel BootGuard Verified Boot");
-    }
-  if (g_strcmp0 (appstream_id, FWUPD_SECURITY_ATTR_ID_INTEL_BOOTGUARD_ACM) == 0)
-    {
-      /* TRANSLATORS: Title: BootGuard is a trademark from Intel,
-       * ACM means to verify the integrity of Initial Boot Block */
-      return _("Intel BootGuard ACM Protected");
-    }
-  if (g_strcmp0 (appstream_id, FWUPD_SECURITY_ATTR_ID_INTEL_BOOTGUARD_POLICY) == 0)
-    {
-      /* TRANSLATORS: Title: BootGuard is a trademark from Intel,
-       * error policy is what to do on failure */
-      return _("Intel BootGuard Error Policy");
-    }
-  if (g_strcmp0 (appstream_id, FWUPD_SECURITY_ATTR_ID_INTEL_BOOTGUARD_OTP) == 0)
-    {
-      /* TRANSLATORS: Title: BootGuard is a trademark from Intel */
-      return _("Intel BootGuard Fuse");
-    }
-  if (g_strcmp0 (appstream_id, FWUPD_SECURITY_ATTR_ID_INTEL_CET_ENABLED) == 0)
-    {
-      /* TRANSLATORS: Title: CET = Control-flow Enforcement Technology,
-       * enabled means supported by the processor */
-      return _("Intel CET Enabled");
-    }
-  if (g_strcmp0 (appstream_id, FWUPD_SECURITY_ATTR_ID_INTEL_CET_ACTIVE) == 0)
-    {
-      /* TRANSLATORS: Title: CET = Control-flow Enforcement Technology,
-       * active means being used by the OS */
-      return _("Intel CET Active");
-    }
-  if (g_strcmp0 (appstream_id, FWUPD_SECURITY_ATTR_ID_INTEL_SMAP) == 0)
-    {
-      /* TRANSLATORS: Title: SMAP = Supervisor Mode Access Prevention */
-      return _("Intel SMAP");
-    }
-  if (g_strcmp0 (appstream_id, FWUPD_SECURITY_ATTR_ID_ENCRYPTED_RAM) == 0)
-    {
-      /* TRANSLATORS: Title: Memory contents are encrypted, e.g. Intel TME */
-      return _("Encrypted RAM");
-    }
-  if (g_strcmp0 (appstream_id, FWUPD_SECURITY_ATTR_ID_IOMMU) == 0)
-    {
-      /* TRANSLATORS: Title:
-       * https://en.wikipedia.org/wiki/Input%E2%80%93output_memory_management_unit */
-      return _("IOMMU Protection");
-    }
-  if (g_strcmp0 (appstream_id, FWUPD_SECURITY_ATTR_ID_KERNEL_LOCKDOWN) == 0)
-    {
-      /* TRANSLATORS: Title: lockdown is a security mode of the kernel */
-      return _("Linux Kernel Lockdown");
-    }
-  if (g_strcmp0 (appstream_id, FWUPD_SECURITY_ATTR_ID_KERNEL_TAINTED) == 0)
-    {
-      /* TRANSLATORS: Title: if it's tainted or not */
-      return _("Linux Kernel Verification");
-    }
-  if (g_strcmp0 (appstream_id, FWUPD_SECURITY_ATTR_ID_KERNEL_SWAP) == 0)
-    {
-      /* TRANSLATORS: Title: swap space or swap partition */
-      return _("Linux Swap");
-    }
-  if (g_strcmp0 (appstream_id, FWUPD_SECURITY_ATTR_ID_SUSPEND_TO_RAM) == 0)
-    {
-      /* TRANSLATORS: Title: sleep state */
-      return _("Suspend To RAM");
-    }
-  if (g_strcmp0 (appstream_id, FWUPD_SECURITY_ATTR_ID_SUSPEND_TO_IDLE) == 0)
-    {
-      /* TRANSLATORS: Title: a better sleep state */
-      return _("Suspend To Idle");
-    }
-  if (g_strcmp0 (appstream_id, FWUPD_SECURITY_ATTR_ID_UEFI_PK) == 0)
-    {
-      /* TRANSLATORS: Title: PK is the 'platform key' for the machine */
-      return _("UEFI Platform Key");
-    }
-  if (g_strcmp0 (appstream_id, FWUPD_SECURITY_ATTR_ID_UEFI_SECUREBOOT) == 0)
-    {
-      /* TRANSLATORS: Title: SB is a way of locking down UEFI */
-      return _("UEFI Secure Boot");
-    }
-  if (g_strcmp0 (appstream_id, FWUPD_SECURITY_ATTR_ID_TPM_EMPTY_PCR) == 0)
-    {
-      /* TRANSLATORS: Title: PCRs (Platform Configuration Registers) shouldn't be empty */
-      return _("TPM Platform Configuration");
-    }
-  if (g_strcmp0 (appstream_id, FWUPD_SECURITY_ATTR_ID_TPM_RECONSTRUCTION_PCR0) == 0)
-    {
-      /* TRANSLATORS: Title: the PCR is rebuilt from the TPM event log */
-      return _("TPM Reconstruction");
-    }
-  if (g_strcmp0 (appstream_id, FWUPD_SECURITY_ATTR_ID_TPM_VERSION_20) == 0)
-    {
-      /* TRANSLATORS: Title: TPM = Trusted Platform Module */
-      return _("TPM v2.0");
-    }
-  if (g_strcmp0 (appstream_id, FWUPD_SECURITY_ATTR_ID_MEI_MANUFACTURING_MODE) == 0)
-    {
-      /* TRANSLATORS: Title: MEI = Intel Management Engine */
-      return _("Intel Management Engine Manufacturing Mode");
-    }
-  if (g_strcmp0 (appstream_id, FWUPD_SECURITY_ATTR_ID_MEI_OVERRIDE_STRAP) == 0)
-    {
-      /* TRANSLATORS: Title: MEI = Intel Management Engine, and the "override" is enabled
-       * with a jumper -- luckily it is probably not accessible to end users on consumer
-       * boards */
-      return _("Intel Management Engine Override");
-    }
-  if (g_strcmp0 (appstream_id, FWUPD_SECURITY_ATTR_ID_MEI_VERSION) == 0)
-    {
-      /* TRANSLATORS: Title: MEI = Intel Management Engine */
-      return _("Intel Management Engine Version");
-    }
-  if (g_strcmp0 (appstream_id, FWUPD_SECURITY_ATTR_ID_FWUPD_UPDATES) == 0)
-    {
-      /* TRANSLATORS: Title: if firmware updates are available */
-      return _("Firmware Updates");
-    }
-  if (g_strcmp0 (appstream_id, FWUPD_SECURITY_ATTR_ID_FWUPD_ATTESTATION) == 0)
-    {
-      /* TRANSLATORS: Title: if we can verify the firmware checksums */
-      return _("Firmware Attestation");
-    }
-  if (g_strcmp0 (appstream_id, FWUPD_SECURITY_ATTR_ID_FWUPD_PLUGINS) == 0)
-    {
-      /* TRANSLATORS: Title: if the fwupd plugins are all present and correct */
-      return _("Firmware Updater Verification");
-    }
-  if (g_strcmp0 (appstream_id, FWUPD_SECURITY_ATTR_ID_PLATFORM_DEBUG_ENABLED) == 0 ||
-      g_strcmp0 (appstream_id, FWUPD_SECURITY_ATTR_ID_PLATFORM_DEBUG_LOCKED) == 0)
-    {
-      /* TRANSLATORS: Title: Allows debugging of parts using proprietary hardware */
-      return _("Platform Debugging");
-    }
-  if (g_strcmp0 (appstream_id, FWUPD_SECURITY_ATTR_ID_SUPPORTED_CPU) == 0)
-    {
-      /* TRANSLATORS: Title: if fwupd supports HSI on this chip */
-      return _("Processor Security Checks");
-    }
-  if (g_strcmp0 (appstream_id, FWUPD_SECURITY_ATTR_ID_AMD_ROLLBACK_PROTECTION) == 0)
-    {
-      /* TRANSLATORS: Title: if firmware enforces rollback protection */
-      return _("AMD Rollback Protection");
-    }
-  if (g_strcmp0 (appstream_id, FWUPD_SECURITY_ATTR_ID_AMD_SPI_REPLAY_PROTECTION) == 0)
-    {
-      /* TRANSLATORS: Title: if hardware enforces control of SPI replays */
-      return _("AMD Firmware Replay Protection");
-    }
-  if (g_strcmp0 (appstream_id, FWUPD_SECURITY_ATTR_ID_AMD_SPI_WRITE_PROTECTION) == 0)
-    {
-      /* TRANSLATORS: Title: if hardware enforces control of SPI writes */
-      return _("AMD Firmware Write Protection");
-    }
-  if (g_strcmp0 (appstream_id, FWUPD_SECURITY_ATTR_ID_PLATFORM_FUSED) == 0)
-    {
-      /* TRANSLATORS: Title: if the part has been fused */
-      return _("Fused Platform");
-    }
-  return NULL;
-}
-
 const gchar *
 fwupd_security_attr_result_to_string (FwupdSecurityAttrResult result)
 {
@@ -312,6 +110,7 @@ fu_security_attr_new_from_variant (GVari
   FwupdSecurityAttr *attr = g_new0 (FwupdSecurityAttr, 1);
   const gchar *key;
   GVariant *value;
+  g_autofree gchar *name = NULL;
 
   while (g_variant_iter_next (iter, "{&sv}", &key, &value))
     {
@@ -331,6 +130,8 @@ fu_security_attr_new_from_variant (GVari
         attr->description = g_strdup (dgettext ("fwupd", g_variant_get_string (value, NULL)));
       else if (g_strcmp0 (key, "Summary") == 0)
         attr->title = g_strdup (dgettext ("fwupd", g_variant_get_string (value, NULL)));
+      else if (g_strcmp0 (key, "Name") == 0)
+        name = g_variant_dup_string (value, NULL);
       g_variant_unref (value);
     }
 
@@ -339,8 +140,8 @@ fu_security_attr_new_from_variant (GVari
     attr->hsi_level = 1;
 
   /* fallback for older fwupd versions */
-  if (attr->appstream_id != NULL && attr->title == NULL)
-    attr->title = g_strdup (fu_security_attr_get_title_fallback (attr->appstream_id));
+  if (attr->appstream_id != NULL && attr->title == NULL && name != NULL)
+    attr->title = g_strdup (name);
 
   /* success */
   return attr;
@@ -371,3 +172,21 @@ load_custom_css (const char *path)
                                               GTK_STYLE_PROVIDER (provider),
                                               GTK_STYLE_PROVIDER_PRIORITY_USER);
 }
+
+void
+hsi_report_title_print_padding(const gchar *title, GString *dst_string, gsize maxlen)
+{
+  gsize title_len;
+  gsize maxpad = maxlen;
+
+  if (maxlen == 0)
+    maxpad = 50;
+
+  if (title == NULL || dst_string == NULL)
+    return;
+  g_string_append_printf (dst_string, "%s", title);
+
+  title_len = g_utf8_strlen (title, -1) + 1;
+  for (gsize i = title_len; i < maxpad; i++)
+    g_string_append (dst_string, " ");
+}
diff -pruN 1:43.2-2/panels/firmware-security/cc-firmware-security-utils.h 1:44~alpha-0ubuntu1/panels/firmware-security/cc-firmware-security-utils.h
--- 1:43.2-2/panels/firmware-security/cc-firmware-security-utils.h	2022-12-23 11:11:35.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/firmware-security/cc-firmware-security-utils.h	2023-01-09 20:06:57.000000000 +0000
@@ -129,5 +129,6 @@ gboolean     firmware_security_attr_has_
 void         load_custom_css                                    (const char              *path);
 const gchar *fwupd_security_attr_result_to_string               (FwupdSecurityAttrResult  result);
 gboolean     fwupd_get_result_status                            (FwupdSecurityAttrResult  result);
+void         hsi_report_title_print_padding                     (const gchar *title, GString *dst_string, gsize maxlen);
 
 G_END_DECLS
diff -pruN 1:43.2-2/panels/firmware-security/firmware-security.gresource.xml 1:44~alpha-0ubuntu1/panels/firmware-security/firmware-security.gresource.xml
--- 1:43.2-2/panels/firmware-security/firmware-security.gresource.xml	2022-12-23 11:11:35.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/firmware-security/firmware-security.gresource.xml	2023-01-09 20:06:57.000000000 +0000
@@ -4,6 +4,7 @@
     <file preprocess="xml-stripblanks">cc-firmware-security-panel.ui</file>
     <file preprocess="xml-stripblanks">cc-firmware-security-dialog.ui</file>
     <file preprocess="xml-stripblanks">cc-firmware-security-boot-dialog.ui</file>
+    <file preprocess="xml-stripblanks">cc-firmware-security-help-dialog.ui</file>
     <file>security-level.css</file>
   </gresource>
 </gresources>
diff -pruN 1:43.2-2/panels/firmware-security/gnome-firmware-security-panel.desktop.in 1:44~alpha-0ubuntu1/panels/firmware-security/gnome-firmware-security-panel.desktop.in
--- 1:43.2-2/panels/firmware-security/gnome-firmware-security-panel.desktop.in	1970-01-01 00:00:00.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/firmware-security/gnome-firmware-security-panel.desktop.in	2023-01-09 20:06:57.000000000 +0000
@@ -0,0 +1,15 @@
+[Desktop Entry]
+Name=Device Security
+Comment=Host firmware security status
+Exec=gnome-control-center firmware-security
+# FIXME
+# Translators: Do NOT translate or transliterate this text (this is an icon file name)!
+Icon=security-high-symbolic
+Terminal=false
+Type=Application
+NoDisplay=true
+StartupNotify=true
+Categories=GNOME;GTK;Settings;DesktopSettings;X-GNOME-Settings-Panel;X-GNOME-PrivacySettings;
+OnlyShowIn=GNOME;Unity;
+# Translators: Search terms to find the Privacy panel. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon!
+Keywords=screen;lock;diagnostics;crash;private;recent;temporary;tmp;index;name;network;identity;privacy;
diff -pruN 1:43.2-2/panels/firmware-security/gnome-firmware-security-panel.desktop.in.in 1:44~alpha-0ubuntu1/panels/firmware-security/gnome-firmware-security-panel.desktop.in.in
--- 1:43.2-2/panels/firmware-security/gnome-firmware-security-panel.desktop.in.in	2022-12-23 11:11:35.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/firmware-security/gnome-firmware-security-panel.desktop.in.in	1970-01-01 00:00:00.000000000 +0000
@@ -1,19 +0,0 @@
-[Desktop Entry]
-Name=Device Security
-Comment=Host firmware security status
-Exec=gnome-control-center firmware-security
-# FIXME
-# Translators: Do NOT translate or transliterate this text (this is an icon file name)!
-Icon=security-high-symbolic
-Terminal=false
-Type=Application
-NoDisplay=true
-StartupNotify=true
-Categories=GNOME;GTK;Settings;DesktopSettings;X-GNOME-Settings-Panel;X-GNOME-PrivacySettings;
-OnlyShowIn=GNOME;Unity;
-X-GNOME-Bugzilla-Bugzilla=GNOME
-X-GNOME-Bugzilla-Product=gnome-control-center
-X-GNOME-Bugzilla-Component=privacy
-X-GNOME-Bugzilla-Version=@VERSION@
-# Translators: Search terms to find the Privacy panel. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon!
-Keywords=screen;lock;diagnostics;crash;private;recent;temporary;tmp;index;name;network;identity;privacy;
diff -pruN 1:43.2-2/panels/firmware-security/meson.build 1:44~alpha-0ubuntu1/panels/firmware-security/meson.build
--- 1:43.2-2/panels/firmware-security/meson.build	2022-12-23 11:11:35.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/firmware-security/meson.build	2023-01-09 20:06:57.000000000 +0000
@@ -1,15 +1,9 @@
 panels_list += cappletname
 desktop = 'gnome-@0@-panel.desktop'.format(cappletname)
 
-desktop_in = configure_file(
-  input: desktop + '.in.in',
-  output: desktop + '.in',
-  configuration: desktop_conf
-)
-
 i18n.merge_file(
   type: 'desktop',
-  input: desktop_in,
+  input: desktop + '.in',
   output: desktop,
   po_dir: po_dir,
   install: true,
@@ -19,10 +13,12 @@ i18n.merge_file(
 sources = files('cc-firmware-security-utils.c',
                 'cc-firmware-security-panel.c',
                 'cc-firmware-security-dialog.c',
+                'cc-firmware-security-help-dialog.c',
                 'cc-firmware-security-boot-dialog.c')
 
 resource_data = files('cc-firmware-security-panel.ui',
                       'cc-firmware-security-dialog.ui',
+                      'cc-firmware-security-help-dialog.ui',
                       'cc-firmware-security-boot-dialog.ui')
 
 sources += gnome.compile_resources(
@@ -35,10 +31,14 @@ sources += gnome.compile_resources(
 
 cflags += '-DGNOMELOCALEDIR="@0@"'.format(control_center_localedir)
 
+deps = common_deps + [
+  dependency('libgtop-2.0'),
+]
+
 panels_libs += static_library(
   cappletname,
   sources: sources,
   include_directories: [top_inc, common_inc],
-  dependencies: common_deps,
+  dependencies: deps,
   c_args: cflags
 )
diff -pruN 1:43.2-2/panels/firmware-security/security-level.css 1:44~alpha-0ubuntu1/panels/firmware-security/security-level.css
--- 1:43.2-2/panels/firmware-security/security-level.css	2022-12-23 11:11:35.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/firmware-security/security-level.css	2023-01-09 20:06:57.000000000 +0000
@@ -1,8 +1,11 @@
-.hsi-level-box {
+.security-level-icon {
   border-radius: 9999px;
   min-width: 64px;
   min-height: 64px;
+}
 
+.panel-unavaliable-color {
+  color:  @light_4;
 }
 
 .hsi-level-box.level0 {
diff -pruN 1:43.2-2/panels/info-overview/cc-info-overview-panel.c 1:44~alpha-0ubuntu1/panels/info-overview/cc-info-overview-panel.c
--- 1:43.2-2/panels/info-overview/cc-info-overview-panel.c	2022-12-23 11:11:35.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/info-overview/cc-info-overview-panel.c	2023-01-09 20:06:57.000000000 +0000
@@ -57,15 +57,12 @@ struct _CcInfoOverviewPanel
 {
   CcPanel          parent_instance;
 
-  GtkEntry        *device_name_entry;
-  GtkWidget       *rename_button;
   CcListRow       *disk_row;
   CcListRow       *gnome_version_row;
   CcListRow       *graphics_row;
   CcListRow       *hardware_model_row;
-  GtkDialog       *hostname_editor;
-  CcHostnameEntry *hostname_entry;
-  CcListRow       *hostname_row;
+  CcListRow       *firmware_version_row;
+  CcListRow       *kernel_row;
   CcListRow       *memory_row;
   GtkPicture      *os_logo;
   CcListRow       *os_name_row;
@@ -389,13 +386,11 @@ get_primary_disc_info (CcInfoOverviewPan
     }
 }
 
-static void
-get_hardware_model (CcInfoOverviewPanel *self)
+static char *
+get_hostnamed_property (const char *property_name)
 {
   g_autoptr(GDBusProxy) hostnamed_proxy = NULL;
-  g_autoptr(GVariant) vendor_variant = NULL;
-  g_autoptr(GVariant) model_variant = NULL;
-  const char *vendor_string, *model_string;
+  g_autoptr(GVariant) property_variant = NULL;
   g_autoptr(GError) error = NULL;
 
   hostnamed_proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM,
@@ -409,35 +404,63 @@ get_hardware_model (CcInfoOverviewPanel
   if (hostnamed_proxy == NULL)
     {
       g_debug ("Couldn't get hostnamed to start, bailing: %s", error->message);
-      return;
+      return NULL;
     }
 
-  vendor_variant = g_dbus_proxy_get_cached_property (hostnamed_proxy, "HardwareVendor");
-  if (!vendor_variant)
+  property_variant = g_dbus_proxy_get_cached_property (hostnamed_proxy, property_name);
+  if (!property_variant)
     {
-      g_debug ("Unable to retrieve org.freedesktop.hostname1.HardwareVendor property");
-      return;
+      g_debug ("Unable to retrieve org.freedesktop.hostname1.%s property", property_name);
+      return NULL;
     }
 
-  model_variant = g_dbus_proxy_get_cached_property (hostnamed_proxy, "HardwareModel");
-  if (!model_variant)
-    {
-      g_debug ("Unable to retrieve org.freedesktop.hostname1.HardwareModel property");
-      return;
-    }
+  return g_variant_dup_string (property_variant, NULL);
+}
 
-  vendor_string = g_variant_get_string (vendor_variant, NULL),
-  model_string = g_variant_get_string (model_variant, NULL);
+static char *
+get_hardware_model_string ()
+{
+  g_autofree char *vendor_string = NULL;
+  g_autofree char *model_string = NULL;
 
-  if (vendor_string && g_strcmp0 (vendor_string, "") != 0)
-    {
-      g_autofree gchar *vendor_model = NULL;
+  vendor_string = get_hostnamed_property ("HardwareVendor");
+  if (!vendor_string || g_strcmp0 (vendor_string, "") == 0)
+    return NULL;
 
-      vendor_model = g_strdup_printf ("%s %s", vendor_string, model_string);
+  model_string = get_hostnamed_property ("HardwareModel");
+  if (!model_string || g_strcmp0 (model_string, "") == 0)
+    return NULL;
 
-      cc_list_row_set_secondary_label (self->hardware_model_row, vendor_model);
-      gtk_widget_set_visible (GTK_WIDGET (self->hardware_model_row), TRUE);
-    }
+  return g_strdup_printf ("%s %s", vendor_string, model_string);
+}
+
+static char *
+get_firmware_version_string ()
+{
+  g_autofree char *firmware_version_string = NULL;
+
+  firmware_version_string = get_hostnamed_property ("FirmwareVersion");
+  if (!firmware_version_string || g_strcmp0 (firmware_version_string, "") == 0)
+    return NULL;
+
+  return g_steal_pointer (&firmware_version_string);
+}
+
+static char *
+get_kernel_version_string ()
+{
+  g_autofree char *kernel_name = NULL;
+  g_autofree char *kernel_release = NULL;
+
+  kernel_name = get_hostnamed_property ("KernelName");
+  if (!kernel_name || g_strcmp0 (kernel_name, "") == 0)
+    return NULL;
+
+  kernel_release = get_hostnamed_property ("KernelRelease");
+  if (!kernel_release || g_strcmp0 (kernel_release, "") == 0)
+    return NULL;
+
+  return g_strdup_printf ("%s %s", kernel_name, kernel_release);
 }
 
 static char *
@@ -524,11 +547,13 @@ set_virtualization_label (CcInfoOverview
 
   if (virt == NULL || *virt == '\0')
     {
-      gtk_widget_hide (GTK_WIDGET (self->virtualization_row));
+      gtk_widget_set_visible (GTK_WIDGET (self->virtualization_row), FALSE);
+      gtk_widget_set_visible (GTK_WIDGET (self->firmware_version_row), FALSE);
+
       return;
     }
 
-  gtk_widget_show (GTK_WIDGET (self->virtualization_row));
+  gtk_widget_set_visible (GTK_WIDGET (self->virtualization_row), TRUE);
 
   display_name = NULL;
   for (i = 0; i < G_N_ELEMENTS (virt_tech); i++)
@@ -697,6 +722,9 @@ info_overview_panel_setup_overview (CcIn
   g_autofree char *os_type_text = NULL;
   g_autofree char *os_name_text = NULL;
   g_autofree char *os_build_text = NULL;
+  g_autofree char *hardware_model_text = NULL;
+  g_autofree char *firmware_version_text = NULL;
+  g_autofree char *kernel_version_text = NULL;
   g_autofree gchar *graphics_hardware_string = NULL;
 
   cc_object_storage_create_dbus_proxy (G_BUS_TYPE_SESSION,
@@ -709,7 +737,13 @@ info_overview_panel_setup_overview (CcIn
                                        (GAsyncReadyCallback) shell_proxy_ready,
                                        self);
 
-  get_hardware_model (self);
+  hardware_model_text = get_hardware_model_string ();
+  cc_list_row_set_secondary_label (self->hardware_model_row, hardware_model_text);
+  gtk_widget_set_visible (GTK_WIDGET (self->hardware_model_row), hardware_model_text != NULL);
+
+  firmware_version_text = get_firmware_version_string ();
+  cc_list_row_set_secondary_label (self->firmware_version_row, firmware_version_text);
+  gtk_widget_set_visible (GTK_WIDGET (self->firmware_version_row), firmware_version_text != NULL);
 
   ram_size = get_ram_size_dmi ();
   if (ram_size == 0)
@@ -738,6 +772,10 @@ info_overview_panel_setup_overview (CcIn
   cc_list_row_set_secondary_label (self->os_type_row, os_type_text);
 
   cc_list_row_set_secondary_label (self->windowing_system_row, get_windowing_system ());
+
+  kernel_version_text = get_kernel_version_string ();
+  cc_list_row_set_secondary_label (self->kernel_row, kernel_version_text);
+  gtk_widget_set_visible (GTK_WIDGET (self->kernel_row), kernel_version_text != NULL);
 }
 
 static gboolean
@@ -777,7 +815,7 @@ does_gpk_update_viewer_exist (void)
 }
 
 static void
-open_software_update (CcInfoOverviewPanel *self)
+cc_info_panel_open_software_update (CcInfoOverviewPanel *self)
 {
   g_autoptr(GError) error = NULL;
   gboolean ret;
@@ -799,83 +837,6 @@ open_software_update (CcInfoOverviewPane
       g_warning ("Failed to spawn %s: %s", argv[0], error->message);
 }
 
-static void
-on_device_name_entry_changed (CcInfoOverviewPanel *self)
-{
-  const gchar *current_hostname, *new_hostname;
-
-  current_hostname = gtk_editable_get_text (GTK_EDITABLE (self->hostname_entry));
-  new_hostname = gtk_editable_get_text (GTK_EDITABLE (self->device_name_entry));
-  gtk_widget_set_sensitive (self->rename_button,
-                            g_strcmp0 (current_hostname, new_hostname) != 0);
-}
-
-static void
-update_device_name (CcInfoOverviewPanel *self)
-{
-  const gchar *hostname;
-
-  /* We simply change the CcHostnameEntry text. CcHostnameEntry
-   * listens to changes and updates hostname on change.
-   */
-  hostname = gtk_editable_get_text (GTK_EDITABLE (self->device_name_entry));
-  gtk_editable_set_text (GTK_EDITABLE (self->hostname_entry), hostname);
-}
-
-static void
-on_hostname_editor_dialog_response_cb (GtkDialog           *dialog,
-                                       gint                 response,
-                                       CcInfoOverviewPanel *self)
-{
-  if (response == GTK_RESPONSE_APPLY)
-    {
-      update_device_name (self);
-    }
-
-  gtk_window_close (GTK_WINDOW (dialog));
-}
-
-static void
-on_device_name_entry_activated_cb (CcInfoOverviewPanel *self)
-{
-  update_device_name (self);
-  gtk_window_close (GTK_WINDOW (self->hostname_editor));
-}
-
-static void
-open_hostname_edit_dialog (CcInfoOverviewPanel *self)
-{
-  GtkWindow *toplevel;
-  CcShell *shell;
-  const gchar *hostname;
-
-  g_assert (CC_IS_INFO_OVERVIEW_PANEL (self));
-
-  shell = cc_panel_get_shell (CC_PANEL (self));
-  toplevel = GTK_WINDOW (cc_shell_get_toplevel (shell));
-  gtk_window_set_transient_for (GTK_WINDOW (self->hostname_editor), toplevel);
-
-  hostname = gtk_editable_get_text (GTK_EDITABLE (self->hostname_entry));
-  gtk_editable_set_text (GTK_EDITABLE (self->device_name_entry), hostname);
-  gtk_widget_grab_focus (GTK_WIDGET (self->device_name_entry));
-
-  gtk_window_present (GTK_WINDOW (self->hostname_editor));
-
-}
-
-static void
-cc_info_panel_row_activated_cb (CcInfoOverviewPanel *self,
-                                AdwActionRow        *row)
-{
-  g_assert (CC_IS_INFO_OVERVIEW_PANEL (self));
-  g_assert (ADW_IS_ACTION_ROW (row));
-
-  if (row == ADW_ACTION_ROW (self->hostname_row))
-    open_hostname_edit_dialog (self);
-  else if (row == self->software_updates_row)
-    open_software_update (self);
-}
-
 #if !defined(DISTRIBUTOR_LOGO) || defined(DARK_MODE_DISTRIBUTOR_LOGO)
 static gboolean
 use_dark_theme (CcInfoOverviewPanel *panel)
@@ -937,32 +898,25 @@ cc_info_overview_panel_class_init (CcInf
 
   gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/control-center/info-overview/cc-info-overview-panel.ui");
 
-  gtk_widget_class_bind_template_child (widget_class, CcInfoOverviewPanel, device_name_entry);
   gtk_widget_class_bind_template_child (widget_class, CcInfoOverviewPanel, disk_row);
   gtk_widget_class_bind_template_child (widget_class, CcInfoOverviewPanel, gnome_version_row);
   gtk_widget_class_bind_template_child (widget_class, CcInfoOverviewPanel, graphics_row);
   gtk_widget_class_bind_template_child (widget_class, CcInfoOverviewPanel, hardware_model_row);
-  gtk_widget_class_bind_template_child (widget_class, CcInfoOverviewPanel, hostname_editor);
-  gtk_widget_class_bind_template_child (widget_class, CcInfoOverviewPanel, hostname_entry);
-  gtk_widget_class_bind_template_child (widget_class, CcInfoOverviewPanel, hostname_row);
+  gtk_widget_class_bind_template_child (widget_class, CcInfoOverviewPanel, firmware_version_row);
+  gtk_widget_class_bind_template_child (widget_class, CcInfoOverviewPanel, kernel_row);
   gtk_widget_class_bind_template_child (widget_class, CcInfoOverviewPanel, memory_row);
   gtk_widget_class_bind_template_child (widget_class, CcInfoOverviewPanel, os_logo);
   gtk_widget_class_bind_template_child (widget_class, CcInfoOverviewPanel, os_name_row);
   gtk_widget_class_bind_template_child (widget_class, CcInfoOverviewPanel, os_build_row);
   gtk_widget_class_bind_template_child (widget_class, CcInfoOverviewPanel, os_type_row);
   gtk_widget_class_bind_template_child (widget_class, CcInfoOverviewPanel, processor_row);
-  gtk_widget_class_bind_template_child (widget_class, CcInfoOverviewPanel, rename_button);
   gtk_widget_class_bind_template_child (widget_class, CcInfoOverviewPanel, software_updates_row);
   gtk_widget_class_bind_template_child (widget_class, CcInfoOverviewPanel, virtualization_row);
   gtk_widget_class_bind_template_child (widget_class, CcInfoOverviewPanel, windowing_system_row);
 
-  gtk_widget_class_bind_template_callback (widget_class, cc_info_panel_row_activated_cb);
-  gtk_widget_class_bind_template_callback (widget_class, on_device_name_entry_changed);
-  gtk_widget_class_bind_template_callback (widget_class, on_device_name_entry_activated_cb);
-  gtk_widget_class_bind_template_callback (widget_class, on_hostname_editor_dialog_response_cb);
+  gtk_widget_class_bind_template_callback (widget_class, cc_info_panel_open_software_update);
 
   g_type_ensure (CC_TYPE_LIST_ROW);
-  g_type_ensure (CC_TYPE_HOSTNAME_ENTRY);
 }
 
 static void
@@ -975,7 +929,7 @@ cc_info_overview_panel_init (CcInfoOverv
   g_resources_register (cc_info_overview_get_resource ());
 
   if ((!does_gnome_software_exist () || !does_gnome_software_allow_updates ()) && !does_gpk_update_viewer_exist ())
-    gtk_widget_hide (GTK_WIDGET (self->software_updates_row));
+    gtk_widget_set_visible (GTK_WIDGET (self->software_updates_row), FALSE);
 
   info_overview_panel_setup_overview (self);
   info_overview_panel_setup_virt (self);
diff -pruN 1:43.2-2/panels/info-overview/cc-info-overview-panel.ui 1:44~alpha-0ubuntu1/panels/info-overview/cc-info-overview-panel.ui
--- 1:43.2-2/panels/info-overview/cc-info-overview-panel.ui	2022-12-23 11:11:35.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/info-overview/cc-info-overview-panel.ui	2023-01-09 20:06:57.000000000 +0000
@@ -14,6 +14,7 @@
                 <property name="child">
                   <object class="GtkPicture" id="os_logo">
                     <property name="can-shrink">False</property>
+                    <property name="content-fit">scale-down</property>
                     <property name="alternative-text" translatable="yes">System Logo</property>
                   </object>
                 </property>
@@ -28,11 +29,8 @@
 
             <!-- Device name -->
             <child>
-              <object class="CcListRow" id="hostname_row">
+              <object class="CcHostnameEntry" id="hostname_row">
                 <property name="title" translatable="yes">Device Name</property>
-                <property name="secondary-label" bind-source="hostname_entry" bind-property="text" bind-flags="sync-create" />
-                <property name="show-arrow">True</property>
-                <signal name="activated" handler="cc_info_panel_row_activated_cb" swapped="yes"/>
               </object>
             </child>
 
@@ -51,6 +49,15 @@
               </object>
             </child>
 
+            <!-- Firmware Version -->
+            <child>
+              <object class="CcListRow" id="firmware_version_row">
+                <property name="visible">False</property>
+                <property name="activatable">False</property>
+                <property name="title" translatable="yes">Firmware Version</property>
+              </object>
+            </child>
+
             <!-- Memory -->
             <child>
               <object class="CcListRow" id="memory_row">
@@ -143,12 +150,21 @@
               </object>
             </child>
 
+            <!-- Kernel version -->
+            <child>
+              <object class="CcListRow" id="kernel_row">
+                <property name="visible">False</property>
+                <property name="title" translatable="yes">Kernel Version</property>
+                <property name="activatable">False</property>
+              </object>
+            </child>
+
             <!-- Software Updates -->
             <child>
               <object class="AdwActionRow" id="software_updates_row">
                 <property name="activatable">True</property>
                 <property name="title" translatable="yes">Software Updates</property>
-                <signal name="activated" handler="cc_info_panel_row_activated_cb" swapped="yes"/>
+                <signal name="activated" handler="cc_info_panel_open_software_update" swapped="yes"/>
                 <child type="suffix">
                   <object class="GtkImage">
                     <property name="valign">center</property>
@@ -164,69 +180,4 @@
       </object>
     </child>
   </template>
-
-  <object class="GtkDialog" id="hostname_editor">
-    <property name="visible">False</property>
-    <property name="modal">True</property>
-    <property name="use-header-bar">1</property>
-    <property name="default-height">24</property>
-    <property name="hide-on-close">True</property>
-    <property name="title" translatable="yes">Rename Device</property>
-    <signal name="response" handler="on_hostname_editor_dialog_response_cb" object="CcInfoOverviewPanel" swapped="no" />
-
-    <child>
-      <object class="GtkBox">
-        <property name="margin-top">18</property>
-        <property name="margin-start">12</property>
-        <property name="margin-end">12</property>
-        <property name="margin-bottom">18</property>
-        <property name="orientation">vertical</property>
-        <child>
-          <object class="GtkLabel" id="device_name_description">
-            <property name="margin-bottom">18</property>
-            <property name="wrap">True</property>
-            <property name="max-width-chars">35</property>
-            <property name="xalign">0.0</property>
-            <property name="label" translatable="yes">The device name is used to identify this device when it is viewed over the network, or when pairing Bluetooth devices.</property>
-          </object>
-        </child>
-        <child>
-          <object class="GtkEntry" id="device_name_entry">
-            <accessibility>
-              <property name="label" translatable="yes">Device name</property>
-              <relation name="described-by">device_name_description</relation>
-            </accessibility>
-            <signal name="changed" handler="on_device_name_entry_changed" swapped="yes"/>
-            <signal name="activate" handler="on_device_name_entry_activated_cb" swapped="yes" />
-          </object>
-        </child>
-      </object>
-    </child>
-
-    <!-- Rename button -->
-    <child type="action">
-      <object class="GtkButton" id="rename_button">
-        <property name="use-underline">True</property>
-        <property name="label" translatable="yes">_Rename</property>
-      </object>
-    </child>
-
-    <!-- Cancel button -->
-    <child type="action">
-      <object class="GtkButton" id="cancel_button">
-        <property name="use-underline">True</property>
-        <property name="label" translatable="yes">_Cancel</property>
-      </object>
-    </child>
-
-    <action-widgets>
-      <action-widget response="apply" default="true">rename_button</action-widget>
-      <action-widget response="cancel">cancel_button</action-widget>
-    </action-widgets>
-  </object>
-
-  <object class="CcHostnameEntry" id="hostname_entry">
-    <property name="visible">0</property>
-  </object>
-
 </interface>
diff -pruN 1:43.2-2/panels/info-overview/gnome-info-overview-panel.desktop.in 1:44~alpha-0ubuntu1/panels/info-overview/gnome-info-overview-panel.desktop.in
--- 1:43.2-2/panels/info-overview/gnome-info-overview-panel.desktop.in	1970-01-01 00:00:00.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/info-overview/gnome-info-overview-panel.desktop.in	2023-01-09 20:06:57.000000000 +0000
@@ -0,0 +1,18 @@
+[Desktop Entry]
+Name=About
+Comment=View information about your system
+Exec=gnome-control-center info-overview
+# Translators: Do NOT translate or transliterate this text (this is an icon file name)!
+Icon=org.gnome.Settings-about-symbolic
+Terminal=false
+Type=Application
+NoDisplay=true
+StartupNotify=true
+Categories=GNOME;GTK;Settings;X-GNOME-Settings-Panel;X-GNOME-DetailsSettings;
+OnlyShowIn=GNOME;Unity;
+# Translators: Search terms to find the About panel.
+# Do NOT translate or localize the semicolons!
+# The list MUST also end with a semicolon!
+# "Preferred Applications" is the old name for the preference, so make
+# sure that you use the same "translation" for those keywords
+Keywords=device;system;information;hostname;memory;processor;version;default;application;preferred;cd;dvd;usb;audio;video;disc;removable;media;autorun;
diff -pruN 1:43.2-2/panels/info-overview/gnome-info-overview-panel.desktop.in.in 1:44~alpha-0ubuntu1/panels/info-overview/gnome-info-overview-panel.desktop.in.in
--- 1:43.2-2/panels/info-overview/gnome-info-overview-panel.desktop.in.in	2022-12-23 11:11:35.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/info-overview/gnome-info-overview-panel.desktop.in.in	1970-01-01 00:00:00.000000000 +0000
@@ -1,22 +0,0 @@
-[Desktop Entry]
-Name=About
-Comment=View information about your system
-Exec=gnome-control-center info-overview
-# Translators: Do NOT translate or transliterate this text (this is an icon file name)!
-Icon=org.gnome.Settings-about-symbolic
-Terminal=false
-Type=Application
-NoDisplay=true
-StartupNotify=true
-Categories=GNOME;GTK;Settings;X-GNOME-Settings-Panel;X-GNOME-DetailsSettings;
-OnlyShowIn=GNOME;Unity;
-X-GNOME-Bugzilla-Bugzilla=GNOME
-X-GNOME-Bugzilla-Product=gnome-control-center
-X-GNOME-Bugzilla-Component=info
-X-GNOME-Bugzilla-Version=@VERSION@
-# Translators: Search terms to find the About panel.
-# Do NOT translate or localize the semicolons!
-# The list MUST also end with a semicolon!
-# "Preferred Applications" is the old name for the preference, so make
-# sure that you use the same "translation" for those keywords
-Keywords=device;system;information;hostname;memory;processor;version;default;application;preferred;cd;dvd;usb;audio;video;disc;removable;media;autorun;
diff -pruN 1:43.2-2/panels/info-overview/info-cleanup.c 1:44~alpha-0ubuntu1/panels/info-overview/info-cleanup.c
--- 1:43.2-2/panels/info-overview/info-cleanup.c	2022-12-23 11:11:35.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/info-overview/info-cleanup.c	2023-01-09 20:06:57.000000000 +0000
@@ -37,6 +37,7 @@ prettify_info (const char *info)
   int   i;
   static const ReplaceStrings rs[] = {
     { "Mesa DRI ", ""},
+    { "Mesa Intel", "Intel"},
     { "[(]R[)]", "\302\256"},
     { "[(](tm|TM)[)]", "\342\204\242"},
     { "(ATI|EPYC|AMD FX|Radeon|Ryzen|Threadripper|GeForce RTX) ", "\\1\342\204\242 "},
diff -pruN 1:43.2-2/panels/info-overview/meson.build 1:44~alpha-0ubuntu1/panels/info-overview/meson.build
--- 1:43.2-2/panels/info-overview/meson.build	2022-12-23 11:11:35.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/info-overview/meson.build	2023-01-09 20:06:57.000000000 +0000
@@ -1,15 +1,9 @@
 panels_list += cappletname
 desktop = 'gnome-@0@-panel.desktop'.format(cappletname)
 
-desktop_in = configure_file(
-  input: desktop + '.in.in',
-  output: desktop + '.in',
-  configuration: desktop_conf
-)
-
 i18n.merge_file(
   type: 'desktop',
-  input: desktop_in,
+  input: desktop + '.in',
   output: desktop,
   po_dir: po_dir,
   install: true,
@@ -59,6 +53,14 @@ print_renderer_deps = [
 ]
 
 executable(
+  'test-info-cleanup',
+  [ 'info-cleanup.c', 'test-info-cleanup.c' ],
+  include_directories: [ top_inc ],
+  dependencies: [ print_renderer_deps ],
+  c_args: cflags,
+)
+
+executable(
   'gnome-control-center-print-renderer',
   'gnome-control-center-print-renderer.c',
   include_directories: [ top_inc ],
diff -pruN 1:43.2-2/panels/info-overview/test-info-cleanup.c 1:44~alpha-0ubuntu1/panels/info-overview/test-info-cleanup.c
--- 1:43.2-2/panels/info-overview/test-info-cleanup.c	1970-01-01 00:00:00.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/info-overview/test-info-cleanup.c	2023-01-09 20:06:57.000000000 +0000
@@ -0,0 +1,18 @@
+#include <locale.h>
+#include <info-cleanup.h>
+
+int main (int argc, char **argv)
+{
+	g_autofree char *str = NULL;
+
+	setlocale (LC_ALL, "");
+
+	if (argc != 2) {
+		g_print ("Usage: %s DEVICE-NAME\n", argv[0]);
+		return 1;
+	}
+
+	str = info_cleanup (argv[1]);
+	g_print ("%s ➯ %s\n", argv[1], str);
+	return 0;
+}
diff -pruN 1:43.2-2/panels/keyboard/cc-input-chooser.c 1:44~alpha-0ubuntu1/panels/keyboard/cc-input-chooser.c
--- 1:43.2-2/panels/keyboard/cc-input-chooser.c	2022-12-23 11:11:35.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/keyboard/cc-input-chooser.c	2023-01-09 20:06:57.000000000 +0000
@@ -149,7 +149,7 @@ padded_label_new (const gchar        *te
   set_row_widget_margins (label);
   gtk_box_append (GTK_BOX (widget), label);
   if (dim_label)
-    gtk_style_context_add_class (gtk_widget_get_style_context (label), "dim-label");
+    gtk_widget_add_css_class (label, "dim-label");
 
   if (direction == ROW_TRAVEL_DIRECTION_FORWARD)
     {
diff -pruN 1:43.2-2/panels/keyboard/cc-keyboard-item.c 1:44~alpha-0ubuntu1/panels/keyboard/cc-keyboard-item.c
--- 1:43.2-2/panels/keyboard/cc-keyboard-item.c	2022-12-23 11:11:35.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/keyboard/cc-keyboard-item.c	2023-01-09 20:06:57.000000000 +0000
@@ -26,9 +26,12 @@
 #include <gio/gio.h>
 #include <glib/gi18n-lib.h>
 
+#include "cc-util.h"
+#include "keyboard-shortcuts.h"
 #include "cc-keyboard-item.h"
 
 #define CUSTOM_KEYS_SCHEMA "org.gnome.settings-daemon.plugins.media-keys.custom-keybinding"
+#define SHORTCUT_DELIMITERS "+ "
 
 struct _CcKeyboardItem
 {
@@ -359,6 +362,126 @@ cc_keyboard_item_new (CcKeyboardItemType
   return CC_KEYBOARD_ITEM (object);
 }
 
+/* Copied from cc-keyboard-shortcut-dialog.c */
+static gboolean
+strv_contains_prefix_or_match (char       **strv,
+                               const char  *prefix)
+{
+  const struct {
+    const gchar *key;
+    const gchar *untranslated;
+    const gchar *synonym;
+  } key_aliases[] =
+    {
+      { "ctrl",   "Ctrl",  "ctrl" },
+      { "win",    "Super", "super" },
+      { "option",  NULL,   "alt" },
+      { "command", NULL,   "super" },
+      { "apple",   NULL,   "super" },
+    };
+
+  for (guint i = 0; strv[i]; i++)
+    {
+      if (g_str_has_prefix (strv[i], prefix))
+        return TRUE;
+    }
+
+  for (guint i = 0; i < G_N_ELEMENTS (key_aliases); i++)
+    {
+      g_autofree char *alias = NULL;
+      const char *synonym;
+
+      if (!g_str_has_prefix (key_aliases[i].key, prefix))
+        continue;
+
+      if (key_aliases[i].untranslated)
+        {
+          const char *translated_label;
+
+          /* Steal GTK+'s translation */
+          translated_label = g_dpgettext2 ("gtk40", "keyboard label", key_aliases[i].untranslated);
+          alias = g_utf8_strdown (translated_label, -1);
+        }
+
+      synonym = key_aliases[i].synonym;
+
+      /* If a translation or synonym of the key is in the accelerator, and we typed
+       * the key, also consider that a prefix */
+      if ((alias && g_strv_contains ((const char * const *) strv, alias)) ||
+          (synonym && g_strv_contains ((const char * const *) strv, synonym)))
+        return TRUE;
+    }
+
+  return FALSE;
+}
+
+/* Copied from cc-keyboard-shortcut-dialog.c */
+static gboolean
+search_match_shortcut (CcKeyboardItem *item,
+                       const char     *search)
+{
+  g_auto(GStrv) shortcut_tokens = NULL, search_tokens = NULL;
+  g_autofree char *normalized_accel = NULL;
+  g_autofree char *accel = NULL;
+  GList *key_combos;
+  CcKeyCombo *combo;
+  gboolean match = TRUE;
+
+  key_combos = cc_keyboard_item_get_key_combos (item);
+  for (GList *l = key_combos; l != NULL; l = l->next)
+    {
+      combo = l->data;
+
+      if (is_empty_binding (combo))
+        continue;
+
+      accel = convert_keysym_state_to_string (combo);
+      normalized_accel = cc_util_normalize_casefold_and_unaccent (accel);
+
+      shortcut_tokens = g_strsplit_set (normalized_accel, SHORTCUT_DELIMITERS, -1);
+      search_tokens = g_strsplit_set (search, SHORTCUT_DELIMITERS, -1);
+
+      for (guint i = 0; search_tokens[i]; i++)
+        {
+          match = match && strv_contains_prefix_or_match (shortcut_tokens, search_tokens[i]);
+
+          if (!match)
+            break;
+        }
+
+      if (match)
+        return TRUE;
+    }
+
+  return FALSE;
+}
+
+gboolean
+cc_keyboard_item_matches_string (CcKeyboardItem *self,
+                                 GStrv           search_terms)
+{
+  g_autofree char *name = NULL;
+
+  g_return_val_if_fail (CC_IS_KEYBOARD_ITEM (self), FALSE);
+
+  if (!search_terms || !*search_terms || !self->description)
+    return TRUE;
+
+  name = cc_util_normalize_casefold_and_unaccent (self->description);
+
+  for (guint i = 0; search_terms[i]; i++)
+    {
+      gboolean match;
+
+      match = strstr (name, search_terms[i]) || search_match_shortcut (self, search_terms[i]);
+
+      if (!match)
+        return FALSE;
+    }
+
+  return TRUE;
+}
+
 static guint *
 get_above_tab_keysyms (void)
 {
@@ -517,6 +640,9 @@ binding_changed (CcKeyboardItem *item,
   item->editable = g_settings_is_writable (item->settings, item->key);
 
   g_object_notify (G_OBJECT (item), "key-combos");
+  g_object_notify (G_OBJECT (item), "is-value-default");
+  if (item->reverse_item)
+    g_object_notify (G_OBJECT (item->reverse_item), "is-value-default");
 }
 
 gboolean
diff -pruN 1:43.2-2/panels/keyboard/cc-keyboard-item.h 1:44~alpha-0ubuntu1/panels/keyboard/cc-keyboard-item.h
--- 1:43.2-2/panels/keyboard/cc-keyboard-item.h	2022-12-23 11:11:35.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/keyboard/cc-keyboard-item.h	2023-01-09 20:06:57.000000000 +0000
@@ -51,6 +51,9 @@ typedef struct
 
 CcKeyboardItem*    cc_keyboard_item_new                      (CcKeyboardItemType  type);
 
+gboolean           cc_keyboard_item_matches_string           (CcKeyboardItem *self,
+                                                              GStrv           search_terms);
+
 gboolean           cc_keyboard_item_load_from_gsettings_path (CcKeyboardItem     *item,
                                                               const char         *path,
                                                               gboolean            reset);
diff -pruN 1:43.2-2/panels/keyboard/cc-keyboard-manager.c 1:44~alpha-0ubuntu1/panels/keyboard/cc-keyboard-manager.c
--- 1:43.2-2/panels/keyboard/cc-keyboard-manager.c	2022-12-23 11:11:35.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/keyboard/cc-keyboard-manager.c	2023-01-09 20:06:57.000000000 +0000
@@ -54,6 +54,7 @@ enum
   SHORTCUT_ADDED,
   SHORTCUT_CHANGED,
   SHORTCUT_REMOVED,
+  SHORTCUTS_LOADED,
   LAST_SIGNAL
 };
 
@@ -262,6 +263,8 @@ add_shortcuts (CcKeyboardManager *self)
 
       can_continue = gtk_tree_model_iter_next (sections_model, &sections_iter);
     }
+
+  g_signal_emit (self, signals[SHORTCUTS_LOADED], 0);
 }
 
 static void
@@ -819,6 +822,17 @@ cc_keyboard_manager_class_init (CcKeyboa
                                             G_TYPE_NONE,
                                             1,
                                             CC_TYPE_KEYBOARD_ITEM);
+
+  /**
+   * CcKeyboardManager:shortcuts-loaded:
+   *
+   * Emitted after all shortcuts are loaded.
+   */
+  signals[SHORTCUTS_LOADED] = g_signal_new ("shortcuts-loaded",
+                                            CC_TYPE_KEYBOARD_MANAGER,
+                                            G_SIGNAL_RUN_FIRST,
+                                            0, NULL, NULL, NULL,
+                                            G_TYPE_NONE, 0);
 }
 
 static void
diff -pruN 1:43.2-2/panels/keyboard/cc-keyboard-panel.c 1:44~alpha-0ubuntu1/panels/keyboard/cc-keyboard-panel.c
--- 1:43.2-2/panels/keyboard/cc-keyboard-panel.c	2022-12-23 11:11:35.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/keyboard/cc-keyboard-panel.c	2023-01-09 20:06:57.000000000 +0000
@@ -31,6 +31,7 @@
 #include "cc-keyboard-shortcut-dialog.h"
 #include "cc-input-list-box.h"
 #include "cc-xkb-modifier-dialog.h"
+#include "cc-list-row.h"
 
 #include "keyboard-shortcuts.h"
 
@@ -44,10 +45,8 @@ struct _CcKeyboardPanel
 
   GSettings           *input_source_settings;
   AdwPreferencesGroup *input_switch_group;
-  AdwActionRow        *alt_chars_row;
-  AdwActionRow        *compose_row;
-  GtkWidget           *value_alternate_chars;
-  GtkWidget           *value_compose;
+  CcListRow           *alt_chars_row;
+  CcListRow           *compose_row;
 
   AdwActionRow        *common_shortcuts_row;
 };
@@ -105,9 +104,9 @@ special_chars_activated (AdwActionRow
 
   window = GTK_WINDOW (cc_shell_get_toplevel (cc_panel_get_shell (CC_PANEL (self))));
 
-  if (row == self->alt_chars_row)
+  if (row == (gpointer)self->alt_chars_row)
     modifier = &LV3_MODIFIER;
-  else if (row == self->compose_row)
+  else if (row == (gpointer)self->compose_row)
     modifier = &COMPOSE_MODIFIER;
   else
     return;
@@ -191,8 +190,6 @@ cc_keyboard_panel_class_init (CcKeyboard
   gtk_widget_class_bind_template_child (widget_class, CcKeyboardPanel, same_source);
   gtk_widget_class_bind_template_child (widget_class, CcKeyboardPanel, alt_chars_row);
   gtk_widget_class_bind_template_child (widget_class, CcKeyboardPanel, compose_row);
-  gtk_widget_class_bind_template_child (widget_class, CcKeyboardPanel, value_alternate_chars);
-  gtk_widget_class_bind_template_child (widget_class, CcKeyboardPanel, value_compose);
   gtk_widget_class_bind_template_child (widget_class, CcKeyboardPanel, common_shortcuts_row);
 
   gtk_widget_class_bind_template_callback (widget_class, special_chars_activated);
@@ -247,8 +244,8 @@ cc_keyboard_panel_init (CcKeyboardPanel
   /* "Type Special Characters" section */
   g_settings_bind_with_mapping (self->input_source_settings,
                                 "xkb-options",
-                                self->value_alternate_chars,
-                                "label",
+                                self->alt_chars_row,
+                                "secondary-label",
                                 G_SETTINGS_BIND_GET,
                                 xcb_modifier_transform_binding_to_label,
                                 NULL,
@@ -256,8 +253,8 @@ cc_keyboard_panel_init (CcKeyboardPanel
                                 NULL);
   g_settings_bind_with_mapping (self->input_source_settings,
                                 "xkb-options",
-                                self->value_compose,
-                                "label",
+                                self->compose_row,
+                                "secondary-label",
                                 G_SETTINGS_BIND_GET,
                                 xcb_modifier_transform_binding_to_label,
                                 NULL,
diff -pruN 1:43.2-2/panels/keyboard/cc-keyboard-panel.ui 1:44~alpha-0ubuntu1/panels/keyboard/cc-keyboard-panel.ui
--- 1:43.2-2/panels/keyboard/cc-keyboard-panel.ui	2022-12-23 11:11:35.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/keyboard/cc-keyboard-panel.ui	2023-01-09 20:06:57.000000000 +0000
@@ -59,36 +59,20 @@
             <property name="title" translatable="yes">Special Character Entry</property>
             <property name="description" translatable="yes">Methods for entering symbols and letter variants using the keyboard.</property>
             <child>
-              <object class="AdwActionRow" id="alt_chars_row">
+              <object class="CcListRow" id="alt_chars_row">
                 <property name="title" translatable="yes">Alternate Characters Key</property>
                 <property name="activatable">True</property>
+                <property name="show-arrow">True</property>
+                <property name="secondary-label" translatable="no">Right Alt</property>
                 <signal name="activated" handler="special_chars_activated" object="CcKeyboardPanel" swapped="no" />
-                <child>
-                  <object class="GtkLabel" id="value_alternate_chars">
-                    <property name="label" translatable="no">Right Alt</property>
-                  </object>
-                </child>
-                <child>
-                  <object class="GtkImage">
-                    <property name="icon_name">go-next-symbolic</property>
-                  </object>
-                </child>
               </object>
             </child>
             <child>
-              <object class="AdwActionRow" id="compose_row">
+              <object class="CcListRow" id="compose_row">
                 <property name="title" translatable="yes">Compose Key</property>
+                <property name="show-arrow">True</property>
                 <property name="activatable">True</property>
                 <signal name="activated" handler="special_chars_activated" object="CcKeyboardPanel" swapped="no" />
-                <child>
-                  <object class="GtkLabel" id="value_compose">
-                  </object>
-                </child>
-                <child>
-                  <object class="GtkImage">
-                    <property name="icon_name">go-next-symbolic</property>
-                  </object>
-                </child>
               </object>
             </child>
           </object>
@@ -97,15 +81,11 @@
           <object class="AdwPreferencesGroup">
             <property name="title" translatable="yes">Keyboard Shortcuts</property>
             <child>
-              <object class="AdwActionRow" id="common_shortcuts_row">
+              <object class="CcListRow" id="common_shortcuts_row">
                 <property name="title" translatable="yes">View and Customize Shortcuts</property>
                 <property name="activatable">True</property>
+                <property name="show-arrow">True</property>
                 <signal name="activated" handler="keyboard_shortcuts_activated" object="CcKeyboardPanel" swapped="no" />
-                <child>
-                  <object class="GtkImage">
-                    <property name="icon_name">go-next-symbolic</property>
-                  </object>
-                </child>
               </object>
             </child>
           </object>
diff -pruN 1:43.2-2/panels/keyboard/cc-keyboard-shortcut-dialog.c 1:44~alpha-0ubuntu1/panels/keyboard/cc-keyboard-shortcut-dialog.c
--- 1:43.2-2/panels/keyboard/cc-keyboard-shortcut-dialog.c	2022-12-23 11:11:35.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/keyboard/cc-keyboard-shortcut-dialog.c	2023-01-09 20:06:57.000000000 +0000
@@ -3,6 +3,7 @@
  * Copyright (C) 2010 Intel, Inc
  * Copyright (C) 2016 Endless, Inc
  * Copyright (C) 2020 System76, Inc.
+ * Copyright (C) 2022 Purism SPC
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -20,6 +21,7 @@
  * Author: Thomas Wood <thomas.wood@intel.com>
  *         Georges Basile Stavracas Neto <gbsneto@gnome.org>
  *         Ian Douglas Scott <idscott@system76.com>
+ *         Mohammed Sadiq <sadiq@sadiqpk.org>
  *
  * SPDX-License-Identifier: GPL-2.0-or-later
  */
@@ -32,369 +34,297 @@
 #include "cc-keyboard-item.h"
 #include "cc-keyboard-manager.h"
 #include "cc-keyboard-shortcut-editor.h"
+#include "cc-keyboard-shortcut-group.h"
 #include "cc-keyboard-shortcut-row.h"
 #include "cc-list-row.h"
 #include "cc-util.h"
 #include "keyboard-shortcuts.h"
 
-#define SHORTCUT_DELIMITERS "+ "
-
-typedef struct {
-  gchar          *section_title;
-  gchar          *section_id;
-  guint           modified_count;
-  GtkLabel       *modified_label;
-} SectionRowData;
-
-typedef struct {
-  CcKeyboardItem *item;
-  gchar          *section_title;
-  gchar          *section_id;
-  SectionRowData *section_data;
-} ShortcutRowData;
-
 struct _CcKeyboardShortcutDialog
 {
-  GtkDialog  parent_instance;
+  AdwWindow             parent_instance;
 
-  GtkSizeGroup       *accelerator_sizegroup;
-  GtkWidget          *back_button;
-  GtkListBoxRow      *custom_shortcut_add_row;
-  guint               custom_shortcut_count;
-  GtkWidget          *empty_custom_shortcuts_placeholder;
-  GtkWidget          *empty_search_placeholder;
-  GtkHeaderBar       *headerbar;
-  GtkStack           *header_stack;
-  GtkWidget          *reset_all_button;
-  GtkWidget          *section_box;
-  GtkSearchEntry     *search_entry;
-  GtkListBox         *section_listbox;
-  GtkListBoxRow      *section_row;
-  GtkWidget          *shortcut_box;
-  GtkListBox         *shortcut_listbox;
-  GtkStack           *stack;
-
-  CcKeyboardManager  *manager;
-  GtkWidget          *shortcut_editor;
-  GHashTable         *sections;
+  AdwHeaderBar         *header_bar;
+  GtkButton            *back_button;
+  GtkButton            *reset_all_button;
+  GtkSearchEntry       *search_entry;
+
+  AdwLeaflet           *main_leaflet;
+  GtkBox               *main_box;
+  GtkStack             *section_stack;
+  AdwPreferencesPage   *section_list_page;
+  GtkListBox           *section_list_box;
+  AdwPreferencesPage   *search_result_page;
+  AdwStatusPage        *empty_results_page;
+
+  GtkStack             *shortcut_list_stack;
+  AdwPreferencesPage   *empty_subpage_results_page;
+
+  AdwStatusPage        *empty_custom_shortcut_page;
+  GtkSizeGroup         *accelerator_size_group;
+
+  /* A GListStore of sections containing a GListStore of CcKeyboardItem */
+  GListStore           *sections;
+  GListStore           *visible_section;
+  GtkFlattenListModel  *filtered_shortcuts;
+
+  CcKeyboardManager    *manager;
+  GtkWidget            *shortcut_editor;
+  GStrv                 search_terms;
  };
 
-G_DEFINE_TYPE (CcKeyboardShortcutDialog, cc_keyboard_shortcut_dialog, GTK_TYPE_DIALOG)
-static gboolean
-is_matched_shortcut_present (GtkListBox *listbox,
-                             gpointer user_data);
+G_DEFINE_TYPE (CcKeyboardShortcutDialog, cc_keyboard_shortcut_dialog, ADW_TYPE_WINDOW)
+
 
-static SectionRowData*
-section_row_data_new (const gchar *section_id,
-                      const gchar *section_title,
-                      GtkLabel    *modified_label)
+static GListStore *
+keyboard_shortcut_get_section_store (CcKeyboardShortcutDialog *self,
+                                     const char               *section_id,
+                                     const char               *section_title)
 {
-  SectionRowData *data;
+  g_autoptr(GListStore) section = NULL;
+  GtkWidget *group;
+  guint n_items;
 
-  data = g_new0 (SectionRowData, 1);
-  data->section_id = g_strdup (section_id);
-  data->section_title = g_strdup (section_title);
-  data->modified_count = 0;
-  data->modified_label = modified_label;
+  g_assert (CC_IS_KEYBOARD_SHORTCUT_DIALOG (self));
+  g_assert (section_id && *section_id);
 
-  return data;
-}
+  n_items = g_list_model_get_n_items (G_LIST_MODEL (self->sections));
 
-static void
-section_row_data_free (SectionRowData *data)
-{
-  g_free (data->section_id);
-  g_free (data->section_title);
-  g_free (data);
-}
+  for (guint i = 0; i < n_items; i++)
+    {
+      g_autoptr(GObject) item = NULL;
+      const char *item_section_id;
 
-static ShortcutRowData*
-shortcut_row_data_new (CcKeyboardItem *item,
-                       const gchar    *section_id,
-                       const gchar    *section_title,
-                       SectionRowData *section_data)
-{
-  ShortcutRowData *data;
+      item = g_list_model_get_item (G_LIST_MODEL (self->sections), i);
+      item_section_id = g_object_get_data (item, "id");
+
+      if (g_str_equal (item_section_id, section_id))
+        return G_LIST_STORE (item);
+    }
+
+  /* Found no matching section, so create one */
+  section = g_list_store_new (CC_TYPE_KEYBOARD_ITEM);
+  g_object_set_data_full (G_OBJECT (section), "id", g_strdup (section_id), g_free);
+  g_object_set_data_full (G_OBJECT (section), "title", g_strdup (section_title), g_free);
 
-  data = g_new0 (ShortcutRowData, 1);
-  data->item = g_object_ref (item);
-  data->section_id = g_strdup (section_id);
-  data->section_title = g_strdup (section_title);
-  data->section_data = section_data;
+  /* This group shall be shown in the search results page */
+  group = cc_keyboard_shortcut_group_new (G_LIST_MODEL (section),
+                                          section_id, section_title,
+                                          self->manager,
+                                          CC_KEYBOARD_SHORTCUT_EDITOR (self->shortcut_editor),
+                                          self->accelerator_size_group);
+  g_object_set_data (G_OBJECT (section), "search-group", group);
 
-  return data;
+  /* This group shall be shown when a section title row is activated */
+  group = cc_keyboard_shortcut_group_new (G_LIST_MODEL (section),
+                                          section_id, NULL,
+                                          self->manager,
+                                          CC_KEYBOARD_SHORTCUT_EDITOR (self->shortcut_editor),
+                                          self->accelerator_size_group);
+  g_object_set_data (G_OBJECT (section), "group", group);
+
+  g_list_store_append (self->sections, section);
+
+  return section;
 }
 
 static void
-shortcut_row_data_free (ShortcutRowData *data)
+shortcut_added_cb (CcKeyboardShortcutDialog *self,
+                   CcKeyboardItem           *item,
+                   const char               *section_id,
+                   const char               *section_title)
 {
-  g_object_unref (data->item);
-  g_free (data->section_id);
-  g_free (data->section_title);
-  g_free (data);
+  GListStore *section;
+
+  section = keyboard_shortcut_get_section_store (self, section_id, section_title);
+  g_object_set_data (G_OBJECT (item), "section", section);
+  g_list_store_append (section, item);
 }
 
-static GtkListBoxRow*
-add_section (CcKeyboardShortcutDialog *self,
-             const gchar     *section_id,
-             const gchar     *section_title)
+static void
+shortcut_removed_cb (CcKeyboardShortcutDialog *self,
+                     CcKeyboardItem           *item)
 {
-  GtkWidget *icon, *modified_label, *row;
-
-  icon = gtk_image_new_from_icon_name ("go-next-symbolic");
-  gtk_widget_add_css_class (icon, "dim-label");
+  GListStore *section;
+  guint position;
 
-  modified_label = gtk_label_new (NULL);
-  gtk_widget_add_css_class (modified_label, "dim-label");
+  section = g_object_get_data (G_OBJECT (item), "section");
+  g_return_if_fail (section);
 
-  row = adw_action_row_new ();
-  gtk_list_box_row_set_activatable (GTK_LIST_BOX_ROW (row), TRUE);
-  adw_preferences_row_set_title (ADW_PREFERENCES_ROW (row), _(section_title));
-  //TODO gtk_container_add (GTK_CONTAINER (row), modified_label);
-  //TODO gtk_container_add (GTK_CONTAINER (row), icon);
-
-  g_object_set_data_full (G_OBJECT (row),
-                          "data",
-                          section_row_data_new (section_id, section_title, GTK_LABEL (modified_label)),
-                          (GDestroyNotify)section_row_data_free);
-
-  g_hash_table_insert (self->sections, g_strdup (section_id), row);
-  gtk_list_box_append (self->section_listbox, row);
-
-  return GTK_LIST_BOX_ROW (row);
+  if (g_list_store_find (section, item, &position))
+    g_list_store_remove (section, position);
 }
 
 static void
-set_custom_shortcut_placeholder_visibility (CcKeyboardShortcutDialog *self)
+shortuct_custom_items_changed (CcKeyboardShortcutDialog *self)
 {
-  SectionRowData *section_data;
-  gboolean is_custom_shortcuts = FALSE;
+  GListStore *section;
+
+  g_assert (CC_IS_KEYBOARD_SHORTCUT_DIALOG (self));
+
+  section = keyboard_shortcut_get_section_store (self, "custom", "Custom Shortcuts");
 
-  if (self->section_row != NULL)
+  if (self->visible_section == section)
     {
-      section_data = g_object_get_data (G_OBJECT (self->section_row), "data");
-      is_custom_shortcuts = (strcmp (section_data->section_id, "custom") == 0);
+      GtkWidget *page;
+      guint n_items;
 
-      gtk_stack_set_transition_type (self->stack, GTK_STACK_TRANSITION_TYPE_CROSSFADE);
-      if (is_custom_shortcuts && (self->custom_shortcut_count == 0))
-        gtk_stack_set_visible_child (self->stack, GTK_WIDGET (self->empty_custom_shortcuts_placeholder));
+      n_items = g_list_model_get_n_items (G_LIST_MODEL (section));
+
+      if (n_items)
+        page = GTK_WIDGET (self->shortcut_list_stack);
       else
-        gtk_stack_set_visible_child (self->stack, self->shortcut_box);
-    }
-}
- 
-static void
-add_item (CcKeyboardShortcutDialog *self,
-          CcKeyboardItem  *item,
-          const gchar     *section_id,
-          const gchar     *section_title)
-{
-  GtkWidget *row;
-  GtkListBoxRow *section_row;
-  SectionRowData *section_data;
-
-  section_row = g_hash_table_lookup (self->sections, section_id);
-  if (section_row == NULL)
-    section_row = add_section (self, section_id, section_title);
-
-  section_data = g_object_get_data (G_OBJECT (section_row), "data");
-
-  row = GTK_WIDGET (cc_keyboard_shortcut_row_new (item,
-                                                  self->manager,
-                                                  CC_KEYBOARD_SHORTCUT_EDITOR (self->shortcut_editor),
-		                                  self->accelerator_sizegroup));
-
-  g_object_set_data_full (G_OBJECT (row),
-                          "data",
-                          shortcut_row_data_new (item, section_id, section_title, section_data),
-                          (GDestroyNotify)shortcut_row_data_free);
+        page = GTK_WIDGET (self->empty_custom_shortcut_page);
 
-  if (strcmp (section_id, "custom") == 0)
-    {
-      self->custom_shortcut_count++;
-      set_custom_shortcut_placeholder_visibility (self);
+      adw_leaflet_set_visible_child (self->main_leaflet, page);
+      gtk_widget_set_visible (GTK_WIDGET (self->search_entry), n_items > 0);
     }
-
-  gtk_list_box_append (self->shortcut_listbox, row);
 }
 
-static void
-remove_item (CcKeyboardShortcutDialog *self,
-             CcKeyboardItem  *item)
+static int
+compare_sections_title (gconstpointer a,
+                        gconstpointer b,
+                        gpointer     user_data)
 {
-  GtkWidget *child;
+  GObject *obj_a, *obj_b;
 
-  for (child = gtk_widget_get_first_child (GTK_WIDGET (self->shortcut_listbox));
-       child;
-       child = gtk_widget_get_next_sibling (child))
-    {
-      ShortcutRowData *row_data;
+  const char *title_a, *title_b, *id_a, *id_b;
 
-      if (!GTK_IS_LIST_BOX_ROW (child))
-        continue;
+  obj_a = G_OBJECT (a);
+  obj_b = G_OBJECT (b);
 
-      row_data = g_object_get_data (G_OBJECT (child), "data");
+  id_a = g_object_get_data (obj_a, "id");
+  id_b = g_object_get_data (obj_b, "id");
 
-      if (row_data && row_data->item == item)
-        {
-          if (strcmp (row_data->section_id, "custom") == 0)
-            {
-              self->custom_shortcut_count--;
-              set_custom_shortcut_placeholder_visibility (self);
-            }
+  /* Always place custom row as the last item */
+  if (g_str_equal (id_a, "custom"))
+    return 1;
 
-          gtk_list_box_remove (self->shortcut_listbox, child);
-          break;
-        }
-    }
+  if (g_str_equal (id_b, "custom"))
+    return -1;
+
+  title_a = _(g_object_get_data (obj_a, "title"));
+  title_b = _(g_object_get_data (obj_b, "title"));
+
+  return g_strcmp0 (title_a, title_b);
 }
 
 static void
-update_modified_counts (CcKeyboardShortcutDialog *self)
+shortcut_search_result_changed_cb (CcKeyboardShortcutDialog *self)
 {
-  SectionRowData *section_data;
-  ShortcutRowData *shortcut_data;
-  g_autofree gchar *modified_text = NULL;
-  GtkWidget *child;
-
-  for (child = gtk_widget_get_first_child (GTK_WIDGET (self->section_listbox));
-       child;
-       child = gtk_widget_get_next_sibling (child))
-    {
-      if (!GTK_IS_LIST_BOX_ROW (child))
-        continue;
+  GListModel *model;
+  GtkWidget *page;
+  guint n_items;
 
-      section_data = g_object_get_data (G_OBJECT (child), "data");
-      section_data->modified_count = 0;
-    }
+  g_assert (CC_IS_KEYBOARD_SHORTCUT_DIALOG (self));
 
-  for (child = gtk_widget_get_first_child (GTK_WIDGET (self->shortcut_listbox));
-       child;
-       child = gtk_widget_get_next_sibling (child))
-    {
-      if (!GTK_IS_LIST_BOX_ROW (child))
-        continue;
+  /* If a section is already shown, it is handled in search change callback */
+  if (self->visible_section)
+    return;
 
-      if (GTK_LIST_BOX_ROW (child) == self->custom_shortcut_add_row)
-        continue;
-      shortcut_data = g_object_get_data (G_OBJECT (child), "data");
-      if (!cc_keyboard_item_is_value_default (shortcut_data->item))
-        shortcut_data->section_data->modified_count++;
-    }
+  model = G_LIST_MODEL (self->filtered_shortcuts);
+  n_items = g_list_model_get_n_items (model);
 
-  for (child = gtk_widget_get_first_child (GTK_WIDGET (self->section_listbox));
-       child;
-       child = gtk_widget_get_next_sibling (child))
-    {
-      if (!GTK_IS_LIST_BOX_ROW (child))
-        continue;
+  if (n_items == 0)
+    page = GTK_WIDGET (self->empty_results_page);
+  else if (self->search_terms)
+    page = GTK_WIDGET (self->search_result_page);
+  else
+    page = GTK_WIDGET (self->section_list_page);
 
-      section_data = g_object_get_data (G_OBJECT (child), "data");
-      if (section_data->modified_count > 0)
-        {
-          modified_text = g_strdup_printf (g_dngettext (GETTEXT_PACKAGE,
-                                                        "%d modified",
-                                                        "%d modified",
-                                                        section_data->modified_count),
-                                           section_data->modified_count);
-          gtk_label_set_text (section_data->modified_label, modified_text);
-        }
-      else
-        {
-          gtk_label_set_text (section_data->modified_label, "");
-        }
-    }
+  gtk_stack_set_visible_child (self->section_stack, page);
 }
 
+/* All items have loaded, now sort the groups and add them to the page */
 static void
-show_section_list (CcKeyboardShortcutDialog *self)
+shortcuts_loaded_cb (CcKeyboardShortcutDialog *self)
 {
-  if (self->section_row != NULL)
-    gtk_stack_set_transition_type (self->stack, GTK_STACK_TRANSITION_TYPE_SLIDE_RIGHT);
-  else
-    gtk_stack_set_transition_type (self->stack, GTK_STACK_TRANSITION_TYPE_NONE);
-  self->section_row = NULL;
+  g_autoptr(GPtrArray) filtered_items = NULL;
+  g_autoptr(GPtrArray) widgets = NULL;
+  GListStore *filtered_lists;
+  GListStore *custom_store;
+  guint n_items;
 
-  gtk_stack_set_visible_child (self->stack, self->section_box);
-  gtk_window_set_title (GTK_WINDOW (self), _("Keyboard Shortcuts"));
-  gtk_editable_set_text (GTK_EDITABLE (self->search_entry), "");
-  gtk_stack_set_visible_child (self->header_stack, self->reset_all_button);
-  gtk_widget_set_visible (GTK_WIDGET (self->search_entry), TRUE);
+  /* Ensure that custom shorcuts section exists */
+  custom_store = keyboard_shortcut_get_section_store (self, "custom", "Custom Shortcuts");
+  n_items = g_list_model_get_n_items (G_LIST_MODEL (self->sections));
+  widgets = g_ptr_array_new ();
+  filtered_items = g_ptr_array_new ();
+  filtered_lists = g_list_store_new (G_TYPE_LIST_MODEL);
 
-  update_modified_counts (self);
-}
+  g_signal_connect_object (custom_store, "items-changed",
+                           G_CALLBACK (shortuct_custom_items_changed),
+                           self, G_CONNECT_SWAPPED);
 
-static void
-show_shortcut_list (CcKeyboardShortcutDialog *self)
-{
-  SectionRowData *section_data;
-  gchar *title;
-  gboolean is_custom_shortcuts = FALSE;
+  g_list_store_sort (self->sections, compare_sections_title, NULL);
 
-   title = _("Keyboard Shortcuts");
-   gtk_stack_set_transition_type (self->stack, GTK_STACK_TRANSITION_TYPE_NONE);
-   if (self->section_row != NULL)
+  for (guint i = 0; i < n_items; i++)
     {
-      section_data = g_object_get_data (G_OBJECT (self->section_row), "data");
-      title = _(section_data->section_title);
-      is_custom_shortcuts = (strcmp (section_data->section_id, "custom") == 0);
-      gtk_stack_set_transition_type (self->stack, GTK_STACK_TRANSITION_TYPE_SLIDE_LEFT);
+      g_autoptr(GObject) item = NULL;
+      CcKeyboardShortcutGroup *group;
+      GListModel *model;
+      GtkWidget *page;
+
+      item = g_list_model_get_item (G_LIST_MODEL (self->sections), i);
+      group = g_object_get_data (item, "search-group");
+      g_ptr_array_add (widgets, group);
+
+      model = cc_keyboard_shortcut_group_get_model (group);
+      g_ptr_array_add (filtered_items, model);
+
+      /* Populate shortcut section page */
+      group = g_object_get_data (item, "group");
+      page = adw_preferences_page_new ();
+      g_object_set_data (item, "page", page);
+      adw_preferences_page_add (ADW_PREFERENCES_PAGE (page), ADW_PREFERENCES_GROUP (group));
+      gtk_stack_add_child (self->shortcut_list_stack, page);
     }
-  gtk_list_box_invalidate_filter (self->shortcut_listbox);
 
-  if (is_custom_shortcuts && (self->custom_shortcut_count == 0))
-    gtk_stack_set_visible_child (self->stack, GTK_WIDGET (self->empty_custom_shortcuts_placeholder));
-  else
-    gtk_stack_set_visible_child (self->stack, self->shortcut_box);
+  /* Populate search results page */
+  for (guint i = 0; i < widgets->len; i++)
+    adw_preferences_page_add (self->search_result_page, widgets->pdata[i]);
 
-  gtk_window_set_title (GTK_WINDOW (self), title);
-  set_custom_shortcut_placeholder_visibility (self);
-  gtk_stack_set_visible_child (self->header_stack, self->back_button);
-  gtk_widget_set_visible (GTK_WIDGET (self->search_entry), self->section_row == NULL);
+  /* Keep track of search results so as to update empty state */
+  g_list_store_splice (filtered_lists, 0, 0, filtered_items->pdata, filtered_items->len);
+  self->filtered_shortcuts = gtk_flatten_list_model_new (G_LIST_MODEL (filtered_lists));
 
+  g_signal_connect_object (self->filtered_shortcuts, "items-changed",
+                           G_CALLBACK (shortcut_search_result_changed_cb),
+                           self, G_CONNECT_SWAPPED);
 }
 
-static void
-add_custom_shortcut_clicked_cb (CcKeyboardShortcutDialog *self)
+static GtkWidget *
+shortcut_dialog_row_new (gpointer item,
+                         gpointer user_data)
 {
-  CcKeyboardShortcutEditor *editor;
+  GtkWidget *row, *group;
+  const char *title;
 
-  editor = CC_KEYBOARD_SHORTCUT_EDITOR (self->shortcut_editor);
+  group = g_object_get_data (item, "search-group");
+  title = g_object_get_data (item, "title");
+  row = g_object_new (CC_TYPE_LIST_ROW, NULL);
 
-  cc_keyboard_shortcut_editor_set_mode (editor, CC_SHORTCUT_EDITOR_CREATE);
-  cc_keyboard_shortcut_editor_set_item (editor, NULL);
+  g_object_set_data (G_OBJECT (row), "section", item);
+  cc_list_row_set_show_arrow (CC_LIST_ROW (row), TRUE);
+  gtk_list_box_row_set_activatable (GTK_LIST_BOX_ROW (row), TRUE);
+  adw_preferences_row_set_title (ADW_PREFERENCES_ROW (row), _(title));
 
-  gtk_widget_show (self->shortcut_editor);
-}
+  g_object_bind_property (group, "modified-text",
+                          row, "secondary-label",
+                          G_BINDING_SYNC_CREATE);
 
-static void
-section_row_activated (GtkWidget                *button,
-                       GtkListBoxRow            *row,
-                       CcKeyboardShortcutDialog *self)
-{
-  self->section_row = row;
-  show_shortcut_list (self);
+  return row;
 }
 
 static void
-shortcut_row_activated (GtkWidget                *button,
-                        GtkListBoxRow            *row,
-                        CcKeyboardShortcutDialog *self)
+add_custom_shortcut_clicked_cb (CcKeyboardShortcutDialog *self)
 {
   CcKeyboardShortcutEditor *editor;
 
-  if (row == self->custom_shortcut_add_row)
-    {
-      add_custom_shortcut_clicked_cb (self);
-      return;
-    }
-
   editor = CC_KEYBOARD_SHORTCUT_EDITOR (self->shortcut_editor);
 
-  ShortcutRowData *data = g_object_get_data (G_OBJECT (row), "data");
-
-  cc_keyboard_shortcut_editor_set_mode (editor, CC_SHORTCUT_EDITOR_EDIT);
-  cc_keyboard_shortcut_editor_set_item (editor, data->item);
+  cc_keyboard_shortcut_editor_set_mode (editor, CC_SHORTCUT_EDITOR_CREATE);
+  cc_keyboard_shortcut_editor_set_item (editor, NULL);
 
   gtk_widget_show (self->shortcut_editor);
 }
@@ -402,27 +332,11 @@ shortcut_row_activated (GtkWidget
 static void
 back_button_clicked_cb (CcKeyboardShortcutDialog *self)
 {
-  show_section_list (self);
-}
-
-static void
-reset_shortcut (CcKeyboardShortcutDialog *self,
-                GtkWidget                *row)
-{
-  ShortcutRowData *data;
-
-  if (row == GTK_WIDGET (self->custom_shortcut_add_row))
-    return;
-
-  data = g_object_get_data (G_OBJECT (row), "data");
-
-  /* Don't reset custom shortcuts */
-  if (cc_keyboard_item_get_item_type (data->item) == CC_KEYBOARD_ITEM_TYPE_GSETTINGS_PATH)
-    return;
+  gtk_editable_set_text (GTK_EDITABLE (self->search_entry), "");
+  gtk_widget_show (GTK_WIDGET (self->search_entry));
 
-  /* cc_keyboard_manager_reset_shortcut() already resets conflicting shortcuts,
-   * so no other check is needed here. */
-  cc_keyboard_manager_reset_shortcut (self->manager, data->item);
+  self->visible_section = NULL;
+  adw_leaflet_navigate (self->main_leaflet, ADW_NAVIGATION_DIRECTION_BACK);
 }
 
 static void
@@ -430,25 +344,35 @@ on_reset_all_dialog_response_cb (GtkDial
                                  gint                      response,
                                  CcKeyboardShortcutDialog *self)
 {
+  guint n_items, j_items;
+
+  if (response != GTK_RESPONSE_ACCEPT)
+    return;
 
-  if (response == GTK_RESPONSE_ACCEPT)
+  n_items = g_list_model_get_n_items (G_LIST_MODEL (self->sections));
+
+  for (guint i = 0; i < n_items; i++)
     {
-      GtkWidget *child;
+      g_autoptr(GListModel) section = NULL;
+
+      section = g_list_model_get_item (G_LIST_MODEL (self->sections), i);
+      j_items = g_list_model_get_n_items (section);
 
-      for (child = gtk_widget_get_first_child (GTK_WIDGET (self->shortcut_listbox));
-           child;
-           child = gtk_widget_get_next_sibling (child))
+      for (guint j = 0; j < j_items; j++)
         {
-          if (!GTK_IS_LIST_BOX_ROW (child))
-            continue;
-          if (GTK_LIST_BOX_ROW (child) == self->custom_shortcut_add_row)
-            continue;
-          reset_shortcut (self, child);
+          g_autoptr(CcKeyboardItem) item = NULL;
+
+          item = g_list_model_get_item (section, j);
+
+          /* Don't reset custom shortcuts */
+          if (cc_keyboard_item_get_item_type (item) == CC_KEYBOARD_ITEM_TYPE_GSETTINGS_PATH)
+            return;
+
+          /* cc_keyboard_manager_reset_shortcut() already resets conflicting shortcuts,
+           * so no other check is needed here. */
+          cc_keyboard_manager_reset_shortcut (self->manager, item);
         }
     }
-
-  gtk_window_destroy (GTK_WINDOW (dialog));
-  update_modified_counts (self);
 }
 
 static void
@@ -483,284 +407,95 @@ reset_all_clicked_cb (CcKeyboardShortcut
 }
 
 static void
-search_entry_cb (CcKeyboardShortcutDialog *self)
+shortcut_dialog_visible_child_changed_cb (CcKeyboardShortcutDialog *self)
 {
-  gboolean is_shortcut = is_matched_shortcut_present (self->shortcut_listbox, self);
-  const gchar *search_text = gtk_editable_get_text (GTK_EDITABLE (self->search_entry));
-
-  if (!is_shortcut)
-      gtk_stack_set_visible_child (self->stack, self->empty_search_placeholder);
-  else if (g_utf8_strlen (search_text, -1) == 0 && self->section_row == NULL)
-    show_section_list (self);
-  else if (gtk_stack_get_visible_child (self->stack) != self->shortcut_box)
-    show_shortcut_list (self);
-  else
-    gtk_list_box_invalidate_filter (self->shortcut_listbox);
-}
-
-static gboolean
-strv_contains_prefix_or_match (gchar       **strv,
-                               const gchar  *prefix)
-{
-  const struct {
-    const gchar *key;
-    const gchar *untranslated;
-    const gchar *synonym;
-  } key_aliases[] =
-    {
-      { "ctrl",   "Ctrl",  "ctrl" },
-      { "win",    "Super", "super" },
-      { "option",  NULL,   "alt" },
-      { "command", NULL,   "super" },
-      { "apple",   NULL,   "super" },
-    };
-
-  for (guint i = 0; strv[i]; i++)
-    {
-      if (g_str_has_prefix (strv[i], prefix))
-        return TRUE;
-    }
-
-  for (guint i = 0; i < G_N_ELEMENTS (key_aliases); i++)
-    {
-      g_autofree gchar *alias = NULL;
-      const gchar *synonym;
-
-      if (!g_str_has_prefix (key_aliases[i].key, prefix))
-        continue;
-
-      if (key_aliases[i].untranslated)
-        {
-          const gchar *translated_label;
-
-          /* Steal GTK+'s translation */
-          translated_label = g_dpgettext2 ("gtk40", "keyboard label", key_aliases[i].untranslated);
-          alias = g_utf8_strdown (translated_label, -1);
-        }
-
-      synonym = key_aliases[i].synonym;
+  gpointer visible_child;
+  const char *title;
+  gboolean show_back;
 
-      /* If a translation or synonym of the key is in the accelerator, and we typed
-       * the key, also consider that a prefix */
-      if ((alias && g_strv_contains ((const gchar * const *) strv, alias)) ||
-          (synonym && g_strv_contains ((const gchar * const *) strv, synonym)))
-        {
-          return TRUE;
-        }
-    }
-
-  return FALSE;
-}
-
-static gboolean
-search_match_shortcut (CcKeyboardItem *item,
-                       const gchar    *search)
-{
-  g_auto(GStrv) shortcut_tokens = NULL, search_tokens = NULL;
-  g_autofree gchar *normalized_accel = NULL;
-  g_autofree gchar *accel = NULL;
-  gboolean match;
-  GList *key_combos;
-  CcKeyCombo *combo;
+  visible_child = adw_leaflet_get_visible_child (self->main_leaflet);
+  show_back = visible_child != self->main_box;
 
-  key_combos = cc_keyboard_item_get_key_combos (item);
-  for (GList *l = key_combos; l != NULL; l = l->next)
-    {
-      combo = l->data;
-
-      if (is_empty_binding (combo))
-        continue;
-
-      match = TRUE;
-      accel = convert_keysym_state_to_string (combo);
-      normalized_accel = cc_util_normalize_casefold_and_unaccent (accel);
-
-      shortcut_tokens = g_strsplit_set (normalized_accel, SHORTCUT_DELIMITERS, -1);
-      search_tokens = g_strsplit_set (search, SHORTCUT_DELIMITERS, -1);
-
-      for (guint i = 0; search_tokens[i] != NULL; i++)
-        {
-          const gchar *token;
-
-          /* Strip leading and trailing whitespaces */
-          token = g_strstrip (search_tokens[i]);
-
-          if (g_utf8_strlen (token, -1) == 0)
-            continue;
-
-          match = match && strv_contains_prefix_or_match (shortcut_tokens, token);
-
-          if (!match)
-            break;
-        }
-
-      if (match)
-        return TRUE;
-    }
-
-  return FALSE;
-}
-
-static gint
-section_sort_function (GtkListBoxRow *a,
-                       GtkListBoxRow *b,
-                       gpointer       user_data)
-{
-  SectionRowData *a_data, *b_data;
+  gtk_widget_set_visible (GTK_WIDGET (self->back_button), show_back);
 
-  a_data = g_object_get_data (G_OBJECT (a), "data");
-  b_data = g_object_get_data (G_OBJECT (b), "data");
-
-  /* Put custom shortcuts below everything else */
-  if (g_strcmp0 (a_data->section_id, "custom") == 0)
-    return 1;
+  if (self->visible_section)
+    title = g_object_get_data (G_OBJECT (self->visible_section), "title");
+  else
+    title = "Keyboard Shortcuts";
 
-  return g_strcmp0 (a_data->section_title, b_data->section_title);
+  gtk_window_set_title (GTK_WINDOW (self), _(title));
 }
 
-static gint
-shortcut_sort_function (GtkListBoxRow *a,
-                        GtkListBoxRow *b,
-                        gpointer       user_data)
+static void
+shortcut_search_entry_changed_cb (CcKeyboardShortcutDialog *self)
 {
-  CcKeyboardShortcutDialog *self = user_data;
-  ShortcutRowData *a_data, *b_data;
-  gint retval;
+  g_autofree char *search = NULL;
+  const char *search_text;
+  guint n_items;
 
-  if (a == self->custom_shortcut_add_row)
-    return 1;
-  else if (b == self->custom_shortcut_add_row)
-    return -1;
+  g_assert (CC_IS_KEYBOARD_SHORTCUT_DIALOG (self));
 
-  a_data = g_object_get_data (G_OBJECT (a), "data");
-  b_data = g_object_get_data (G_OBJECT (b), "data");
+  n_items = g_list_model_get_n_items (G_LIST_MODEL (self->sections));
+  search_text = gtk_editable_get_text (GTK_EDITABLE (self->search_entry));
+  search = cc_util_normalize_casefold_and_unaccent (search_text);
 
-  retval = g_strcmp0 (a_data->section_title, b_data->section_title);
+  g_clear_pointer (&self->search_terms, g_strfreev);
+  if (search && *search && *search != ' ')
+    self->search_terms = g_strsplit (search, " ", -1);
 
-  if (retval != 0)
-    return retval;
+  /* "Reset all..." button should be sensitive only if the search is not active */
+  gtk_widget_set_sensitive (GTK_WIDGET (self->reset_all_button), !self->search_terms);
 
-  return g_strcmp0 (cc_keyboard_item_get_description (a_data->item), cc_keyboard_item_get_description (b_data->item));
-}
-
-static gboolean
-shortcut_filter_function (GtkListBoxRow *row,
-                          gpointer       userdata)
-{
-  CcKeyboardShortcutDialog *self = userdata;
-  SectionRowData  *section_data;
-  ShortcutRowData *data;
-  CcKeyboardItem *item;
-  gboolean retval;
-  g_autofree gchar *search = NULL;
-  g_autofree gchar *name = NULL;
-  g_auto(GStrv) terms = NULL;
-  gboolean is_custom_shortcuts = FALSE;
-  const gchar *search_text;
-
-  if (self->section_row != NULL)
-  {
-    section_data = g_object_get_data (G_OBJECT (self->section_row), "data");
-    is_custom_shortcuts = (strcmp (section_data->section_id, "custom") == 0);
-
-    data = g_object_get_data (G_OBJECT (row), "data");
-    if (data && strcmp (data->section_id, section_data->section_id) != 0)
-      return FALSE;
-  }
+  /* If we already showing a section, filter that group only */
+  if (self->visible_section)
+    {
+      CcKeyboardShortcutGroup *group;
+      GtkWidget *child;
+      gboolean is_empty;
 
-  if (row == self->custom_shortcut_add_row)
-    return is_custom_shortcuts;
+      group = g_object_get_data (G_OBJECT (self->visible_section), "group");
+      child = g_object_get_data (G_OBJECT (self->visible_section), "page");
+      cc_keyboard_shortcut_group_set_filter (group, self->search_terms);
+      g_object_get (group, "empty", &is_empty, NULL);
 
-  search_text = gtk_editable_get_text (GTK_EDITABLE (self->search_entry));
-  if (g_utf8_strlen (search_text, -1) == 0)
-    return TRUE;
+      if (is_empty)
+        child = GTK_WIDGET (self->empty_subpage_results_page);
 
-  data = g_object_get_data (G_OBJECT (row), "data");
-  item = data->item;
-  name = cc_util_normalize_casefold_and_unaccent (cc_keyboard_item_get_description (item));
-  search = cc_util_normalize_casefold_and_unaccent (search_text);
-  terms = g_strsplit (search, " ", -1);
+      gtk_stack_set_visible_child (self->shortcut_list_stack, child);
+      return;
+    }
 
-  for (guint i = 0; terms && terms[i]; i++)
+  for (guint i = 0; i < n_items; i++)
     {
-      retval = strstr (name, terms[i]) || search_match_shortcut (item, terms[i]);
-      if (!retval)
-        break;
-    }
+      g_autoptr(GObject) item = NULL;
+      CcKeyboardShortcutGroup *group;
 
-  return retval;
-}
+      item = g_list_model_get_item (G_LIST_MODEL (self->sections), i);
+      group = g_object_get_data (item, "search-group");
 
-static gboolean
-is_matched_shortcut_present (GtkListBox* listbox,
-                             gpointer user_data)
-{
-  for (gint i = 0; ; i++)
-    {
-      GtkListBoxRow *current = gtk_list_box_get_row_at_index (listbox, i);
-      if (!current)
-        return FALSE;
-      if (shortcut_filter_function (current, user_data))
-        return TRUE;
+      cc_keyboard_shortcut_group_set_filter (group, self->search_terms);
     }
+
+  shortcut_search_result_changed_cb (self);
 }
 
 static void
-shortcut_header_function (GtkListBoxRow *row,
-                          GtkListBoxRow *before,
-                          gpointer       user_data)
+shortcut_section_row_activated_cb (CcKeyboardShortcutDialog *self,
+                                   GtkListBoxRow            *row)
 {
-  CcKeyboardShortcutDialog *self = user_data;
-  gboolean add_header;
-  ShortcutRowData *data, *before_data;
+  GListStore *section;
+  GtkWidget *page;
 
-  data = g_object_get_data (G_OBJECT (row), "data");
+  g_assert (CC_IS_KEYBOARD_SHORTCUT_DIALOG (self));
+  g_assert (GTK_IS_LIST_BOX_ROW (row));
 
-  if (row == self->custom_shortcut_add_row)
-    {
+  section = g_object_get_data (G_OBJECT (row), "section");
+  self->visible_section = section;
 
-      add_header = FALSE;
-    }
-  else if (before && before != self->custom_shortcut_add_row)
-    {
-      before_data = g_object_get_data (G_OBJECT (before), "data");
-      add_header = g_strcmp0 (before_data->section_id, data->section_id) != 0;
-    }
-  else
-    {
-      add_header = TRUE;
-    }
-
-  if (self->section_row != NULL)
-    add_header = FALSE;
-
-  if (add_header)
-    {
-      GtkWidget *box, *label, *separator;
-      g_autofree gchar *markup = NULL;
-
-      box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 6);
-      if (!before)
-        gtk_widget_set_margin_top (box, 6);
-
-      markup = g_strdup_printf ("<b>%s</b>", _(data->section_title));
-      label = g_object_new (GTK_TYPE_LABEL,
-                            "label", markup,
-                            "use-markup", TRUE,
-                            "xalign", 0.0,
-                            "margin-start", 6,
-                            NULL);
-      gtk_box_append (GTK_BOX (box), label);
-
-      separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
-      gtk_box_append (GTK_BOX (box), separator);
-
-      gtk_list_box_row_set_header (row, box);
-    }
-  else
-    {
-      gtk_list_box_row_set_header (row, NULL);
-    }
+  page = g_object_get_data (G_OBJECT (section), "page");
+  gtk_stack_set_visible_child (self->shortcut_list_stack, page);
+  adw_leaflet_set_visible_child (self->main_leaflet, GTK_WIDGET (self->shortcut_list_stack));
+  shortuct_custom_items_changed (self);
 }
 
 static void
@@ -780,8 +515,13 @@ cc_keyboard_shortcut_dialog_finalize (GO
   CcKeyboardShortcutDialog *self = CC_KEYBOARD_SHORTCUT_DIALOG (object);
 
   g_clear_object (&self->manager);
-  g_clear_pointer (&self->sections, g_hash_table_destroy);
+  g_clear_object (&self->sections);
+  g_clear_pointer (&self->search_terms, g_strfreev);
+  g_clear_object (&self->sections);
+  g_clear_object (&self->filtered_shortcuts);
   g_clear_pointer ((GtkWindow**)&self->shortcut_editor, gtk_window_destroy);
+
+  G_OBJECT_CLASS (cc_keyboard_shortcut_dialog_parent_class)->finalize (object);
 }
 
 static void
@@ -793,85 +533,88 @@ cc_keyboard_shortcut_dialog_class_init (
   object_class->constructed = cc_keyboard_shortcut_dialog_constructed;
   object_class->finalize = cc_keyboard_shortcut_dialog_finalize;
 
-  gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/control-center/keyboard/cc-keyboard-shortcut-dialog.ui");
+  gtk_widget_class_set_template_from_resource (widget_class,
+                                               "/org/gnome/control-center/"
+                                               "keyboard/cc-keyboard-shortcut-dialog.ui");
 
-  gtk_widget_class_bind_template_child (widget_class, CcKeyboardShortcutDialog, accelerator_sizegroup);
+  gtk_widget_class_bind_template_child (widget_class, CcKeyboardShortcutDialog, header_bar);
   gtk_widget_class_bind_template_child (widget_class, CcKeyboardShortcutDialog, back_button);
-  gtk_widget_class_bind_template_child (widget_class, CcKeyboardShortcutDialog, custom_shortcut_add_row);
-  gtk_widget_class_bind_template_child (widget_class, CcKeyboardShortcutDialog, empty_custom_shortcuts_placeholder);
-  gtk_widget_class_bind_template_child (widget_class, CcKeyboardShortcutDialog, empty_search_placeholder);
-  gtk_widget_class_bind_template_child (widget_class, CcKeyboardShortcutDialog, headerbar);
-  gtk_widget_class_bind_template_child (widget_class, CcKeyboardShortcutDialog, header_stack);
   gtk_widget_class_bind_template_child (widget_class, CcKeyboardShortcutDialog, reset_all_button);
   gtk_widget_class_bind_template_child (widget_class, CcKeyboardShortcutDialog, search_entry);
-  gtk_widget_class_bind_template_child (widget_class, CcKeyboardShortcutDialog, section_listbox);
-  gtk_widget_class_bind_template_child (widget_class, CcKeyboardShortcutDialog, section_box);
-  gtk_widget_class_bind_template_child (widget_class, CcKeyboardShortcutDialog, shortcut_listbox);
-  gtk_widget_class_bind_template_child (widget_class, CcKeyboardShortcutDialog, shortcut_box);
-  gtk_widget_class_bind_template_child (widget_class, CcKeyboardShortcutDialog, stack);
+
+  gtk_widget_class_bind_template_child (widget_class, CcKeyboardShortcutDialog, main_leaflet);
+  gtk_widget_class_bind_template_child (widget_class, CcKeyboardShortcutDialog, main_box);
+  gtk_widget_class_bind_template_child (widget_class, CcKeyboardShortcutDialog, section_stack);
+  gtk_widget_class_bind_template_child (widget_class, CcKeyboardShortcutDialog, section_list_page);
+  gtk_widget_class_bind_template_child (widget_class, CcKeyboardShortcutDialog, section_list_box);
+  gtk_widget_class_bind_template_child (widget_class, CcKeyboardShortcutDialog, search_result_page);
+  gtk_widget_class_bind_template_child (widget_class, CcKeyboardShortcutDialog, empty_results_page);
+
+  gtk_widget_class_bind_template_child (widget_class, CcKeyboardShortcutDialog, shortcut_list_stack);
+  gtk_widget_class_bind_template_child (widget_class, CcKeyboardShortcutDialog, empty_subpage_results_page);
+
+  gtk_widget_class_bind_template_child (widget_class, CcKeyboardShortcutDialog, empty_custom_shortcut_page);
+  gtk_widget_class_bind_template_child (widget_class, CcKeyboardShortcutDialog, accelerator_size_group);
 
   gtk_widget_class_bind_template_callback (widget_class, add_custom_shortcut_clicked_cb);
   gtk_widget_class_bind_template_callback (widget_class, back_button_clicked_cb);
   gtk_widget_class_bind_template_callback (widget_class, reset_all_clicked_cb);
-  gtk_widget_class_bind_template_callback (widget_class, search_entry_cb);
-  gtk_widget_class_bind_template_callback (widget_class, section_row_activated);
-  gtk_widget_class_bind_template_callback (widget_class, shortcut_row_activated);
+  gtk_widget_class_bind_template_callback (widget_class, shortcut_dialog_visible_child_changed_cb);
+  gtk_widget_class_bind_template_callback (widget_class, shortcut_search_entry_changed_cb);
+  gtk_widget_class_bind_template_callback (widget_class, shortcut_section_row_activated_cb);
 }
 
 static void
 cc_keyboard_shortcut_dialog_init (CcKeyboardShortcutDialog *self)
 {
+  g_autoptr(GtkCssProvider) provider = NULL;
+  GdkDisplay *display;
+
   gtk_widget_init_template (GTK_WIDGET (self));
 
+  provider = gtk_css_provider_new ();
+  gtk_css_provider_load_from_data (GTK_CSS_PROVIDER (provider),
+                                   ".shortcut-list undershoot.top {"
+                                   "  box-shadow: inset 0 1px @borders;"
+                                   "}", -1);
+  display = gdk_display_get_default ();
+  gtk_style_context_add_provider_for_display (display,
+                                              GTK_STYLE_PROVIDER (provider),
+                                              GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
+
   gtk_search_entry_set_key_capture_widget (self->search_entry, GTK_WIDGET (self));
+  shortcut_dialog_visible_child_changed_cb (self);
 
   self->manager = cc_keyboard_manager_new ();
 
   self->shortcut_editor = cc_keyboard_shortcut_editor_new (self->manager);
+  shortcut_dialog_visible_child_changed_cb (self);
 
-  self->sections = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL);
-  self->section_row = NULL;
+  self->sections = g_list_store_new (G_TYPE_LIST_STORE);
 
   g_signal_connect_object (self->manager,
                            "shortcut-added",
-                           G_CALLBACK (add_item),
-                           self,
-                           G_CONNECT_SWAPPED);
-
+                           G_CALLBACK (shortcut_added_cb),
+                           self, G_CONNECT_SWAPPED);
   g_signal_connect_object (self->manager,
                            "shortcut-removed",
-                           G_CALLBACK (remove_item),
-                           self,
-                           G_CONNECT_SWAPPED);
+                           G_CALLBACK (shortcut_removed_cb),
+                           self, G_CONNECT_SWAPPED);
+  g_signal_connect_object (self->manager,
+                           "shortcuts-loaded",
+                           G_CALLBACK (shortcuts_loaded_cb),
+                           self, G_CONNECT_SWAPPED);
 
-  add_section(self, "custom", "Custom Shortcuts");
   cc_keyboard_manager_load_shortcuts (self->manager);
 
-  gtk_list_box_set_sort_func (GTK_LIST_BOX (self->section_listbox),
-                              section_sort_function,
-                              self,
-                              NULL);
-
-  gtk_list_box_set_filter_func (self->shortcut_listbox,
-                                shortcut_filter_function,
-                                self,
-                                NULL);
-  gtk_list_box_set_header_func (self->shortcut_listbox,
-                                shortcut_header_function,
-                                self,
-                                NULL);
-  gtk_list_box_set_sort_func (GTK_LIST_BOX (self->shortcut_listbox),
-                              shortcut_sort_function,
-                              self,
-                              NULL);
-
-  show_section_list (self);
+  gtk_list_box_bind_model (self->section_list_box,
+                           G_LIST_MODEL (self->sections),
+                           shortcut_dialog_row_new,
+                           self, NULL);
 }
 
 GtkWidget*
 cc_keyboard_shortcut_dialog_new (void)
 {
-  return g_object_new (CC_TYPE_KEYBOARD_SHORTCUT_DIALOG,
-                       "use-header-bar", 1,
-                       NULL);
+  return g_object_new (CC_TYPE_KEYBOARD_SHORTCUT_DIALOG, NULL);
 }
diff -pruN 1:43.2-2/panels/keyboard/cc-keyboard-shortcut-dialog.h 1:44~alpha-0ubuntu1/panels/keyboard/cc-keyboard-shortcut-dialog.h
--- 1:43.2-2/panels/keyboard/cc-keyboard-shortcut-dialog.h	2022-12-23 11:11:35.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/keyboard/cc-keyboard-shortcut-dialog.h	2023-01-09 20:06:57.000000000 +0000
@@ -22,14 +22,14 @@
 
 #pragma once
 
-#include <gtk/gtk.h>
+#include <adwaita.h>
 
 G_BEGIN_DECLS
 
 #define CC_TYPE_KEYBOARD_SHORTCUT_DIALOG (cc_keyboard_shortcut_dialog_get_type ())
 
-G_DECLARE_FINAL_TYPE (CcKeyboardShortcutDialog, cc_keyboard_shortcut_dialog, CC, KEYBOARD_SHORTCUT_DIALOG, GtkDialog)
+G_DECLARE_FINAL_TYPE (CcKeyboardShortcutDialog, cc_keyboard_shortcut_dialog, CC, KEYBOARD_SHORTCUT_DIALOG, AdwWindow)
 
 GtkWidget* cc_keyboard_shortcut_dialog_new (void);
 
-G_END_DECLS
\ No newline at end of file
+G_END_DECLS
diff -pruN 1:43.2-2/panels/keyboard/cc-keyboard-shortcut-dialog.ui 1:44~alpha-0ubuntu1/panels/keyboard/cc-keyboard-shortcut-dialog.ui
--- 1:43.2-2/panels/keyboard/cc-keyboard-shortcut-dialog.ui	2022-12-23 11:11:35.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/keyboard/cc-keyboard-shortcut-dialog.ui	2023-01-09 20:06:57.000000000 +0000
@@ -1,227 +1,166 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <interface>
-  <!-- interface-requires gtk+ 3.0 -->
-  <template class="CcKeyboardShortcutDialog" parent="GtkDialog">
+  <template class="CcKeyboardShortcutDialog" parent="AdwWindow">
     <property name="modal">True</property>
     <property name="default-width">600</property>
+    <property name="default-height">540</property>
+
+    <child>
+      <object class="GtkBox">
+        <property name="orientation">vertical</property>
 
-    <child type="titlebar">
-      <object class="GtkHeaderBar" id="headerbar">
-        <property name="show_title_buttons">True</property>
         <child>
-          <object class="GtkStack" id="header_stack">
-            <property name="hhomogeneous">False</property>
-            <property name="vhomogeneous">False</property>
-            <property name="transition-type">crossfade</property>
+          <object class="AdwHeaderBar" id="header_bar">
 
+            <!-- Back button -->
             <child>
               <object class="GtkButton" id="back_button">
-                <property name="halign">start</property>
-                <property name="valign">center</property>
-                <property name="icon_name">go-previous-symbolic</property>
-                <property name="use-underline">True</property>
-                <signal name="clicked" handler="back_button_clicked_cb" object="CcKeyboardShortcutDialog" swapped="yes" />
-                <style>
-                  <class name="image-button"/>
-                </style>
+                <property name="icon-name">go-previous-symbolic</property>
                 <accessibility>
                   <property name="label">Back</property>
                 </accessibility>
+                <signal name="clicked" handler="back_button_clicked_cb" swapped="yes" />
+                <style>
+                  <class name="image-button"/>
+                </style>
               </object>
             </child>
 
+            <!-- Reset All… button -->
             <child>
               <object class="GtkButton" id="reset_all_button">
+                <property name="visible" bind-source="back_button" bind-flags="sync-create|invert-boolean|bidirectional"/>
                 <property name="label" translatable="yes">Reset All…</property>
                 <property name="tooltip-text" translatable="yes">Reset all shortcuts to their default keybindings</property>
-                <signal name="clicked" handler="reset_all_clicked_cb" object="CcKeyboardShortcutDialog" swapped="yes" />
+                <signal name="clicked" handler="reset_all_clicked_cb" swapped="yes" />
               </object>
             </child>
 
-          </object>
+          </object> <!-- ./AdwHeaderBar headerbar -->
         </child>
-      </object>
-    </child>
 
-    <child>
-      <object class="GtkScrolledWindow">
-        <property name="hexpand">True</property>
-        <property name="vexpand">True</property>
-        <property name="hscrollbar_policy">never</property>
-        <property name="propagate_natural_width">True</property>
-        <property name="propagate_natural_height">True</property>
-        <property name="max_content_height">450</property>
         <child>
-          <object class="GtkBox">
-            <property name="orientation">vertical</property>
-            <child>
-              <object class="GtkSearchEntry" id="search_entry">
-                <property name="margin-top">12</property>
-                <property name="width_chars">30</property>
-                <property name="halign">center</property>
-                <accessibility>
-                  <property name="label" translatable="yes">Search</property>
-                </accessibility>
-                <signal name="notify::text" handler="search_entry_cb" object="CcKeyboardShortcutDialog" swapped="yes" />
-              </object>
-            </child>
+          <object class="GtkSeparator"/>
+        </child>
+
+        <child>
+          <object class="AdwLeaflet" id="main_leaflet">
+            <property name="can-unfold">False</property>
+            <property name="can-navigate-back">True</property>
+            <signal name="notify::visible-child" handler="shortcut_dialog_visible_child_changed_cb" swapped="yes"/>
+
             <child>
-              <object class="GtkStack" id="stack">
-                <property name="hexpand">True</property>
-                <property name="vexpand">True</property>
-                <property name="hhomogeneous">False</property>
-                <property name="vhomogeneous">False</property>
+              <object class="GtkBox" id="main_box">
+                <property name="orientation">vertical</property>
+
+                <!-- Search Entry -->
                 <child>
-                  <object class="GtkBox" id="section_box">
-                    <property name="orientation">vertical</property>
-                    <property name="margin-top">12</property>
-                    <property name="margin-bottom">12</property>
-                    <property name="margin-start">12</property>
-                    <property name="margin-end">12</property>
-                    <child>
-                      <object class="GtkListBox" id="section_listbox">
-                        <property name="selection-mode">none</property>
-                        <property name="margin-top">12</property>
-                        <property name="margin-bottom">12</property>
-                        <property name="margin-start">12</property>
-                        <property name="margin-end">12</property>
-                        <accessibility>
-                          <property name="label" translatable="yes">Section</property>
-                        </accessibility>
-                        <signal name="row-activated" handler="section_row_activated" object="CcKeyboardShortcutDialog" swapped="no" />
-                        <style>
-                          <class name="boxed-list" />
-                        </style>
-                      </object>
-                    </child>
+                  <object class="GtkSearchEntry" id="search_entry">
+                    <property name="halign">center</property>
+                    <property name="margin-top">6</property>
+                    <property name="margin-bottom">6</property>
+                    <property name="width-chars">32</property>
+                    <signal name="search-changed" handler="shortcut_search_entry_changed_cb" swapped="yes" />
+                    <accessibility>
+                      <property name="label" translatable="yes">Search Shortcuts</property>
+                    </accessibility>
                   </object>
                 </child>
+
                 <child>
-                  <object class="GtkBox" id="shortcut_box">
-                    <property name="orientation">vertical</property>
-                    <property name="margin-top">12</property>
-                    <property name="margin-bottom">12</property>
-                    <property name="margin-start">12</property>
-                    <property name="margin-end">12</property>
-                    <property name="spacing">12</property>
+                  <object class="GtkStack" id="section_stack">
+                    <property name="vhomogeneous">False</property>
+                    <property name="css-classes">shortcut-list</property>
+
+                    <!-- Shortcut section title rows -->
                     <child>
-                      <object class="GtkListBox" id="shortcut_listbox">
-                        <property name="selection-mode">none</property>
-                        <accessibility>
-                          <property name="label" translatable="yes">Shortcuts</property>
-                        </accessibility>
-                        <style>
-                          <class name="boxed-list" />
-                        </style>
-                        <signal name="row-activated" handler="shortcut_row_activated" object="CcKeyboardShortcutDialog" swapped="no" />
+                      <object class="AdwPreferencesPage" id="section_list_page">
                         <child>
-                          <object class="GtkListBoxRow" id="custom_shortcut_add_row">
-                             <accessibility>
-                              <property name="label" translatable="yes">Add a shortcut</property>
-                            </accessibility>
-                             <child>
-                              <object class="GtkImage">
-                                <property name="hexpand">True</property>
-                                <property name="icon_name">list-add-symbolic</property>
-                                <property name="height_request">48</property>
+                          <object class="AdwPreferencesGroup">
+                            <child>
+                              <object class="GtkListBox" id="section_list_box">
+                                <property name="selection-mode">none</property>
+                                <signal name="row-activated" handler="shortcut_section_row_activated_cb" swapped="yes"/>
+                                <style>
+                                 <class name="boxed-list"/>
+                                </style>
                               </object>
-                             </child>
-                           </object>
+                            </child>
+                          </object>
                         </child>
                       </object>
                     </child>
-                  </object>
-                </child>
-                <child>
-                  <object class="GtkBox" id="empty_custom_shortcuts_placeholder">
-                    <property name="orientation">vertical</property>
-                    <property name="margin-top">18</property>
-                    <property name="margin-bottom">18</property>
-                    <property name="margin-start">18</property>
-                    <property name="margin-end">18</property>
-                    <property name="spacing">18</property>
-                    <property name="valign">center</property>
-                    <style>
-                      <class name="background"/>
-                    </style>
+
+                    <!-- Shortcut search results list -->
                     <child>
-                      <object class="GtkImage">
-                        <property name="icon-name">input-keyboard-symbolic</property>
-                        <property name="pixel-size">128</property>
-                      </object>
+                      <object class="AdwPreferencesPage" id="search_result_page"/>
                     </child>
+
                     <child>
-                      <object class="GtkLabel">
-                        <property name="label" translatable="yes">Add Custom Shortcuts</property>
-                        <attributes>
-                          <attribute name="weight" value="bold" />
-                        </attributes>
+                      <object class="AdwStatusPage" id="empty_results_page">
+                        <property name="icon_name">edit-find-symbolic</property>
+                        <property name="title" translatable="yes">No keyboard shortcut found</property>
+                        <property name="description" translatable="yes">Try a different search.</property>
                       </object>
                     </child>
-                    <child>
-                      <object class="GtkLabel">
-                        <property name="label" translatable="yes">Set up custom shortcuts for launching apps, running scripts, and more.</property>
+
+                  </object>
+                </child>
+
+              </object>
+            </child>
+
+            <child>
+              <object class="AdwLeafletPage">
+                <property name="navigatable">False</property>
+                <property name="child">
+                  <object class="GtkStack" id="shortcut_list_stack">
+                    <property name="vhomogeneous">False</property>
+
+                    <!-- Empty search page -->
+                    <child>
+                      <object class="AdwStatusPage" id="empty_subpage_results_page">
+                        <property name="icon_name">edit-find-symbolic</property>
+                        <property name="title" translatable="yes">No keyboard shortcut found</property>
+                        <property name="description" translatable="yes">Try a different search.</property>
                       </object>
                     </child>
+
+                  </object>
+                </property>
+              </object>
+            </child>
+
+            <child>
+              <object class="AdwLeafletPage">
+                <property name="navigatable">False</property>
+                <property name="child">
+                  <object class="AdwStatusPage" id="empty_custom_shortcut_page">
+                    <property name="icon-name">input-keyboard-symbolic</property>
+                    <property name="title" translatable="yes">Add Custom Shortcuts</property>
+                    <property name="description" translatable="yes">Set up custom shortcuts for launching apps, running scripts, and more.</property>
                     <child>
                       <object class="GtkButton">
                         <property name="halign">center</property>
                         <property name="label" translatable="yes">Add Shortcut</property>
+                        <signal name="clicked" handler="add_custom_shortcut_clicked_cb" swapped="yes"/>
                         <style>
-                          <class name="suggested-action" />
+                          <class name="suggested-action"/>
+                          <class name="pill"/>
                         </style>
-                        <signal name="clicked" handler="add_custom_shortcut_clicked_cb" object="CcKeyboardShortcutDialog" swapped="yes" />
                       </object>
                     </child>
                   </object>
-                </child>
-                <child>
-                  <object class="GtkBox" id="empty_search_placeholder">
-                  <property name="halign">center</property>
-                  <property name="valign">center</property>
-                  <property name="hexpand">True</property>
-                  <property name="vexpand">True</property>
-                  <property name="margin-top">18</property>
-                  <property name="margin-bottom">18</property>
-                  <property name="margin-start">18</property>
-                  <property name="margin-end">18</property>
-                  <property name="orientation">vertical</property>
-                  <property name="spacing">6</property>
-                  <child>
-                    <object class="GtkImage">
-                      <property name="pixel_size">80</property>
-                      <property name="icon_name">edit-find-symbolic</property>
-                      <style>
-                        <class name="dim-label"/>
-                      </style>
-                    </object>
-                  </child>
-                  <child>
-                    <object class="GtkLabel">
-                      <property name="label" translatable="yes">No keyboard shortcut found</property>
-                      <attributes>
-                        <attribute name="weight" value="bold"/>
-                        <attribute name="scale" value="1.44"/>
-                      </attributes>
-                    </object>
-                  </child>
-                  <child>
-                    <object class="GtkLabel">
-                      <property name="label" translatable="yes">Try a different search</property>
-                      <style>
-                        <class name="dim-label"/>
-                      </style>
-                    </object>
-                  </child>
-                </object>
-                </child>
+                </property>
               </object>
             </child>
-          </object>
+
+          </object> <!-- ./AdwLeaflet -->
         </child>
-      </object>
+
+      </object> <!-- ./GtkBox -->
     </child>
 
   </template>
-  <object class="GtkSizeGroup" id="accelerator_sizegroup" />
+  <object class="GtkSizeGroup" id="accelerator_size_group"/>
 </interface>
diff -pruN 1:43.2-2/panels/keyboard/cc-keyboard-shortcut-editor.c 1:44~alpha-0ubuntu1/panels/keyboard/cc-keyboard-shortcut-editor.c
--- 1:43.2-2/panels/keyboard/cc-keyboard-shortcut-editor.c	2022-12-23 11:11:35.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/keyboard/cc-keyboard-shortcut-editor.c	2023-01-09 20:06:57.000000000 +0000
@@ -383,18 +383,16 @@ setup_custom_shortcut (CcKeyboardShortcu
     {
       GtkLabel *label;
       g_autofree gchar *friendly_accelerator = NULL;
-      g_autofree gchar *accelerator_text = NULL;
       g_autofree gchar *collision_text = NULL;
 
       friendly_accelerator = convert_keysym_state_to_string (self->custom_combo);
 
-      accelerator_text = g_strdup_printf ("<b>%s</b>", friendly_accelerator);
-      collision_text = g_strdup_printf (_("%s is already being used for %s. If you "
-                                          "replace it, %s will be disabled"),
-                                        accelerator_text,
-                                        cc_keyboard_item_get_description (collision_item),
-                                        cc_keyboard_item_get_description (collision_item));
-
+      /* TRANSLATORS: Don't translate/transliterate <b>%s</b>, which is the accelerator used */
+      collision_text = g_markup_printf_escaped (_("<b>%s</b> is already being used for %s. If you "
+                                                  "replace it, %s will be disabled"),
+                                                friendly_accelerator,
+                                                cc_keyboard_item_get_description (collision_item),
+                                                cc_keyboard_item_get_description (collision_item));
       label = is_custom_shortcut (self) ? self->new_shortcut_conflict_label : self->shortcut_conflict_label;
 
       gtk_label_set_markup (label, collision_text);
@@ -529,7 +527,6 @@ setup_keyboard_item (CcKeyboardShortcutE
   CcKeyCombo combo;
   gboolean is_custom;
   g_autofree gchar *accel = NULL;
-  g_autofree gchar *description_text = NULL;
   g_autofree gchar *text = NULL;
 
   if (!item) {
@@ -557,9 +554,12 @@ setup_keyboard_item (CcKeyboardShortcutE
   gtk_widget_hide (GTK_WIDGET (self->replace_button));
 
   /* Setup the top label */
-  description_text = g_strdup_printf ("<b>%s</b>", cc_keyboard_item_get_description (item));
-  /* TRANSLATORS: %s is replaced with a description of the keyboard shortcut */
-  text = g_strdup_printf (_("Enter new shortcut to change %s."), description_text);
+  /*
+   * TRANSLATORS: %s is replaced with a description of the keyboard shortcut,
+   * don't translate/transliterate <b>%s</b>
+   */
+  text = g_markup_printf_escaped (_("Enter new shortcut to change <b>%s</b>"),
+                                  cc_keyboard_item_get_description (item));
 
   gtk_label_set_markup (self->top_info_label, text);
 
diff -pruN 1:43.2-2/panels/keyboard/cc-keyboard-shortcut-group.c 1:44~alpha-0ubuntu1/panels/keyboard/cc-keyboard-shortcut-group.c
--- 1:43.2-2/panels/keyboard/cc-keyboard-shortcut-group.c	1970-01-01 00:00:00.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/keyboard/cc-keyboard-shortcut-group.c	2023-01-09 20:06:57.000000000 +0000
@@ -0,0 +1,443 @@
+/* -*- mode: c; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/*
+ * Copyright (C) 2022 Purism SPC
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see <http://www.gnu.org/licenses/>.
+ *
+ * Author(s):
+ *   Mohammed Sadiq <sadiq@sadiqpk.org>
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+
+#undef G_LOG_DOMAIN
+#define G_LOG_DOMAIN "cc-keyboard-shortcut-group"
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <glib/gi18n.h>
+
+#include "cc-keyboard-item.h"
+#include "cc-keyboard-shortcut-row.h"
+#include "cc-keyboard-shortcut-group.h"
+
+struct _CcKeyboardShortcutGroup
+{
+  AdwPreferencesGroup       parent_instance;
+
+  GtkListBox               *shortcut_list_box;
+
+  GtkSizeGroup             *accelerator_size_group;
+  CcKeyboardShortcutEditor *shortcut_editor;
+
+  GListModel               *shortcut_items;
+  GtkFilterListModel       *filtered_shortcuts;
+  GtkCustomFilter          *custom_filter;
+
+  CcKeyboardManager        *keyboard_manager;
+  char                    **search_terms;
+  char                     *section_id;
+  char                     *section_title;
+  /* The text representing the count of shortcuts changed */
+  char                     *modified_text;
+
+  gboolean                 is_empty;
+};
+
+G_DEFINE_TYPE (CcKeyboardShortcutGroup, cc_keyboard_shortcut_group, ADW_TYPE_PREFERENCES_GROUP)
+
+enum {
+  PROP_0,
+  PROP_EMPTY,
+  PROP_MODIFIED_TEXT,
+  N_PROPS
+};
+
+static GParamSpec *properties[N_PROPS];
+
+static void
+shortcut_group_row_activated_cb (CcKeyboardShortcutGroup *self,
+                                 GtkListBoxRow           *row)
+{
+  g_assert (CC_IS_KEYBOARD_SHORTCUT_GROUP (self));
+  g_assert (GTK_IS_LIST_BOX_ROW (row));
+
+  if (CC_IS_KEYBOARD_SHORTCUT_ROW (row))
+    {
+      CcKeyboardItem *item;
+
+      item = cc_keyboard_shortcut_row_get_item (CC_KEYBOARD_SHORTCUT_ROW (row));
+      cc_keyboard_shortcut_editor_set_mode (self->shortcut_editor, CC_SHORTCUT_EDITOR_EDIT);
+      cc_keyboard_shortcut_editor_set_item (self->shortcut_editor, item);
+    }
+  else  /* Add shortcut row */
+    {
+      cc_keyboard_shortcut_editor_set_mode (self->shortcut_editor, CC_SHORTCUT_EDITOR_CREATE);
+      cc_keyboard_shortcut_editor_set_item (self->shortcut_editor, NULL);
+    }
+
+  gtk_widget_show (GTK_WIDGET (self->shortcut_editor));
+}
+
+static void
+group_shortcut_changed_cb (CcKeyboardShortcutGroup *self)
+{
+  g_assert (CC_IS_KEYBOARD_SHORTCUT_GROUP (self));
+
+  /* Free the modified text, so that it will be regenerated when someone asks for one */
+  g_clear_pointer (&self->modified_text, g_free);
+  g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_MODIFIED_TEXT]);
+}
+
+static void
+shortcut_group_update_modified_text (CcKeyboardShortcutGroup *self)
+{
+  guint n_items, n_modified = 0;
+
+  g_assert (CC_IS_KEYBOARD_SHORTCUT_GROUP (self));
+
+  if (self->modified_text)
+    return;
+
+  n_items = g_list_model_get_n_items (self->shortcut_items);
+
+  for (guint i = 0; i < n_items; i++)
+    {
+      g_autoptr(CcKeyboardItem) item = NULL;
+
+      item = g_list_model_get_item (self->shortcut_items, i);
+
+      if (!cc_keyboard_item_is_value_default (item))
+        n_modified++;
+    }
+
+  if (n_modified == 0)
+    self->modified_text = g_strdup ("");
+  else
+    self->modified_text = g_strdup_printf (g_dngettext (GETTEXT_PACKAGE,
+                                                        "%d modified",
+                                                        "%d modified",
+                                                        n_modified),
+                                           n_modified);
+}
+
+static GtkWidget *
+shortcut_group_row_new (gpointer item,
+                        gpointer user_data)
+{
+  CcKeyboardShortcutGroup *self = user_data;
+  GtkWidget *row;
+
+  /* Row to add custom shortcut */
+  if (GTK_IS_STRING_OBJECT (item))
+    {
+      GtkWidget *icon;
+
+      row = adw_preferences_row_new ();
+      gtk_list_box_row_set_activatable (GTK_LIST_BOX_ROW (row), TRUE);
+      gtk_list_box_row_set_selectable (GTK_LIST_BOX_ROW (row), FALSE);
+      gtk_accessible_update_property (GTK_ACCESSIBLE (row),
+                                      GTK_ACCESSIBLE_PROPERTY_LABEL,
+                                      _("Add a Shortcut"),
+                                      -1);
+      icon = gtk_image_new_from_icon_name ("list-add-symbolic");
+      gtk_widget_set_margin_top (icon, 15);
+      gtk_widget_set_margin_bottom (icon, 15);
+      gtk_list_box_row_set_child (GTK_LIST_BOX_ROW (row), icon);
+
+      return row;
+
+    }
+
+  row = GTK_WIDGET (cc_keyboard_shortcut_row_new (item,
+                                                  self->keyboard_manager,
+                                                  self->shortcut_editor,
+                                                  self->accelerator_size_group));
+
+  g_signal_connect_object (item, "notify::is-value-default",
+                           G_CALLBACK (group_shortcut_changed_cb),
+                           self,
+                           G_CONNECT_SWAPPED);
+
+  return row;
+}
+
+static gboolean
+shortcut_group_filter_cb (gpointer item,
+                          gpointer  user_data)
+{
+  CcKeyboardShortcutGroup *self = user_data;
+
+  if (!self->search_terms)
+    return TRUE;
+
+  /* We don't want to show the "Add new shortcut" row in search results */
+  if (GTK_IS_STRING_OBJECT (item))
+    return FALSE;
+
+  return cc_keyboard_item_matches_string (item, self->search_terms);
+}
+
+static void
+group_filter_list_changed_cb (CcKeyboardShortcutGroup *self)
+{
+  guint n_items;
+  gboolean empty;
+
+  g_assert (CC_IS_KEYBOARD_SHORTCUT_GROUP (self));
+
+  n_items = g_list_model_get_n_items (G_LIST_MODEL (self->filtered_shortcuts));
+  empty = n_items == 0;
+
+  if (self->is_empty == empty)
+    return;
+
+  self->is_empty = empty;
+  g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_EMPTY]);
+}
+
+static void
+shortcut_group_set_list_model (CcKeyboardShortcutGroup *self,
+                               GListModel              *shortcut_items)
+{
+  GtkExpression *expression;
+  GtkSortListModel *sort_model;
+  GtkStringSorter *sorter;
+  GListModel *model = NULL;
+
+  g_assert (!self->shortcut_items);
+  self->shortcut_items = g_object_ref (shortcut_items);
+
+  /* Sort shortcuts by description */
+  expression = gtk_property_expression_new (CC_TYPE_KEYBOARD_ITEM, NULL, "description");
+  sorter = gtk_string_sorter_new (expression);
+  sort_model = gtk_sort_list_model_new (g_object_ref (shortcut_items), GTK_SORTER (sorter));
+
+  /*
+   * This is a workaround to add an additional item to the end
+   * of the shortcut list, which will be used to show "+" row
+   * to add more items.  We do this way instead of appending a
+   * row to avoid some imperfections in the GUI.
+   */
+  if (g_strcmp0 (self->section_id, "custom") == 0)
+    {
+      g_autoptr(GListStore) add_shortcut = NULL;
+      g_autoptr(GtkStringObject) str = NULL;
+      GtkFlattenListModel *flat_model;
+      GListStore *shortcut_store;
+
+      shortcut_store = g_list_store_new (G_TYPE_LIST_MODEL);
+      add_shortcut = g_list_store_new (GTK_TYPE_STRING_OBJECT);
+
+      str = gtk_string_object_new ("add-shortcut");
+      g_list_store_append (add_shortcut, str);
+
+      g_list_store_append (shortcut_store, sort_model);
+      g_list_store_append (shortcut_store, add_shortcut);
+
+      flat_model = gtk_flatten_list_model_new (G_LIST_MODEL (shortcut_store));
+      model = G_LIST_MODEL (flat_model);
+    }
+
+  if (!model)
+    model = G_LIST_MODEL (sort_model);
+
+  self->custom_filter = gtk_custom_filter_new (shortcut_group_filter_cb, self, NULL);
+  self->filtered_shortcuts = gtk_filter_list_model_new (model, GTK_FILTER (self->custom_filter));
+
+  g_signal_connect_object (self->filtered_shortcuts, "items-changed",
+                           G_CALLBACK (group_filter_list_changed_cb),
+                           self, G_CONNECT_SWAPPED);
+  group_filter_list_changed_cb (self);
+}
+
+static void
+shortcut_group_update_title (CcKeyboardShortcutGroup *self)
+{
+  const char *title = NULL;
+  guint n_items;
+  gboolean show_title = TRUE;
+
+  if (!self->section_title)
+    return;
+
+  n_items = g_list_model_get_n_items (G_LIST_MODEL (self->filtered_shortcuts));
+
+  if (!self->search_terms || n_items == 0)
+    show_title = FALSE;
+
+  if (show_title)
+    title = _(self->section_title);
+
+  adw_preferences_group_set_title (ADW_PREFERENCES_GROUP (self), title);
+}
+
+static void
+cc_keyboard_shortcut_group_get_property (GObject    *object,
+                                         guint       prop_id,
+                                         GValue     *value,
+                                         GParamSpec *pspec)
+{
+  CcKeyboardShortcutGroup *self = (CcKeyboardShortcutGroup *)object;
+
+  switch (prop_id)
+    {
+    case PROP_EMPTY:
+      g_value_set_boolean (value, self->is_empty);
+      break;
+
+    case PROP_MODIFIED_TEXT:
+      shortcut_group_update_modified_text (self);
+      g_value_set_string (value, self->modified_text);
+      break;
+
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+    }
+}
+
+static void
+cc_keyboard_shortcut_group_finalize (GObject *object)
+{
+  CcKeyboardShortcutGroup *self = (CcKeyboardShortcutGroup *)object;
+
+  g_clear_pointer (&self->section_id, g_free);
+  g_clear_pointer (&self->section_title, g_free);
+  g_clear_object (&self->shortcut_items);
+  g_clear_object (&self->filtered_shortcuts);
+
+  G_OBJECT_CLASS (cc_keyboard_shortcut_group_parent_class)->finalize (object);
+}
+
+static void
+cc_keyboard_shortcut_group_class_init (CcKeyboardShortcutGroupClass *klass)
+{
+  GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+  object_class->get_property = cc_keyboard_shortcut_group_get_property;
+  object_class->finalize = cc_keyboard_shortcut_group_finalize;
+
+  /**
+   * CcKeyboardShortcutGroup:empty:
+   *
+   * Whether the list of shortcuts is empty
+   */
+  properties[PROP_EMPTY] =
+    g_param_spec_boolean ("empty",
+                          "Empty Shorcuts",
+                          "Whether the group contain no shorcuts",
+                          FALSE,
+                          G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
+
+  /**
+   * CcKeyboardShortcutGroup:modified_text:
+   *
+   * A string the represents the number of modified keys
+   * present in the group, translated to current locale.
+   * This is a string property so that it can be bound to
+   * UI label as such.
+   *
+   * Shall be any empty string if no shortcut is modified.
+   */
+  properties[PROP_MODIFIED_TEXT] =
+    g_param_spec_string ("modified-text",
+                         "Modified Text",
+                         "A string representing the number of modified shortcut items",
+                         "",
+                         G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
+
+  g_object_class_install_properties (object_class, N_PROPS, properties);
+}
+
+static void
+cc_keyboard_shortcut_group_init (CcKeyboardShortcutGroup *self)
+{
+  self->shortcut_list_box = GTK_LIST_BOX (gtk_list_box_new ());
+  gtk_widget_add_css_class (GTK_WIDGET (self->shortcut_list_box), "boxed-list");
+  g_signal_connect_object (self->shortcut_list_box, "row-activated",
+                           G_CALLBACK (shortcut_group_row_activated_cb),
+                           self, G_CONNECT_SWAPPED);
+
+  adw_preferences_group_add (ADW_PREFERENCES_GROUP (self),
+                             GTK_WIDGET (self->shortcut_list_box));
+}
+
+GtkWidget *
+cc_keyboard_shortcut_group_new (GListModel               *shortcut_items,
+                                const char               *section_id,
+                                const char               *section_title,
+                                CcKeyboardManager        *manager,
+                                CcKeyboardShortcutEditor *shortcut_editor,
+                                GtkSizeGroup             *size_group)
+{
+  CcKeyboardShortcutGroup *self;
+
+  g_return_val_if_fail (section_id && *section_id, NULL);
+  g_return_val_if_fail (G_IS_LIST_MODEL (shortcut_items), NULL);
+  g_return_val_if_fail (g_list_model_get_item_type (shortcut_items) == CC_TYPE_KEYBOARD_ITEM, NULL);
+
+  self = g_object_new (CC_TYPE_KEYBOARD_SHORTCUT_GROUP, NULL);
+  self->section_title = g_strdup (section_title);
+  self->section_id = g_strdup (section_id);
+
+  self->keyboard_manager = manager;
+  self->shortcut_editor = shortcut_editor;
+  self->accelerator_size_group = size_group;
+
+  shortcut_group_set_list_model (self, shortcut_items);
+  shortcut_group_update_title (self);
+
+  g_object_bind_property (self, "empty",
+                          self, "visible",
+                          G_BINDING_SYNC_CREATE | G_BINDING_INVERT_BOOLEAN);
+
+  gtk_list_box_bind_model (self->shortcut_list_box,
+                           G_LIST_MODEL (self->filtered_shortcuts),
+                           shortcut_group_row_new,
+                           self, NULL);
+
+  return GTK_WIDGET (self);
+}
+
+/**
+ * cc_keyboard_shortcut_group_get_model:
+ * self: A #CcKeyboardShortcutGroup
+ *
+ * Get the #GListModel used to create shortcut rows.
+ * The content of the model can be different from
+ * the #GListModel given to create @self if a search
+ * is in progress.
+ *
+ * Returns: (transfer none): A #GListModel
+ */
+GListModel *
+cc_keyboard_shortcut_group_get_model (CcKeyboardShortcutGroup *self)
+{
+  g_return_val_if_fail (CC_IS_KEYBOARD_SHORTCUT_GROUP (self), NULL);
+
+  return G_LIST_MODEL (self->filtered_shortcuts);
+}
+
+void
+cc_keyboard_shortcut_group_set_filter (CcKeyboardShortcutGroup *self,
+                                       GStrv                    search_terms)
+{
+  g_return_if_fail (CC_IS_KEYBOARD_SHORTCUT_GROUP (self));
+
+  self->search_terms = search_terms;
+  gtk_filter_changed (GTK_FILTER (self->custom_filter), GTK_FILTER_CHANGE_DIFFERENT);
+  shortcut_group_update_title (self);
+}
diff -pruN 1:43.2-2/panels/keyboard/cc-keyboard-shortcut-group.h 1:44~alpha-0ubuntu1/panels/keyboard/cc-keyboard-shortcut-group.h
--- 1:43.2-2/panels/keyboard/cc-keyboard-shortcut-group.h	1970-01-01 00:00:00.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/keyboard/cc-keyboard-shortcut-group.h	2023-01-09 20:06:57.000000000 +0000
@@ -0,0 +1,47 @@
+/* -*- mode: c; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/*
+ * Copyright (C) 2022 Purism SPC
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see <http://www.gnu.org/licenses/>.
+ *
+ * Author(s):
+ *   Mohammed Sadiq <sadiq@sadiqpk.org>
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+
+#pragma once
+
+#include <adwaita.h>
+
+#include "cc-keyboard-manager.h"
+#include "cc-keyboard-shortcut-editor.h"
+
+G_BEGIN_DECLS
+
+#define CC_TYPE_KEYBOARD_SHORTCUT_GROUP (cc_keyboard_shortcut_group_get_type ())
+
+G_DECLARE_FINAL_TYPE (CcKeyboardShortcutGroup, cc_keyboard_shortcut_group, CC, KEYBOARD_SHORTCUT_GROUP, AdwPreferencesGroup)
+
+GtkWidget  *cc_keyboard_shortcut_group_new          (GListModel               *shortcut_items,
+                                                     const char               *section_id,
+                                                     const char               *section_title,
+                                                     CcKeyboardManager        *manager,
+                                                     CcKeyboardShortcutEditor *shortcut_editor,
+                                                     GtkSizeGroup             *size_group);
+GListModel *cc_keyboard_shortcut_group_get_model    (CcKeyboardShortcutGroup  *self);
+void        cc_keyboard_shortcut_group_set_filter   (CcKeyboardShortcutGroup  *self,
+                                                     GStrv                     search_terms);
+
+G_END_DECLS
diff -pruN 1:43.2-2/panels/keyboard/cc-keyboard-shortcut-row.c 1:44~alpha-0ubuntu1/panels/keyboard/cc-keyboard-shortcut-row.c
--- 1:43.2-2/panels/keyboard/cc-keyboard-shortcut-row.c	2022-12-23 11:11:35.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/keyboard/cc-keyboard-shortcut-row.c	2023-01-09 20:06:57.000000000 +0000
@@ -1,6 +1,7 @@
 /* cc-keyboard-shortcut-row.c
  *
  * Copyright (C) 2020 System76, Inc.
+ * Copyright (C) 2022 Purism SPC.
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -64,10 +65,13 @@ cc_keyboard_shortcut_row_init (CcKeyboar
 }
 
 static void
-shortcut_modified_changed_cb (CcKeyboardShortcutRow *self)
+cc_kbd_shortcut_is_default_changed_cb (CcKeyboardShortcutRow *self)
 {
-  gtk_revealer_set_reveal_child (self->reset_revealer,
-		                !cc_keyboard_item_is_value_default (self->item));
+  /* Embolden the label when the shortcut is modified */
+  if (cc_keyboard_item_is_value_default (self->item))
+    gtk_widget_remove_css_class (GTK_WIDGET (self->accelerator_label), "heading");
+  else
+    gtk_widget_add_css_class (GTK_WIDGET (self->accelerator_label), "heading");
 }
 
 static gboolean
@@ -82,20 +86,7 @@ transform_binding_to_accel (GBinding
 
   item = CC_KEYBOARD_ITEM (g_binding_dup_source (binding));
   combo = cc_keyboard_item_get_primary_combo (item);
-
-  /* Embolden the label when the shortcut is modified */
-  if (!cc_keyboard_item_is_value_default (item))
-    {
-      g_autofree gchar *tmp = NULL;
-
-      tmp = convert_keysym_state_to_string (&combo);
-
-      accelerator = g_strdup_printf ("<b>%s</b>", tmp);
-    }
-  else
-    {
-      accelerator = convert_keysym_state_to_string (&combo);
-    }
+  accelerator = convert_keysym_state_to_string (&combo);
 
   g_value_take_string (to_value, accelerator);
 
@@ -115,8 +106,12 @@ cc_keyboard_shortcut_row_new (CcKeyboard
   self->manager = manager;
   self->shortcut_editor = shortcut_editor;
 
-  adw_preferences_row_set_title (ADW_PREFERENCES_ROW (self), cc_keyboard_item_get_description (item));
-
+  g_object_bind_property (item, "description",
+                          self, "title",
+                          G_BINDING_SYNC_CREATE);
+  g_object_bind_property (item, "is-value-default",
+                          self->reset_revealer, "reveal-child",
+                          G_BINDING_SYNC_CREATE | G_BINDING_INVERT_BOOLEAN);
   g_object_bind_property_full (item,
                                "key-combos",
                                self->accelerator_label,
@@ -125,15 +120,21 @@ cc_keyboard_shortcut_row_new (CcKeyboard
                                transform_binding_to_accel,
                                NULL, NULL, NULL);
 
-  gtk_revealer_set_reveal_child (self->reset_revealer,
-                                 !cc_keyboard_item_is_value_default (item));
-  g_signal_connect_object (item,
-                           "notify::key-combos",
-                           G_CALLBACK (shortcut_modified_changed_cb),
+  g_signal_connect_object (item, "notify::is-value-default",
+                           G_CALLBACK (cc_kbd_shortcut_is_default_changed_cb),
                            self, G_CONNECT_SWAPPED);
+  cc_kbd_shortcut_is_default_changed_cb (self);
 
   gtk_size_group_add_widget(size_group,
                             GTK_WIDGET (self->accelerator_label));
 
   return self;
 }
+
+CcKeyboardItem *
+cc_keyboard_shortcut_row_get_item (CcKeyboardShortcutRow *self)
+{
+  g_return_val_if_fail (CC_IS_KEYBOARD_SHORTCUT_ROW (self), NULL);
+
+  return self->item;
+}
diff -pruN 1:43.2-2/panels/keyboard/cc-keyboard-shortcut-row.h 1:44~alpha-0ubuntu1/panels/keyboard/cc-keyboard-shortcut-row.h
--- 1:43.2-2/panels/keyboard/cc-keyboard-shortcut-row.h	2022-12-23 11:11:35.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/keyboard/cc-keyboard-shortcut-row.h	2023-01-09 20:06:57.000000000 +0000
@@ -34,5 +34,6 @@ CcKeyboardShortcutRow *cc_keyboard_short
                                                      CcKeyboardManager        *manager,
                                                      CcKeyboardShortcutEditor *editor,
                                                      GtkSizeGroup             *size_group);
+CcKeyboardItem        *cc_keyboard_shortcut_row_get_item  (CcKeyboardShortcutRow   *self);
 
 G_END_DECLS
diff -pruN 1:43.2-2/panels/keyboard/cc-keyboard-shortcut-row.ui 1:44~alpha-0ubuntu1/panels/keyboard/cc-keyboard-shortcut-row.ui
--- 1:43.2-2/panels/keyboard/cc-keyboard-shortcut-row.ui	2022-12-23 11:11:35.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/keyboard/cc-keyboard-shortcut-row.ui	2023-01-09 20:06:57.000000000 +0000
@@ -2,12 +2,12 @@
 <interface>
   <!-- interface-requires gtk+ 3.0 -->
   <template class="CcKeyboardShortcutRow" parent="AdwActionRow">
+    <property name="use-markup">False</property>
     <property name="selectable">False</property>
     <property name="activatable">True</property>
     <child>
       <object class="GtkLabel" id="accelerator_label">
         <property name="xalign">1.0</property>
-        <property name="use-markup">True</property>
         <style>
           <class name="dim-label" />
         </style>
diff -pruN 1:43.2-2/panels/keyboard/gnome-keyboard-panel.desktop.in 1:44~alpha-0ubuntu1/panels/keyboard/gnome-keyboard-panel.desktop.in
--- 1:43.2-2/panels/keyboard/gnome-keyboard-panel.desktop.in	1970-01-01 00:00:00.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/keyboard/gnome-keyboard-panel.desktop.in	2023-01-09 20:06:57.000000000 +0000
@@ -0,0 +1,14 @@
+[Desktop Entry]
+Name=Keyboard
+Comment=Change keyboard shortcuts and set your typing preferences, keyboard layouts and input sources
+Exec=gnome-control-center keyboard
+# Translators: Do NOT translate or transliterate this text (this is an icon file name)!
+Icon=org.gnome.Settings-keyboard-symbolic
+Terminal=false
+Type=Application
+NoDisplay=true
+StartupNotify=true
+Categories=GNOME;GTK;Settings;HardwareSettings;X-GNOME-Settings-Panel;X-GNOME-DevicesSettings;
+OnlyShowIn=GNOME;Unity;
+# Translators: Search terms to find the Keyboard panel. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon!
+Keywords=Shortcut;Workspace;Window;Resize;Zoom;Contrast;Input;Source;Lock;Volume;Hotkey;
diff -pruN 1:43.2-2/panels/keyboard/gnome-keyboard-panel.desktop.in.in 1:44~alpha-0ubuntu1/panels/keyboard/gnome-keyboard-panel.desktop.in.in
--- 1:43.2-2/panels/keyboard/gnome-keyboard-panel.desktop.in.in	2022-12-23 11:11:35.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/keyboard/gnome-keyboard-panel.desktop.in.in	1970-01-01 00:00:00.000000000 +0000
@@ -1,18 +0,0 @@
-[Desktop Entry]
-Name=Keyboard
-Comment=Change keyboard shortcuts and set your typing preferences, keyboard layouts and input sources
-Exec=gnome-control-center keyboard
-# Translators: Do NOT translate or transliterate this text (this is an icon file name)!
-Icon=org.gnome.Settings-keyboard-symbolic
-Terminal=false
-Type=Application
-NoDisplay=true
-StartupNotify=true
-Categories=GNOME;GTK;Settings;HardwareSettings;X-GNOME-Settings-Panel;X-GNOME-DevicesSettings;
-OnlyShowIn=GNOME;Unity;
-X-GNOME-Bugzilla-Bugzilla=GNOME
-X-GNOME-Bugzilla-Product=gnome-control-center
-X-GNOME-Bugzilla-Component=keyboard
-X-GNOME-Bugzilla-Version=@VERSION@
-# Translators: Search terms to find the Keyboard panel. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon!
-Keywords=Shortcut;Workspace;Window;Resize;Zoom;Contrast;Input;Source;Lock;Volume;
diff -pruN 1:43.2-2/panels/keyboard/meson.build 1:44~alpha-0ubuntu1/panels/keyboard/meson.build
--- 1:43.2-2/panels/keyboard/meson.build	2022-12-23 11:11:35.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/keyboard/meson.build	2023-01-09 20:06:57.000000000 +0000
@@ -1,15 +1,9 @@
 panels_list += cappletname
 desktop = 'gnome-@0@-panel.desktop'.format(cappletname)
 
-desktop_in = configure_file(
-  input: desktop + '.in.in',
-  output: desktop + '.in',
-  configuration: desktop_conf
-)
-
 i18n.merge_file(
   type: 'desktop',
-  input: desktop_in,
+  input: desktop + '.in',
   output: desktop,
   po_dir: po_dir,
   install: true,
@@ -55,6 +49,7 @@ endforeach
 sources = files(
   'cc-xkb-modifier-dialog.c',
   'cc-keyboard-shortcut-row.c',
+  'cc-keyboard-shortcut-group.c',
   'cc-keyboard-shortcut-dialog.c',
   'cc-keyboard-panel.c',
   'cc-keyboard-item.c',
diff -pruN 1:43.2-2/panels/location/cc-location-panel.c 1:44~alpha-0ubuntu1/panels/location/cc-location-panel.c
--- 1:43.2-2/panels/location/cc-location-panel.c	2022-12-23 11:11:35.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/location/cc-location-panel.c	2023-01-09 20:06:57.000000000 +0000
@@ -186,7 +186,7 @@ add_location_app (CcLocationPanel *self,
   last_used_str = cc_util_get_smart_date (t);
   w = gtk_label_new (last_used_str);
   g_free (last_used_str);
-  gtk_style_context_add_class (gtk_widget_get_style_context (w), "dim-label");
+  gtk_widget_add_css_class (w, "dim-label");
   gtk_widget_set_margin_start (w, 12);
   gtk_widget_set_margin_end (w, 12);
   gtk_widget_set_valign (w, GTK_ALIGN_CENTER);
diff -pruN 1:43.2-2/panels/location/cc-location-panel.ui 1:44~alpha-0ubuntu1/panels/location/cc-location-panel.ui
--- 1:43.2-2/panels/location/cc-location-panel.ui	2022-12-23 11:11:35.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/location/cc-location-panel.ui	2023-01-09 20:06:57.000000000 +0000
@@ -21,7 +21,7 @@
               <object class="AdwStatusPage">
                 <property name="icon-name">location-services-disabled-symbolic</property>
                 <property name="title" translatable="yes">Location Services Turned Off</property>
-                <property name="description" translatable="yes">No applications can obtain location information.</property>
+                <property name="description" translatable="yes">No sandboxed applications can obtain location information.</property>
               </object>
 
             </property>
@@ -35,11 +35,9 @@
               <object class="AdwPreferencesPage">
                 <child>
                   <object class="AdwPreferencesGroup">
-                    <property name="description" translatable="yes">Location services allow applications to know your location. Using Wi-Fi and mobile broadband increases accuracy.
+                    <property name="description" translatable="yes">Location services use GPS, Wi-Fi and cellular connections to determine the approximate location of this device. &lt;a href=&apos;https://location.services.mozilla.com/privacy&apos;&gt;Learn about what data is collected, and how it is used.&lt;/a&gt;
 
-Uses Mozilla Location Service: &lt;a href=&apos;https://location.services.mozilla.com/privacy&apos;&gt;Privacy Policy&lt;/a&gt;
-
-Allow the applications below to determine your location.</property>
+The following sandboxed applications have been given access to location data. Applications that are not sandboxed can access location data without asking for permission.</property>
                     <child>
                       <object class="GtkListBox" id="location_apps_list_box">
                         <property name="selection-mode">none</property>
@@ -53,7 +51,7 @@ Allow the applications below to determin
                             <property name="margin_bottom">18</property>
                             <property name="margin_start">18</property>
                             <property name="margin_end">18</property>
-                            <property name="label" translatable="yes">No Applications Have Asked for Location Access</property>
+                            <property name="label" translatable="yes">No sandboxed applications have asked for location access</property>
                             <property name="wrap">true</property>
                             <property name="max-width-chars">50</property>
                             <style>
diff -pruN 1:43.2-2/panels/location/gnome-location-panel.desktop.in 1:44~alpha-0ubuntu1/panels/location/gnome-location-panel.desktop.in
--- 1:43.2-2/panels/location/gnome-location-panel.desktop.in	1970-01-01 00:00:00.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/location/gnome-location-panel.desktop.in	2023-01-09 20:06:57.000000000 +0000
@@ -0,0 +1,15 @@
+[Desktop Entry]
+Name=Location Services
+Comment=Protect your location information
+Exec=gnome-control-center location
+# FIXME
+# Translators: Do NOT translate or transliterate this text (this is an icon file name)!
+Icon=org.gnome.Settings-location-symbolic
+Terminal=false
+Type=Application
+NoDisplay=true
+StartupNotify=true
+Categories=GNOME;GTK;Settings;DesktopSettings;X-GNOME-Settings-Panel;X-GNOME-PrivacySettings;
+OnlyShowIn=GNOME;Unity;
+# Translators: Search terms to find the Location panel. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon!
+Keywords=location;gps;private;privacy;
diff -pruN 1:43.2-2/panels/location/gnome-location-panel.desktop.in.in 1:44~alpha-0ubuntu1/panels/location/gnome-location-panel.desktop.in.in
--- 1:43.2-2/panels/location/gnome-location-panel.desktop.in.in	2022-12-23 11:11:35.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/location/gnome-location-panel.desktop.in.in	1970-01-01 00:00:00.000000000 +0000
@@ -1,19 +0,0 @@
-[Desktop Entry]
-Name=Location Services
-Comment=Protect your location information
-Exec=gnome-control-center location
-# FIXME
-# Translators: Do NOT translate or transliterate this text (this is an icon file name)!
-Icon=org.gnome.Settings-location-symbolic
-Terminal=false
-Type=Application
-NoDisplay=true
-StartupNotify=true
-Categories=GNOME;GTK;Settings;DesktopSettings;X-GNOME-Settings-Panel;X-GNOME-PrivacySettings;
-OnlyShowIn=GNOME;Unity;
-X-GNOME-Bugzilla-Bugzilla=GNOME
-X-GNOME-Bugzilla-Product=gnome-control-center
-X-GNOME-Bugzilla-Component=privacy
-X-GNOME-Bugzilla-Version=@VERSION@
-# Translators: Search terms to find the Location panel. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon!
-Keywords=location;gps;private;privacy;
diff -pruN 1:43.2-2/panels/location/meson.build 1:44~alpha-0ubuntu1/panels/location/meson.build
--- 1:43.2-2/panels/location/meson.build	2022-12-23 11:11:35.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/location/meson.build	2023-01-09 20:06:57.000000000 +0000
@@ -1,15 +1,9 @@
 panels_list += cappletname
 desktop = 'gnome-@0@-panel.desktop'.format(cappletname)
 
-desktop_in = configure_file(
-  input: desktop + '.in.in',
-  output: desktop + '.in',
-  configuration: desktop_conf
-)
-
 i18n.merge_file(
   type: 'desktop',
-  input: desktop_in,
+  input: desktop + '.in',
   output: desktop,
   po_dir: po_dir,
   install: true,
diff -pruN 1:43.2-2/panels/microphone/cc-microphone-panel.ui 1:44~alpha-0ubuntu1/panels/microphone/cc-microphone-panel.ui
--- 1:43.2-2/panels/microphone/cc-microphone-panel.ui	2022-12-23 11:11:35.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/microphone/cc-microphone-panel.ui	2023-01-09 20:06:57.000000000 +0000
@@ -21,7 +21,7 @@
               <object class="AdwStatusPage">
                 <property name="icon-name">microphone-disabled-symbolic</property>
                 <property name="title" translatable="yes">Microphone Turned Off</property>
-                <property name="description" translatable="yes">No applications can record sound.</property>
+                <property name="description" translatable="yes">No sandboxed applications can record sound.</property>
               </object>
             </property>
           </object>
@@ -34,9 +34,7 @@
               <object class="AdwPreferencesPage">
                 <child>
                   <object class="AdwPreferencesGroup">
-                    <property name="description" translatable="yes">Use of the microphone allows applications to record and listen to audio. Disabling the microphone may cause some applications to not function properly.
-
-Allow the applications below to use your microphone.</property>
+                    <property name="description" translatable="yes">The following sandboxed applications have been given permission to use microphones. Applications that are not sandboxed can use microphones without asking for permission.</property>
                     <child>
                       <object class="GtkListBox" id="microphone_apps_list_box">
                         <property name="can-focus">true</property>
@@ -51,7 +49,7 @@ Allow the applications below to use your
                             <property name="margin-bottom">18</property>
                             <property name="margin-start">18</property>
                             <property name="margin-end">18</property>
-                            <property name="label" translatable="yes">No Applications Have Asked for Microphone Access</property>
+                            <property name="label" translatable="yes">No sandboxed applications have asked for microphone access</property>
                             <property name="wrap">true</property>
                             <property name="max-width-chars">50</property>
                             <style>
diff -pruN 1:43.2-2/panels/microphone/gnome-microphone-panel.desktop.in 1:44~alpha-0ubuntu1/panels/microphone/gnome-microphone-panel.desktop.in
--- 1:43.2-2/panels/microphone/gnome-microphone-panel.desktop.in	1970-01-01 00:00:00.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/microphone/gnome-microphone-panel.desktop.in	2023-01-09 20:06:57.000000000 +0000
@@ -0,0 +1,15 @@
+[Desktop Entry]
+Name=Microphone
+Comment=Protect your conversations
+Exec=gnome-control-center microphone
+# FIXME
+# Translators: Do NOT translate or transliterate this text (this is an icon file name)!
+Icon=org.gnome.Settings-microphone-symbolic
+Terminal=false
+Type=Application
+NoDisplay=true
+StartupNotify=true
+Categories=GNOME;GTK;Settings;DesktopSettings;X-GNOME-Settings-Panel;X-GNOME-PrivacySettings;
+OnlyShowIn=GNOME;Unity;
+# Translators: Search terms to find the Microphone panel. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon!
+Keywords=microphone;recording;application;privacy;
diff -pruN 1:43.2-2/panels/microphone/gnome-microphone-panel.desktop.in.in 1:44~alpha-0ubuntu1/panels/microphone/gnome-microphone-panel.desktop.in.in
--- 1:43.2-2/panels/microphone/gnome-microphone-panel.desktop.in.in	2022-12-23 11:11:35.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/microphone/gnome-microphone-panel.desktop.in.in	1970-01-01 00:00:00.000000000 +0000
@@ -1,19 +0,0 @@
-[Desktop Entry]
-Name=Microphone
-Comment=Protect your conversations
-Exec=gnome-control-center microphone
-# FIXME
-# Translators: Do NOT translate or transliterate this text (this is an icon file name)!
-Icon=org.gnome.Settings-microphone-symbolic
-Terminal=false
-Type=Application
-NoDisplay=true
-StartupNotify=true
-Categories=GNOME;GTK;Settings;DesktopSettings;X-GNOME-Settings-Panel;X-GNOME-PrivacySettings;
-OnlyShowIn=GNOME;Unity;
-X-GNOME-Bugzilla-Bugzilla=GNOME
-X-GNOME-Bugzilla-Product=gnome-control-center
-X-GNOME-Bugzilla-Component=privacy
-X-GNOME-Bugzilla-Version=@VERSION@
-# Translators: Search terms to find the Microphone panel. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon!
-Keywords=microphone;recording;application;privacy;
diff -pruN 1:43.2-2/panels/microphone/meson.build 1:44~alpha-0ubuntu1/panels/microphone/meson.build
--- 1:43.2-2/panels/microphone/meson.build	2022-12-23 11:11:35.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/microphone/meson.build	2023-01-09 20:06:57.000000000 +0000
@@ -1,15 +1,9 @@
 panels_list += cappletname
 desktop = 'gnome-@0@-panel.desktop'.format(cappletname)
 
-desktop_in = configure_file(
-  input: desktop + '.in.in',
-  output: desktop + '.in',
-  configuration: desktop_conf
-)
-
 i18n.merge_file(
   type: 'desktop',
-  input: desktop_in,
+  input: desktop + '.in',
   output: desktop,
   po_dir: po_dir,
   install: true,
diff -pruN 1:43.2-2/panels/mouse/cc-mouse-panel.c 1:44~alpha-0ubuntu1/panels/mouse/cc-mouse-panel.c
--- 1:43.2-2/panels/mouse/cc-mouse-panel.c	2022-12-23 11:11:35.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/mouse/cc-mouse-panel.c	2023-01-09 20:06:57.000000000 +0000
@@ -83,13 +83,13 @@ setup_touchpad_options (CcMousePanel *se
   gboolean have_tap_to_click;
 
   if (self->have_synaptics || !self->have_touchpad) {
-    gtk_widget_hide (GTK_WIDGET (self->touchpad_group));
+    gtk_widget_set_visible (GTK_WIDGET (self->touchpad_group), FALSE);
     return;
   }
 
   cc_touchpad_check_capabilities (&have_two_finger_scrolling, &have_edge_scrolling, &have_tap_to_click);
 
-  gtk_widget_show (GTK_WIDGET (self->touchpad_group));
+  gtk_widget_set_visible (GTK_WIDGET (self->touchpad_group), TRUE);
 
   gtk_widget_set_visible (GTK_WIDGET (self->two_finger_scrolling_row), have_two_finger_scrolling);
   gtk_widget_set_visible (GTK_WIDGET (self->edge_scrolling_row), have_edge_scrolling);
diff -pruN 1:43.2-2/panels/mouse/cc-mouse-panel.ui 1:44~alpha-0ubuntu1/panels/mouse/cc-mouse-panel.ui
--- 1:43.2-2/panels/mouse/cc-mouse-panel.ui	2022-12-23 11:11:35.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/mouse/cc-mouse-panel.ui	2023-01-09 20:06:57.000000000 +0000
@@ -6,7 +6,7 @@
       <object class="GtkToggleButton" id="test_button">
         <property name="use_underline">True</property>
         <property name="valign">center</property>
-        <property name="label" translatable="yes">Test Your _Settings</property>
+        <property name="label" translatable="yes">Test _Settings</property>
         <signal name="toggled" handler="test_button_toggled_cb" object="CcMousePanel" swapped="yes"/>
         <style>
           <class name="text-button"/>
@@ -63,15 +63,25 @@
                 <child>
                   <object class="AdwActionRow" id="mouse_row">
                     <property name="title" translatable="yes">Mouse Speed</property>
-                    <child>
+                    <child type="suffix">
                       <object class="GtkScale" id="mouse_speed_scale">
-                        <property name="adjustment">mouse_speed_adjustment</property>
-                        <property name="draw_value">False</property>
                         <property name="hexpand">True</property>
-                        <property name="vexpand">True</property>
                         <accessibility>
-                          <property name="label">Mouse speed</property>
+                          <property name="label" translatable="yes">Mouse speed</property>
                         </accessibility>
+                        <marks>
+                          <mark value="-1" translatable="yes">Slow</mark>
+                          <mark value="0"/>
+                          <mark value="1" translatable="yes">Fast</mark>
+                        </marks>
+                        <property name="adjustment">
+                          <object class="GtkAdjustment">
+                            <property name="lower">-1</property>
+                            <property name="upper">1</property>
+                            <property name="step-increment">0.1</property>
+                            <property name="page-increment">0.1</property>
+                          </object>
+                        </property>
                       </object>
                     </child>
                   </object>
@@ -129,15 +139,25 @@
                 <child>
                   <object class="AdwActionRow" id="touchpad_speed_row">
                     <property name="title" translatable="yes">Touchpad Speed</property>
-                    <child>
+                    <child type="suffix">
                       <object class="GtkScale" id="touchpad_speed_scale">
-                        <property name="adjustment">touchpad_speed_adjustment</property>
-                        <property name="draw_value">False</property>
                         <property name="hexpand">True</property>
-                        <property name="vexpand">True</property>
                         <accessibility>
-                          <property name="label">Double-click timeout</property>
+                          <property name="label" translatable="yes">Touchpad speed</property>
                         </accessibility>
+                        <marks>
+                          <mark value="-1" translatable="yes">Slow</mark>
+                          <mark value="0"/>
+                          <mark value="1" translatable="yes">Fast</mark>
+                        </marks>
+                        <property name="adjustment">
+                          <object class="GtkAdjustment">
+                            <property name="lower">-1</property>
+                            <property name="upper">1</property>
+                            <property name="step-increment">0.1</property>
+                            <property name="page-increment">0.1</property>
+                          </object>
+                        </property>
                       </object>
                     </child>
                   </object>
@@ -201,19 +221,4 @@
       </object>
     </child>
   </template>
-  <object class="GtkAdjustment" id="mouse_speed_adjustment">
-    <property name="lower">-1</property>
-    <property name="upper">1</property>
-  </object>
-  <object class="GtkAdjustment" id="touchpad_speed_adjustment">
-    <property name="lower">-1</property>
-    <property name="upper">1</property>
-  </object>
-  <object class="GtkSizeGroup">
-    <property name="mode">horizontal</property>
-    <widgets>
-      <widget name="mouse_speed_scale"/>
-      <widget name="touchpad_speed_scale"/>
-    </widgets>
-  </object>
 </interface>
diff -pruN 1:43.2-2/panels/mouse/cc-mouse-test.ui 1:44~alpha-0ubuntu1/panels/mouse/cc-mouse-test.ui
--- 1:43.2-2/panels/mouse/cc-mouse-test.ui	2022-12-23 11:11:35.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/mouse/cc-mouse-test.ui	2023-01-09 20:06:57.000000000 +0000
@@ -35,11 +35,11 @@
                     </child>
                     <child type="overlay">
                       <object class="GtkDrawingArea" id="button_drawing_area">
-                        <property name="width_request">180</property>
-                        <property name="height_request">180</property>
-                        <property name="valign">end</property>
-                        <property name="margin_top">20</property>
-                        <property name="margin_bottom">20</property>
+                        <property name="width_request">120</property>
+                        <property name="height_request">120</property>
+                        <property name="valign">start</property>
+                        <property name="margin_top">215</property>
+                        <property name="margin_start">250</property>
                         <child>
                           <object class="GtkGestureClick">
                             <property name="button">0</property>
diff -pruN 1:43.2-2/panels/mouse/gnome-mouse-panel.desktop.in 1:44~alpha-0ubuntu1/panels/mouse/gnome-mouse-panel.desktop.in
--- 1:43.2-2/panels/mouse/gnome-mouse-panel.desktop.in	1970-01-01 00:00:00.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/mouse/gnome-mouse-panel.desktop.in	2023-01-09 20:06:57.000000000 +0000
@@ -0,0 +1,14 @@
+[Desktop Entry]
+Name=Mouse & Touchpad
+Comment=Change your mouse or touchpad sensitivity and select right or left-handed
+Exec=gnome-control-center mouse
+# Translators: Do NOT translate or transliterate this text (this is an icon file name)!
+Icon=org.gnome.Settings-mouse-symbolic
+Terminal=false
+Type=Application
+NoDisplay=true
+StartupNotify=true
+Categories=GNOME;GTK;Settings;HardwareSettings;X-GNOME-Settings-Panel;X-GNOME-DevicesSettings;
+OnlyShowIn=GNOME;Unity;
+# Translators: Search terms to find the Mouse and Touchpad panel. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon!
+Keywords=Trackpad;Pointer;Click;Tap;Double;Button;Trackball;Scroll;
diff -pruN 1:43.2-2/panels/mouse/gnome-mouse-panel.desktop.in.in 1:44~alpha-0ubuntu1/panels/mouse/gnome-mouse-panel.desktop.in.in
--- 1:43.2-2/panels/mouse/gnome-mouse-panel.desktop.in.in	2022-12-23 11:11:35.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/mouse/gnome-mouse-panel.desktop.in.in	1970-01-01 00:00:00.000000000 +0000
@@ -1,18 +0,0 @@
-[Desktop Entry]
-Name=Mouse & Touchpad
-Comment=Change your mouse or touchpad sensitivity and select right or left-handed
-Exec=gnome-control-center mouse
-# Translators: Do NOT translate or transliterate this text (this is an icon file name)!
-Icon=org.gnome.Settings-mouse-symbolic
-Terminal=false
-Type=Application
-NoDisplay=true
-StartupNotify=true
-Categories=GNOME;GTK;Settings;HardwareSettings;X-GNOME-Settings-Panel;X-GNOME-DevicesSettings;
-OnlyShowIn=GNOME;Unity;
-X-GNOME-Bugzilla-Bugzilla=GNOME
-X-GNOME-Bugzilla-Product=gnome-control-center
-X-GNOME-Bugzilla-Component=mouse
-X-GNOME-Bugzilla-Version=@VERSION@
-# Translators: Search terms to find the Mouse and Touchpad panel. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon!
-Keywords=Trackpad;Pointer;Click;Tap;Double;Button;Trackball;Scroll;
diff -pruN 1:43.2-2/panels/mouse/meson.build 1:44~alpha-0ubuntu1/panels/mouse/meson.build
--- 1:43.2-2/panels/mouse/meson.build	2022-12-23 11:11:35.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/mouse/meson.build	2023-01-09 20:06:57.000000000 +0000
@@ -1,15 +1,9 @@
 panels_list += cappletname
 desktop = 'gnome-@0@-panel.desktop'.format(cappletname)
 
-desktop_in = configure_file(
-  input: desktop + '.in.in',
-  output: desktop + '.in',
-  configuration: desktop_conf
-)
-
 i18n.merge_file(
   type: 'desktop',
-  input: desktop_in,
+  input: desktop + '.in',
   output: desktop,
   po_dir: po_dir,
   install: true,
diff -pruN 1:43.2-2/panels/multitasking/gnome-multitasking-panel.desktop.in 1:44~alpha-0ubuntu1/panels/multitasking/gnome-multitasking-panel.desktop.in
--- 1:43.2-2/panels/multitasking/gnome-multitasking-panel.desktop.in	1970-01-01 00:00:00.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/multitasking/gnome-multitasking-panel.desktop.in	2023-01-09 20:06:57.000000000 +0000
@@ -0,0 +1,14 @@
+[Desktop Entry]
+Name=Multitasking
+Comment=Manage preferences for productivity and multitasking
+Exec=gnome-control-center multitasking
+# Translators: Do NOT translate or transliterate this text (this is an icon file name)!
+Icon=org.gnome.Settings-multitasking-symbolic
+Terminal=false
+Type=Application
+NoDisplay=true
+StartupNotify=true
+Categories=GNOME;GTK;Settings;DesktopSettings;X-GNOME-Settings-Panel;X-GNOME-PersonalizationSettings;
+OnlyShowIn=GNOME;
+# Translators: Search terms to find the Search panel. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon!
+Keywords=Multitasking;Multitask;Productivity;Customize;Desktop;Hot Corner;Workspaces;
diff -pruN 1:43.2-2/panels/multitasking/gnome-multitasking-panel.desktop.in.in 1:44~alpha-0ubuntu1/panels/multitasking/gnome-multitasking-panel.desktop.in.in
--- 1:43.2-2/panels/multitasking/gnome-multitasking-panel.desktop.in.in	2022-12-23 11:11:35.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/multitasking/gnome-multitasking-panel.desktop.in.in	1970-01-01 00:00:00.000000000 +0000
@@ -1,14 +0,0 @@
-[Desktop Entry]
-Name=Multitasking
-Comment=Manage preferences for productivity and multitasking
-Exec=gnome-control-center multitasking
-# Translators: Do NOT translate or transliterate this text (this is an icon file name)!
-Icon=org.gnome.Settings-multitasking-symbolic
-Terminal=false
-Type=Application
-NoDisplay=true
-StartupNotify=true
-Categories=GNOME;GTK;Settings;DesktopSettings;X-GNOME-Settings-Panel;X-GNOME-PersonalizationSettings;
-OnlyShowIn=GNOME;
-# Translators: Search terms to find the Search panel. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon!
-Keywords=Multitasking;Multitask;Productivity;Customize;Desktop;Hot Corner;Workspaces;
diff -pruN 1:43.2-2/panels/multitasking/meson.build 1:44~alpha-0ubuntu1/panels/multitasking/meson.build
--- 1:43.2-2/panels/multitasking/meson.build	2022-12-23 11:11:35.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/multitasking/meson.build	2023-01-09 20:06:57.000000000 +0000
@@ -1,15 +1,9 @@
 panels_list += cappletname
 desktop = 'gnome-@0@-panel.desktop'.format(cappletname)
 
-desktop_in = configure_file(
-  input: desktop + '.in.in',
-  output: desktop + '.in',
-  configuration: desktop_conf
-)
-
 i18n.merge_file(
   type: 'desktop',
-  input: desktop_in,
+  input: desktop + '.in',
   output: desktop,
   po_dir: po_dir,
   install: true,
diff -pruN 1:43.2-2/panels/network/cc-net-proxy-page.c 1:44~alpha-0ubuntu1/panels/network/cc-net-proxy-page.c
--- 1:43.2-2/panels/network/cc-net-proxy-page.c	1970-01-01 00:00:00.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/network/cc-net-proxy-page.c	2023-01-09 20:06:57.000000000 +0000
@@ -0,0 +1,443 @@
+/* -*- mode: c; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
+ *
+ * Copyright (C) 2011-2012 Richard Hughes <richard@hughsie.com>
+ * Copyright 2022 Mohammed Sadiq <sadiq@sadiqpk.org>
+ * Copyright 2022 Purism SPC
+ *
+ * Licensed under the GNU General Public License Version 2
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+
+#undef G_LOG_DOMAIN
+#define G_LOG_DOMAIN "cc-net-proxy-page"
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <glib/gi18n.h>
+
+#include "panels/common/cc-list-row.h"
+#include "cc-net-proxy-page.h"
+
+struct _CcNetProxyPage
+{
+  AdwPreferencesPage   parent_instance;
+
+  AdwComboRow         *proxy_type_row;
+
+  GtkStack            *main_stack;
+  AdwPreferencesGroup *automatic_view;
+  GtkBox              *manual_view;
+
+  /* Automatic view */
+  GtkEntry            *proxy_url_entry;
+  GtkEntry            *proxy_warning_label;
+
+  /* Manual view */
+  AdwEntryRow         *http_host_entry;
+  GtkAdjustment       *http_port_adjustment;
+  AdwEntryRow         *https_host_entry;
+  GtkAdjustment       *https_port_adjustment;
+  AdwEntryRow         *ftp_host_entry;
+  GtkAdjustment       *ftp_port_adjustment;
+  AdwEntryRow         *socks_host_entry;
+  GtkAdjustment       *socks_port_adjustment;
+  AdwEntryRow         *proxy_ignore_entry;
+
+  GSettings           *settings;
+  char                *state_text;
+
+  gboolean             is_loading;
+};
+
+G_DEFINE_TYPE (CcNetProxyPage, cc_net_proxy_page, ADW_TYPE_PREFERENCES_PAGE)
+
+typedef enum
+{
+  MODE_DISABLED,
+  MODE_MANUAL,
+  MODE_AUTOMATIC
+} ProxyMode;
+
+typedef enum
+{
+  ROW_AUTOMATIC,
+  ROW_MANUAL
+} RowValue;
+
+enum {
+  PROP_0,
+  PROP_MODIFIED,
+  PROP_STATE_TEXT,
+  N_PROPS
+};
+
+static GParamSpec *properties[N_PROPS];
+
+static gboolean
+get_ignore_hosts (GValue   *value,
+                  GVariant *variant,
+                  gpointer  user_data)
+{
+  g_autofree const char **strv = NULL;
+
+  strv = g_variant_get_strv (variant, NULL);
+  g_value_take_string (value, g_strjoinv (", ", (char **)strv));
+
+  return TRUE;
+}
+
+static GVariant *
+set_ignore_hosts (const GValue       *value,
+                  const GVariantType *expected_type,
+                  gpointer            user_data)
+{
+  g_auto(GStrv) strv = NULL;
+  const char *sv;
+
+  sv = g_value_get_string (value);
+  strv = g_strsplit_set (sv, ", ", 0);
+
+  return g_variant_new_strv ((const char * const *)strv, -1);
+}
+
+/*
+ * Get the current mode, which may not have saved
+ * to settings yet
+ */
+static ProxyMode
+proxy_get_current_mode (CcNetProxyPage *self)
+{
+  ProxyMode mode;
+  guint selected;
+
+  g_assert (CC_IS_NET_PROXY_PAGE (self));
+
+  /*
+   * Disabled state is immediately applied on change.  So get
+   * it from the settings as we don't store it locally
+   */
+  mode = g_settings_get_enum (self->settings, "mode");
+  if (mode == MODE_DISABLED)
+    return MODE_DISABLED;
+
+  if (self->is_loading)
+    return mode;
+
+  selected = adw_combo_row_get_selected (self->proxy_type_row);
+
+  if (selected == ROW_AUTOMATIC)
+    return MODE_AUTOMATIC;
+
+  if (selected == ROW_MANUAL)
+    return MODE_MANUAL;
+
+  g_assert_not_reached ();
+
+  return -1;
+}
+
+static void
+proxy_update_state_text (CcNetProxyPage *self)
+{
+  ProxyMode mode;
+
+  g_assert (CC_IS_NET_PROXY_PAGE (self));
+
+  mode = proxy_get_current_mode (self);
+
+  if (mode == MODE_DISABLED)
+    self->state_text = _("Off");
+  else if (mode == MODE_AUTOMATIC)
+    self->state_text = _("Automatic");
+  else
+    self->state_text = _("Manual");
+
+  g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_STATE_TEXT]);
+}
+
+static void
+proxy_configuration_changed_cb (CcNetProxyPage *self)
+{
+  GtkWidget *child;
+  ProxyMode mode;
+
+  g_assert (CC_IS_NET_PROXY_PAGE (self));
+
+  if (adw_combo_row_get_selected (self->proxy_type_row) == ROW_AUTOMATIC)
+    child = GTK_WIDGET (self->automatic_view);
+  else
+    child = GTK_WIDGET (self->manual_view);
+
+  gtk_stack_set_visible_child (self->main_stack, child);
+
+  if (self->is_loading)
+    return;
+
+  mode = proxy_get_current_mode (self);
+  g_settings_set_enum (self->settings, "mode", mode);
+}
+
+static void
+proxy_settings_has_unapplied_cb (CcNetProxyPage *self)
+{
+  g_assert (CC_IS_NET_PROXY_PAGE (self));
+
+  g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_MODIFIED]);
+}
+
+static void
+proxy_settings_changed_cb (CcNetProxyPage *self)
+{
+  g_autofree char *url = NULL;
+  ProxyMode mode;
+
+  url = g_settings_get_string (self->settings, "autoconfig-url");
+  mode = proxy_get_current_mode (self);
+
+  /* Show warning if autoconfig URL is not set */
+  gtk_widget_set_visible (GTK_WIDGET (self->proxy_warning_label), !url || !*url);
+  gtk_widget_set_sensitive (GTK_WIDGET (self->main_stack), mode != MODE_DISABLED);
+  gtk_widget_set_sensitive (GTK_WIDGET (self->proxy_type_row), mode != MODE_DISABLED);
+
+  if (mode == MODE_AUTOMATIC)
+    adw_combo_row_set_selected (self->proxy_type_row, ROW_AUTOMATIC);
+  else if (mode == MODE_MANUAL)
+    adw_combo_row_set_selected (self->proxy_type_row, ROW_MANUAL);
+
+  proxy_update_state_text (self);
+}
+
+static void
+cc_net_proxy_page_get_property (GObject    *object,
+                                guint       prop_id,
+                                GValue     *value,
+                                GParamSpec *pspec)
+{
+  CcNetProxyPage *self = (CcNetProxyPage *)object;
+
+  switch (prop_id)
+    {
+    case PROP_MODIFIED:
+      g_value_set_boolean (value, cc_net_proxy_page_has_modified (self));
+      break;
+
+    case PROP_STATE_TEXT:
+      g_value_set_string (value, self->state_text);
+      break;
+
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+    }
+}
+
+static void
+cc_net_proxy_page_finalize (GObject *object)
+{
+  CcNetProxyPage *self = (CcNetProxyPage *)object;
+
+  g_clear_object (&self->settings);
+
+  G_OBJECT_CLASS (cc_net_proxy_page_parent_class)->finalize (object);
+}
+
+static void
+cc_net_proxy_page_class_init (CcNetProxyPageClass *klass)
+{
+  GObjectClass *object_class = G_OBJECT_CLASS (klass);
+  GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
+
+  object_class->get_property = cc_net_proxy_page_get_property;
+  object_class->finalize = cc_net_proxy_page_finalize;
+
+  properties[PROP_STATE_TEXT] =
+    g_param_spec_string ("state-text",
+                         "Proxy state text",
+                         "Human readable Proxy state text",
+                         NULL,
+                         G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
+
+  properties[PROP_MODIFIED] =
+    g_param_spec_boolean ("modified",
+                          "Proxy settings modified",
+                          "Proxy settings modified",
+                          FALSE,
+                          G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
+
+  g_object_class_install_properties (object_class, N_PROPS, properties);
+
+  gtk_widget_class_set_template_from_resource (widget_class,
+                                               "/org/gnome/control-center/"
+                                               "network/cc-net-proxy-page.ui");
+
+  gtk_widget_class_bind_template_child (widget_class, CcNetProxyPage, proxy_type_row);
+
+  gtk_widget_class_bind_template_child (widget_class, CcNetProxyPage, main_stack);
+  gtk_widget_class_bind_template_child (widget_class, CcNetProxyPage, automatic_view);
+  gtk_widget_class_bind_template_child (widget_class, CcNetProxyPage, manual_view);
+
+  gtk_widget_class_bind_template_child (widget_class, CcNetProxyPage, proxy_url_entry);
+  gtk_widget_class_bind_template_child (widget_class, CcNetProxyPage, proxy_warning_label);
+
+  gtk_widget_class_bind_template_child (widget_class, CcNetProxyPage, http_host_entry);
+  gtk_widget_class_bind_template_child (widget_class, CcNetProxyPage, http_port_adjustment);
+  gtk_widget_class_bind_template_child (widget_class, CcNetProxyPage, https_host_entry);
+  gtk_widget_class_bind_template_child (widget_class, CcNetProxyPage, https_port_adjustment);
+  gtk_widget_class_bind_template_child (widget_class, CcNetProxyPage, ftp_host_entry);
+  gtk_widget_class_bind_template_child (widget_class, CcNetProxyPage, ftp_port_adjustment);
+  gtk_widget_class_bind_template_child (widget_class, CcNetProxyPage, socks_host_entry);
+  gtk_widget_class_bind_template_child (widget_class, CcNetProxyPage, socks_port_adjustment);
+  gtk_widget_class_bind_template_child (widget_class, CcNetProxyPage, proxy_ignore_entry);
+
+  gtk_widget_class_bind_template_callback (widget_class, proxy_configuration_changed_cb);
+}
+
+static void
+proxy_bind_settings (CcNetProxyPage *self,
+                     const char     *type,
+                     gpointer        url_entry,
+                     gpointer        port_adjustment)
+{
+  g_autoptr(GSettings) settings = NULL;
+
+  g_assert (type && *type);
+
+  settings = g_settings_get_child (self->settings, type);
+  g_settings_bind (settings, "host",
+                   url_entry, "text",
+                   G_SETTINGS_BIND_DEFAULT);
+  g_settings_bind (settings, "port",
+                   port_adjustment, "value",
+                   G_SETTINGS_BIND_DEFAULT);
+}
+
+static void
+cc_net_proxy_page_init (CcNetProxyPage *self)
+{
+  gtk_widget_init_template (GTK_WIDGET (self));
+
+  self->is_loading = TRUE;
+  self->settings = g_settings_new ("org.gnome.system.proxy");
+
+  /* We should save the changes only when asked to */
+  g_settings_delay (self->settings);
+  g_signal_connect_object (self->settings, "notify::has-unapplied",
+                           G_CALLBACK (proxy_settings_has_unapplied_cb),
+                           self,
+                           G_CONNECT_SWAPPED | G_CONNECT_AFTER);
+
+  g_signal_connect_object (self->settings,
+                           "changed",
+                           G_CALLBACK (proxy_settings_changed_cb),
+                           self,
+                           G_CONNECT_SWAPPED | G_CONNECT_AFTER);
+  proxy_settings_changed_cb (self);
+
+  g_settings_bind (self->settings, "autoconfig-url",
+                   self->proxy_url_entry, "text",
+                   G_SETTINGS_BIND_DEFAULT);
+
+  proxy_bind_settings (self, "http", self->http_host_entry, self->http_port_adjustment);
+  proxy_bind_settings (self, "https", self->https_host_entry, self->https_port_adjustment);
+  proxy_bind_settings (self, "ftp", self->ftp_host_entry, self->ftp_port_adjustment);
+  proxy_bind_settings (self, "socks", self->socks_host_entry, self->socks_port_adjustment);
+
+  g_settings_bind_with_mapping (self->settings, "ignore-hosts",
+                                self->proxy_ignore_entry, "text",
+                                G_SETTINGS_BIND_DEFAULT,
+                                get_ignore_hosts, set_ignore_hosts,
+                                NULL, NULL);
+
+  proxy_update_state_text (self);
+
+  self->is_loading = FALSE;
+}
+
+gboolean
+cc_net_proxy_page_get_enabled (CcNetProxyPage *self)
+{
+  ProxyMode mode;
+
+  g_return_val_if_fail (CC_IS_NET_PROXY_PAGE (self), FALSE);
+
+  mode = proxy_get_current_mode (self);
+
+  return mode != MODE_DISABLED;
+}
+
+void
+cc_net_proxy_page_set_enabled (CcNetProxyPage *self,
+                               gboolean        enable)
+{
+  ProxyMode mode;
+
+  g_return_if_fail (CC_IS_NET_PROXY_PAGE (self));
+
+  /* Proxy should not have changed when enabling/disabling */
+  g_return_if_fail (!cc_net_proxy_page_has_modified (self));
+
+  mode = g_settings_get_enum (self->settings, "mode");
+
+  /*
+   * Don't change if that's already the case to avoid marking
+   * the settings as modified
+   */
+  if (enable && mode != MODE_DISABLED)
+    return;
+
+  if (!enable && mode == MODE_DISABLED)
+    return;
+
+  if (enable)
+    g_settings_set_enum (self->settings, "mode", MODE_AUTOMATIC);
+  else
+    g_settings_set_enum (self->settings, "mode", MODE_DISABLED);
+
+  /* Apply changes immediately */
+  cc_net_proxy_page_save_changes (self);
+}
+
+gboolean
+cc_net_proxy_page_has_modified (CcNetProxyPage *self)
+{
+  g_return_val_if_fail (CC_IS_NET_PROXY_PAGE (self), FALSE);
+
+  return g_settings_get_has_unapplied (self->settings);
+}
+
+void
+cc_net_proxy_page_save_changes (CcNetProxyPage *self)
+{
+  g_return_if_fail (CC_IS_NET_PROXY_PAGE (self));
+
+  g_settings_apply (self->settings);
+}
+
+void
+cc_net_proxy_page_cancel_changes (CcNetProxyPage *self)
+{
+  g_return_if_fail (CC_IS_NET_PROXY_PAGE (self));
+
+  g_settings_revert (self->settings);
+
+  /* Update widgets from the stored settings, not from the UI values */
+  self->is_loading = TRUE;
+  proxy_settings_changed_cb (self);
+  self->is_loading = FALSE;
+}
diff -pruN 1:43.2-2/panels/network/cc-net-proxy-page.h 1:44~alpha-0ubuntu1/panels/network/cc-net-proxy-page.h
--- 1:43.2-2/panels/network/cc-net-proxy-page.h	1970-01-01 00:00:00.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/network/cc-net-proxy-page.h	2023-01-09 20:06:57.000000000 +0000
@@ -0,0 +1,43 @@
+/* -*- mode: c; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
+ *
+ * Copyright (C) 2011-2012 Richard Hughes <richard@hughsie.com>
+ * Copyright 2022 Mohammed Sadiq <sadiq@sadiqpk.org>
+ * Copyright 2022 Purism SPC
+ *
+ * Licensed under the GNU General Public License Version 2
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+
+#pragma once
+
+#include <adwaita.h>
+
+G_BEGIN_DECLS
+
+#define CC_TYPE_NET_PROXY_PAGE (cc_net_proxy_page_get_type ())
+
+G_DECLARE_FINAL_TYPE (CcNetProxyPage, cc_net_proxy_page, CC, NET_PROXY_PAGE, AdwPreferencesPage)
+
+gboolean  cc_net_proxy_page_get_enabled     (CcNetProxyPage *self);
+void      cc_net_proxy_page_set_enabled     (CcNetProxyPage *self,
+                                             gboolean        enable);
+gboolean  cc_net_proxy_page_has_modified    (CcNetProxyPage *self);
+void      cc_net_proxy_page_save_changes    (CcNetProxyPage *self);
+void      cc_net_proxy_page_cancel_changes  (CcNetProxyPage *self);
+
+G_END_DECLS
diff -pruN 1:43.2-2/panels/network/cc-net-proxy-page.ui 1:44~alpha-0ubuntu1/panels/network/cc-net-proxy-page.ui
--- 1:43.2-2/panels/network/cc-net-proxy-page.ui	1970-01-01 00:00:00.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/network/cc-net-proxy-page.ui	2023-01-09 20:06:57.000000000 +0000
@@ -0,0 +1,295 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+  <template class="CcNetProxyPage" parent="AdwPreferencesPage">
+
+    <!-- Proxy Automatic/Manual -->
+    <child>
+      <object class="AdwPreferencesGroup">
+        <property name="margin-top">18</property>
+        <child>
+          <object class="GtkListBox">
+            <property name="selection-mode">none</property>
+            <style>
+              <class name="boxed-list"/>
+            </style>
+            <child>
+              <object class="AdwComboRow" id="proxy_type_row">
+                <property name="title" translatable="yes">Configuration</property>
+                <signal name="notify::selected-item" handler="proxy_configuration_changed_cb" swapped="yes"/>
+
+                <property name="model">
+                  <object class="GtkStringList">
+                    <!-- Update cc-net-proxy-page.c if the order is changed -->
+                    <items>
+                      <item translatable="yes">Automatic</item>
+                      <item translatable="yes">Manual</item>
+                    </items>
+                  </object>
+                </property>
+              </object>
+            </child>
+          </object>
+        </child>
+      </object>
+    </child>
+
+    <child>
+      <object class="AdwPreferencesGroup">
+        <child>
+          <object class="GtkStack" id="main_stack">
+
+            <child>
+              <object class="AdwPreferencesGroup" id="automatic_view">
+                <child>
+                  <object class="GtkListBox">
+                    <property name="selection-mode">none</property>
+                    <style>
+                      <class name="boxed-list"/>
+                    </style>
+
+                    <!-- Configuration URL -->
+                    <child>
+                      <object class="AdwEntryRow" id="proxy_url_entry">
+                        <property name="title" translatable="yes">Configuration URL</property>
+                      </object>
+                    </child>
+
+                  </object>
+                </child>
+                <child>
+                  <object class="GtkLabel" id="proxy_warning_label">
+                    <property name="margin-top">12</property>
+                    <property name="wrap">1</property>
+                    <property name="label" translatable="yes">Web Proxy Autodiscovery is used when a Configuration URL is not provided. This is not recommended for untrusted public networks.</property>
+                    <style>
+                      <class name="dim-label"/>
+                    </style>
+                  </object>
+                </child>
+              </object>
+            </child>
+
+            <child>
+              <object class="GtkBox" id="manual_view">
+                <property name="orientation">vertical</property>
+                <property name="spacing">24</property>
+
+                <!-- HTTP Proxy -->
+                <child>
+                  <object class="AdwPreferencesGroup">
+                    <property name="title" translatable="yes">HTTP Proxy</property>
+                    <child>
+                      <object class="GtkListBox">
+                        <property name="selection-mode">none</property>
+                        <style>
+                          <class name="boxed-list"/>
+                        </style>
+
+                        <!-- HTTP URL -->
+                        <child>
+                          <object class="AdwEntryRow" id="http_host_entry">
+                            <property name="title" translatable="yes">URL</property>
+                          </object>
+                        </child>
+
+                        <!-- HTTP Port -->
+                        <child>
+                          <object class="AdwActionRow">
+                            <property name="title" translatable="yes">Port</property>
+                            <child type="suffix">
+                              <object class="GtkSpinButton" id="http_port_spin_button">
+                                <property name="valign">center</property>
+                                <property name="xalign">1</property>
+                                <property name="adjustment">
+                                  <object class="GtkAdjustment" id="http_port_adjustment">
+                                    <property name="upper">65535</property>
+                                    <property name="step-increment">1</property>
+                                  </object>
+                                </property>
+                                <accessibility>
+                                  <property name="label" translatable="yes">HTTP proxy port</property>
+                                </accessibility>
+                              </object>
+                            </child>
+                          </object>
+                        </child>
+
+                      </object>
+                    </child>
+                  </object>
+                </child>
+
+                <!-- HTTPS Proxy -->
+                <child>
+                  <object class="AdwPreferencesGroup">
+                    <property name="title" translatable="yes">HTTPS Proxy</property>
+                    <child>
+                      <object class="GtkListBox">
+                        <property name="selection-mode">none</property>
+                        <style>
+                          <class name="boxed-list"/>
+                        </style>
+
+                        <!-- HTTPS URL -->
+                        <child>
+                          <object class="AdwEntryRow" id="https_host_entry">
+                            <property name="title" translatable="yes">URL</property>
+                          </object>
+                        </child>
+
+                        <!-- HTTPS Port -->
+                        <child>
+                          <object class="AdwActionRow">
+                            <property name="title" translatable="yes">Port</property>
+                            <child type="suffix">
+                              <object class="GtkSpinButton" id="https_port_spin_button">
+                                <property name="valign">center</property>
+                                <property name="xalign">1</property>
+                                <property name="adjustment">
+                                  <object class="GtkAdjustment" id="https_port_adjustment">
+                                    <property name="upper">65535</property>
+                                    <property name="step-increment">1</property>
+                                  </object>
+                                </property>
+                                <accessibility>
+                                  <property name="label" translatable="yes">HTTPS proxy port</property>
+                                </accessibility>
+                              </object>
+                            </child>
+                          </object>
+                        </child>
+
+                      </object>
+                    </child>
+                  </object>
+                </child>
+
+                <!-- FTP Proxy -->
+                <child>
+                  <object class="AdwPreferencesGroup">
+                    <property name="title" translatable="yes">FTP Proxy</property>
+                    <child>
+                      <object class="GtkListBox">
+                        <property name="selection-mode">none</property>
+                        <style>
+                          <class name="boxed-list"/>
+                        </style>
+
+                        <!-- FTP URL -->
+                        <child>
+                          <object class="AdwEntryRow" id="ftp_host_entry">
+                            <property name="title" translatable="yes">URL</property>
+                          </object>
+                        </child>
+
+                        <!-- FTP Port -->
+                        <child>
+                          <object class="AdwActionRow">
+                            <property name="title" translatable="yes">Port</property>
+                            <child type="suffix">
+                              <object class="GtkSpinButton" id="ftp_port_spin_button">
+                                <property name="valign">center</property>
+                                <property name="xalign">1</property>
+                                <property name="adjustment">
+                                  <object class="GtkAdjustment" id="ftp_port_adjustment">
+                                    <property name="upper">65535</property>
+                                    <property name="step-increment">1</property>
+                                  </object>
+                                </property>
+                                <accessibility>
+                                  <property name="label" translatable="yes">FTP proxy port</property>
+                                </accessibility>
+                              </object>
+                            </child>
+                          </object>
+                        </child>
+
+                      </object>
+                    </child>
+                  </object>
+                </child>
+
+                <!-- SOCKS Host -->
+                <child>
+                  <object class="AdwPreferencesGroup">
+                    <property name="title" translatable="yes">SOCKS Host</property>
+                    <child>
+                      <object class="GtkListBox">
+                        <property name="selection-mode">none</property>
+                        <style>
+                          <class name="boxed-list"/>
+                        </style>
+
+                        <!-- SOCKS URL -->
+                        <child>
+                          <object class="AdwEntryRow" id="socks_host_entry">
+                            <property name="title" translatable="yes">URL</property>
+                          </object>
+                        </child>
+
+                        <!-- SOCKS Port -->
+                        <child>
+                          <object class="AdwActionRow">
+                            <property name="title" translatable="yes">Port</property>
+                            <child type="suffix">
+                              <object class="GtkSpinButton" id="socks_port_spin_button">
+                                <property name="valign">center</property>
+                                <property name="xalign">1</property>
+                                <property name="adjustment">
+                                  <object class="GtkAdjustment" id="socks_port_adjustment">
+                                    <property name="upper">65535</property>
+                                    <property name="step-increment">1</property>
+                                  </object>
+                                </property>
+                                <accessibility>
+                                  <property name="label" translatable="yes">SOCKS host port</property>
+                                </accessibility>
+                              </object>
+                            </child>
+                          </object>
+                        </child>
+
+                      </object>
+                    </child>
+                  </object>
+                </child>
+
+                <child>
+                  <object class="AdwPreferencesGroup">
+                    <child>
+                      <object class="AdwEntryRow" id="proxy_ignore_entry">
+                        <property name="title" translatable="yes">Ignored Hosts</property>
+                      </object>
+                    </child>
+                  </object>
+                </child>
+
+              </object> <!-- ./GtkBox manual_box -->
+            </child>
+
+          </object> <!-- ./GtkStack main_stack -->
+        </child>
+
+      </object> <!-- ./AdwPreferencesGroup -->
+    </child>
+
+  </template>
+
+  <object class="GtkSizeGroup">
+    <property name="mode">horizontal</property>
+    <widgets>
+      <widget name="http_host_entry"/>
+      <widget name="http_port_spin_button"/>
+
+      <widget name="https_host_entry"/>
+      <widget name="https_port_spin_button"/>
+
+      <widget name="ftp_host_entry"/>
+      <widget name="ftp_port_spin_button"/>
+
+      <widget name="socks_host_entry"/>
+      <widget name="socks_port_spin_button"/>
+    </widgets>
+  </object>
+
+</interface>
diff -pruN 1:43.2-2/panels/network/cc-network-panel.c 1:44~alpha-0ubuntu1/panels/network/cc-network-panel.c
--- 1:43.2-2/panels/network/cc-network-panel.c	2022-12-23 11:11:35.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/network/cc-network-panel.c	2023-01-09 20:06:57.000000000 +0000
@@ -30,11 +30,12 @@
 
 #include <NetworkManager.h>
 
+#include "cc-list-row.h"
+#include "cc-net-proxy-page.h"
 #include "net-device-bluetooth.h"
 #include "net-device-ethernet.h"
 #include "net-device-mobile.h"
 #include "net-device-wifi.h"
-#include "net-proxy.h"
 #include "net-vpn.h"
 
 #include "panel-common.h"
@@ -65,12 +66,19 @@ struct _CcNetworkPanel
         gboolean          updating_device;
 
         /* widgets */
+        GtkWidget        *back_button;
         GtkWidget        *box_bluetooth;
-        GtkWidget        *box_proxy;
         GtkWidget        *box_vpn;
         GtkWidget        *box_wired;
+        GtkWidget        *cancel_button;
         GtkWidget        *container_bluetooth;
         GtkWidget        *empty_listbox;
+        GtkWidget        *enable_switch;
+        GtkWidget        *main_leaflet;
+        GtkWidget        *page_title;
+        GtkWidget        *proxy_page;
+        GtkWidget        *proxy_row;
+        GtkWidget        *save_button;
         GtkWidget        *vpn_stack;
 
         /* wireless dialog stuff */
@@ -650,35 +658,110 @@ panel_check_network_manager_version (CcN
         /* parse running version */
         version = nm_client_get_version (self->client);
         if (version == NULL) {
-                GtkWidget *box;
-                GtkWidget *label;
-                g_autofree gchar *markup = NULL;
-
-                box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 20);
-                gtk_box_set_homogeneous (GTK_BOX (box), TRUE);
-                gtk_widget_set_vexpand (box, TRUE);
-                adw_bin_set_child (ADW_BIN (self), box);
-
-                label = gtk_label_new (_("Oops, something has gone wrong. Please contact your software vendor."));
-                gtk_widget_set_vexpand (label, TRUE);
-                gtk_label_set_wrap (GTK_LABEL (label), TRUE);
-                gtk_widget_set_valign (label, GTK_ALIGN_END);
-                gtk_box_append (GTK_BOX (box), label);
-
-                markup = g_strdup_printf ("<small><tt>%s</tt></small>",
-                                          _("NetworkManager needs to be running."));
-                label = gtk_label_new (NULL);
-                gtk_widget_set_vexpand (label, TRUE);
-                gtk_label_set_markup (GTK_LABEL (label), markup);
-                gtk_label_set_wrap (GTK_LABEL (label), TRUE);
-                gtk_widget_set_valign (label, GTK_ALIGN_START);
-                gtk_box_append (GTK_BOX (box), label);
+                GtkWidget *status_page;
+
+                status_page = adw_status_page_new ();
+                cc_panel_set_content (CC_PANEL (self), status_page);
+
+                adw_status_page_set_icon_name (ADW_STATUS_PAGE (status_page), "network-error-symbolic");
+                adw_status_page_set_title (ADW_STATUS_PAGE (status_page), _("Can’t Connect to Network"));
+                adw_status_page_set_description (ADW_STATUS_PAGE (status_page),
+                                                 _("NetworkManager needs to be running to view or make "
+                                                   "connections. Contact a system administrator or the "
+                                                   "software vendor."));
         } else {
                 manager_running (self);
         }
 }
 
 static void
+network_panel_update_back_button_cb (CcNetworkPanel *self)
+{
+        GtkWidget *child;
+        gboolean folded, is_proxy_page;
+
+        g_assert (CC_IS_NETWORK_PANEL (self));
+
+        folded = cc_panel_get_folded (CC_PANEL (self));
+
+        child = adw_leaflet_get_visible_child (ADW_LEAFLET (self->main_leaflet));
+        is_proxy_page = child == self->proxy_page;
+
+        gtk_widget_set_visible (self->back_button, folded || is_proxy_page);
+        gtk_widget_set_visible (self->enable_switch, is_proxy_page);
+}
+
+static void
+network_panel_back_clicked_cb (CcNetworkPanel *self)
+{
+        GtkWidget *child;
+        gboolean is_sub_page;
+
+        g_assert (CC_IS_NETWORK_PANEL (self));
+
+        child = adw_leaflet_get_visible_child (ADW_LEAFLET (self->main_leaflet));
+        is_sub_page = child == self->proxy_page;
+
+        if (is_sub_page) {
+                adw_leaflet_navigate (ADW_LEAFLET (self->main_leaflet), ADW_NAVIGATION_DIRECTION_BACK);
+        } else {
+                gtk_widget_activate_action (GTK_WIDGET (self),
+                                            "window.navigate", "i",
+                                            ADW_NAVIGATION_DIRECTION_BACK);
+        }
+}
+
+static void
+network_panel_cancel_clicked_cb (CcNetworkPanel *self)
+{
+        g_assert (CC_IS_NETWORK_PANEL (self));
+
+        cc_net_proxy_page_cancel_changes (CC_NET_PROXY_PAGE (self->proxy_page));
+}
+
+static void
+network_panel_save_clicked_cb (CcNetworkPanel *self)
+{
+        g_assert (CC_IS_NETWORK_PANEL (self));
+
+        cc_net_proxy_page_save_changes (CC_NET_PROXY_PAGE (self->proxy_page));
+}
+
+static void
+network_panel_enable_changed_cb (CcNetworkPanel *self)
+{
+        gboolean enabled;
+
+        g_assert (CC_IS_NETWORK_PANEL (self));
+
+        enabled = gtk_switch_get_active (GTK_SWITCH (self->enable_switch));
+        cc_net_proxy_page_set_enabled (CC_NET_PROXY_PAGE (self->proxy_page), enabled);
+}
+
+static void
+visible_child_changed_cb (CcNetworkPanel *self)
+{
+        GtkWidget *page;
+        const char *title = NULL;
+
+        g_assert (CC_IS_NETWORK_PANEL (self));
+
+        page = adw_leaflet_get_visible_child (ADW_LEAFLET (self->main_leaflet));
+
+        if (page == self->proxy_page) {
+                gboolean enabled;
+
+                title = _("Proxy");
+                enabled = cc_net_proxy_page_get_enabled (CC_NET_PROXY_PAGE (self->proxy_page));
+                gtk_switch_set_active (GTK_SWITCH (self->enable_switch), enabled);
+        } else {
+                title = _("Network");
+        }
+
+        adw_window_title_set_title (ADW_WINDOW_TITLE (self->page_title), title);
+}
+
+static void
 create_connection_cb (GtkWidget      *button,
                       CcNetworkPanel *self)
 {
@@ -691,6 +774,40 @@ create_connection_cb (GtkWidget      *bu
 }
 
 static void
+settings_row_activated_cb (CcNetworkPanel *self,
+                           GtkListBoxRow  *row,
+                           GtkListBox     *box)
+{
+        g_assert (CC_IS_NETWORK_PANEL (self));
+        g_assert (GTK_IS_LIST_BOX_ROW (row));
+        g_assert (GTK_IS_LIST_BOX (box));
+
+        adw_leaflet_set_visible_child (ADW_LEAFLET (self->main_leaflet), self->proxy_page);
+}
+
+static void
+network_proxy_modified_cb (CcNetworkPanel *self)
+{
+        GtkWidget *child;
+        gboolean modified, show_back = TRUE;
+
+        g_assert (CC_IS_NETWORK_PANEL (self));
+
+        modified = cc_net_proxy_page_has_modified (CC_NET_PROXY_PAGE (self->proxy_page));
+        child = adw_leaflet_get_visible_child (ADW_LEAFLET (self->main_leaflet));
+
+        /* If modified, we show "Cancel" and "Save" button instead */
+        if (modified || child != self->proxy_page)
+                show_back = FALSE;
+
+        gtk_widget_set_visible (self->back_button, show_back);
+        gtk_widget_set_visible (self->enable_switch, show_back);
+
+        gtk_widget_set_visible (self->cancel_button, !show_back);
+        gtk_widget_set_visible (self->save_button, !show_back);
+}
+
+static void
 cc_network_panel_map (GtkWidget *widget)
 {
         GTK_WIDGET_CLASS (cc_network_panel_parent_class)->map (widget);
@@ -698,6 +815,7 @@ cc_network_panel_map (GtkWidget *widget)
         /* is the user compiling against a new version, but not running
          * the daemon? */
         panel_check_network_manager_version (CC_NETWORK_PANEL (widget));
+        visible_child_changed_cb (CC_NETWORK_PANEL (widget));
 }
 
 
@@ -721,15 +839,33 @@ cc_network_panel_class_init (CcNetworkPa
 
         gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/control-center/network/cc-network-panel.ui");
 
+        gtk_widget_class_bind_template_child (widget_class, CcNetworkPanel, back_button);
         gtk_widget_class_bind_template_child (widget_class, CcNetworkPanel, box_bluetooth);
-        gtk_widget_class_bind_template_child (widget_class, CcNetworkPanel, box_proxy);
         gtk_widget_class_bind_template_child (widget_class, CcNetworkPanel, box_vpn);
         gtk_widget_class_bind_template_child (widget_class, CcNetworkPanel, box_wired);
+        gtk_widget_class_bind_template_child (widget_class, CcNetworkPanel, cancel_button);
         gtk_widget_class_bind_template_child (widget_class, CcNetworkPanel, container_bluetooth);
         gtk_widget_class_bind_template_child (widget_class, CcNetworkPanel, empty_listbox);
+        gtk_widget_class_bind_template_child (widget_class, CcNetworkPanel, enable_switch);
+        gtk_widget_class_bind_template_child (widget_class, CcNetworkPanel, main_leaflet);
+        gtk_widget_class_bind_template_child (widget_class, CcNetworkPanel, page_title);
+        gtk_widget_class_bind_template_child (widget_class, CcNetworkPanel, proxy_page);
+        gtk_widget_class_bind_template_child (widget_class, CcNetworkPanel, proxy_row);
+        gtk_widget_class_bind_template_child (widget_class, CcNetworkPanel, save_button);
         gtk_widget_class_bind_template_child (widget_class, CcNetworkPanel, vpn_stack);
 
+        gtk_widget_class_bind_template_callback (widget_class, network_panel_update_back_button_cb);
+        gtk_widget_class_bind_template_callback (widget_class, network_panel_back_clicked_cb);
+        gtk_widget_class_bind_template_callback (widget_class, network_panel_cancel_clicked_cb);
+        gtk_widget_class_bind_template_callback (widget_class, network_panel_save_clicked_cb);
+        gtk_widget_class_bind_template_callback (widget_class, network_panel_enable_changed_cb);
+        gtk_widget_class_bind_template_callback (widget_class, visible_child_changed_cb);
         gtk_widget_class_bind_template_callback (widget_class, create_connection_cb);
+        gtk_widget_class_bind_template_callback (widget_class, settings_row_activated_cb);
+        gtk_widget_class_bind_template_callback (widget_class, network_proxy_modified_cb);
+
+        g_type_ensure (CC_TYPE_LIST_ROW);
+        g_type_ensure (CC_TYPE_NET_PROXY_PAGE);
 }
 
 static void
@@ -738,7 +874,6 @@ cc_network_panel_init (CcNetworkPanel *s
         g_autoptr(GDBusConnection) system_bus = NULL;
         g_autoptr(GError) error = NULL;
         const GPtrArray *connections;
-        NetProxy *proxy;
         guint i;
 
         g_resources_register (cc_network_get_resource ());
@@ -751,10 +886,6 @@ cc_network_panel_init (CcNetworkPanel *s
         self->vpns = g_ptr_array_new ();
         self->nm_device_to_device = g_hash_table_new (g_direct_hash, g_direct_equal);
 
-        /* add the virtual proxy device */
-        proxy = net_proxy_new ();
-        gtk_box_append (GTK_BOX (self->box_proxy), GTK_WIDGET (proxy));
-
         /* Create and store a NMClient instance if it doesn't exist yet */
         if (!cc_object_storage_has_object (CC_OBJECT_NMCLIENT)) {
                 g_autoptr(NMClient) client = nm_client_new (NULL, NULL);
diff -pruN 1:43.2-2/panels/network/cc-network-panel.ui 1:44~alpha-0ubuntu1/panels/network/cc-network-panel.ui
--- 1:43.2-2/panels/network/cc-network-panel.ui	2022-12-23 11:11:35.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/network/cc-network-panel.ui	2023-01-09 20:06:57.000000000 +0000
@@ -1,8 +1,62 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <interface>
   <template class="CcNetworkPanel" parent="CcPanel">
+    <signal name="notify::folded" handler="network_panel_update_back_button_cb" swapped="yes"/>
+
+    <!-- Header Bar -->
+    <child type="titlebar">
+      <object class="AdwHeaderBar" id="titlebar">
+        <property name="show-end-title-buttons">True</property>
+        <property name="show-start-title-buttons">False</property>
+        <property name="title-widget">
+          <object class="AdwWindowTitle" id="page_title"/>
+        </property>
+
+        <child type="start">
+          <object class="GtkButton" id="back_button">
+            <property name="visible">False</property>
+            <property name="icon-name">go-previous-symbolic</property>
+            <signal name="clicked" handler="network_panel_back_clicked_cb" swapped="yes"/>
+          </object>
+        </child>
+
+        <child type="start">
+          <object class="GtkButton" id="cancel_button">
+            <property name="visible">False</property>
+            <property name="label" translatable="yes">Cancel</property>
+            <signal name="clicked" handler="network_panel_cancel_clicked_cb" swapped="yes"/>
+          </object>
+        </child>
+
+        <child type="end">
+          <object class="GtkButton" id="save_button">
+            <property name="visible">False</property>
+            <property name="label" translatable="yes">Save</property>
+            <style>
+              <class name="suggested-action"/>
+            </style>
+            <signal name="clicked" handler="network_panel_save_clicked_cb" swapped="yes"/>
+          </object>
+        </child>
+
+        <child type="end">
+          <object class="GtkSwitch" id="enable_switch">
+            <property name="visible">False</property>
+            <signal name="notify::active" handler="network_panel_enable_changed_cb" swapped="yes"/>
+          </object>
+        </child>
+
+      </object>
+    </child>
 
     <child type="content">
+      <object class="AdwLeaflet" id="main_leaflet">
+        <property name="can-unfold">False</property>
+        <property name="can-navigate-back">True</property>
+        <signal name="notify::visible-child" handler="network_panel_update_back_button_cb" swapped="yes"/>
+        <signal name="notify::visible-child" handler="visible_child_changed_cb" swapped="yes"/>
+
+        <child>
       <object class="AdwPreferencesPage">
         <!-- Each group below will contain GtkStacks from the NetDevices -->
         <child>
@@ -79,15 +133,40 @@
             </child>
           </object>
         </child>
+
         <child>
           <object class="AdwPreferencesGroup">
+            <!-- xxx: Added to avoid confusion with the preceding VPN row -->
+            <property name="title" translatable="yes">Proxy</property>
             <child>
-              <object class="GtkBox" id="box_proxy">
-                <property name="orientation">vertical</property>
+              <object class="GtkListBox">
+                <signal name="row-activated" handler="settings_row_activated_cb" swapped="yes"/>
+                <style>
+                  <class name="boxed-list" />
+                </style>
+                <child>
+                  <object class="CcListRow" id="proxy_row">
+                    <property name="title" translatable="yes">Proxy</property>
+                    <property name="show-arrow">True</property>
+                    <property name="selectable">False</property>
+                    <property name="icon-name">preferences-system-network-proxy-symbolic</property>
+                    <property name="secondary-label" bind-source="proxy_page" bind-property="state-text" bind-flags="sync-create"/>
+                  </object>
+                </child>
               </object>
             </child>
           </object>
         </child>
+
+            </object>
+        </child>
+
+        <child>
+          <object class="CcNetProxyPage" id="proxy_page">
+            <signal name="notify::modified" handler="network_proxy_modified_cb" swapped="yes"/>
+          </object>
+        </child>
+
       </object>
     </child>
   </template>
diff -pruN 1:43.2-2/panels/network/cc-wifi-panel.c 1:44~alpha-0ubuntu1/panels/network/cc-wifi-panel.c
--- 1:43.2-2/panels/network/cc-wifi-panel.c	2022-12-23 11:11:35.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/network/cc-wifi-panel.c	2023-01-09 20:06:57.000000000 +0000
@@ -26,7 +26,7 @@
 #include "cc-list-row.h"
 
 #include "shell/cc-application.h"
-#include "shell/cc-debug.h"
+#include "shell/cc-log.h"
 #include "shell/cc-object-storage.h"
 
 #include <glib/gi18n.h>
diff -pruN 1:43.2-2/panels/network/cc-wifi-panel.ui 1:44~alpha-0ubuntu1/panels/network/cc-wifi-panel.ui
--- 1:43.2-2/panels/network/cc-wifi-panel.ui	2022-12-23 11:11:35.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/network/cc-wifi-panel.ui	2023-01-09 20:06:57.000000000 +0000
@@ -91,39 +91,11 @@
                       <object class="GtkStackPage">
                         <property name="name">no-wifi-devices</property>
                         <property name="child">
-                          <object class="GtkBox">
-                            <property name="hexpand">True</property>
-                            <property name="vexpand">True</property>
-                            <property name="halign">center</property>
-                            <property name="valign">center</property>
-                            <property name="orientation">vertical</property>
-                            <child>
-                              <object class="GtkImage">
-                                <property name="icon_name">network-wireless-no-route-symbolic</property>
-                                <property name="pixel_size">256</property>
-                                <property name="margin-bottom">18</property>
-                                <style>
-                                  <class name="dim-label" />
-                                </style>
-                              </object>
-                            </child>
-                            <child>
-                              <object class="GtkLabel">
-                                <property name="wrap">True</property>
-                                <property name="label" translatable="yes">No Wi-Fi Adapter Found</property>
-                                <attributes>
-                                  <attribute name="weight" value="bold" />
-                                  <attribute name="scale" value="1.2" />
-                                </attributes>
-                              </object>
-                            </child>
-                            <child>
-                              <object class="GtkLabel">
-                                <property name="wrap">True</property>
-                                <property name="label" translatable="yes">Make sure you have a Wi-Fi adapter plugged and turned on</property>
-                              </object>
-                            </child>
-                          </object>
+                          <object class="AdwStatusPage">
+                            <property name="icon-name">network-wireless-no-route-symbolic</property>
+                            <property name="title" translatable="yes">No Wi-Fi Adapter Found</property>
+                            <property name="description" translatable="yes">Make sure you have a Wi-Fi adapter plugged and turned on</property>
+                         </object>
                         </property>
                       </object>
                     </child>
@@ -133,38 +105,10 @@
                       <object class="GtkStackPage">
                         <property name="name">airplane-mode</property>
                         <property name="child">
-                          <object class="GtkBox">
-                            <property name="hexpand">True</property>
-                            <property name="vexpand">True</property>
-                            <property name="halign">center</property>
-                            <property name="valign">center</property>
-                            <property name="orientation">vertical</property>
-                            <child>
-                              <object class="GtkImage">
-                                <property name="icon_name">airplane-mode-symbolic</property>
-                                <property name="pixel_size">256</property>
-                                <property name="margin-bottom">18</property>
-                                <style>
-                                  <class name="dim-label" />
-                                </style>
-                              </object>
-                            </child>
-                            <child>
-                              <object class="GtkLabel">
-                                <property name="wrap">True</property>
-                                <property name="label" translatable="yes">Airplane Mode On</property>
-                                <attributes>
-                                  <attribute name="weight" value="bold" />
-                                  <attribute name="scale" value="1.2" />
-                                </attributes>
-                              </object>
-                            </child>
-                            <child>
-                              <object class="GtkLabel">
-                                <property name="wrap">True</property>
-                                <property name="label" translatable="yes">Turn off to use Wi-Fi</property>
-                              </object>
-                            </child>
+                          <object class="AdwStatusPage">
+                            <property name="icon-name">airplane-mode-symbolic</property>
+                            <property name="title" translatable="yes">Airplane Mode On</property>
+                            <property name="description" translatable="yes">Turn off to use Wi-Fi</property>
                           </object>
                         </property>
                       </object>
diff -pruN 1:43.2-2/panels/network/connection-editor/ce-ip-address-entry.c 1:44~alpha-0ubuntu1/panels/network/connection-editor/ce-ip-address-entry.c
--- 1:43.2-2/panels/network/connection-editor/ce-ip-address-entry.c	2022-12-23 11:11:35.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/network/connection-editor/ce-ip-address-entry.c	2023-01-09 20:06:57.000000000 +0000
@@ -40,13 +40,11 @@ static void
 ce_ip_address_entry_changed (GtkEditable *editable)
 {
   CEIPAddressEntry *self = CE_IP_ADDRESS_ENTRY (editable);
-  GtkStyleContext *context;
 
-  context = gtk_widget_get_style_context (GTK_WIDGET (self));
   if (ce_ip_address_entry_is_valid (self))
-    gtk_style_context_remove_class (context, "error");
+    gtk_widget_remove_css_class (GTK_WIDGET (self), "error");
   else
-    gtk_style_context_add_class (context, "error");
+    gtk_widget_add_css_class (GTK_WIDGET (self), "error");
 }
 
 static void
diff -pruN 1:43.2-2/panels/network/connection-editor/ce-netmask-entry.c 1:44~alpha-0ubuntu1/panels/network/connection-editor/ce-netmask-entry.c
--- 1:43.2-2/panels/network/connection-editor/ce-netmask-entry.c	2022-12-23 11:11:35.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/network/connection-editor/ce-netmask-entry.c	2023-01-09 20:06:57.000000000 +0000
@@ -69,13 +69,11 @@ static void
 ce_netmask_entry_changed (GtkEditable *editable)
 {
   CENetmaskEntry *self = CE_NETMASK_ENTRY (editable);
-  GtkStyleContext *context;
 
-  context = gtk_widget_get_style_context (GTK_WIDGET (self));
   if (ce_netmask_entry_is_valid (self))
-    gtk_style_context_remove_class (context, "error");
+    gtk_widget_remove_css_class (GTK_WIDGET (self), "error");
   else
-    gtk_style_context_add_class (context, "error");
+    gtk_widget_add_css_class (GTK_WIDGET (self), "error");
 }
 
 static void
diff -pruN 1:43.2-2/panels/network/connection-editor/ce-page-8021x-security.c 1:44~alpha-0ubuntu1/panels/network/connection-editor/ce-page-8021x-security.c
--- 1:43.2-2/panels/network/connection-editor/ce-page-8021x-security.c	2022-12-23 11:11:35.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/network/connection-editor/ce-page-8021x-security.c	2023-01-09 20:06:57.000000000 +0000
@@ -26,11 +26,10 @@
 #include <NetworkManager.h>
 #include <string.h>
 
-#include "ws-wpa-eap.h"
-#include "wireless-security.h"
 #include "ce-page.h"
 #include "ce-page-ethernet.h"
 #include "ce-page-8021x-security.h"
+#include "nma-ws.h"
 
 struct _CEPage8021xSecurity {
 	GtkGrid parent;
@@ -40,7 +39,7 @@ struct _CEPage8021xSecurity {
         GtkLabel    *security_label;
 
         NMConnection *connection;
-        WirelessSecurityWPAEAP *security;
+        NMAWs8021x *security;
         GtkSizeGroup *group;
         gboolean initial_have_8021x;
 };
@@ -71,13 +70,13 @@ finish_setup (CEPage8021xSecurity *self,
 
 	self->group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
 
-	self->security = ws_wpa_eap_new (self->connection);
+	self->security = nma_ws_802_1x_new (self->connection, FALSE, FALSE);
 	if (!self->security) {
 		g_warning ("Could not load 802.1x user interface.");
 		return;
 	}
 
-	g_signal_connect_object (WIRELESS_SECURITY (self->security), "changed", G_CALLBACK (security_item_changed_cb), self, G_CONNECT_SWAPPED);
+	g_signal_connect_object (NMA_WS (self->security), "ws-changed", G_CALLBACK (security_item_changed_cb), self, G_CONNECT_SWAPPED);
 	if (gtk_widget_get_parent (GTK_WIDGET (self->security)))
 		gtk_box_remove (self->box, GTK_WIDGET (self->security));
 
@@ -86,7 +85,7 @@ finish_setup (CEPage8021xSecurity *self,
 	gtk_widget_set_sensitive (GTK_WIDGET (self->security), self->initial_have_8021x);
 
 	gtk_size_group_add_widget (self->group, GTK_WIDGET (self->security_label));
-	wireless_security_add_to_size_group (WIRELESS_SECURITY (self->security), self->group);
+	nma_ws_add_to_size_group (NMA_WS (self->security), self->group);
 
 	gtk_box_append (self->box, GTK_WIDGET (self->security));
 
@@ -119,7 +118,7 @@ ce_page_8021x_security_validate (CEPage
 		NMSetting *s_8021x;
 
 		/* FIXME: get failed property and error out of wireless security objects */
-		valid = wireless_security_validate (WIRELESS_SECURITY (self->security), error);
+		valid = nma_ws_validate (NMA_WS (self->security), error);
 		if (valid) {
 			g_autoptr(NMConnection) tmp_connection = NULL;
 
@@ -127,7 +126,7 @@ ce_page_8021x_security_validate (CEPage
 			tmp_connection = nm_simple_connection_new_clone (connection);
 			nm_connection_add_setting (tmp_connection, nm_setting_wireless_new ());
 
-			ws_wpa_eap_fill_connection (self->security, tmp_connection);
+			nma_ws_fill_connection (NMA_WS (self->security), tmp_connection);
 
 			/* NOTE: It is important we create a copy of the settings, as the
 			 * secrets might be cleared otherwise.
diff -pruN 1:43.2-2/panels/network/connection-editor/ce-page-security.c 1:44~alpha-0ubuntu1/panels/network/connection-editor/ce-page-security.c
--- 1:43.2-2/panels/network/connection-editor/ce-page-security.c	2022-12-23 11:11:35.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/network/connection-editor/ce-page-security.c	2023-01-09 20:06:57.000000000 +0000
@@ -27,13 +27,7 @@
 
 #include "ce-page.h"
 #include "ce-page-security.h"
-#include "wireless-security.h"
-#include "ws-dynamic-wep.h"
-#include "ws-leap.h"
-#include "ws-sae.h"
-#include "ws-wep-key.h"
-#include "ws-wpa-eap.h"
-#include "ws-wpa-psk.h"
+#include "nma-ws.h"
 
 struct _CEPageSecurity
 {
@@ -126,12 +120,12 @@ get_default_type_for_security (NMSetting
         return NMU_SEC_INVALID;
 }
 
-static WirelessSecurity *
+static NMAWs *
 security_combo_get_active (CEPageSecurity *self)
 {
         GtkTreeIter iter;
         GtkTreeModel *model;
-        WirelessSecurity *sec = NULL;
+        NMAWs *sec;
 
         model = gtk_combo_box_get_model (self->security_combo);
         if (!gtk_combo_box_get_active_iter (self->security_combo, &iter))
@@ -157,7 +151,7 @@ wsec_size_group_clear (GtkSizeGroup *gro
 static void
 security_combo_changed (CEPageSecurity *self)
 {
-        g_autoptr(WirelessSecurity) sec = NULL;
+        NMAWs *sec;
         GtkWidget *child;
 
         wsec_size_group_clear (self->group);
@@ -171,9 +165,10 @@ security_combo_changed (CEPageSecurity *
                         gtk_box_remove (self->box, GTK_WIDGET (sec));
 
                 gtk_size_group_add_widget (self->group, GTK_WIDGET (self->security_label));
-                wireless_security_add_to_size_group (sec, self->group);
+                nma_ws_add_to_size_group (sec, self->group);
 
                 gtk_box_append (self->box, g_object_ref (GTK_WIDGET (sec)));
+                g_object_unref (sec);
         }
 
         ce_page_changed (CE_PAGE (self));
@@ -187,13 +182,15 @@ security_item_changed_cb (CEPageSecurity
 
 static void
 add_security_item (CEPageSecurity   *self,
-                   WirelessSecurity *sec,
+                   NMAWs            *sec,
                    GtkListStore     *model,
                    GtkTreeIter      *iter,
                    const char       *text,
                    gboolean          adhoc_valid)
 {
-        g_signal_connect_object (sec, "changed", G_CALLBACK (security_item_changed_cb), self, G_CONNECT_SWAPPED);
+        if (G_IS_INITIALLY_UNOWNED (sec))
+                g_object_ref_sink (sec);
+        g_signal_connect_object (sec, "ws-changed", G_CALLBACK (security_item_changed_cb), self, G_CONNECT_SWAPPED);
         gtk_list_store_append (model, iter);
         gtk_list_store_set (model, iter,
                             S_NAME_COLUMN, text,
@@ -256,7 +253,7 @@ finish_setup (CEPageSecurity *self)
         if (sws)
                 default_type = get_default_type_for_security (sws);
 
-        sec_model = gtk_list_store_new (3, G_TYPE_STRING, wireless_security_get_type (), G_TYPE_BOOLEAN);
+        sec_model = gtk_list_store_new (3, G_TYPE_STRING, NMA_TYPE_WS, G_TYPE_BOOLEAN);
 
         if (nm_utils_security_valid (NMU_SEC_NONE, dev_caps, FALSE, is_adhoc, 0, 0, 0)) {
                 gtk_list_store_insert_with_values (sec_model, &iter, -1,
@@ -281,7 +278,7 @@ finish_setup (CEPageSecurity *self)
 #endif
 
         if (nm_utils_security_valid (NMU_SEC_STATIC_WEP, dev_caps, FALSE, is_adhoc, 0, 0, 0)) {
-                WirelessSecurityWEPKey *ws_wep;
+                NMAWsWepKey *ws_wep;
                 NMWepKeyType wep_type = NM_WEP_KEY_TYPE_KEY;
 
                 if (default_type == NMU_SEC_STATIC_WEP) {
@@ -292,9 +289,9 @@ finish_setup (CEPageSecurity *self)
                                 wep_type = NM_WEP_KEY_TYPE_KEY;
                 }
 
-                ws_wep = ws_wep_key_new (self->connection, NM_WEP_KEY_TYPE_KEY);
+                ws_wep = nma_ws_wep_key_new (self->connection, NM_WEP_KEY_TYPE_KEY, FALSE, FALSE);
                 if (ws_wep) {
-                        add_security_item (self, WIRELESS_SECURITY (ws_wep), sec_model,
+                        add_security_item (self, NMA_WS (ws_wep), sec_model,
                                            &iter, _("WEP 40/128-bit Key (Hex or ASCII)"),
                                            TRUE);
                         if ((active < 0) && (default_type == NMU_SEC_STATIC_WEP) && (wep_type == NM_WEP_KEY_TYPE_KEY))
@@ -302,9 +299,9 @@ finish_setup (CEPageSecurity *self)
                         item++;
                 }
 
-                ws_wep = ws_wep_key_new (self->connection, NM_WEP_KEY_TYPE_PASSPHRASE);
+                ws_wep = nma_ws_wep_key_new (self->connection, NM_WEP_KEY_TYPE_PASSPHRASE, FALSE, FALSE);
                 if (ws_wep) {
-                        add_security_item (self, WIRELESS_SECURITY (ws_wep), sec_model,
+                        add_security_item (self, NMA_WS (ws_wep), sec_model,
                                            &iter, _("WEP 128-bit Passphrase"), TRUE);
                         if ((active < 0) && (default_type == NMU_SEC_STATIC_WEP) && (wep_type == NM_WEP_KEY_TYPE_PASSPHRASE))
                                 active = item;
@@ -313,11 +310,11 @@ finish_setup (CEPageSecurity *self)
         }
 
         if (nm_utils_security_valid (NMU_SEC_LEAP, dev_caps, FALSE, is_adhoc, 0, 0, 0)) {
-                WirelessSecurityLEAP *ws_leap;
+                NMAWsLeap *ws_leap;
 
-                ws_leap = ws_leap_new (self->connection);
+                ws_leap = nma_ws_leap_new (self->connection, FALSE);
                 if (ws_leap) {
-                        add_security_item (self, WIRELESS_SECURITY (ws_leap), sec_model,
+                        add_security_item (self, NMA_WS (ws_leap), sec_model,
                                            &iter, _("LEAP"), FALSE);
                         if ((active < 0) && (default_type == NMU_SEC_LEAP))
                                 active = item;
@@ -326,11 +323,11 @@ finish_setup (CEPageSecurity *self)
         }
 
         if (nm_utils_security_valid (NMU_SEC_DYNAMIC_WEP, dev_caps, FALSE, is_adhoc, 0, 0, 0)) {
-                WirelessSecurityDynamicWEP *ws_dynamic_wep;
+                NMAWsDynamicWep *ws_dynamic_wep;
 
-                ws_dynamic_wep = ws_dynamic_wep_new (self->connection);
+                ws_dynamic_wep = nma_ws_dynamic_wep_new (self->connection, TRUE, FALSE);
                 if (ws_dynamic_wep) {
-                        add_security_item (self, WIRELESS_SECURITY (ws_dynamic_wep), sec_model,
+                        add_security_item (self, NMA_WS (ws_dynamic_wep), sec_model,
                                            &iter, _("Dynamic WEP (802.1x)"), FALSE);
                         if ((active < 0) && (default_type == NMU_SEC_DYNAMIC_WEP))
                                 active = item;
@@ -340,11 +337,11 @@ finish_setup (CEPageSecurity *self)
 
         if (nm_utils_security_valid (NMU_SEC_WPA_PSK, dev_caps, FALSE, is_adhoc, 0, 0, 0) ||
             nm_utils_security_valid (NMU_SEC_WPA2_PSK, dev_caps, FALSE, is_adhoc, 0, 0, 0)) {
-                WirelessSecurityWPAPSK *ws_wpa_psk;
+                NMAWsWpaPsk *ws_wpa_psk;
 
-                ws_wpa_psk = ws_wpa_psk_new (self->connection);
+                ws_wpa_psk = nma_ws_wpa_psk_new (self->connection, FALSE);
                 if (ws_wpa_psk) {
-                        add_security_item (self, WIRELESS_SECURITY (ws_wpa_psk), sec_model,
+                        add_security_item (self, NMA_WS (ws_wpa_psk), sec_model,
                                            &iter, _("WPA & WPA2 Personal"), FALSE);
                         if ((active < 0) && ((default_type == NMU_SEC_WPA_PSK) || (default_type == NMU_SEC_WPA2_PSK)))
                                 active = item;
@@ -354,11 +351,11 @@ finish_setup (CEPageSecurity *self)
 
         if (nm_utils_security_valid (NMU_SEC_WPA_ENTERPRISE, dev_caps, FALSE, is_adhoc, 0, 0, 0) ||
             nm_utils_security_valid (NMU_SEC_WPA2_ENTERPRISE, dev_caps, FALSE, is_adhoc, 0, 0, 0)) {
-                WirelessSecurityWPAEAP *ws_wpa_eap;
+                NMAWsWpaEap *ws_wpa_eap;
 
-                ws_wpa_eap = ws_wpa_eap_new (self->connection);
+                ws_wpa_eap = nma_ws_wpa_eap_new (self->connection, TRUE, FALSE, NULL);
                 if (ws_wpa_eap) {
-                        add_security_item (self, WIRELESS_SECURITY (ws_wpa_eap), sec_model,
+                        add_security_item (self, NMA_WS (ws_wpa_eap), sec_model,
                                            &iter, _("WPA & WPA2 Enterprise"), FALSE);
                         if ((active < 0) && ((default_type == NMU_SEC_WPA_ENTERPRISE) || (default_type == NMU_SEC_WPA2_ENTERPRISE)))
                                 active = item;
@@ -368,11 +365,11 @@ finish_setup (CEPageSecurity *self)
 
 #if NM_CHECK_VERSION(1,20,6)
         if (nm_utils_security_valid (NMU_SEC_SAE, dev_caps, FALSE, is_adhoc, 0, 0, 0)) {
-                WirelessSecuritySAE *ws_sae;
+                NMAWsSae *ws_sae;
 
-                ws_sae = ws_sae_new (self->connection);
+                ws_sae = nma_ws_sae_new (self->connection, FALSE);
                 if (ws_sae) {
-                        add_security_item (self, WIRELESS_SECURITY (ws_sae), sec_model,
+                        add_security_item (self, NMA_WS (ws_sae), sec_model,
                                            &iter, _("WPA3 Personal"), FALSE);
                         if ((active < 0) && ((default_type == NMU_SEC_SAE)))
                                 active = item;
@@ -426,7 +423,7 @@ ce_page_security_validate (CEPage
 {
         CEPageSecurity *self = CE_PAGE_SECURITY (page);
         NMSettingWireless *sw;
-        g_autoptr(WirelessSecurity) sec = NULL;
+        NMAWs *sec;
         gboolean valid = FALSE;
         const char *mode;
 
@@ -444,21 +441,22 @@ ce_page_security_validate (CEPage
 
                 if (ssid) {
                         /* FIXME: get failed property and error out of wifi security objects */
-                        valid = wireless_security_validate (sec, error);
+                        valid = nma_ws_validate (sec, error);
                         if (valid)
-                                wireless_security_fill_connection (sec, connection);
+                                nma_ws_fill_connection (sec, connection);
                 } else {
                         g_set_error (error, NM_CONNECTION_ERROR, NM_CONNECTION_ERROR_MISSING_SETTING, "Missing SSID");
                         valid = FALSE;
                 }
 
                 if (self->adhoc) {
-                        if (!wireless_security_adhoc_compatible (sec)) {
+                        if (!nma_ws_adhoc_compatible (sec)) {
                                 if (valid)
                                         g_set_error (error, NM_CONNECTION_ERROR, NM_CONNECTION_ERROR_INVALID_SETTING, "Security not compatible with Ad-Hoc mode");
                                 valid = FALSE;
                         }
                 }
+                g_object_unref (sec);
         } else {
 
     		if (gtk_combo_box_get_active ((CE_PAGE_SECURITY (self))->security_combo) == 0) {
diff -pruN 1:43.2-2/panels/network/connection-editor/meson.build 1:44~alpha-0ubuntu1/panels/network/connection-editor/meson.build
--- 1:43.2-2/panels/network/connection-editor/meson.build	2022-12-23 11:11:35.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/network/connection-editor/meson.build	2023-01-09 20:06:57.000000000 +0000
@@ -41,8 +41,7 @@ sources += gnome.compile_resources(
 libconnection_editor = static_library(
   name,
   sources: sources,
-  include_directories: [top_inc, common_inc, network_inc, wireless_security_inc],
+  include_directories: [top_inc, common_inc, network_inc],
   dependencies: deps,
   c_args: cflags,
-  link_with: libwireless_security
 )
diff -pruN 1:43.2-2/panels/network/connection-editor/net-connection-editor.c 1:44~alpha-0ubuntu1/panels/network/connection-editor/net-connection-editor.c
--- 1:43.2-2/panels/network/connection-editor/net-connection-editor.c	2022-12-23 11:11:35.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/network/connection-editor/net-connection-editor.c	2023-01-09 20:06:57.000000000 +0000
@@ -38,7 +38,6 @@
 #include "ce-page-8021x-security.h"
 #include "ce-page-vpn.h"
 #include "vpn-helpers.h"
-#include "eap-method.h"
 
 enum {
         DONE,
@@ -76,6 +75,93 @@ struct _NetConnectionEditor
 
 G_DEFINE_TYPE (NetConnectionEditor, net_connection_editor, GTK_TYPE_DIALOG)
 
+/* Used as both GSettings keys and GObject data tags */
+#define IGNORE_CA_CERT_TAG "ignore-ca-cert"
+#define IGNORE_PHASE2_CA_CERT_TAG "ignore-phase2-ca-cert"
+
+static GSettings *
+_get_ca_ignore_settings (NMConnection *connection)
+{
+	GSettings *settings;
+	g_autofree gchar *path = NULL;
+	const char *uuid;
+
+	g_return_val_if_fail (connection, NULL);
+
+	uuid = nm_connection_get_uuid (connection);
+	g_return_val_if_fail (uuid && *uuid, NULL);
+
+	path = g_strdup_printf ("/org/gnome/nm-applet/eap/%s/", uuid);
+	settings = g_settings_new_with_path ("org.gnome.nm-applet.eap", path);
+
+	return settings;
+}
+
+/**
+ * eap_method_ca_cert_ignore_save:
+ * @connection: the connection for which to save CA cert ignore values to GSettings
+ *
+ * Reads the CA cert ignore tags from the 802.1x setting GObject data and saves
+ * then to GSettings if present, using the connection UUID as the index.
+ */
+static void
+eap_method_ca_cert_ignore_save (NMConnection *connection)
+{
+	NMSetting8021x *s_8021x;
+	g_autoptr(GSettings) settings = NULL;
+	gboolean ignore = FALSE, phase2_ignore = FALSE;
+
+	g_return_if_fail (connection);
+
+	s_8021x = nm_connection_get_setting_802_1x (connection);
+	if (s_8021x) {
+		ignore = !!g_object_get_data (G_OBJECT (s_8021x), IGNORE_CA_CERT_TAG);
+		phase2_ignore = !!g_object_get_data (G_OBJECT (s_8021x), IGNORE_PHASE2_CA_CERT_TAG);
+	}
+
+	settings = _get_ca_ignore_settings (connection);
+	if (!settings)
+		return;
+
+	g_settings_set_boolean (settings, IGNORE_CA_CERT_TAG, ignore);
+	g_settings_set_boolean (settings, IGNORE_PHASE2_CA_CERT_TAG, phase2_ignore);
+}
+
+/**
+ * eap_method_ca_cert_ignore_load:
+ * @connection: the connection for which to load CA cert ignore values to GSettings
+ *
+ * Reads the CA cert ignore tags from the 802.1x setting GObject data and saves
+ * then to GSettings if present, using the connection UUID as the index.
+ */
+static void
+eap_method_ca_cert_ignore_load (NMConnection *connection)
+{
+	g_autoptr(GSettings) settings = NULL;
+	NMSetting8021x *s_8021x;
+	gboolean ignore, phase2_ignore;
+
+	g_return_if_fail (connection);
+
+	s_8021x = nm_connection_get_setting_802_1x (connection);
+	if (!s_8021x)
+		return;
+
+	settings = _get_ca_ignore_settings (connection);
+	if (!settings)
+		return;
+
+	ignore = g_settings_get_boolean (settings, IGNORE_CA_CERT_TAG);
+	phase2_ignore = g_settings_get_boolean (settings, IGNORE_PHASE2_CA_CERT_TAG);
+
+	g_object_set_data (G_OBJECT (s_8021x),
+	                   IGNORE_CA_CERT_TAG,
+	                   GUINT_TO_POINTER (ignore));
+	g_object_set_data (G_OBJECT (s_8021x),
+	                   IGNORE_PHASE2_CA_CERT_TAG,
+	                   GUINT_TO_POINTER (phase2_ignore));
+}
+
 static void page_changed (NetConnectionEditor *self);
 
 static void
diff -pruN 1:43.2-2/panels/network/gnome-network-panel.desktop.in 1:44~alpha-0ubuntu1/panels/network/gnome-network-panel.desktop.in
--- 1:43.2-2/panels/network/gnome-network-panel.desktop.in	1970-01-01 00:00:00.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/network/gnome-network-panel.desktop.in	2023-01-09 20:06:57.000000000 +0000
@@ -0,0 +1,14 @@
+[Desktop Entry]
+Name=Network
+Comment=Control how you connect to the Internet
+Exec=gnome-control-center network
+# Translators: Do NOT translate or transliterate this text (this is an icon file name)!
+Icon=org.gnome.Settings-network-symbolic
+Terminal=false
+Type=Application
+NoDisplay=true
+StartupNotify=true
+Categories=GNOME;GTK;Settings;HardwareSettings;X-GNOME-Settings-Panel;X-GNOME-ConnectivitySettings;
+OnlyShowIn=GNOME;Unity;
+# Translators: Search terms to find the Network panel. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon!
+Keywords=Network;IP;LAN;Proxy;WAN;Broadband;Modem;Bluetooth;vpn;DNS;
diff -pruN 1:43.2-2/panels/network/gnome-network-panel.desktop.in.in 1:44~alpha-0ubuntu1/panels/network/gnome-network-panel.desktop.in.in
--- 1:43.2-2/panels/network/gnome-network-panel.desktop.in.in	2022-12-23 11:11:35.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/network/gnome-network-panel.desktop.in.in	1970-01-01 00:00:00.000000000 +0000
@@ -1,18 +0,0 @@
-[Desktop Entry]
-Name=Network
-Comment=Control how you connect to the Internet
-Exec=gnome-control-center network
-# Translators: Do NOT translate or transliterate this text (this is an icon file name)!
-Icon=org.gnome.Settings-network-symbolic
-Terminal=false
-Type=Application
-NoDisplay=true
-StartupNotify=true
-Categories=GNOME;GTK;Settings;HardwareSettings;X-GNOME-Settings-Panel;X-GNOME-ConnectivitySettings;
-OnlyShowIn=GNOME;Unity;
-X-GNOME-Bugzilla-Bugzilla=GNOME
-X-GNOME-Bugzilla-Product=gnome-control-center
-X-GNOME-Bugzilla-Component=network
-X-GNOME-Bugzilla-Version=@VERSION@
-# Translators: Search terms to find the Network panel. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon!
-Keywords=Network;IP;LAN;Proxy;WAN;Broadband;Modem;Bluetooth;vpn;DNS;
diff -pruN 1:43.2-2/panels/network/gnome-wifi-panel.desktop.in 1:44~alpha-0ubuntu1/panels/network/gnome-wifi-panel.desktop.in
--- 1:43.2-2/panels/network/gnome-wifi-panel.desktop.in	1970-01-01 00:00:00.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/network/gnome-wifi-panel.desktop.in	2023-01-09 20:06:57.000000000 +0000
@@ -0,0 +1,14 @@
+[Desktop Entry]
+Name=Wi-Fi
+Comment=Control how you connect to Wi-Fi networks
+Exec=gnome-control-center wifi
+# Translators: Do NOT translate or transliterate this text (this is an icon file name)!
+Icon=network-wireless
+Terminal=false
+Type=Application
+NoDisplay=true
+StartupNotify=true
+Categories=GNOME;GTK;Settings;HardwareSettings;X-GNOME-Settings-Panel;X-GNOME-ConnectivitySettings;
+OnlyShowIn=GNOME;Unity;
+# Translators: Search terms to find the Wi-Fi panel. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon!
+Keywords=Network;Wireless;Wi-Fi;Wifi;IP;LAN;Broadband;DNS;Hotspot;
diff -pruN 1:43.2-2/panels/network/gnome-wifi-panel.desktop.in.in 1:44~alpha-0ubuntu1/panels/network/gnome-wifi-panel.desktop.in.in
--- 1:43.2-2/panels/network/gnome-wifi-panel.desktop.in.in	2022-12-23 11:11:35.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/network/gnome-wifi-panel.desktop.in.in	1970-01-01 00:00:00.000000000 +0000
@@ -1,18 +0,0 @@
-[Desktop Entry]
-Name=Wi-Fi
-Comment=Control how you connect to Wi-Fi networks
-Exec=gnome-control-center wifi
-# Translators: Do NOT translate or transliterate this text (this is an icon file name)!
-Icon=network-wireless
-Terminal=false
-Type=Application
-NoDisplay=true
-StartupNotify=true
-Categories=GNOME;GTK;Settings;HardwareSettings;X-GNOME-Settings-Panel;X-GNOME-ConnectivitySettings;
-OnlyShowIn=GNOME;Unity;
-X-GNOME-Bugzilla-Bugzilla=GNOME
-X-GNOME-Bugzilla-Product=gnome-control-center
-X-GNOME-Bugzilla-Component=network
-X-GNOME-Bugzilla-Version=@VERSION@
-# Translators: Search terms to find the Wi-Fi panel. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon!
-Keywords=Network;Wireless;Wi-Fi;Wifi;IP;LAN;Broadband;DNS;Hotspot;
diff -pruN 1:43.2-2/panels/network/meson.build 1:44~alpha-0ubuntu1/panels/network/meson.build
--- 1:43.2-2/panels/network/meson.build	2022-12-23 11:11:35.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/network/meson.build	2023-01-09 20:06:57.000000000 +0000
@@ -5,7 +5,6 @@ deps = common_deps + network_manager_dep
 
 network_inc = include_directories('.')
 
-subdir('wireless-security')
 subdir('connection-editor')
 subdir('icons')
 
@@ -19,15 +18,9 @@ panels_list += panel_names
 foreach name: panel_names
   desktop = 'gnome-' + name + '-panel.desktop'
 
-  desktop_in = configure_file(
-    input: desktop + '.in.in',
-    output: desktop + '.in',
-    configuration: desktop_conf
-  )
-
   i18n.merge_file(
     type: 'desktop',
-    input: desktop_in,
+    input: desktop + '.in',
     output: desktop,
     po_dir: po_dir,
     install: true,
@@ -38,6 +31,7 @@ endforeach
 sources = files(
   'cc-qr-code.c',
   'cc-network-panel.c',
+  'cc-net-proxy-page.c',
   'cc-wifi-connection-row.c',
   'cc-wifi-connection-list.c',
   'cc-wifi-panel.c',
@@ -46,7 +40,6 @@ sources = files(
   'net-device-ethernet.c',
   'net-device-mobile.c',
   'net-device-wifi.c',
-  'net-proxy.c',
   'net-vpn.c',
   'network-dialogs.c',
   'panel-common.c',
@@ -55,13 +48,13 @@ sources = files(
 
 resource_data = files(
   'cc-network-panel.ui',
+  'cc-net-proxy-page.c',
   'cc-wifi-connection-row.ui',
   'cc-wifi-panel.ui',
   'cc-wifi-hotspot-dialog.ui',
   'network-bluetooth.ui',
   'network-ethernet.ui',
   'network-mobile.ui',
-  'network-proxy.ui',
   'network-vpn.ui',
   'network-wifi.ui',
 )
diff -pruN 1:43.2-2/panels/network/net-device-ethernet.c 1:44~alpha-0ubuntu1/panels/network/net-device-ethernet.c
--- 1:43.2-2/panels/network/net-device-ethernet.c	2022-12-23 11:11:35.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/network/net-device-ethernet.c	2023-01-09 20:06:57.000000000 +0000
@@ -58,7 +58,7 @@ add_details_row (GtkWidget *details, gin
         GtkWidget *value_label;
 
         heading_label = gtk_label_new (heading);
-        gtk_style_context_add_class (gtk_widget_get_style_context (heading_label), "dim-label");
+        gtk_widget_add_css_class (heading_label, "dim-label");
         gtk_widget_set_halign (heading_label, GTK_ALIGN_END);
         gtk_widget_set_valign (heading_label, GTK_ALIGN_START);
         gtk_widget_set_hexpand (heading_label, TRUE);
diff -pruN 1:43.2-2/panels/network/net-device-wifi.c 1:44~alpha-0ubuntu1/panels/network/net-device-wifi.c
--- 1:43.2-2/panels/network/net-device-wifi.c	2022-12-23 11:11:35.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/network/net-device-wifi.c	2023-01-09 20:06:57.000000000 +0000
@@ -1045,7 +1045,7 @@ show_history (NetDeviceWifi *self)
         adw_preferences_window_set_can_navigate_back (ADW_PREFERENCES_WINDOW (dialog), FALSE);
         native = gtk_widget_get_native (GTK_WIDGET (self));
         gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (native));
-        gtk_window_set_title (GTK_WINDOW (dialog), _("Known Wi-Fi Networks"));
+        gtk_window_set_title (GTK_WINDOW (dialog), _("Saved Wi-Fi Networks"));
         gtk_window_set_modal (GTK_WINDOW (dialog), TRUE);
         gtk_window_set_default_size (GTK_WINDOW (dialog), 500, 400);
 
@@ -1066,7 +1066,7 @@ show_history (NetDeviceWifi *self)
         /* translators: This is the label for the "Forget wireless network" functionality */
         forget = gtk_button_new_with_mnemonic (C_("Wi-Fi Network", "_Forget"));
         gtk_widget_set_sensitive (forget, FALSE);
-        gtk_style_context_add_class (gtk_widget_get_style_context (forget), "destructive-action");
+        gtk_widget_add_css_class (forget, "destructive-action");
 
         g_signal_connect (forget, "clicked",
                           G_CALLBACK (forget_selected), list);
diff -pruN 1:43.2-2/panels/network/net-proxy.c 1:44~alpha-0ubuntu1/panels/network/net-proxy.c
--- 1:43.2-2/panels/network/net-proxy.c	2022-12-23 11:11:35.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/network/net-proxy.c	1970-01-01 00:00:00.000000000 +0000
@@ -1,372 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
- *
- * Copyright (C) 2011-2012 Richard Hughes <richard@hughsie.com>
- *
- * Licensed under the GNU General Public License Version 2
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#include "config.h"
-
-#include <glib-object.h>
-#include <glib/gi18n.h>
-#include <gio/gio.h>
-
-#include "net-proxy.h"
-
-typedef enum
-{
-        MODE_DISABLED,
-        MODE_MANUAL,
-        MODE_AUTOMATIC
-} ProxyMode;
-
-struct _NetProxy
-{
-        AdwBin            parent;
-
-        GtkCheckButton   *automatic_radio;
-        GtkDialog        *dialog;
-        GtkCheckButton   *manual_radio;
-        GtkCheckButton   *none_radio;
-        GtkEntry         *proxy_ftp_entry;
-        GtkEntry         *proxy_http_entry;
-        GtkEntry         *proxy_https_entry;
-        GtkEntry         *proxy_ignore_entry;
-        GtkAdjustment    *proxy_port_ftp_adjustment;
-        GtkAdjustment    *proxy_port_http_adjustment;
-        GtkAdjustment    *proxy_port_https_adjustment;
-        GtkAdjustment    *proxy_port_socks_adjustment;
-        GtkEntry         *proxy_socks_entry;
-        GtkEntry         *proxy_url_entry;
-        GtkLabel         *proxy_warning_label;
-        GtkStack         *stack;
-        GtkLabel         *status_label;
-
-        GSettings        *settings;
-};
-
-G_DEFINE_TYPE (NetProxy, net_proxy, ADW_TYPE_BIN)
-
-static const gchar *
-panel_get_string_for_value (ProxyMode mode)
-{
-        switch (mode) {
-        case MODE_DISABLED:
-                return _("Off");
-        case MODE_MANUAL:
-                return _("Manual");
-        case MODE_AUTOMATIC:
-                return _("Automatic");
-        default:
-                g_assert_not_reached ();
-        }
-}
-
-static inline void
-panel_update_status_label (NetProxy  *self,
-                           ProxyMode  mode)
-{
-        gtk_label_set_label (self->status_label, panel_get_string_for_value (mode));
-}
-
-static void
-check_wpad_warning (NetProxy *self)
-{
-        g_autofree gchar *autoconfig_url = NULL;
-        GString *string = NULL;
-        gboolean ret = FALSE;
-        guint mode;
-
-        string = g_string_new ("");
-
-        /* check we're using 'Automatic' */
-        mode = g_settings_get_enum (self->settings, "mode");
-        if (mode != MODE_AUTOMATIC)
-                goto out;
-
-        /* see if the PAC is blank */
-        autoconfig_url = g_settings_get_string (self->settings,
-                                                "autoconfig-url");
-        ret = autoconfig_url == NULL ||
-              autoconfig_url[0] == '\0';
-        if (!ret)
-                goto out;
-
-        g_string_append (string, "<small>");
-
-        /* TRANSLATORS: this is when the use leaves the PAC textbox blank */
-        g_string_append (string, _("Web Proxy Autodiscovery is used when a Configuration URL is not provided."));
-
-        g_string_append (string, "\n");
-
-        /* TRANSLATORS: WPAD is bad: if you enable it on an untrusted
-         * network, then anyone else on that network can tell your
-         * machine that it should proxy all of your web traffic
-         * through them. */
-        g_string_append (string, _("This is not recommended for untrusted public networks."));
-        g_string_append (string, "</small>");
-out:
-        gtk_label_set_markup (self->proxy_warning_label, string->str);
-        gtk_widget_set_visible (GTK_WIDGET (self->proxy_warning_label), (string->len > 0));
-
-        g_string_free (string, TRUE);
-}
-
-static void
-settings_changed_cb (NetProxy *self)
-{
-        check_wpad_warning (self);
-}
-
-static void
-panel_proxy_mode_setup_widgets (NetProxy *self, ProxyMode value)
-{
-        /* hide or show the PAC text box */
-        switch (value) {
-        case MODE_DISABLED:
-                gtk_stack_set_visible_child_name (self->stack, "disabled");
-                break;
-        case MODE_MANUAL:
-                gtk_stack_set_visible_child_name (self->stack, "manual");
-                break;
-        case MODE_AUTOMATIC:
-                gtk_stack_set_visible_child_name (self->stack, "automatic");
-                break;
-        default:
-                g_assert_not_reached ();
-        }
-
-        /* perhaps show the wpad warning */
-        check_wpad_warning (self);
-}
-
-static void
-panel_proxy_mode_radio_changed_cb (NetProxy *self, GtkCheckButton *radio)
-{
-        ProxyMode value;
-
-        if (!gtk_check_button_get_active (GTK_CHECK_BUTTON (radio)))
-                return;
-
-        /* get selected radio */
-        if (radio == self->none_radio)
-                value = MODE_DISABLED;
-        else if (radio == self->manual_radio)
-                value = MODE_MANUAL;
-        else if (radio == self->automatic_radio)
-                value = MODE_AUTOMATIC;
-        else
-                g_assert_not_reached ();
-
-        /* set */
-        g_settings_set_enum (self->settings, "mode", value);
-
-        /* hide or show the correct widgets */
-        panel_proxy_mode_setup_widgets (self, value);
-
-        /* status label */
-        panel_update_status_label (self, value);
-}
-
-static void
-show_dialog_cb (NetProxy *self)
-{
-        gtk_window_set_transient_for (GTK_WINDOW (self->dialog), GTK_WINDOW (gtk_widget_get_native (GTK_WIDGET (self))));
-        gtk_window_present (GTK_WINDOW (self->dialog));
-}
-
-static void
-net_proxy_finalize (GObject *object)
-{
-        NetProxy *self = NET_PROXY (object);
-
-        g_clear_object (&self->settings);
-
-        G_OBJECT_CLASS (net_proxy_parent_class)->finalize (object);
-}
-
-static void
-net_proxy_class_init (NetProxyClass *klass)
-{
-        GObjectClass *object_class = G_OBJECT_CLASS (klass);
-        GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
-
-        object_class->finalize = net_proxy_finalize;
-
-        gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/control-center/network/network-proxy.ui");
-
-        gtk_widget_class_bind_template_child (widget_class, NetProxy, automatic_radio);
-        gtk_widget_class_bind_template_child (widget_class, NetProxy, dialog);
-        gtk_widget_class_bind_template_child (widget_class, NetProxy, manual_radio);
-        gtk_widget_class_bind_template_child (widget_class, NetProxy, none_radio);
-        gtk_widget_class_bind_template_child (widget_class, NetProxy, proxy_ftp_entry);
-        gtk_widget_class_bind_template_child (widget_class, NetProxy, proxy_http_entry);
-        gtk_widget_class_bind_template_child (widget_class, NetProxy, proxy_https_entry);
-        gtk_widget_class_bind_template_child (widget_class, NetProxy, proxy_ignore_entry);
-        gtk_widget_class_bind_template_child (widget_class, NetProxy, proxy_port_ftp_adjustment);
-        gtk_widget_class_bind_template_child (widget_class, NetProxy, proxy_port_http_adjustment);
-        gtk_widget_class_bind_template_child (widget_class, NetProxy, proxy_port_https_adjustment);
-        gtk_widget_class_bind_template_child (widget_class, NetProxy, proxy_port_socks_adjustment);
-        gtk_widget_class_bind_template_child (widget_class, NetProxy, proxy_socks_entry);
-        gtk_widget_class_bind_template_child (widget_class, NetProxy, proxy_url_entry);
-        gtk_widget_class_bind_template_child (widget_class, NetProxy, proxy_warning_label);
-        gtk_widget_class_bind_template_child (widget_class, NetProxy, stack);
-        gtk_widget_class_bind_template_child (widget_class, NetProxy, status_label);
-
-        gtk_widget_class_bind_template_callback (widget_class, panel_proxy_mode_radio_changed_cb);
-        gtk_widget_class_bind_template_callback (widget_class, show_dialog_cb);
-}
-
-static gboolean
-get_ignore_hosts (GValue   *value,
-                  GVariant *variant,
-                  gpointer  user_data)
-{
-        GVariantIter iter;
-        const gchar *s;
-        g_autofree gchar **av = NULL;
-        gchar **p;
-        gsize n;
-
-        n = g_variant_iter_init (&iter, variant);
-        p = av = g_new0 (gchar *, n + 1);
-
-        while (g_variant_iter_next (&iter, "&s", &s))
-                if (s[0] != '\0') {
-                        *p = (gchar *) s;
-                        ++p;
-                }
-
-        g_value_take_string (value, g_strjoinv (", ", av));
-
-        return TRUE;
-}
-
-static GVariant *
-set_ignore_hosts (const GValue       *value,
-                  const GVariantType *expected_type,
-                  gpointer            user_data)
-{
-        GVariantBuilder builder;
-        const gchar *sv;
-        gchar **av, **p;
-
-        sv = g_value_get_string (value);
-        av = g_strsplit_set (sv, ", ", 0);
-
-        g_variant_builder_init (&builder, G_VARIANT_TYPE_STRING_ARRAY);
-        for (p = av; *p; ++p) {
-                if (*p[0] != '\0')
-                        g_variant_builder_add (&builder, "s", *p);
-        }
-
-        g_strfreev (av);
-
-        return g_variant_builder_end (&builder);
-}
-
-static void
-net_proxy_init (NetProxy *self)
-{
-        g_autoptr(GSettings) http_settings = NULL;
-        g_autoptr(GSettings) https_settings = NULL;
-        g_autoptr(GSettings) ftp_settings = NULL;
-        g_autoptr(GSettings) socks_settings = NULL;
-        ProxyMode value;
-
-        gtk_widget_init_template (GTK_WIDGET (self));
-
-        self->settings = g_settings_new ("org.gnome.system.proxy");
-        g_signal_connect_object (self->settings,
-                                 "changed",
-                                 G_CALLBACK (settings_changed_cb),
-                                 self,
-                                 G_CONNECT_SWAPPED);
-
-        /* actions */
-        value = g_settings_get_enum (self->settings, "mode");
-
-        /* bind the proxy values */
-        g_settings_bind (self->settings, "autoconfig-url",
-                         self->proxy_url_entry, "text",
-                         G_SETTINGS_BIND_DEFAULT);
-
-        /* bind the HTTP proxy values */
-        http_settings = g_settings_get_child (self->settings, "http");
-        g_settings_bind (http_settings, "host",
-                         self->proxy_http_entry, "text",
-                         G_SETTINGS_BIND_DEFAULT);
-        g_settings_bind (http_settings, "port",
-                         self->proxy_port_http_adjustment, "value",
-                         G_SETTINGS_BIND_DEFAULT);
-
-        /* bind the HTTPS proxy values */
-        https_settings = g_settings_get_child (self->settings, "https");
-        g_settings_bind (https_settings, "host",
-                         self->proxy_https_entry, "text",
-                         G_SETTINGS_BIND_DEFAULT);
-        g_settings_bind (https_settings, "port",
-                         self->proxy_port_https_adjustment, "value",
-                         G_SETTINGS_BIND_DEFAULT);
-
-        /* bind the FTP proxy values */
-        ftp_settings = g_settings_get_child (self->settings, "ftp");
-        g_settings_bind (ftp_settings, "host",
-                         self->proxy_ftp_entry, "text",
-                         G_SETTINGS_BIND_DEFAULT);
-        g_settings_bind (ftp_settings, "port",
-                         self->proxy_port_ftp_adjustment, "value",
-                         G_SETTINGS_BIND_DEFAULT);
-
-        /* bind the SOCKS proxy values */
-        socks_settings = g_settings_get_child (self->settings, "socks");
-        g_settings_bind (socks_settings, "host",
-                         self->proxy_socks_entry, "text",
-                         G_SETTINGS_BIND_DEFAULT);
-        g_settings_bind (socks_settings, "port",
-                         self->proxy_port_socks_adjustment, "value",
-                         G_SETTINGS_BIND_DEFAULT);
-
-        /* bind the proxy ignore hosts */
-        g_settings_bind_with_mapping (self->settings, "ignore-hosts",
-                                      self->proxy_ignore_entry, "text",
-                                      G_SETTINGS_BIND_DEFAULT, get_ignore_hosts, set_ignore_hosts,
-                                      NULL, NULL);
-
-        /* setup the radio before connecting to the :toggled signal */
-        switch (value) {
-        case MODE_DISABLED:
-                gtk_check_button_set_active (GTK_CHECK_BUTTON (self->none_radio), TRUE);
-                break;
-        case MODE_MANUAL:
-                gtk_check_button_set_active (GTK_CHECK_BUTTON (self->manual_radio), TRUE);
-                break;
-        case MODE_AUTOMATIC:
-                gtk_check_button_set_active (GTK_CHECK_BUTTON (self->automatic_radio), TRUE);
-                break;
-        default:
-                g_assert_not_reached ();
-        }
-        panel_proxy_mode_setup_widgets (self, value);
-        panel_update_status_label (self, value);
-}
-
-NetProxy *
-net_proxy_new (void)
-{
-        return g_object_new (net_proxy_get_type (), NULL);
-}
diff -pruN 1:43.2-2/panels/network/net-proxy.h 1:44~alpha-0ubuntu1/panels/network/net-proxy.h
--- 1:43.2-2/panels/network/net-proxy.h	2022-12-23 11:11:35.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/network/net-proxy.h	1970-01-01 00:00:00.000000000 +0000
@@ -1,32 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
- *
- * Copyright (C) 2011-2012 Richard Hughes <richard@hughsie.com>
- *
- * Licensed under the GNU General Public License Version 2
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#pragma once
-
-#include <adwaita.h>
-
-G_BEGIN_DECLS
-
-G_DECLARE_FINAL_TYPE (NetProxy, net_proxy, NET, PROXY, AdwBin)
-
-NetProxy *net_proxy_new (void);
-
-G_END_DECLS
diff -pruN 1:43.2-2/panels/network/network.gresource.xml 1:44~alpha-0ubuntu1/panels/network/network.gresource.xml
--- 1:43.2-2/panels/network/network.gresource.xml	2022-12-23 11:11:35.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/network/network.gresource.xml	2023-01-09 20:06:57.000000000 +0000
@@ -3,10 +3,10 @@
   <gresource prefix="/org/gnome/control-center/network">
     <!-- Network panel -->
     <file preprocess="xml-stripblanks">cc-network-panel.ui</file>
+    <file preprocess="xml-stripblanks">cc-net-proxy-page.ui</file>
     <file preprocess="xml-stripblanks">cc-wifi-connection-row.ui</file>
     <file preprocess="xml-stripblanks">cc-wifi-hotspot-dialog.ui</file>
     <file preprocess="xml-stripblanks">network-bluetooth.ui</file>
-    <file preprocess="xml-stripblanks">network-proxy.ui</file>
     <file preprocess="xml-stripblanks">network-vpn.ui</file>
     <file preprocess="xml-stripblanks">network-wifi.ui</file>
     <file preprocess="xml-stripblanks">network-mobile.ui</file>
diff -pruN 1:43.2-2/panels/network/network-proxy.ui 1:44~alpha-0ubuntu1/panels/network/network-proxy.ui
--- 1:43.2-2/panels/network/network-proxy.ui	2022-12-23 11:11:35.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/network/network-proxy.ui	1970-01-01 00:00:00.000000000 +0000
@@ -1,404 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<interface>
-  <!-- interface-requires gtk+ 3.0 -->
-  <object class="GtkAdjustment" id="proxy_port_ftp_adjustment">
-    <property name="upper">65535</property>
-    <property name="step_increment">1</property>
-  </object>
-  <object class="GtkAdjustment" id="proxy_port_http_adjustment">
-    <property name="upper">65535</property>
-    <property name="step_increment">1</property>
-  </object>
-  <object class="GtkAdjustment" id="proxy_port_https_adjustment">
-    <property name="upper">65535</property>
-    <property name="step_increment">1</property>
-  </object>
-  <object class="GtkAdjustment" id="proxy_port_socks_adjustment">
-    <property name="upper">65535</property>
-    <property name="step_increment">1</property>
-  </object>
-  <template class="NetProxy" parent="AdwBin">
-    <child>
-      <object class="GtkListBox">
-        <property name="selection_mode">none</property>
-        <style>
-          <class name="boxed-list" />
-        </style>
-        <child>
-          <object class="GtkListBoxRow">
-            <property name="activatable">False</property>
-            <child>
-              <object class="GtkBox">
-                <property name="spacing">12</property>
-                <property name="margin_top">8</property>
-                <property name="margin_bottom">8</property>
-                <property name="margin_start">12</property>
-                <property name="margin_end">12</property>
-                <child>
-                  <object class="GtkLabel">
-                    <property name="hexpand">True</property>
-                    <property name="label" translatable="yes">Network Proxy</property>
-                    <property name="ellipsize">end</property>
-                    <property name="xalign">0.0</property>
-                    <attributes>
-                      <attribute name="weight" value="bold" />
-                    </attributes>
-                  </object>
-                </child>
-                <child>
-                  <object class="GtkLabel" id="status_label">
-                    <property name="margin_top">8</property>
-                    <property name="margin_bottom">8</property>
-                    <style>
-                      <class name="dim-label" />
-                    </style>
-                  </object>
-                </child>
-                <child>
-                  <object class="GtkButton">
-                    <signal name="clicked" handler="show_dialog_cb" object="NetProxy" swapped="yes"/>
-                    <property name="icon_name">emblem-system-symbolic</property>
-                    <accessibility>
-                      <property name="label" translatable="yes">Options…</property>
-                    </accessibility>
-                    <style>
-                      <class name="flat"/>
-                    </style>
-                  </object>
-                </child>
-              </object>
-            </child>
-          </object>
-        </child>
-      </object>
-    </child>
-  </template>
-  <object class="GtkDialog" id="dialog">
-    <property name="use_header_bar">1</property>
-    <property name="default_height">350</property>
-    <property name="modal">True</property>
-    <property name="destroy_with_parent">True</property>
-    <property name="hide-on-close">True</property>
-    <property name="title" translatable="yes">Network Proxy</property>
-    <child>
-      <object class="GtkBox">
-        <property name="margin-top">18</property>
-        <property name="margin-bottom">18</property>
-        <property name="margin-start">18</property>
-        <property name="margin-end">18</property>
-        <property name="orientation">vertical</property>
-        <property name="spacing">6</property>
-        <child>
-          <object class="GtkCheckButton" id="automatic_radio">
-            <property name="label" translatable="yes">Automatic</property>
-            <property name="group">none_radio</property>
-            <signal name="toggled" handler="panel_proxy_mode_radio_changed_cb" object="NetProxy" swapped="yes"/>
-          </object>
-        </child>
-        <child>
-          <object class="GtkCheckButton" id="manual_radio">
-            <property name="label" translatable="yes">Manual</property>
-            <property name="group">none_radio</property>
-            <signal name="toggled" handler="panel_proxy_mode_radio_changed_cb" object="NetProxy" swapped="yes"/>
-          </object>
-        </child>
-        <child>
-          <object class="GtkCheckButton" id="none_radio">
-            <property name="label" translatable="yes">Disabled</property>
-            <signal name="toggled" handler="panel_proxy_mode_radio_changed_cb" object="NetProxy" swapped="yes"/>
-          </object>
-        </child>
-        <child>
-          <object class="GtkStack" id="stack">
-            <property name="transition_type">crossfade</property>
-
-            <!-- Disabled (empty box) -->
-            <child>
-              <object class="GtkStackPage">
-                <property name="name">disabled</property>
-                <property name="child">
-                  <object class="GtkBox" />
-                </property>
-              </object>
-            </child>
-
-            <!-- Manual -->
-            <child>
-              <object class="GtkStackPage">
-                <property name="name">manual</property>
-                <property name="child">
-                  <object class="GtkGrid">
-                    <property name="valign">start</property>
-                    <property name="margin-top">12</property>
-                    <property name="margin-bottom">12</property>
-                    <property name="margin-start">12</property>
-                    <property name="margin-end">12</property>
-                    <property name="row_spacing">10</property>
-                    <property name="column_spacing">6</property>
-                    <child>
-                      <object class="GtkLabel">
-                        <property name="xalign">1</property>
-                        <property name="label" translatable="yes">_HTTP Proxy</property>
-                        <property name="use_underline">True</property>
-                        <property name="mnemonic_widget">proxy_http_entry</property>
-                        <layout>
-                          <property name="column">0</property>
-                          <property name="row">3</property>
-                          <property name="column-span">1</property>
-                          <property name="row-span">1</property>
-                        </layout>
-                        <style>
-                          <class name="dim-label"/>
-                        </style>
-                      </object>
-                    </child>
-                    <child>
-                      <object class="GtkLabel">
-                        <property name="xalign">1</property>
-                        <property name="label" translatable="yes">H_TTPS Proxy</property>
-                        <property name="use_underline">True</property>
-                        <property name="mnemonic_widget">proxy_https_entry</property>
-                        <layout>
-                          <property name="column">0</property>
-                          <property name="row">4</property>
-                          <property name="column-span">1</property>
-                          <property name="row-span">1</property>
-                        </layout>
-                        <style>
-                          <class name="dim-label"/>
-                        </style>
-                      </object>
-                    </child>
-                    <child>
-                      <object class="GtkLabel">
-                        <property name="xalign">1</property>
-                        <property name="label" translatable="yes">_FTP Proxy</property>
-                        <property name="use_underline">True</property>
-                        <property name="mnemonic_widget">proxy_ftp_entry</property>
-                        <layout>
-                          <property name="column">0</property>
-                          <property name="row">5</property>
-                          <property name="column-span">1</property>
-                          <property name="row-span">1</property>
-                        </layout>
-                        <style>
-                          <class name="dim-label"/>
-                        </style>
-                      </object>
-                    </child>
-                    <child>
-                      <object class="GtkLabel">
-                        <property name="xalign">1</property>
-                        <property name="label" translatable="yes">_Socks Host</property>
-                        <property name="use_underline">True</property>
-                        <property name="mnemonic_widget">proxy_socks_entry</property>
-                        <layout>
-                          <property name="column">0</property>
-                          <property name="row">6</property>
-                          <property name="column-span">1</property>
-                          <property name="row-span">1</property>
-                        </layout>
-                        <style>
-                          <class name="dim-label"/>
-                        </style>
-                      </object>
-                    </child>
-                    <child>
-                      <object class="GtkLabel">
-                        <property name="xalign">1</property>
-                        <property name="label" translatable="yes">_Ignore Hosts</property>
-                        <property name="use_underline">True</property>
-                        <property name="mnemonic_widget">proxy_ignore_entry</property>
-                        <layout>
-                          <property name="column">0</property>
-                          <property name="row">7</property>
-                          <property name="column-span">1</property>
-                          <property name="row-span">1</property>
-                        </layout>
-                        <style>
-                          <class name="dim-label"/>
-                        </style>
-                      </object>
-                    </child>
-                    <child>
-                      <object class="GtkEntry" id="proxy_http_entry">
-                        <property name="invisible_char">●</property>
-                        <property name="invisible_char_set">True</property>
-                        <layout>
-                          <property name="column">1</property>
-                          <property name="row">3</property>
-                          <property name="column-span">1</property>
-                          <property name="row-span">1</property>
-                        </layout>
-                      </object>
-                    </child>
-                    <child>
-                      <object class="GtkSpinButton">
-                        <property name="xalign">1</property>
-                        <property name="adjustment">proxy_port_http_adjustment</property>
-                        <layout>
-                          <property name="column">2</property>
-                          <property name="row">3</property>
-                          <property name="column-span">1</property>
-                          <property name="row-span">1</property>
-                        </layout>
-                        <accessibility>
-                          <property name="label" translatable="yes">HTTP proxy port</property>
-                        </accessibility>
-                      </object>
-                    </child>
-                    <child>
-                      <object class="GtkEntry" id="proxy_https_entry">
-                        <property name="invisible_char">●</property>
-                        <property name="invisible_char_set">True</property>
-                        <layout>
-                          <property name="column">1</property>
-                          <property name="row">4</property>
-                          <property name="column-span">1</property>
-                          <property name="row-span">1</property>
-                        </layout>
-                      </object>
-                    </child>
-                    <child>
-                      <object class="GtkEntry" id="proxy_ftp_entry">
-                        <property name="invisible_char">●</property>
-                        <property name="invisible_char_set">True</property>
-                        <layout>
-                          <property name="column">1</property>
-                          <property name="row">5</property>
-                          <property name="column-span">1</property>
-                          <property name="row-span">1</property>
-                        </layout>
-                      </object>
-                    </child>
-                    <child>
-                      <object class="GtkEntry" id="proxy_socks_entry">
-                        <property name="invisible_char">●</property>
-                        <property name="invisible_char_set">True</property>
-                        <layout>
-                          <property name="column">1</property>
-                          <property name="row">6</property>
-                          <property name="column-span">1</property>
-                          <property name="row-span">1</property>
-                        </layout>
-                      </object>
-                    </child>
-                    <child>
-                      <object class="GtkEntry" id="proxy_ignore_entry">
-                        <property name="invisible_char">●</property>
-                        <property name="invisible_char_set">True</property>
-                        <layout>
-                          <property name="column">1</property>
-                          <property name="row">7</property>
-                          <property name="column-span">2</property>
-                          <property name="row-span">1</property>
-                        </layout>
-                      </object>
-                    </child>
-                    <child>
-                      <object class="GtkSpinButton">
-                        <property name="xalign">1</property>
-                        <property name="adjustment">proxy_port_https_adjustment</property>
-                        <layout>
-                          <property name="column">2</property>
-                          <property name="row">4</property>
-                          <property name="column-span">1</property>
-                          <property name="row-span">1</property>
-                        </layout>
-                        <accessibility>
-                          <property name="label" translatable="yes">HTTPS proxy port</property>
-                        </accessibility>
-                      </object>
-                    </child>
-                    <child>
-                      <object class="GtkSpinButton">
-                        <property name="xalign">1</property>
-                        <property name="adjustment">proxy_port_ftp_adjustment</property>
-                        <layout>
-                          <property name="column">2</property>
-                          <property name="row">5</property>
-                          <property name="column-span">1</property>
-                          <property name="row-span">1</property>
-                        </layout>
-                        <accessibility>
-                          <property name="label" translatable="yes">FTP proxy port</property>
-                        </accessibility>
-                      </object>
-                    </child>
-                    <child>
-                      <object class="GtkSpinButton">
-                        <property name="xalign">1</property>
-                        <property name="adjustment">proxy_port_socks_adjustment</property>
-                        <layout>
-                          <property name="column">2</property>
-                          <property name="row">6</property>
-                          <property name="column-span">1</property>
-                          <property name="row-span">1</property>
-                        </layout>
-                        <accessibility>
-                          <property name="label" translatable="yes">Socks proxy port</property>
-                        </accessibility>
-                      </object>
-                    </child>
-                  </object>
-                </property>
-              </object>
-            </child>
-
-            <!-- Automatic -->
-            <child>
-              <object class="GtkStackPage">
-                <property name="name">automatic</property>
-                <property name="child">
-                  <object class="GtkGrid">
-                    <property name="row_spacing">12</property>
-                    <property name="column_spacing">12</property>
-                    <child>
-                      <object class="GtkLabel">
-                        <property name="xalign">1</property>
-                        <property name="label" translatable="yes">_Configuration URL</property>
-                        <property name="use_underline">True</property>
-                        <property name="mnemonic_widget">proxy_url_entry</property>
-                        <layout>
-                          <property name="row">0</property>
-                          <property name="column">0</property>
-                        </layout>
-                        <style>
-                          <class name="dim-label"/>
-                        </style>
-                      </object>
-                    </child>
-                    <child>
-                      <object class="GtkEntry" id="proxy_url_entry">
-                        <property name="invisible_char">●</property>
-                        <property name="invisible_char_set">True</property>
-                        <layout>
-                          <property name="row">0</property>
-                          <property name="column">1</property>
-                        </layout>
-                      </object>
-                    </child>
-                    <child>
-                      <object class="GtkLabel" id="proxy_warning_label">
-                        <property name="visible">False</property>
-                        <property name="xalign">0</property>
-                        <property name="wrap">True</property>
-                        <property name="width_chars">50</property>
-                        <layout>
-                          <property name="row">1</property>
-                          <property name="column">0</property>
-                          <property name="column-span">2</property>
-                        </layout>
-                      </object>
-                    </child>
-                  </object>
-                </property>
-              </object>
-            </child>
-
-          </object>
-        </child>
-      </object>
-    </child>
-  </object>
-</interface>
diff -pruN 1:43.2-2/panels/network/network-wifi.ui 1:44~alpha-0ubuntu1/panels/network/network-wifi.ui
--- 1:43.2-2/panels/network/network-wifi.ui	2022-12-23 11:11:35.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/network/network-wifi.ui	2023-01-09 20:06:57.000000000 +0000
@@ -140,7 +140,7 @@
             <property name="activatable">True</property>
             <child>
               <object class="GtkLabel">
-                <property name="label" translatable="yes">_Known Wi-Fi Networks</property>
+                <property name="label" translatable="yes">_Saved Networks</property>
                 <property name="use_underline">True</property>
                 <property name="xalign">0</property>
               </object>
diff -pruN 1:43.2-2/panels/network/ui-helpers.c 1:44~alpha-0ubuntu1/panels/network/ui-helpers.c
--- 1:43.2-2/panels/network/ui-helpers.c	2022-12-23 11:11:35.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/network/ui-helpers.c	2023-01-09 20:06:57.000000000 +0000
@@ -26,7 +26,7 @@ widget_set_error (GtkWidget *widget)
 {
 	g_return_if_fail (GTK_IS_WIDGET (widget));
 
-	gtk_style_context_add_class (gtk_widget_get_style_context (widget), "error");
+	gtk_widget_add_css_class (widget, "error");
 }
 
 void
@@ -34,5 +34,5 @@ widget_unset_error (GtkWidget *widget)
 {
 	g_return_if_fail (GTK_IS_WIDGET (widget));
 
-	gtk_style_context_remove_class (gtk_widget_get_style_context (widget), "error");
+	gtk_widget_remove_css_class (widget, "error");
 }
diff -pruN 1:43.2-2/panels/network/wireless-security/eap-method.c 1:44~alpha-0ubuntu1/panels/network/wireless-security/eap-method.c
--- 1:43.2-2/panels/network/wireless-security/eap-method.c	2022-12-23 11:11:35.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/network/wireless-security/eap-method.c	1970-01-01 00:00:00.000000000 +0000
@@ -1,588 +0,0 @@
-/* -*- Mode: C; tab-width: 5; indent-tabs-mode: t; c-basic-offset: 5 -*- */
-
-/* NetworkManager Applet -- allow user control over networking
- *
- * Dan Williams <dcbw@redhat.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Copyright 2007 - 2014 Red Hat, Inc.
- */
-
-#include <fcntl.h>
-#include <glib/gi18n.h>
-
-#include "eap-method.h"
-#include "helpers.h"
-#include "ui-helpers.h"
-
-G_DEFINE_INTERFACE (EAPMethod, eap_method, G_TYPE_OBJECT)
-
-enum {
-        CHANGED,
-        LAST_SIGNAL
-};
-
-static guint signals[LAST_SIGNAL] = { 0 };
-
-static void
-eap_method_default_init (EAPMethodInterface *iface)
-{
-        signals[CHANGED] =
-                g_signal_new ("changed",
-                              G_TYPE_FROM_INTERFACE (iface),
-                              G_SIGNAL_RUN_FIRST,
-                              0,
-                              NULL, NULL,
-                              g_cclosure_marshal_VOID__VOID,
-                              G_TYPE_NONE, 0);
-}
-
-GtkWidget *
-eap_method_get_default_field (EAPMethod *self)
-{
-	g_return_val_if_fail (self != NULL, NULL);
-
-	return EAP_METHOD_GET_IFACE (self)->get_default_field (self);
-}
-
-const gchar *
-eap_method_get_password_flags_name (EAPMethod *self)
-{
-	g_return_val_if_fail (self != NULL, NULL);
-
-	if (EAP_METHOD_GET_IFACE (self)->get_password_flags_name)
-		return EAP_METHOD_GET_IFACE (self)->get_password_flags_name (self);
-	else
-		return NULL;
-}
-
-gboolean
-eap_method_get_phase2 (EAPMethod *self)
-{
-	g_return_val_if_fail (self != NULL, FALSE);
-
-	if (EAP_METHOD_GET_IFACE (self)->get_phase2)
-		return EAP_METHOD_GET_IFACE (self)->get_phase2 (self);
-	else
-		return FALSE;
-}
-
-gboolean
-eap_method_validate (EAPMethod *self, GError **error)
-{
-	gboolean result;
-
-	g_return_val_if_fail (self != NULL, FALSE);
-
-	result = (*(EAP_METHOD_GET_IFACE (self)->validate)) (self, error);
-	if (!result && error && !*error)
-		g_set_error_literal (error, NMA_ERROR, NMA_ERROR_GENERIC, _("undefined error in 802.1X security (wpa-eap)"));
-	return result;
-}
-
-void
-eap_method_update_secrets (EAPMethod *self, NMConnection *connection)
-{
-	g_return_if_fail (self != NULL);
-
-	if (EAP_METHOD_GET_IFACE (self)->update_secrets)
-		EAP_METHOD_GET_IFACE (self)->update_secrets (self, connection);
-}
-
-void
-eap_method_add_to_size_group (EAPMethod *self, GtkSizeGroup *group)
-{
-	g_return_if_fail (self != NULL);
-	g_return_if_fail (group != NULL);
-
-	return (*(EAP_METHOD_GET_IFACE (self)->add_to_size_group)) (self, group);
-}
-
-void
-eap_method_fill_connection (EAPMethod *self,
-                            NMConnection *connection,
-                            NMSettingSecretFlags flags)
-{
-	g_return_if_fail (self != NULL);
-	g_return_if_fail (connection != NULL);
-
-	return (*(EAP_METHOD_GET_IFACE (self)->fill_connection)) (self, connection, flags);
-}
-
-void
-eap_method_emit_changed (EAPMethod *self)
-{
-        g_return_if_fail (EAP_IS_METHOD (self));
-
-        g_signal_emit (self, signals[CHANGED], 0);
-}
-
-const gchar *
-eap_method_get_username (EAPMethod *self)
-{
-	g_return_val_if_fail (EAP_IS_METHOD (self), NULL);
-	return EAP_METHOD_GET_IFACE (self)->get_username (self);
-}
-
-void
-eap_method_set_username (EAPMethod *self, const gchar *username)
-{
-	g_return_if_fail (EAP_IS_METHOD (self));
-	EAP_METHOD_GET_IFACE (self)->set_username (self, username);
-}
-
-const gchar *
-eap_method_get_password (EAPMethod *self)
-{
-	g_return_val_if_fail (EAP_IS_METHOD (self), NULL);
-	return EAP_METHOD_GET_IFACE (self)->get_password (self);
-}
-
-void
-eap_method_set_password (EAPMethod *self, const gchar *password)
-{
-	g_return_if_fail (EAP_IS_METHOD (self));
-	EAP_METHOD_GET_IFACE (self)->set_password (self, password);
-}
-
-gboolean
-eap_method_get_show_password (EAPMethod *self)
-{
-	g_return_val_if_fail (EAP_IS_METHOD (self), FALSE);
-	return EAP_METHOD_GET_IFACE (self)->get_show_password (self);
-}
-
-void
-eap_method_set_show_password (EAPMethod *self, gboolean show_password)
-{
-	g_return_if_fail (EAP_IS_METHOD (self));
-	EAP_METHOD_GET_IFACE (self)->set_show_password (self, show_password);
-}
-
-gboolean
-eap_method_validate_filepicker (GtkFileChooser *chooser,
-                                guint32 item_type,
-                                const char *password,
-                                NMSetting8021xCKFormat *out_format,
-                                GError **error)
-{
-	g_autofree gchar *filename = NULL;
-	g_autoptr(NMSetting8021x) setting = NULL;
-	g_autoptr(GFile) file = NULL;
-	gboolean success = TRUE;
-
-	if (item_type == TYPE_PRIVATE_KEY) {
-		if (!password || *password == '\0')
-			success = FALSE;
-	}
-
-	file = gtk_file_chooser_get_file (chooser);
-	if (!file) {
-		if (item_type != TYPE_CA_CERT) {
-			success = FALSE;
-			g_set_error_literal (error, NMA_ERROR, NMA_ERROR_GENERIC, _("no file selected"));
-		}
-		goto out;
-	}
-
-	filename = g_file_get_path (file);
-	if (!g_file_test (filename, G_FILE_TEST_EXISTS | G_FILE_TEST_IS_REGULAR)) {
-		success = FALSE;
-		goto out;
-	}
-
-	setting = (NMSetting8021x *) nm_setting_802_1x_new ();
-
-	success = FALSE;
-	if (item_type == TYPE_PRIVATE_KEY) {
-		if (nm_setting_802_1x_set_private_key (setting, filename, password, NM_SETTING_802_1X_CK_SCHEME_PATH, out_format, error))
-			success = TRUE;
-	} else if (item_type == TYPE_CLIENT_CERT) {
-		if (nm_setting_802_1x_set_client_cert (setting, filename, NM_SETTING_802_1X_CK_SCHEME_PATH, out_format, error))
-			success = TRUE;
-	} else if (item_type == TYPE_CA_CERT) {
-		if (nm_setting_802_1x_set_ca_cert (setting, filename, NM_SETTING_802_1X_CK_SCHEME_PATH, out_format, error))
-			success = TRUE;
-	} else
-		g_warning ("%s: invalid item type %d.", __func__, item_type);
-
-out:
-	if (!success && error && !*error)
-		g_set_error_literal (error, NMA_ERROR, NMA_ERROR_GENERIC, _("unspecified error validating eap-method file"));
-
-	if (success)
-		widget_unset_error (GTK_WIDGET (chooser));
-	else
-		widget_set_error (GTK_WIDGET (chooser));
-	return success;
-}
-
-static gboolean
-file_is_mime_type (const char *path, const char *mime_types[])
-{
-	g_autoptr(GFile) file = NULL;
-	g_autoptr(GFileInfo) info = NULL;
-	const char *content_type;
-	int i = 0;
-	gboolean found = FALSE;
-
-	file = g_file_new_for_path (path);
-	info = g_file_query_info (file, 
-	                          G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE,
-	                          G_FILE_QUERY_INFO_NONE,
-	                          NULL,
-	                          NULL);
-	if (info) {
-		content_type = g_file_info_get_content_type (info);
-		if (content_type) {
-			while (mime_types[i]) {
-				if (strcmp (content_type, mime_types[i++]) == 0) {
-					found = TRUE;
-					break;
-				}
-			}
-		}
-	}
-
-	return found;
-}
-
-#if !LIBNM_BUILD
-static const char *
-find_tag (const char *tag, const char *buf, gsize len)
-{
-	gsize i, taglen;
-
-	taglen = strlen (tag);
-	if (len < taglen)
-		return NULL;
-
-	for (i = 0; i < len - taglen + 1; i++) {
-		if (memcmp (buf + i, tag, taglen) == 0)
-			return buf + i;
-	}
-	return NULL;
-}
-
-static const char *pem_rsa_key_begin = "-----BEGIN RSA PRIVATE KEY-----";
-static const char *pem_dsa_key_begin = "-----BEGIN DSA PRIVATE KEY-----";
-static const char *pem_pkcs8_enc_key_begin = "-----BEGIN ENCRYPTED PRIVATE KEY-----";
-static const char *pem_pkcs8_dec_key_begin = "-----BEGIN PRIVATE KEY-----";
-static const char *pem_cert_begin = "-----BEGIN CERTIFICATE-----";
-static const char *proc_type_tag = "Proc-Type: 4,ENCRYPTED";
-static const char *dek_info_tag = "DEK-Info:";
-
-static gboolean
-pem_file_is_encrypted (const char *buffer, gsize bytes_read)
-{
-	/* Check if the private key is encrypted or not by looking for the
-	 * old OpenSSL-style proc-type and dec-info tags.
-	 */
-	if (find_tag (proc_type_tag, (const char *) buffer, bytes_read)) {
-		if (find_tag (dek_info_tag, (const char *) buffer, bytes_read))
-			return TRUE;
-	}
-	return FALSE;
-}
-
-static gboolean
-file_is_der_or_pem (const char *filename,
-                    gboolean privkey,
-                    gboolean *out_privkey_encrypted)
-{
-	int fd;
-	unsigned char buffer[8192];
-	ssize_t bytes_read;
-	gboolean success = FALSE;
-
-	fd = open (filename, O_RDONLY);
-	if (fd < 0)
-		return FALSE;
-
-	bytes_read = read (fd, buffer, sizeof (buffer) - 1);
-	if (bytes_read < 400)  /* needs to be lower? */
-		goto out;
-	buffer[bytes_read] = '\0';
-
-	/* Check for DER signature */
-	if (bytes_read > 2 && buffer[0] == 0x30 && buffer[1] == 0x82) {
-		success = TRUE;
-		goto out;
-	}
-
-	/* Check for PEM signatures */
-	if (privkey) {
-		if (find_tag (pem_rsa_key_begin, (const char *) buffer, bytes_read)) {
-			success = TRUE;
-			if (out_privkey_encrypted)
-				*out_privkey_encrypted = pem_file_is_encrypted ((const char *) buffer, bytes_read);
-			goto out;
-		}
-
-		if (find_tag (pem_dsa_key_begin, (const char *) buffer, bytes_read)) {
-			success = TRUE;
-			if (out_privkey_encrypted)
-				*out_privkey_encrypted = pem_file_is_encrypted ((const char *) buffer, bytes_read);
-			goto out;
-		}
-
-		if (find_tag (pem_pkcs8_enc_key_begin, (const char *) buffer, bytes_read)) {
-			success = TRUE;
-			if (out_privkey_encrypted)
-				*out_privkey_encrypted = TRUE;
-			goto out;
-		}
-
-		if (find_tag (pem_pkcs8_dec_key_begin, (const char *) buffer, bytes_read)) {
-			success = TRUE;
-			if (out_privkey_encrypted)
-				*out_privkey_encrypted = FALSE;
-			goto out;
-		}
-	} else {
-		if (find_tag (pem_cert_begin, (const char *) buffer, bytes_read)) {
-			success = TRUE;
-			goto out;
-		}
-	}
-
-out:
-	close (fd);
-	return success;
-}
-#endif
-
-static const char *privkey_mime_types[] = {
-	"application/x-x509-ca-cert", "application/pkcs12", "application/x-pkcs12", "application/pgp-keys", NULL
-};
-static const char *cert_mime_types[] = {
-	"application/x-x509-ca-cert", NULL
-};
-
-static void
-add_mime_types_to_filter (GtkFileFilter  *filter,
-                          const char    **mime_types)
-{
-	int i;
-
-	for (i = 0; mime_types[i] != NULL; i++)
-		gtk_file_filter_add_mime_type (filter, mime_types[i]);
-}
-
-
-GtkFileFilter *
-eap_method_default_file_chooser_filter_new (gboolean privkey)
-{
-	GtkFileFilter *filter;
-
-	filter = gtk_file_filter_new ();
-	if (privkey) {
-		add_mime_types_to_filter (filter, privkey_mime_types);
-		gtk_file_filter_set_name (filter, _("DER, PEM, PKCS#12, or PGP private keys"));
-	} else {
-		add_mime_types_to_filter (filter, cert_mime_types);
-		gtk_file_filter_set_name (filter, _("DER or PEM certificates"));
-	}
-	return filter;
-}
-
-gboolean
-eap_method_is_encrypted_private_key (const char *path)
-{
-	gboolean is_encrypted;
-
-	if (!file_is_mime_type (path, privkey_mime_types))
-		return FALSE;
-
-#if LIBNM_BUILD
-	is_encrypted = FALSE;
-	if (!nm_utils_file_is_private_key (path, &is_encrypted))
-		return FALSE;
-#else
-	is_encrypted = TRUE;
-	if (   !file_is_der_or_pem (path, TRUE, &is_encrypted)
-	    && !nm_utils_file_is_pkcs12 (path))
-		return FALSE;
-#endif
-	return is_encrypted;
-}
-
-void
-eap_method_ca_cert_not_required_toggled (GtkCheckButton *id_ca_cert_not_required_checkbutton, GtkFileChooser *id_ca_cert_chooser)
-{
-	g_autoptr(GFile) file = NULL;
-	g_autoptr(GFile) file_old = NULL;
-	gboolean is_not_required;
-
-	g_assert (id_ca_cert_not_required_checkbutton && id_ca_cert_chooser);
-
-	is_not_required = gtk_check_button_get_active (id_ca_cert_not_required_checkbutton);
-
-	file = gtk_file_chooser_get_file (id_ca_cert_chooser);
-	file_old = g_object_steal_data (G_OBJECT (id_ca_cert_chooser), "filename-old");
-	if (is_not_required) {
-		g_clear_object (&file_old);
-		file_old = g_steal_pointer (&file);
-	} else {
-		g_clear_object (&file);
-		file = g_steal_pointer (&file_old);
-	}
-	gtk_widget_set_sensitive (GTK_WIDGET (id_ca_cert_chooser), !is_not_required);
-	if (file)
-		gtk_file_chooser_set_file (id_ca_cert_chooser, file, NULL);
-	g_object_set_data_full (G_OBJECT (id_ca_cert_chooser), "filename-old", g_steal_pointer (&file_old), g_free);
-}
-
-/* Used as both GSettings keys and GObject data tags */
-#define IGNORE_CA_CERT_TAG "ignore-ca-cert"
-#define IGNORE_PHASE2_CA_CERT_TAG "ignore-phase2-ca-cert"
-
-/**
- * eap_method_ca_cert_ignore_set:
- * @method: the #EAPMethod object
- * @connection: the #NMConnection
- * @filename: the certificate file, if any
- * @ca_cert_error: %TRUE if an error was encountered loading the given CA
- * certificate, %FALSE if not or if a CA certificate is not present
- *
- * Updates the connection's CA cert ignore value to %TRUE if the "CA certificate
- * not required" checkbox is checked.  If @ca_cert_error is %TRUE, then the
- * connection's CA cert ignore value will always be set to %FALSE, because it
- * means that the user selected an invalid certificate (thus he does not want to
- * ignore the CA cert)..
- */
-void
-eap_method_ca_cert_ignore_set (EAPMethod *self,
-                               NMConnection *connection,
-                               const char *filename,
-                               gboolean ca_cert_error)
-{
-	NMSetting8021x *s_8021x;
-	gboolean ignore;
-
-	s_8021x = nm_connection_get_setting_802_1x (connection);
-	if (s_8021x) {
-		ignore = !ca_cert_error && filename == NULL;
-		g_object_set_data (G_OBJECT (s_8021x),
-		                   eap_method_get_phase2 (self) ? IGNORE_PHASE2_CA_CERT_TAG : IGNORE_CA_CERT_TAG,
-		                   GUINT_TO_POINTER (ignore));
-	}
-}
-
-/**
- * eap_method_ca_cert_ignore_get:
- * @method: the #EAPMethod object
- * @connection: the #NMConnection
- *
- * Returns: %TRUE if a missing CA certificate can be ignored, %FALSE if a CA
- * certificate should be required for the connection to be valid.
- */
-gboolean
-eap_method_ca_cert_ignore_get (EAPMethod *self, NMConnection *connection)
-{
-	NMSetting8021x *s_8021x;
-
-	s_8021x = nm_connection_get_setting_802_1x (connection);
-	if (s_8021x) {
-		return !!g_object_get_data (G_OBJECT (s_8021x),
-		                            eap_method_get_phase2 (self) ? IGNORE_PHASE2_CA_CERT_TAG : IGNORE_CA_CERT_TAG);
-	}
-	return FALSE;
-}
-
-static GSettings *
-_get_ca_ignore_settings (NMConnection *connection)
-{
-	GSettings *settings;
-	g_autofree gchar *path = NULL;
-	const char *uuid;
-
-	g_return_val_if_fail (connection, NULL);
-
-	uuid = nm_connection_get_uuid (connection);
-	g_return_val_if_fail (uuid && *uuid, NULL);
-
-	path = g_strdup_printf ("/org/gnome/nm-applet/eap/%s/", uuid);
-	settings = g_settings_new_with_path ("org.gnome.nm-applet.eap", path);
-
-	return settings;
-}
-
-/**
- * eap_method_ca_cert_ignore_save:
- * @connection: the connection for which to save CA cert ignore values to GSettings
- *
- * Reads the CA cert ignore tags from the 802.1x setting GObject data and saves
- * then to GSettings if present, using the connection UUID as the index.
- */
-void
-eap_method_ca_cert_ignore_save (NMConnection *connection)
-{
-	NMSetting8021x *s_8021x;
-	g_autoptr(GSettings) settings = NULL;
-	gboolean ignore = FALSE, phase2_ignore = FALSE;
-
-	g_return_if_fail (connection);
-
-	s_8021x = nm_connection_get_setting_802_1x (connection);
-	if (s_8021x) {
-		ignore = !!g_object_get_data (G_OBJECT (s_8021x), IGNORE_CA_CERT_TAG);
-		phase2_ignore = !!g_object_get_data (G_OBJECT (s_8021x), IGNORE_PHASE2_CA_CERT_TAG);
-	}
-
-	settings = _get_ca_ignore_settings (connection);
-	if (!settings)
-		return;
-
-	g_settings_set_boolean (settings, IGNORE_CA_CERT_TAG, ignore);
-	g_settings_set_boolean (settings, IGNORE_PHASE2_CA_CERT_TAG, phase2_ignore);
-}
-
-/**
- * eap_method_ca_cert_ignore_load:
- * @connection: the connection for which to load CA cert ignore values to GSettings
- *
- * Reads the CA cert ignore tags from the 802.1x setting GObject data and saves
- * then to GSettings if present, using the connection UUID as the index.
- */
-void
-eap_method_ca_cert_ignore_load (NMConnection *connection)
-{
-	g_autoptr(GSettings) settings = NULL;
-	NMSetting8021x *s_8021x;
-	gboolean ignore, phase2_ignore;
-
-	g_return_if_fail (connection);
-
-	s_8021x = nm_connection_get_setting_802_1x (connection);
-	if (!s_8021x)
-		return;
-
-	settings = _get_ca_ignore_settings (connection);
-	if (!settings)
-		return;
-
-	ignore = g_settings_get_boolean (settings, IGNORE_CA_CERT_TAG);
-	phase2_ignore = g_settings_get_boolean (settings, IGNORE_PHASE2_CA_CERT_TAG);
-
-	g_object_set_data (G_OBJECT (s_8021x),
-	                   IGNORE_CA_CERT_TAG,
-	                   GUINT_TO_POINTER (ignore));
-	g_object_set_data (G_OBJECT (s_8021x),
-	                   IGNORE_PHASE2_CA_CERT_TAG,
-	                   GUINT_TO_POINTER (phase2_ignore));
-}
-
diff -pruN 1:43.2-2/panels/network/wireless-security/eap-method-fast.c 1:44~alpha-0ubuntu1/panels/network/wireless-security/eap-method-fast.c
--- 1:43.2-2/panels/network/wireless-security/eap-method-fast.c	2022-12-23 11:11:35.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/network/wireless-security/eap-method-fast.c	1970-01-01 00:00:00.000000000 +0000
@@ -1,399 +0,0 @@
-/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */
-/* vim: set ft=c ts=4 sts=4 sw=4 noexpandtab smartindent: */
-
-/* EAP-FAST authentication method (RFC4851)
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Copyright 2012 - 2014 Red Hat, Inc.
- */
-
-#include <glib/gi18n.h>
-
-#include "eap-method.h"
-#include "eap-method-fast.h"
-#include "eap-method-simple.h"
-#include "helpers.h"
-#include "ui-helpers.h"
-#include "ws-file-chooser-button.h"
-
-#define I_NAME_COLUMN 0
-#define I_ID_COLUMN   1
-
-struct _EAPMethodFAST {
-	GtkGrid parent;
-
-	GtkEntry             *anon_identity_entry;
-	GtkLabel             *anon_identity_label;
-	GtkComboBox          *inner_auth_combo;
-	GtkLabel             *inner_auth_label;
-	GtkListStore         *inner_auth_model;
-	GtkBox               *inner_auth_box;
-	WsFileChooserButton  *pac_file_button;
-	GtkLabel             *pac_file_label;
-	GtkCheckButton       *pac_provision_check;
-	GtkComboBox          *pac_provision_combo;
-
-	EAPMethodSimple      *em_gtc;
-	EAPMethodSimple      *em_mschap_v2;
-};
-
-static void eap_method_iface_init (EAPMethodInterface *);
-
-G_DEFINE_TYPE_WITH_CODE (EAPMethodFAST, eap_method_fast, GTK_TYPE_GRID,
-                         G_IMPLEMENT_INTERFACE (eap_method_get_type (), eap_method_iface_init))
-
-static EAPMethod *
-get_inner_method (EAPMethodFAST *self)
-{
-	GtkTreeIter iter;
-	g_autofree gchar *id = NULL;
-
-	if (!gtk_combo_box_get_active_iter (self->inner_auth_combo, &iter))
-		return NULL;
-	gtk_tree_model_get (GTK_TREE_MODEL (self->inner_auth_model), &iter, I_ID_COLUMN, &id, -1);
-
-	if (strcmp (id, "gtc") == 0)
-		return EAP_METHOD (self->em_gtc);
-	if (strcmp (id, "mschapv2") == 0)
-		return EAP_METHOD (self->em_mschap_v2);
-
-	return NULL;
-}
-
-static gboolean
-validate (EAPMethod *parent, GError **error)
-{
-	EAPMethodFAST *self = (EAPMethodFAST *) parent;
-	g_autoptr(GFile) file = NULL;
-	gboolean provisioning;
-	gboolean valid = TRUE;
-
-	provisioning = gtk_check_button_get_active (GTK_CHECK_BUTTON (self->pac_provision_check));
-	file = ws_file_chooser_button_get_file (self->pac_file_button);
-	if (!provisioning && !file) {
-		widget_set_error (GTK_WIDGET (self->pac_file_button));
-		g_set_error_literal (error, NMA_ERROR, NMA_ERROR_GENERIC, _("missing EAP-FAST PAC file"));
-		valid = FALSE;
-	} else
-		widget_unset_error (GTK_WIDGET (self->pac_file_button));
-
-	return eap_method_validate (get_inner_method (self), valid ? error : NULL) && valid;
-}
-
-static void
-add_to_size_group (EAPMethod *parent, GtkSizeGroup *group)
-{
-	EAPMethodFAST *self = (EAPMethodFAST *) parent;
-
-	gtk_size_group_add_widget (group, GTK_WIDGET (self->anon_identity_label));
-	gtk_size_group_add_widget (group, GTK_WIDGET (self->pac_file_label));
-	gtk_size_group_add_widget (group, GTK_WIDGET (self->pac_provision_check));
-	gtk_size_group_add_widget (group, GTK_WIDGET (self->inner_auth_label));
-
-	eap_method_add_to_size_group (EAP_METHOD (self->em_gtc), group);
-	eap_method_add_to_size_group (EAP_METHOD (self->em_mschap_v2), group);
-}
-
-static void
-fill_connection (EAPMethod *parent, NMConnection *connection, NMSettingSecretFlags flags)
-{
-	EAPMethodFAST *self = (EAPMethodFAST *) parent;
-	g_autofree gchar *filename = NULL;
-	g_autoptr(GFile) file = NULL;
-	NMSetting8021x *s_8021x;
-	const char *text;
-	gboolean enabled;
-	int pac_provisioning = 0;
-
-	s_8021x = nm_connection_get_setting_802_1x (connection);
-	g_assert (s_8021x);
-
-	nm_setting_802_1x_add_eap_method (s_8021x, "fast");
-
-	text = gtk_editable_get_text (GTK_EDITABLE (self->anon_identity_entry));
-	if (text && strlen (text))
-		g_object_set (s_8021x, NM_SETTING_802_1X_ANONYMOUS_IDENTITY, text, NULL);
-
-	file = ws_file_chooser_button_get_file (self->pac_file_button);
-	filename = file ? g_file_get_path (file) : NULL;
-	g_object_set (s_8021x, NM_SETTING_802_1X_PAC_FILE, filename, NULL);
-
-	enabled = gtk_check_button_get_active (GTK_CHECK_BUTTON (self->pac_provision_check));
-
-	if (!enabled)
-		g_object_set (G_OBJECT (s_8021x), NM_SETTING_802_1X_PHASE1_FAST_PROVISIONING, "0", NULL);
-	else {
-		pac_provisioning = gtk_combo_box_get_active (self->pac_provision_combo);
-
-		switch (pac_provisioning) {
-		case 0:  /* Anonymous */
-			g_object_set (G_OBJECT (s_8021x), NM_SETTING_802_1X_PHASE1_FAST_PROVISIONING, "1", NULL);
-			break;
-		case 1:  /* Authenticated */
-			g_object_set (G_OBJECT (s_8021x), NM_SETTING_802_1X_PHASE1_FAST_PROVISIONING, "2", NULL);
-			break;
-		case 2:  /* Both - anonymous and authenticated */
-			g_object_set (G_OBJECT (s_8021x), NM_SETTING_802_1X_PHASE1_FAST_PROVISIONING, "3", NULL);
-			break;
-		default: /* Should not happen */
-			g_object_set (G_OBJECT (s_8021x), NM_SETTING_802_1X_PHASE1_FAST_PROVISIONING, "1", NULL);
-			break;
-		}
-	}
-
-	eap_method_fill_connection (get_inner_method (self), connection, flags);
-}
-
-static void
-inner_auth_combo_changed_cb (EAPMethodFAST *self)
-{
-	EAPMethod *inner_method;
-	GtkWidget *child;
-
-	inner_method = get_inner_method (self);
-
-	/* Remove the previous method and migrate username/password across */
-	child = gtk_widget_get_first_child (GTK_WIDGET (self->inner_auth_box));
-	if (child != NULL) {
-		EAPMethod *old_eap = EAP_METHOD (child);
-		eap_method_set_username (inner_method, eap_method_get_username (old_eap));
-		eap_method_set_password (inner_method, eap_method_get_password (old_eap));
-		eap_method_set_show_password (inner_method, eap_method_get_show_password (old_eap));
-		gtk_box_remove (self->inner_auth_box, child);
-	}
-
-	gtk_box_append (self->inner_auth_box, g_object_ref (GTK_WIDGET (inner_method)));
-
-	eap_method_emit_changed (EAP_METHOD (self));
-}
-
-static void
-update_secrets (EAPMethod *parent, NMConnection *connection)
-{
-	EAPMethodFAST *self = (EAPMethodFAST *) parent;
-
-	eap_method_update_secrets (EAP_METHOD (self->em_gtc), connection);
-	eap_method_update_secrets (EAP_METHOD (self->em_mschap_v2), connection);
-}
-
-static GtkWidget *
-get_default_field (EAPMethod *parent)
-{
-	EAPMethodFAST *self = (EAPMethodFAST *) parent;
-	return GTK_WIDGET (self->anon_identity_entry);
-}
-
-static const gchar *
-get_password_flags_name (EAPMethod *parent)
-{
-	return NM_SETTING_802_1X_PASSWORD;
-}
-
-static const gchar *
-get_username (EAPMethod *method)
-{
-	EAPMethodFAST *self = EAP_METHOD_FAST (method);
-	return eap_method_get_username (get_inner_method (self));
-}
-
-static void
-set_username (EAPMethod *method, const gchar *username)
-{
-	EAPMethodFAST *self = EAP_METHOD_FAST (method);
-	return eap_method_set_username (get_inner_method (self), username);
-}
-
-static const gchar *
-get_password (EAPMethod *method)
-{
-	EAPMethodFAST *self = EAP_METHOD_FAST (method);
-	return eap_method_get_password (get_inner_method (self));
-}
-
-static void
-set_password (EAPMethod *method, const gchar *password)
-{
-	EAPMethodFAST *self = EAP_METHOD_FAST (method);
-	return eap_method_set_password (get_inner_method (self), password);
-}
-
-static gboolean
-get_show_password (EAPMethod *method)
-{
-	EAPMethodFAST *self = EAP_METHOD_FAST (method);
-	return eap_method_get_show_password (get_inner_method (self));
-}
-
-static void
-set_show_password (EAPMethod *method, gboolean show_password)
-{
-	EAPMethodFAST *self = EAP_METHOD_FAST (method);
-	return eap_method_set_show_password (get_inner_method (self), show_password);
-}
-
-static void
-pac_toggled_cb (EAPMethodFAST *self)
-{
-	gboolean enabled = FALSE;
-
-	enabled = gtk_check_button_get_active (GTK_CHECK_BUTTON (self->pac_provision_check));
-	gtk_widget_set_sensitive (GTK_WIDGET (self->pac_provision_combo), enabled);
-
-	eap_method_emit_changed (EAP_METHOD (self));
-}
-
-static void
-changed_cb (EAPMethodFAST *self)
-{
-	eap_method_emit_changed (EAP_METHOD (self));
-}
-
-static void
-eap_method_fast_init (EAPMethodFAST *self)
-{
-	gtk_widget_init_template (GTK_WIDGET (self));
-}
-
-static void
-eap_method_fast_class_init (EAPMethodFASTClass *klass)
-{
-        GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
-
-	g_type_ensure (WS_TYPE_FILE_CHOOSER_BUTTON);
-
-	gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/Settings/network/eap-method-fast.ui");
-
-	gtk_widget_class_bind_template_child (widget_class, EAPMethodFAST, anon_identity_entry);
-	gtk_widget_class_bind_template_child (widget_class, EAPMethodFAST, anon_identity_label);
-	gtk_widget_class_bind_template_child (widget_class, EAPMethodFAST, inner_auth_combo);
-	gtk_widget_class_bind_template_child (widget_class, EAPMethodFAST, inner_auth_label);
-	gtk_widget_class_bind_template_child (widget_class, EAPMethodFAST, inner_auth_model);
-	gtk_widget_class_bind_template_child (widget_class, EAPMethodFAST, inner_auth_box);
-	gtk_widget_class_bind_template_child (widget_class, EAPMethodFAST, pac_file_button);
-	gtk_widget_class_bind_template_child (widget_class, EAPMethodFAST, pac_file_label);
-	gtk_widget_class_bind_template_child (widget_class, EAPMethodFAST, pac_provision_check);
-	gtk_widget_class_bind_template_child (widget_class, EAPMethodFAST, pac_provision_combo);
-}
-
-static void
-eap_method_iface_init (EAPMethodInterface *iface)
-{
-	iface->validate = validate;
-	iface->add_to_size_group = add_to_size_group;
-	iface->fill_connection = fill_connection;
-	iface->update_secrets = update_secrets;
-	iface->get_default_field = get_default_field;
-	iface->get_password_flags_name = get_password_flags_name;
-	iface->get_username = get_username;
-	iface->set_username = set_username;
-	iface->get_password = get_password;
-	iface->set_password = set_password;
-	iface->get_show_password = get_show_password;
-	iface->set_show_password = set_show_password;
-}
-
-EAPMethodFAST *
-eap_method_fast_new (NMConnection *connection)
-{
-	EAPMethodFAST *self;
-	GtkFileFilter *filter;
-	NMSetting8021x *s_8021x = NULL;
-	gboolean provisioning_enabled = TRUE;
-	const gchar *phase2_auth = NULL;
-	GtkTreeIter iter;
-
-	self = g_object_new (eap_method_fast_get_type (), NULL);
-
-	if (connection)
-		s_8021x = nm_connection_get_setting_802_1x (connection);
-
-	gtk_combo_box_set_active (self->pac_provision_combo, 0);
-	if (s_8021x) {
-		const char *fast_prov;
-
-		fast_prov = nm_setting_802_1x_get_phase1_fast_provisioning (s_8021x);
-		if (fast_prov) {
-			if (!strcmp (fast_prov, "0"))
-				provisioning_enabled = FALSE;
-			else if (!strcmp (fast_prov, "1"))
-				gtk_combo_box_set_active (self->pac_provision_combo, 0);
-			else if (!strcmp (fast_prov, "2"))
-				gtk_combo_box_set_active (self->pac_provision_combo, 1);
-			else if (!strcmp (fast_prov, "3"))
-				gtk_combo_box_set_active (self->pac_provision_combo, 2);
-		}
-	}
-	gtk_widget_set_sensitive (GTK_WIDGET (self->pac_provision_combo), provisioning_enabled);
-	g_signal_connect_swapped (self->pac_provision_combo, "changed", G_CALLBACK (changed_cb), self);
-
-	gtk_check_button_set_active (self->pac_provision_check, provisioning_enabled);
-	g_signal_connect_swapped (self->pac_provision_check, "toggled", G_CALLBACK (pac_toggled_cb), self);
-
-	if (s_8021x && nm_setting_802_1x_get_anonymous_identity (s_8021x))
-		gtk_editable_set_text (GTK_EDITABLE (self->anon_identity_entry), nm_setting_802_1x_get_anonymous_identity (s_8021x));
-	g_signal_connect_swapped (self->anon_identity_entry, "changed", G_CALLBACK (changed_cb), self);
-
-	g_signal_connect_swapped (self->pac_file_button, "notify::file", G_CALLBACK (changed_cb), self);
-
-	filter = gtk_file_filter_new ();
-	gtk_file_filter_add_pattern (filter, "*.pac");
-	gtk_file_filter_set_name (filter, _("PAC files (*.pac)"));
-	gtk_file_chooser_add_filter (ws_file_chooser_button_get_filechooser (self->pac_file_button), filter);
-	filter = gtk_file_filter_new ();
-	gtk_file_filter_add_pattern (filter, "*");
-	gtk_file_filter_set_name (filter, _("All files"));
-	gtk_file_chooser_add_filter (ws_file_chooser_button_get_filechooser (self->pac_file_button), filter);
-
-	if (connection && s_8021x) {
-		const char *filename = nm_setting_802_1x_get_pac_file (s_8021x);
-		if (filename) {
-			g_autoptr(GFile) file = g_file_new_for_path (filename);
-			ws_file_chooser_button_set_file (self->pac_file_button, file);
-		}
-	}
-
-	self->em_gtc = eap_method_simple_new (connection, "gtc", TRUE, FALSE);
-	gtk_widget_show (GTK_WIDGET (self->em_gtc));
-	g_signal_connect_object (self->em_gtc, "changed", G_CALLBACK (eap_method_emit_changed), self, G_CONNECT_SWAPPED);
-
-	self->em_mschap_v2 = eap_method_simple_new (connection, "mschapv2", TRUE, FALSE);
-	gtk_widget_show (GTK_WIDGET (self->em_mschap_v2));
-	g_signal_connect_object (self->em_mschap_v2, "changed", G_CALLBACK (eap_method_emit_changed), self, G_CONNECT_SWAPPED);
-
-	if (s_8021x) {
-		if (nm_setting_802_1x_get_phase2_auth (s_8021x))
-			phase2_auth = nm_setting_802_1x_get_phase2_auth (s_8021x);
-		else if (nm_setting_802_1x_get_phase2_autheap (s_8021x))
-			phase2_auth = nm_setting_802_1x_get_phase2_autheap (s_8021x);
-	}
-	if (phase2_auth == NULL)
-		phase2_auth = "gtc";
-
-	if (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (self->inner_auth_model), &iter)) {
-		do {
-			g_autofree gchar *id = NULL;
-			gtk_tree_model_get (GTK_TREE_MODEL (self->inner_auth_model), &iter, I_ID_COLUMN, &id, -1);
-			if (strcmp (id, phase2_auth) == 0)
-				gtk_combo_box_set_active_iter (self->inner_auth_combo, &iter);
-		} while (gtk_tree_model_iter_next (GTK_TREE_MODEL (self->inner_auth_model), &iter));
-	}
-
-	g_signal_connect_swapped (self->inner_auth_combo, "changed", G_CALLBACK (inner_auth_combo_changed_cb), self);
-	inner_auth_combo_changed_cb (self);
-
-	return self;
-}
-
diff -pruN 1:43.2-2/panels/network/wireless-security/eap-method-fast.h 1:44~alpha-0ubuntu1/panels/network/wireless-security/eap-method-fast.h
--- 1:43.2-2/panels/network/wireless-security/eap-method-fast.h	2022-12-23 11:11:35.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/network/wireless-security/eap-method-fast.h	1970-01-01 00:00:00.000000000 +0000
@@ -1,34 +0,0 @@
-/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */
-/* vim: set ft=c ts=4 sts=4 sw=4 noexpandtab smartindent: */
-
-/* EAP-FAST authentication method (RFC4851)
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * (C) Copyright 2012 Red Hat, Inc.
- */
-
-#pragma once
-
-#include <gtk/gtk.h>
-#include <NetworkManager.h>
-
-G_BEGIN_DECLS
-
-G_DECLARE_FINAL_TYPE (EAPMethodFAST, eap_method_fast, EAP, METHOD_FAST, GtkGrid)
-
-EAPMethodFAST *eap_method_fast_new (NMConnection *connection);
-
-G_END_DECLS
diff -pruN 1:43.2-2/panels/network/wireless-security/eap-method-fast.ui 1:44~alpha-0ubuntu1/panels/network/wireless-security/eap-method-fast.ui
--- 1:43.2-2/panels/network/wireless-security/eap-method-fast.ui	2022-12-23 11:11:35.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/network/wireless-security/eap-method-fast.ui	1970-01-01 00:00:00.000000000 +0000
@@ -1,151 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<interface>
-  <requires lib="gtk+" version="3.4"/>
-  <object class="GtkListStore" id="inner_auth_model">
-    <columns>
-      <!-- column-name label -->
-      <column type="gchararray"/>
-      <!-- column-name id -->
-      <column type="gchararray"/>
-    </columns>
-    <data>
-      <row>
-        <col id="0" translatable="yes">GTC</col>
-        <col id="1">gtc</col>
-      </row>
-      <row>
-        <col id="0" translatable="yes">MSCHAPv2</col>
-        <col id="1">mschapv2</col>
-      </row>
-    </data>
-  </object>
-  <object class="GtkListStore" id="pac_provision_model">
-    <columns>
-      <!-- column-name gchararray -->
-      <column type="gchararray"/>
-    </columns>
-    <data>
-      <row>
-        <col id="0" translatable="yes">Anonymous</col>
-      </row>
-      <row>
-        <col id="0" translatable="yes">Authenticated</col>
-      </row>
-      <row>
-        <col id="0" translatable="yes">Both</col>
-      </row>
-    </data>
-  </object>
-  <template class="EAPMethodFAST" parent="GtkGrid">
-    <property name="valign">start</property>
-    <property name="column_spacing">6</property>
-    <property name="row_spacing">6</property>
-    <child>
-      <object class="GtkLabel" id="anon_identity_label">
-        <property name="xalign">1</property>
-        <property name="label" translatable="yes">Anony_mous identity</property>
-        <property name="use_underline">True</property>
-        <property name="mnemonic_widget">anon_identity_entry</property>
-        <layout>
-          <property name="column">0</property>
-          <property name="row">0</property>
-        </layout>
-      </object>
-    </child>
-    <child>
-      <object class="GtkEntry" id="anon_identity_entry">
-        <property name="hexpand">True</property>
-        <layout>
-          <property name="column">1</property>
-          <property name="row">0</property>
-        </layout>
-      </object>
-    </child>
-    <child>
-      <object class="GtkLabel" id="pac_file_label">
-        <property name="xalign">1</property>
-        <property name="label" translatable="yes">PAC _file</property>
-        <property name="use_underline">True</property>
-        <property name="mnemonic_widget">pac_file_button</property>
-        <layout>
-          <property name="column">0</property>
-          <property name="row">2</property>
-        </layout>
-      </object>
-    </child>
-    <child>
-      <object class="WsFileChooserButton" id="pac_file_button">
-        <property name="hexpand">True</property>
-        <property name="title" translatable="yes">Choose a PAC file</property>
-        <layout>
-          <property name="column">1</property>
-          <property name="row">2</property>
-        </layout>
-      </object>
-    </child>
-    <child>
-      <object class="GtkBox" id="inner_auth_box">
-        <property name="orientation">vertical</property>
-        <layout>
-          <property name="column">0</property>
-          <property name="column-span">2</property>
-          <property name="row">4</property>
-        </layout>
-      </object>
-    </child>
-    <child>
-      <object class="GtkLabel" id="inner_auth_label">
-        <property name="xalign">1</property>
-        <property name="label" translatable="yes">_Inner authentication</property>
-        <property name="use_underline">True</property>
-        <property name="mnemonic_widget">inner_auth_combo</property>
-        <layout>
-          <property name="column">0</property>
-          <property name="row">3</property>
-        </layout>
-      </object>
-    </child>
-    <child>
-      <object class="GtkComboBox" id="inner_auth_combo">
-        <property name="hexpand">True</property>
-        <property name="model">inner_auth_model</property>
-        <layout>
-          <property name="column">1</property>
-          <property name="row">3</property>
-        </layout>
-        <child>
-          <object class="GtkCellRendererText"/>
-          <attributes>
-            <attribute name="text">0</attribute>
-          </attributes>
-        </child>
-      </object>
-    </child>
-    <child>
-      <object class="GtkCheckButton" id="pac_provision_check">
-        <property name="label" translatable="yes">Allow automatic PAC pro_visioning</property>
-        <property name="use_underline">True</property>
-        <layout>
-          <property name="column">0</property>
-          <property name="row">1</property>
-        </layout>
-      </object>
-    </child>
-    <child>
-      <object class="GtkComboBox" id="pac_provision_combo">
-        <property name="hexpand">True</property>
-        <property name="model">pac_provision_model</property>
-        <layout>
-          <property name="column">1</property>
-          <property name="row">1</property>
-        </layout>
-        <child>
-          <object class="GtkCellRendererText"/>
-          <attributes>
-            <attribute name="text">0</attribute>
-          </attributes>
-        </child>
-      </object>
-    </child>
-  </template>
-</interface>
diff -pruN 1:43.2-2/panels/network/wireless-security/eap-method.h 1:44~alpha-0ubuntu1/panels/network/wireless-security/eap-method.h
--- 1:43.2-2/panels/network/wireless-security/eap-method.h	2022-12-23 11:11:35.000000000 +0000
+++ 1:44~alpha-0ubuntu1/panels/network/wireless-security/eap-method.h	1970-01-01 00:00:00.000000000 +0000
@@ -1,108 +0,0 @@
-/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */
-/* NetworkManager Applet -- allow user control over networking
- *
- * Dan Williams <dcbw@redhat.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Copyright 2007 - 2014 Red Hat, Inc.
- */
-
-#pragma once
-
-#include <gtk/gtk.h>
-#include <NetworkManager.h>
-
-G_BEGIN_DECLS
-
-G_DECLARE_INTERFACE (EAPMethod, eap_method, EAP, METHOD, GObject)
-
-struct _EAPMethodInterface {
-	GTypeInterface g_iface;
-
-	void         (*add_to_size_group)       (EAPMethod *method, GtkSizeGroup *group);
-	void         (*fill_connection)         (EAPMethod *method, NMConnection *connection, NMSettingSecretFlags flags);
-	void         (*update_secrets)          (EAPMethod *method, NMConnection *connection);
-	gboolean     (*validate)                (EAPMethod *method, GError **error);
-	GtkWidget*   (*get_default_field)       (EAPMethod *method);
-	const gchar* (*get_password_flags_name) (EAPMethod *method);
-	gboolean     (*get_phase2)              (EAPMethod *method);
-	const gchar* (*get_username)            (EAPMethod *method);
-	void         (*set_username)            (EAPMethod *method, const gchar *username);
-	const gchar* (*get_password)            (EAPMethod *method);
-	void         (*set_password)            (EAPMethod *method, const gchar *password);
-	gboolean     (*get_show_password)       (EAPMethod *method);
-	void         (*set_show_password)       (EAPMethod *method, gboolean show_password);
-};
-
-GtkWidget *eap_method_get_default_field (EAPMethod *method);
-
-const gchar *eap_method_get_password_flags_name (EAPMethod *method);
-
-gboolean eap_method_get_phase2 (EAPMethod *method);
-
-void eap_method_update_secrets (EAPMethod *method, NMConnection *connection);
-
-gboolean eap_method_validate (EAPMethod *method, GError **error);
-
-void eap_method_add_to_size_group (EAPMethod *method, GtkSizeGroup *group);
-
-void eap_method_fill_connection (EAPMethod *method,
-                                 NMConnection *connection,
-                                 NMSettingSecretFlags flags);
-
-void eap_method_emit_changed (EAPMethod *method);
-
-const gchar *eap_method_get_username (EAPMethod *method);
-
-void eap_method_set_username (EAPMethod *method, const gchar *username);
-
-const gchar *eap_method_get_password (EAPMethod *method);
-
-void eap_method_set_password (EAPMethod *method, const gchar *password);
-
-gboolean eap_method_get_show_password (EAPMethod *method);
-
-void eap_method_set_show_password (EAPMethod *method, gboolean show_password);
-
-/* Below for internal use only */
-
-GtkFileFilter * eap_method_default_file_chooser_filter_new (gboolean privkey);
-
-gboolean eap_method_is_encrypted_private_key (const char *path);
-
-#define TYPE_CLIENT_CERT 0
-#define TYPE_CA_CERT     1
-#define TYPE_PRIVATE_KEY 2
-
-gboolean eap_method_validate_filepicker (GtkFileChooser *chooser,
-                                         guint32 item_type,
-                                         const char *password,
-                                         NMSetting8021xCKFormat *out_format,
-                                         GError **error);
-
-void eap_method_ca_cert_not_required_toggled (GtkCheckButton *id_ca_cert_is_not_required_checkbox,
-                                              GtkFileChooser *id_ca_cert_chooser);
-
-void eap_method_ca_cert_ignore_set (EAPMethod *method,
-                                    NMConnection *connection,
-                                    const char *filename,
-                                    gboolean ca_cert_error);
-gboolean eap_method_ca_cert_ignore_get (EAPMethod *method, NMConnection *connection);
-
-void eap_method_ca_cert_ignore_save (NMConnection *connection);
-void eap_method_ca_cert_ignore_load (NMConnection *connection);
-
-G_END_DECLS
diff -pruN 1:43.2-2/p