[gnome-control-center/gbsneto/gtk4] network: Port to GTK4




commit 9a30105962734cb04cb37f8682b901593bcd498f
Author: Georges Basile Stavracas Neto <georges stavracas gmail com>
Date:   Mon Nov 29 10:37:01 2021 -0300

    network: Port to GTK4
    
    Boy this was hard.
    
    To ease the pain of porting wireless-security to GTK4, add
    a new WsFileChooserButton class that mimics the behavior of
    a button that triggers a filechooser, as per the migration
    guide suggests.
    
    There were lots of GtkGrids, so the diff is particularly
    horrendous. Sorry.
    
    This needs serious testing before landing.

 meson.build                                        |   2 +-
 panels/meson.build                                 |   2 +-
 panels/network/cc-network-panel.c                  |  55 +-
 panels/network/cc-network-panel.ui                 |  91 +--
 panels/network/cc-wifi-connection-list.c           |  31 +-
 panels/network/cc-wifi-connection-list.h           |   6 +-
 panels/network/cc-wifi-connection-row.c            |  25 +-
 panels/network/cc-wifi-connection-row.h            |   4 +-
 panels/network/cc-wifi-connection-row.ui           |  93 +--
 panels/network/cc-wifi-hotspot-dialog.c            |  32 +-
 panels/network/cc-wifi-hotspot-dialog.h            |   2 +-
 panels/network/cc-wifi-hotspot-dialog.ui           |  73 ++-
 panels/network/cc-wifi-panel.c                     |  50 +-
 panels/network/cc-wifi-panel.ui                    | 408 ++++++-------
 .../connection-editor/8021x-security-page.ui       |  41 +-
 .../connection-editor/ce-ip-address-entry.c        |   4 +-
 .../network/connection-editor/ce-netmask-entry.c   |   6 +-
 .../connection-editor/ce-page-8021x-security.c     |  17 +-
 panels/network/connection-editor/ce-page-details.c |  12 +-
 .../network/connection-editor/ce-page-ethernet.c   |  20 +-
 panels/network/connection-editor/ce-page-ip4.c     | 250 ++++----
 panels/network/connection-editor/ce-page-ip4.h     |   4 +-
 panels/network/connection-editor/ce-page-ip6.c     | 256 ++++-----
 panels/network/connection-editor/ce-page-ip6.h     |   4 +-
 .../network/connection-editor/ce-page-security.c   |  17 +-
 panels/network/connection-editor/ce-page-vpn.c     |  26 +-
 panels/network/connection-editor/ce-page-wifi.c    |  24 +-
 panels/network/connection-editor/ce-page.c         |   8 +-
 .../network/connection-editor/connection-editor.ui |  60 +-
 panels/network/connection-editor/details-page.ui   | 377 +++++-------
 panels/network/connection-editor/ethernet-page.ui  | 128 ++---
 panels/network/connection-editor/ip4-page.ui       | 593 ++++++++-----------
 panels/network/connection-editor/ip6-page.ui       | 622 +++++++++-----------
 .../connection-editor/net-connection-editor.c      |  78 +--
 panels/network/connection-editor/security-page.ui  |  42 +-
 panels/network/connection-editor/vpn-helpers.c     | 103 +++-
 panels/network/connection-editor/vpn-page.ui       |  31 +-
 panels/network/connection-editor/wifi-page.ui      |  99 ++--
 panels/network/net-device-ethernet.c               |  66 +--
 panels/network/net-device-mobile.c                 |   5 +-
 panels/network/net-device-wifi.c                   | 143 +++--
 panels/network/net-device-wifi.h                   |   3 +-
 panels/network/net-proxy.c                         |  29 +-
 panels/network/net-proxy.h                         |   4 +-
 panels/network/net-vpn.c                           |   2 +-
 panels/network/network-bluetooth.ui                |  33 +-
 panels/network/network-dialogs.c                   |   4 +-
 panels/network/network-ethernet.ui                 |  93 +--
 panels/network/network-mobile.ui                   | 328 +++--------
 panels/network/network-proxy.ui                    | 635 +++++++++------------
 panels/network/network-vpn.ui                      |  43 +-
 panels/network/network-wifi.ui                     | 119 ++--
 panels/network/wireless-security/eap-method-fast.c |  57 +-
 .../network/wireless-security/eap-method-fast.ui   | 102 ++--
 panels/network/wireless-security/eap-method-leap.c |  22 +-
 .../network/wireless-security/eap-method-leap.ui   |  57 +-
 panels/network/wireless-security/eap-method-peap.c |  55 +-
 .../network/wireless-security/eap-method-peap.ui   | 112 ++--
 .../network/wireless-security/eap-method-simple.c  |  24 +-
 .../network/wireless-security/eap-method-simple.ui |  68 +--
 panels/network/wireless-security/eap-method-tls.c  | 109 ++--
 panels/network/wireless-security/eap-method-tls.ui | 138 ++---
 panels/network/wireless-security/eap-method-ttls.c |  59 +-
 .../network/wireless-security/eap-method-ttls.ui   | 112 ++--
 panels/network/wireless-security/eap-method.c      |  77 ++-
 panels/network/wireless-security/eap-method.h      |   2 +-
 panels/network/wireless-security/helpers.c         |   2 +-
 panels/network/wireless-security/meson.build       |   2 +
 panels/network/wireless-security/ws-dynamic-wep.c  |  12 +-
 panels/network/wireless-security/ws-dynamic-wep.ui |  37 +-
 .../wireless-security/ws-file-chooser-button.c     | 268 +++++++++
 .../wireless-security/ws-file-chooser-button.h     |  44 ++
 panels/network/wireless-security/ws-leap.c         |  12 +-
 panels/network/wireless-security/ws-leap.ui        |  59 +-
 panels/network/wireless-security/ws-sae.c          |   8 +-
 panels/network/wireless-security/ws-sae.ui         |  55 +-
 panels/network/wireless-security/ws-wep-key.c      |  14 +-
 panels/network/wireless-security/ws-wep-key.ui     |  85 ++-
 panels/network/wireless-security/ws-wpa-eap.c      |  12 +-
 panels/network/wireless-security/ws-wpa-eap.ui     |  37 +-
 panels/network/wireless-security/ws-wpa-psk.c      |   8 +-
 panels/network/wireless-security/ws-wpa-psk.ui     |  65 +--
 shell/cc-panel-loader.c                            |  10 +-
 83 files changed, 3017 insertions(+), 3910 deletions(-)
---
diff --git a/meson.build b/meson.build
index 5075eacfc..f00280e9e 100644
--- a/meson.build
+++ b/meson.build
@@ -210,7 +210,7 @@ if host_is_linux
   # network manager
   network_manager_deps = [
     dependency('libnm', version: '>= 1.24.0'),
-    dependency('libnma', version: '>= 1.8.0'),
+    dependency('libnma-gtk4', version: '>= 1.8.0'),
     dependency('mm-glib', version: '>= 0.7')
   ]
 endif
diff --git a/panels/meson.build b/panels/meson.build
index 5382bb034..3fec950e3 100644
--- a/panels/meson.build
+++ b/panels/meson.build
@@ -32,7 +32,7 @@ panels = [
 ]
 
 if host_is_linux
-#  panels += ['network']
+  panels += ['network']
 endif
 
 if host_is_linux_not_s390
diff --git a/panels/network/cc-network-panel.c b/panels/network/cc-network-panel.c
index bd4e55df8..1bf09e8a8 100644
--- a/panels/network/cc-network-panel.c
+++ b/panels/network/cc-network-panel.c
@@ -426,8 +426,7 @@ panel_add_device (CcNetworkPanel *self, NMDevice *device)
         case NM_DEVICE_TYPE_ETHERNET:
         case NM_DEVICE_TYPE_INFINIBAND:
                 device_ethernet = net_device_ethernet_new (self->client, device);
-                gtk_widget_show (GTK_WIDGET (device_ethernet));
-                gtk_container_add (GTK_CONTAINER (self->box_wired), GTK_WIDGET (device_ethernet));
+                gtk_box_append (GTK_BOX (self->box_wired), GTK_WIDGET (device_ethernet));
                 g_ptr_array_add (self->ethernet_devices, device_ethernet);
                 g_hash_table_insert (self->nm_device_to_device, device, device_ethernet);
                 break;
@@ -453,15 +452,13 @@ panel_add_device (CcNetworkPanel *self, NMDevice *device)
                 }
 
                 device_mobile = net_device_mobile_new (self->client, device, modem_object);
-                gtk_widget_show (GTK_WIDGET (device_mobile));
-                gtk_container_add (GTK_CONTAINER (self->box_wired), GTK_WIDGET (device_mobile));
+                gtk_box_append (GTK_BOX (self->box_wired), GTK_WIDGET (device_mobile));
                 g_ptr_array_add (self->mobile_devices, device_mobile);
                 g_hash_table_insert (self->nm_device_to_device, device, device_mobile);
                 break;
         case NM_DEVICE_TYPE_BT:
                 device_bluetooth = net_device_bluetooth_new (self->client, device);
-                gtk_widget_show (GTK_WIDGET (device_bluetooth));
-                gtk_container_add (GTK_CONTAINER (self->box_bluetooth), GTK_WIDGET (device_bluetooth));
+                gtk_box_append (GTK_BOX (self->box_bluetooth), GTK_WIDGET (device_bluetooth));
                 g_ptr_array_add (self->bluetooth_devices, device_bluetooth);
                 g_hash_table_insert (self->nm_device_to_device, device, device_bluetooth);
 
@@ -496,7 +493,7 @@ panel_remove_device (CcNetworkPanel *self, NMDevice *device)
         g_ptr_array_remove (self->mobile_devices, net_device);
         g_hash_table_remove (self->nm_device_to_device, device);
 
-        gtk_widget_destroy (net_device);
+        gtk_box_remove (GTK_BOX (gtk_widget_get_parent (net_device)), net_device);
 
         /* update vpn widgets */
         update_vpn_section (self);
@@ -614,8 +611,7 @@ panel_add_vpn_device (CcNetworkPanel *self, NMConnection *connection)
         }
 
         net_vpn = net_vpn_new (self->client, connection);
-        gtk_widget_show (GTK_WIDGET (net_vpn));
-        gtk_container_add (GTK_CONTAINER (self->box_vpn), GTK_WIDGET (net_vpn));
+        gtk_box_append (GTK_BOX (self->box_vpn), GTK_WIDGET (net_vpn));
 
         /* store in the devices array */
         g_ptr_array_add (self->vpns, net_vpn);
@@ -657,7 +653,7 @@ client_connection_removed_cb (CcNetworkPanel *self, NMConnection *connection)
                 NetVpn *vpn = g_ptr_array_index (self->vpns, i);
                 if (net_vpn_get_connection (vpn) == connection) {
                         g_ptr_array_remove (self->vpns, vpn);
-                        gtk_widget_destroy (GTK_WIDGET (vpn));
+                        gtk_box_remove (GTK_BOX (self->box_vpn), GTK_WIDGET (vpn));
                         update_vpn_section (self);
                         return;
                 }
@@ -676,27 +672,25 @@ panel_check_network_manager_version (CcNetworkPanel *self)
                 GtkWidget *label;
                 g_autofree gchar *markup = NULL;
 
-                gtk_container_remove (GTK_CONTAINER (self), gtk_bin_get_child (GTK_BIN (self)));
-
                 box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 20);
                 gtk_box_set_homogeneous (GTK_BOX (box), TRUE);
                 gtk_widget_set_vexpand (box, TRUE);
-                gtk_container_add (GTK_CONTAINER (self), box);
+                adw_bin_set_child (ADW_BIN (self), box);
 
                 label = gtk_label_new (_("Oops, something has gone wrong. Please contact your software 
vendor."));
-                gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
+                gtk_widget_set_vexpand (label, TRUE);
+                gtk_label_set_wrap (GTK_LABEL (label), TRUE);
                 gtk_widget_set_valign (label, GTK_ALIGN_END);
-                gtk_box_pack_start (GTK_BOX (box), label, TRUE, TRUE, 0);
+                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_line_wrap (GTK_LABEL (label), TRUE);
+                gtk_label_set_wrap (GTK_LABEL (label), TRUE);
                 gtk_widget_set_valign (label, GTK_ALIGN_START);
-                gtk_box_pack_start (GTK_BOX (box), label, TRUE, TRUE, 0);
-
-                gtk_widget_show_all (box);
+                gtk_box_append (GTK_BOX (box), label);
         } else {
                 manager_running (self);
         }
@@ -709,17 +703,19 @@ create_connection_cb (GtkWidget      *button,
         NetConnectionEditor *editor;
 
         editor = net_connection_editor_new (NULL, NULL, NULL, self->client);
-        gtk_window_set_transient_for (GTK_WINDOW (editor), GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET 
(self))));
+        gtk_window_set_transient_for (GTK_WINDOW (editor),
+                                      GTK_WINDOW (gtk_widget_get_native (GTK_WIDGET (self))));
         gtk_window_present (GTK_WINDOW (editor));
 }
 
 static void
-on_toplevel_map (GtkWidget      *widget,
-                 CcNetworkPanel *self)
+cc_network_panel_map (GtkWidget *widget)
 {
+        GTK_WIDGET_CLASS (cc_network_panel_parent_class)->map (widget);
+
         /* is the user compiling against a new version, but not running
          * the daemon? */
-        panel_check_network_manager_version (self);
+        panel_check_network_manager_version (CC_NETWORK_PANEL (widget));
 }
 
 
@@ -732,6 +728,8 @@ cc_network_panel_class_init (CcNetworkPanelClass *klass)
 
        panel_class->get_help_uri = cc_network_panel_get_help_uri;
 
+        widget_class->map = cc_network_panel_map;
+
         object_class->get_property = cc_network_panel_get_property;
         object_class->set_property = cc_network_panel_set_property;
         object_class->dispose = cc_network_panel_dispose;
@@ -754,11 +752,10 @@ cc_network_panel_class_init (CcNetworkPanelClass *klass)
 static void
 cc_network_panel_init (CcNetworkPanel *self)
 {
-        NetProxy *proxy;
-        g_autoptr(GError) error = NULL;
-        GtkWidget *toplevel;
         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 ());
@@ -773,8 +770,7 @@ cc_network_panel_init (CcNetworkPanel *self)
 
         /* add the virtual proxy device */
         proxy = net_proxy_new ();
-        gtk_widget_show (GTK_WIDGET (proxy));
-        gtk_container_add (GTK_CONTAINER (self->box_proxy), GTK_WIDGET (proxy));
+        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)) {
@@ -815,9 +811,6 @@ cc_network_panel_init (CcNetworkPanel *self)
         g_signal_connect_object (self->client, NM_CLIENT_CONNECTION_REMOVED,
                                  G_CALLBACK (client_connection_removed_cb), self, G_CONNECT_SWAPPED);
 
-        toplevel = gtk_widget_get_toplevel (GTK_WIDGET (self));
-        g_signal_connect_after (toplevel, "map", G_CALLBACK (on_toplevel_map), self);
-
         /* Cold-plug existing connections */
         connections = nm_client_get_connections (self->client);
         if (connections) {
diff --git a/panels/network/cc-network-panel.ui b/panels/network/cc-network-panel.ui
index 84735fdbf..f11044ad4 100644
--- a/panels/network/cc-network-panel.ui
+++ b/panels/network/cc-network-panel.ui
@@ -2,30 +2,20 @@
 <interface>
   <!-- interface-requires gtk+ 3.0 -->
   <template class="CcNetworkPanel" parent="CcPanel">
-    <property name="visible">True</property>
-    <property name="can_focus">False</property>
 
     <child>
       <object class="GtkScrolledWindow">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
         <property name="hscrollbar_policy">never</property>
         <child>
           <object class="GtkViewport">
-            <property name="visible">True</property>
-            <property name="can_focus">False</property>
-            <property name="shadow_type">none</property>
             <child>
-              <object class="HdyClamp">
-                <property name="visible">True</property>
+              <object class="AdwClamp">
                 <property name="margin_top">32</property>
                 <property name="margin_bottom">32</property>
                 <property name="margin_start">12</property>
                 <property name="margin_end">12</property>
                 <child>
                   <object class="GtkBox">
-                    <property name="visible">True</property>
-                    <property name="can_focus">False</property>
                     <property name="hexpand">True</property>
                     <property name="spacing">12</property>
                     <property name="orientation">vertical</property>
@@ -34,33 +24,25 @@
                     <!-- Each GtkBox below will contain GtkStacks from the NetDevices -->
                     <child>
                       <object class="GtkBox">
-                        <property name="visible">True</property>
-                        <property name="can_focus">False</property>
                         <property name="spacing">24</property>
                         <property name="orientation">vertical</property>
                         <child>
                           <object class="GtkBox" id="box_wired">
-                            <property name="visible">True</property>
-                            <property name="can_focus">False</property>
                             <property name="orientation">vertical</property>
                             <property name="spacing">24</property>
                           </object>
                         </child>
                         <child>
                           <object class="GtkBox" id="container_bluetooth">
-                            <property name="can_focus">False</property>
+                            <property name="visible">False</property>
                             <property name="orientation">vertical</property>
                             <property name="spacing">12</property>
 
                             <!-- "Other Devices" header -->
                             <child>
                               <object class="GtkBox">
-                                <property name="visible">True</property>
-                                <property name="can_focus">False</property>
                                 <child>
                                   <object class="GtkLabel">
-                                    <property name="visible">True</property>
-                                    <property name="can_focus">False</property>
                                     <property name="hexpand">True</property>
                                     <property name="xalign">0.0</property>
                                     <property name="label" translatable="yes">Other Devices</property>
@@ -72,36 +54,22 @@
                               </object>
                             </child>
                             <child>
-                              <object class="GtkFrame">
-                                <property name="visible">True</property>
-                                <property name="can_focus">False</property>
-                                <child>
-                                  <object class="GtkBox" id="box_bluetooth">
-                                    <property name="visible">True</property>
-                                    <property name="can_focus">False</property>
-                                    <property name="orientation">vertical</property>
-                                  </object>
-                                </child>
+                              <object class="GtkBox" id="box_bluetooth">
+                                <property name="orientation">vertical</property>
                               </object>
                             </child>
                           </object>
                         </child>
                         <child>
                           <object class="GtkBox">
-                            <property name="visible">True</property>
-                            <property name="can_focus">False</property>
                             <property name="orientation">vertical</property>
                             <property name="spacing">6</property>
 
                             <!-- VPN header -->
                             <child>
                               <object class="GtkBox">
-                                <property name="visible">True</property>
-                                <property name="can_focus">False</property>
                                 <child>
                                   <object class="GtkLabel">
-                                    <property name="visible">True</property>
-                                    <property name="can_focus">False</property>
                                     <property name="hexpand">True</property>
                                     <property name="xalign">0.0</property>
                                     <property name="label" translatable="yes">VPN</property>
@@ -112,57 +80,42 @@
                                 </child>
                                 <child>
                                   <object class="GtkButton">
-                                    <property name="visible">True</property>
-                                    <property name="can_focus">False</property>
-                                    <property name="relief">none</property>
+                                    <property name="icon_name">list-add-symbolic</property>
+                                    <style>
+                                      <class name="flat" />
+                                    </style>
                                     <signal name="clicked" handler="create_connection_cb" 
object="CcNetworkPanel" swapped="no" />
-                                    <child>
-                                      <object class="GtkImage">
-                                        <property name="visible">True</property>
-                                        <property name="can_focus">False</property>
-                                        <property name="icon_name">list-add-symbolic</property>
-                                      </object>
-                                    </child>
                                   </object>
                                 </child>
                               </object>
                             </child>
+
                             <child>
-                              <object class="GtkFrame">
-                                <property name="visible">True</property>
-                                <property name="can_focus">False</property>
-                                <child>
-                                  <object class="GtkBox" id="box_vpn">
-                                    <property name="visible">True</property>
-                                    <property name="can_focus">False</property>
-                                    <property name="orientation">vertical</property>
+                              <object class="GtkBox" id="box_vpn">
+                                <property name="orientation">vertical</property>
 
-                                    <!-- "Not set up" row -->
+                                <!-- "Not set up" row -->
+                                <child>
+                                  <object class="GtkListBox" id="empty_listbox">
+                                    <property name="selection_mode">none</property>
+                                    <style>
+                                      <class name="content" />
+                                    </style>
                                     <child>
-                                      <object class="GtkListBox" id="empty_listbox">
-                                        <property name="visible">True</property>
-                                        <property name="can_focus">True</property>
-                                        <property name="selection_mode">none</property>
-                                        <child>
-                                          <object class="HdyActionRow">
-                                            <property name="visible">True</property>
-                                            <property name="can_focus">True</property>
-                                            <property name="activatable">False</property>
-                                            <property name="title" translatable="yes">Not set up</property>
-                                          </object>
-                                        </child>
+                                      <object class="AdwActionRow">
+                                        <property name="activatable">False</property>
+                                        <property name="title" translatable="yes">Not set up</property>
                                       </object>
                                     </child>
                                   </object>
                                 </child>
                               </object>
                             </child>
+
                           </object>
                         </child>
                         <child>
                           <object class="GtkBox" id="box_proxy">
-                            <property name="visible">True</property>
-                            <property name="can_focus">False</property>
                             <property name="orientation">vertical</property>
                           </object>
                         </child>
diff --git a/panels/network/cc-wifi-connection-list.c b/panels/network/cc-wifi-connection-list.c
index ff91892c2..c97128200 100644
--- a/panels/network/cc-wifi-connection-list.c
+++ b/panels/network/cc-wifi-connection-list.c
@@ -20,7 +20,9 @@
 
 struct _CcWifiConnectionList
 {
-  GtkListBox parent_instance;
+  AdwBin         parent_instance;
+
+  GtkListBox    *listbox;
 
   guint          freeze_count;
   gboolean       updating;
@@ -59,7 +61,7 @@ static void on_device_ap_removed_cb (CcWifiConnectionList *self,
 static void on_row_configured_cb    (CcWifiConnectionList *self,
                                      CcWifiConnectionRow  *row);
 
-G_DEFINE_TYPE (CcWifiConnectionList, cc_wifi_connection_list, GTK_TYPE_LIST_BOX)
+G_DEFINE_TYPE (CcWifiConnectionList, cc_wifi_connection_list, ADW_TYPE_BIN)
 
 enum
 {
@@ -127,8 +129,7 @@ cc_wifi_connection_list_row_add (CcWifiConnectionList *self,
                                     connection,
                                     aps,
                                     self->checkable);
-  gtk_container_add (GTK_CONTAINER (self), GTK_WIDGET (res));
-  gtk_widget_show (GTK_WIDGET (res));
+  gtk_list_box_append (self->listbox, GTK_WIDGET (res));
 
   g_signal_connect_object (res, "configure", G_CALLBACK (on_row_configured_cb), self, G_CONNECT_SWAPPED);
 
@@ -153,7 +154,7 @@ clear_widget (CcWifiConnectionList *self)
   while (g_hash_table_iter_next (&iter, NULL, (gpointer*) &row))
     {
       g_hash_table_iter_remove (&iter);
-      gtk_container_remove (GTK_CONTAINER (self), GTK_WIDGET (row));
+      gtk_list_box_remove (self->listbox, GTK_WIDGET (row));
     }
 
   /* Remove all connection rows */
@@ -164,8 +165,7 @@ clear_widget (CcWifiConnectionList *self)
 
       row = g_ptr_array_index (self->connections_row, i);
       g_ptr_array_index (self->connections_row, i) = NULL;
-      gtk_container_remove (GTK_CONTAINER (self),
-                            GTK_WIDGET (row));
+      gtk_list_box_remove (self->listbox, GTK_WIDGET (row));
      }
 
   /* Reset the internal state */
@@ -404,7 +404,7 @@ on_device_ap_removed_cb (CcWifiConnectionList *self,
           if (self->hide_unavailable)
             {
               g_ptr_array_index (self->connections_row, i) = NULL;
-              gtk_container_remove (GTK_CONTAINER (self), GTK_WIDGET (row));
+              gtk_list_box_remove (self->listbox, GTK_WIDGET (row));
             }
         }
     }
@@ -425,7 +425,7 @@ on_device_ap_removed_cb (CcWifiConnectionList *self,
   if (cc_wifi_connection_row_remove_access_point (row, ap))
     {
       g_hash_table_remove (self->ssid_to_row, ssid);
-      gtk_container_remove (GTK_CONTAINER (self), GTK_WIDGET (row));
+      gtk_list_box_remove (self->listbox, GTK_WIDGET (row));
     }
 }
 
@@ -704,6 +704,11 @@ cc_wifi_connection_list_class_init (CcWifiConnectionListClass *klass)
 static void
 cc_wifi_connection_list_init (CcWifiConnectionList *self)
 {
+  self->listbox = GTK_LIST_BOX (gtk_list_box_new ());
+  gtk_list_box_set_selection_mode (GTK_LIST_BOX (self->listbox), GTK_SELECTION_NONE);
+  gtk_widget_add_css_class (GTK_WIDGET (self->listbox), "content");
+  adw_bin_set_child (ADW_BIN (self), GTK_WIDGET (self->listbox));
+
   self->hide_unavailable = TRUE;
   self->show_aps = TRUE;
 
@@ -757,3 +762,11 @@ cc_wifi_connection_list_thaw (CcWifiConnectionList *self)
       update_connections (self);
     }
 }
+
+GtkListBox *
+cc_wifi_connection_list_get_list_box (CcWifiConnectionList *self)
+{
+  g_return_val_if_fail (CC_IS_WIFI_CONNECTION_LIST (self), NULL);
+
+  return self->listbox;
+}
diff --git a/panels/network/cc-wifi-connection-list.h b/panels/network/cc-wifi-connection-list.h
index 67dc23d81..eeec65fd9 100644
--- a/panels/network/cc-wifi-connection-list.h
+++ b/panels/network/cc-wifi-connection-list.h
@@ -17,14 +17,14 @@
 
 #pragma once
 
-#include <gtk/gtk.h>
+#include <adwaita.h>
 #include <NetworkManager.h>
 
 G_BEGIN_DECLS
 
 #define CC_TYPE_WIFI_CONNECTION_LIST (cc_wifi_connection_list_get_type())
 
-G_DECLARE_FINAL_TYPE (CcWifiConnectionList, cc_wifi_connection_list, CC, WIFI_CONNECTION_LIST, GtkListBox)
+G_DECLARE_FINAL_TYPE (CcWifiConnectionList, cc_wifi_connection_list, CC, WIFI_CONNECTION_LIST, AdwBin)
 
 CcWifiConnectionList *cc_wifi_connection_list_new (NMClient     *client,
                                                    NMDeviceWifi *device,
@@ -36,4 +36,6 @@ CcWifiConnectionList *cc_wifi_connection_list_new (NMClient     *client,
 void                  cc_wifi_connection_list_freeze (CcWifiConnectionList  *list);
 void                  cc_wifi_connection_list_thaw   (CcWifiConnectionList  *list);
 
+GtkListBox           *cc_wifi_connection_list_get_list_box (CcWifiConnectionList *self);
+
 G_END_DECLS
diff --git a/panels/network/cc-wifi-connection-row.c b/panels/network/cc-wifi-connection-row.c
index d1ded0fc9..30011c1cc 100644
--- a/panels/network/cc-wifi-connection-row.c
+++ b/panels/network/cc-wifi-connection-row.c
@@ -21,7 +21,7 @@
 
 struct _CcWifiConnectionRow
 {
-  GtkListBoxRow    parent_instance;
+  AdwActionRow     parent_instance;
 
   gboolean         constructed;
 
@@ -36,7 +36,6 @@ struct _CcWifiConnectionRow
   GtkCheckButton  *checkbutton;
   GtkSpinner      *connecting_spinner;
   GtkImage        *encrypted_icon;
-  GtkLabel        *name_label;
   GtkImage        *strength_icon;
 };
 
@@ -62,7 +61,7 @@ typedef enum
   NM_AP_SEC_OWE
 } NMAccessPointSecurity;
 
-G_DEFINE_TYPE (CcWifiConnectionRow, cc_wifi_connection_row, GTK_TYPE_LIST_BOX_ROW)
+G_DEFINE_TYPE (CcWifiConnectionRow, cc_wifi_connection_row, ADW_TYPE_ACTION_ROW)
 
 static GParamSpec *props[PROP_LAST];
 
@@ -208,13 +207,13 @@ update_ui (CcWifiConnectionRow *self)
                                            name, ssid_str);
         }
 
-      gtk_label_set_markup (self->name_label, title);
+      adw_preferences_row_set_title (ADW_PREFERENCES_ROW (self), title);
     }
   else
     {
       ssid = nm_access_point_get_ssid (best_ap);
       title = nm_utils_ssid_to_utf8 (g_bytes_get_data (ssid, NULL), g_bytes_get_size (ssid));
-      gtk_label_set_text (self->name_label, title);
+      adw_preferences_row_set_title (ADW_PREFERENCES_ROW (self), title);
     }
 
   if (active_connection)
@@ -321,20 +320,7 @@ cc_wifi_connection_row_constructed (GObject *object)
   G_OBJECT_CLASS (cc_wifi_connection_row_parent_class)->constructed (object);
 
   /* Reparent the label into the checkbox */
-  if (self->checkable)
-    {
-      gtk_widget_set_visible (GTK_WIDGET (self->checkbutton), TRUE);
-      g_object_ref (self->name_label);
-      gtk_container_remove (GTK_CONTAINER (gtk_widget_get_parent (GTK_WIDGET (self->name_label))),
-                            GTK_WIDGET (self->name_label));
-      gtk_container_add (GTK_CONTAINER (self->checkbutton), GTK_WIDGET (self->name_label));
-      gtk_widget_show (GTK_WIDGET (self->name_label));
-      g_object_unref (self->name_label);
-    }
-  else
-    {
-      gtk_widget_set_visible (GTK_WIDGET (self->checkbutton), FALSE);
-    }
+  gtk_widget_set_visible (GTK_WIDGET (self->checkbutton), self->checkable);
 
   update_ui (CC_WIFI_CONNECTION_ROW (object));
 }
@@ -456,7 +442,6 @@ cc_wifi_connection_row_class_init (CcWifiConnectionRowClass *klass)
   gtk_widget_class_bind_template_child (widget_class, CcWifiConnectionRow, checkbutton);
   gtk_widget_class_bind_template_child (widget_class, CcWifiConnectionRow, connecting_spinner);
   gtk_widget_class_bind_template_child (widget_class, CcWifiConnectionRow, encrypted_icon);
-  gtk_widget_class_bind_template_child (widget_class, CcWifiConnectionRow, name_label);
   gtk_widget_class_bind_template_child (widget_class, CcWifiConnectionRow, strength_icon);
 
   gtk_widget_class_bind_template_callback (widget_class, configure_clicked_cb);
diff --git a/panels/network/cc-wifi-connection-row.h b/panels/network/cc-wifi-connection-row.h
index 4be230523..d632cbf20 100644
--- a/panels/network/cc-wifi-connection-row.h
+++ b/panels/network/cc-wifi-connection-row.h
@@ -17,7 +17,7 @@
 
 #pragma once
 
-#include <gtk/gtk.h>
+#include <adwaita.h>
 #include <NetworkManager.h>
 
 G_BEGIN_DECLS
@@ -25,7 +25,7 @@ G_BEGIN_DECLS
 typedef struct _CcWifiConnectionRow CcWifiConnectionRow;
 
 #define CC_TYPE_WIFI_CONNECTION_ROW (cc_wifi_connection_row_get_type ())
-G_DECLARE_FINAL_TYPE (CcWifiConnectionRow, cc_wifi_connection_row, CC, WIFI_CONNECTION_ROW, GtkListBoxRow)
+G_DECLARE_FINAL_TYPE (CcWifiConnectionRow, cc_wifi_connection_row, CC, WIFI_CONNECTION_ROW, AdwActionRow)
 
 CcWifiConnectionRow *cc_wifi_connection_row_new                 (NMDeviceWifi  *device,
                                                                  NMConnection  *connection,
diff --git a/panels/network/cc-wifi-connection-row.ui b/panels/network/cc-wifi-connection-row.ui
index 39bb6db8b..6d4e618f8 100644
--- a/panels/network/cc-wifi-connection-row.ui
+++ b/panels/network/cc-wifi-connection-row.ui
@@ -2,68 +2,41 @@
 <!-- Generated with glade 3.20.0 -->
 <interface>
   <requires lib="gtk+" version="3.20"/>
-  <template class="CcWifiConnectionRow" parent="GtkListBoxRow">
-    <property name="visible">True</property>
-    <property name="can_focus">True</property>
-    <child>
+  <template class="CcWifiConnectionRow" parent="AdwActionRow">
+    <property name="activatable">True</property>
+    <child type="prefix">
       <object class="GtkBox">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
-        <property name="margin_start">12</property>
-        <property name="margin_end">12</property>
-        <property name="hexpand">True</property>
-        <property name="spacing">6</property>
+        <property name="valign">center</property>
+        <property name="margin_end">6</property>
         <child>
           <object class="GtkCheckButton" id="checkbutton">
-            <property name="visible">True</property>
-            <property name="can_focus">True</property>
-            <property name="receives_default">False</property>
             <property name="halign">start</property>
             <property name="valign">center</property>
-            <property name="draw_indicator">True</property>
-            <child>
-              <placeholder/>
-            </child>
+            <property name="margin_end">6</property>
           </object>
         </child>
         <child>
-          <object class="GtkBox">
-            <property name="visible">True</property>
-            <property name="valign">center</property>
-            <property name="margin_right">6</property>
-            <child>
-              <object class="GtkImage" id="strength_icon">
-                <property name="visible">True</property>
-                <property name="can_focus">False</property>
-                <property name="icon_name">network-wireless-signal-excellent-symbolic</property>
-                <property name="icon_size">1</property>
-              </object>
-            </child>
-            <child>
-              <object class="GtkImage" id="encrypted_icon">
-                <property name="visible">True</property>
-                <property name="can_focus">False</property>
-                <property name="valign">end</property>
-              </object>
-            </child>
+          <object class="GtkImage" id="strength_icon">
+            <property name="icon_name">network-wireless-signal-excellent-symbolic</property>
+            <property name="icon_size">1</property>
           </object>
         </child>
         <child>
-          <object class="GtkLabel" id="name_label">
-            <property name="visible">True</property>
-            <property name="can_focus">False</property>
-            <property name="halign">start</property>
-            <property name="hexpand">True</property>
-            <property name="margin_top">12</property>
-            <property name="margin_bottom">12</property>
-            <property name="label" translatable="no">Connection/SSID</property>
-            <property name="ellipsize">end</property>
+          <object class="GtkImage" id="encrypted_icon">
+            <property name="valign">end</property>
+            <property name="pixel-size">8</property>
           </object>
         </child>
+      </object>
+    </child>
+
+    <child type="suffix">
+      <object class="GtkBox">
+        <property name="valign">center</property>
+        <property name="margin_start">6</property>
+        <property name="spacing">6</property>
         <child>
           <object class="GtkLabel" id="active_label">
-            <property name="visible">True</property>
-            <property name="can_focus">False</property>
             <property name="margin_end">6</property>
             <property name="label" translatable="yes">Connected</property>
             <style>
@@ -74,8 +47,6 @@
         <child>
           <object class="GtkSpinner" id="connecting_spinner">
             <property name="name">connecting_spinner</property>
-            <property name="visible">True</property>
-            <property name="can_focus">False</property>
             <property name="halign">center</property>
             <property name="valign">center</property>
           </object>
@@ -83,31 +54,17 @@
         <child>
           <object class="GtkButton">
             <property name="name">options_button</property>
-            <property name="visible">True</property>
-            <property name="can_focus">True</property>
-            <property name="receives_default">True</property>
+            <property name="icon_name">emblem-system-symbolic</property>
             <property name="halign">center</property>
             <property name="valign">center</property>
             <signal name="clicked" handler="configure_clicked_cb" object="CcWifiConnectionRow" 
swapped="yes"/>
-            <child>
-              <object class="GtkImage">
-                <property name="visible">True</property>
-                <property name="can_focus">False</property>
-                <property name="icon_name">emblem-system-symbolic</property>
-                <property name="icon_size">1</property>
-              </object>
-            </child>
-            <child internal-child="accessible">
-              <object class="AtkObject">
-                <property name="AtkObject::accessible-name" translatable="yes">Options…</property>
-              </object>
-            </child>
-            <style>
-              <class name="image-button"/>
-            </style>
+            <accessibility>
+              <property name="label" translatable="yes">Options…</property>
+            </accessibility>
           </object>
         </child>
       </object>
     </child>
+
   </template>
 </interface>
diff --git a/panels/network/cc-wifi-hotspot-dialog.c b/panels/network/cc-wifi-hotspot-dialog.c
index 57f6d52a4..0610e2458 100644
--- a/panels/network/cc-wifi-hotspot-dialog.c
+++ b/panels/network/cc-wifi-hotspot-dialog.c
@@ -29,7 +29,6 @@
 #include <glib/gi18n.h>
 #include <libmm-glib.h>
 
-#include "list-box-helper.h"
 #include "cc-wifi-hotspot-dialog.h"
 #include "cc-network-resources.h"
 #include "ui-helpers.h"
@@ -40,7 +39,7 @@
 
 struct _CcWifiHotspotDialog
 {
-  GtkMessageDialog parent_instance;
+  GtkDialog        parent_instance;
 
   GtkLabel        *connection_label;
   GtkEntry        *name_entry;
@@ -56,7 +55,7 @@ struct _CcWifiHotspotDialog
   gboolean         wpa_supported; /* WPA/WPA2 supported */
 };
 
-G_DEFINE_TYPE (CcWifiHotspotDialog, cc_wifi_hotspot_dialog, GTK_TYPE_MESSAGE_DIALOG)
+G_DEFINE_TYPE (CcWifiHotspotDialog, cc_wifi_hotspot_dialog, GTK_TYPE_DIALOG)
 
 static gchar *
 get_random_wpa_key (void)
@@ -173,7 +172,7 @@ get_secrets_cb (GObject            *source_object,
     key = nm_setting_wireless_security_get_wep_key (security_setting, 0);
 
   if (key)
-    gtk_entry_set_text (self->password_entry, key);
+    gtk_editable_set_text (GTK_EDITABLE (self->password_entry), key);
 
   nm_connection_clear_secrets (self->connection);
 }
@@ -187,8 +186,8 @@ wifi_hotspot_dialog_update_entries (CcWifiHotspotDialog *self)
 
   g_assert (CC_IS_WIFI_HOTSPOT_DIALOG (self));
 
-  gtk_entry_set_text (self->name_entry, "");
-  gtk_entry_set_text (self->password_entry, "");
+  gtk_editable_set_text (GTK_EDITABLE (self->name_entry), "");
+  gtk_editable_set_text (GTK_EDITABLE (self->password_entry), "");
 
   if (!self->connection)
     return;
@@ -202,7 +201,7 @@ wifi_hotspot_dialog_update_entries (CcWifiHotspotDialog *self)
     ssid_text = g_strdup (self->host_name);
 
   if (ssid_text)
-    gtk_entry_set_text (self->name_entry, ssid_text);
+    gtk_editable_set_text (GTK_EDITABLE (self->name_entry), ssid_text);
 
   if (!NM_IS_REMOTE_CONNECTION (self->connection))
     return;
@@ -242,8 +241,8 @@ hotspot_entry_changed_cb (CcWifiHotspotDialog *self)
   g_assert (CC_IS_WIFI_HOTSPOT_DIALOG (self));
 
   valid_ssid = valid_password = FALSE;
-  ssid = gtk_entry_get_text (self->name_entry);
-  password = gtk_entry_get_text (self->password_entry);
+  ssid = gtk_editable_get_text (GTK_EDITABLE (self->name_entry));
+  password = gtk_editable_get_text (GTK_EDITABLE (self->password_entry));
 
   if (ssid && *ssid)
     {
@@ -293,7 +292,7 @@ generate_password_clicked_cb (CcWifiHotspotDialog *self)
   else
     key = get_random_wep_key ();
 
-  gtk_entry_set_text (self->password_entry, key);
+  gtk_editable_set_text (GTK_EDITABLE (self->password_entry), key);
 }
 
 static void
@@ -317,7 +316,7 @@ hotspot_update_wireless_settings (CcWifiHotspotDialog *self)
   else
     g_object_set (setting, "mode", "adhoc", NULL);
 
-  ssid_text = gtk_entry_get_text (self->name_entry);
+  ssid_text = gtk_editable_get_text (GTK_EDITABLE (self->name_entry));
   ssid = g_bytes_new (ssid_text, strlen (ssid_text));
   g_object_set (setting, "ssid", ssid, NULL);
 }
@@ -337,7 +336,7 @@ hotspot_update_wireless_security_settings (CcWifiHotspotDialog *self)
   nm_setting_wireless_security_clear_protos (setting);
   nm_setting_wireless_security_clear_pairwise (setting);
   nm_setting_wireless_security_clear_groups (setting);
-  value = gtk_entry_get_text (self->password_entry);
+  value = gtk_editable_get_text (GTK_EDITABLE (self->password_entry));
 
   if (self->wpa_supported)
     key_type = "psk";
@@ -412,7 +411,7 @@ cc_wifi_hotspot_dialog_show (GtkWidget *widget)
 
   if (!self->connection)
     if (self->host_name)
-      gtk_entry_set_text (self->name_entry, self->host_name);
+      gtk_editable_set_text (GTK_EDITABLE (self->name_entry), self->host_name);
 
   GTK_WIDGET_CLASS (cc_wifi_hotspot_dialog_parent_class)->show (widget);
 }
@@ -480,14 +479,9 @@ cc_wifi_hotspot_dialog_class_init (CcWifiHotspotDialogClass *klass)
 static void
 cc_wifi_hotspot_dialog_init (CcWifiHotspotDialog *self)
 {
-  g_autofree gchar *title = NULL;
-
   self->cancellable = g_cancellable_new ();
 
   gtk_widget_init_template (GTK_WIDGET (self));
-
-  title = g_strdup_printf ("<big><b>%s</b></big>", _("Turn On Wi-Fi Hotspot?"));
-  gtk_message_dialog_set_markup (GTK_MESSAGE_DIALOG (self), title);
 }
 
 CcWifiHotspotDialog *
@@ -496,8 +490,8 @@ cc_wifi_hotspot_dialog_new (GtkWindow *parent_window)
   g_return_val_if_fail (GTK_IS_WINDOW (parent_window), NULL);
 
   return g_object_new (CC_TYPE_WIFI_HOTSPOT_DIALOG,
+                       "use-header-bar", TRUE,
                        "transient-for", parent_window,
-                       "message-type", GTK_MESSAGE_OTHER,
                        NULL);
 }
 
diff --git a/panels/network/cc-wifi-hotspot-dialog.h b/panels/network/cc-wifi-hotspot-dialog.h
index 585d7f1d0..29a326dfa 100644
--- a/panels/network/cc-wifi-hotspot-dialog.h
+++ b/panels/network/cc-wifi-hotspot-dialog.h
@@ -30,7 +30,7 @@
 G_BEGIN_DECLS
 
 #define CC_TYPE_WIFI_HOTSPOT_DIALOG (cc_wifi_hotspot_dialog_get_type())
-G_DECLARE_FINAL_TYPE (CcWifiHotspotDialog, cc_wifi_hotspot_dialog, CC, WIFI_HOTSPOT_DIALOG, GtkMessageDialog)
+G_DECLARE_FINAL_TYPE (CcWifiHotspotDialog, cc_wifi_hotspot_dialog, CC, WIFI_HOTSPOT_DIALOG, GtkDialog)
 
 CcWifiHotspotDialog *cc_wifi_hotspot_dialog_new            (GtkWindow           *parent_window);
 void                 cc_wifi_hotspot_dialog_set_hostname   (CcWifiHotspotDialog *self,
diff --git a/panels/network/cc-wifi-hotspot-dialog.ui b/panels/network/cc-wifi-hotspot-dialog.ui
index 619e051c1..6552650a1 100644
--- a/panels/network/cc-wifi-hotspot-dialog.ui
+++ b/panels/network/cc-wifi-hotspot-dialog.ui
@@ -1,19 +1,28 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <interface>
-  <template class="CcWifiHotspotDialog" parent="GtkMessageDialog">
+  <template class="CcWifiHotspotDialog" parent="GtkDialog">
+    <property name="title" translatable="yes">Turn On Wi-Fi Hotspot?</property>
     <property name="modal">1</property>
     <property name="destroy-with-parent">1</property>
-    <property name="message-type">other</property>
-    <signal name="delete-event" handler="gtk_widget_hide_on_delete"/>
+    <property name="hide-on-close">True</property>
 
-    <child internal-child="message_area">
+    <child internal-child="headerbar">
+      <object class="GtkHeaderBar">
+        <property name="show-title-buttons">0</property>
+      </object>
+    </child>
+
+    <child internal-child="content_area">
       <object class="GtkBox">
-        <property name="visible">1</property>
-        <property name="margin-top">0</property>
+        <property name="orientation">vertical</property>
+        <property name="margin-top">30</property>
+        <property name="margin-bottom">30</property>
+        <property name="margin-start">30</property>
+        <property name="margin-end">30</property>
+        <property name="spacing">20</property>
 
         <child>
           <object class="GtkLabel" id="label">
-            <property name="visible">1</property>
             <property name="wrap">1</property>
             <property name="max-width-chars">50</property>
             <property name="label" translatable="yes">Wi-Fi hotspot allows others to share your internet 
connection, by creating a Wi-Fi network that they can connect to. To do this, you must have an internet 
connection through a source other than Wi-Fi.</property>
@@ -23,7 +32,6 @@
 
         <child>
           <object class="GtkLabel" id="connection_label">
-            <property name="visible">1</property>
             <property name="margin-bottom">18</property>
             <property name="wrap">1</property>
             <property name="max-width-chars">40</property>
@@ -34,7 +42,6 @@
 
         <child>
           <object class="GtkGrid">
-            <property name="visible">1</property>
             <property name="row-spacing">6</property>
             <property name="column-spacing">12</property>
 
@@ -43,24 +50,22 @@
               <object class="GtkLabel">
                 <property name="label" translatable="yes">Network Name</property>
                 <property name="halign">end</property>
-                <property name="visible">1</property>
+                <layout>
+                  <property name="column">0</property>
+                  <property name="row">0</property>
+                </layout>
               </object>
-              <packing>
-                <property name="left-attach">0</property>
-                <property name="top-attach">0</property>
-              </packing>
             </child>
             <child>
               <object class="GtkEntry" id="name_entry">
-                <property name="visible">1</property>
                 <property name="hexpand">1</property>
                 <property name="max-length">64</property>
                 <signal name="changed" handler="hotspot_entry_changed_cb" swapped="yes" />
+                <layout>
+                  <property name="column">1</property>
+                  <property name="row">0</property>
+                </layout>
               </object>
-              <packing>
-                <property name="left-attach">1</property>
-                <property name="top-attach">0</property>
-              </packing>
             </child>
 
             <!-- Hotspot Password -->
@@ -68,34 +73,35 @@
               <object class="GtkLabel">
                 <property name="label" translatable="yes">Password</property>
                 <property name="halign">end</property>
-                <property name="visible">1</property>
+                <layout>
+                  <property name="column">0</property>
+                  <property name="row">1</property>
+                </layout>
               </object>
-              <packing>
-                <property name="left-attach">0</property>
-                <property name="top-attach">1</property>
-              </packing>
             </child>
             <child>
               <object class="GtkEntry" id="password_entry">
-                <property name="visible">1</property>
                 <property name="max-length">64</property>
                 <property name="secondary-icon-name">view-refresh-symbolic</property>
                 <property name="secondary-icon-tooltip-text" translatable="yes">Generate Random 
Password</property>
                 <property name="placeholder-text" translatable="yes">Autogenerate Password</property>
                 <signal name="icon-press" handler="generate_password_clicked_cb" swapped="yes" />
                 <signal name="changed" handler="hotspot_entry_changed_cb" swapped="yes" />
+                <layout>
+                  <property name="column">1</property>
+                  <property name="row">1</property>
+                </layout>
               </object>
-              <packing>
-                <property name="left-attach">1</property>
-                <property name="top-attach">1</property>
-              </packing>
             </child>
 
             <!-- Error Label -->
             <child>
               <object class="GtkLabel" id="error_label">
                 <property name="halign">start</property>
-                <property name="visible">1</property>
+                <layout>
+                  <property name="column">1</property>
+                  <property name="row">2</property>
+                </layout>
                 <style>
                   <class name="dim-label" />
                 </style>
@@ -103,10 +109,6 @@
                   <attribute name="scale" value="0.83"/>
                 </attributes>
               </object>
-              <packing>
-                <property name="left-attach">1</property>
-                <property name="top-attach">2</property>
-              </packing>
             </child>
 
           </object>
@@ -117,15 +119,12 @@
 
     <child type="action">
       <object class="GtkButton" id="cancel_button">
-        <property name="visible">1</property>
         <property name="use-underline">1</property>
         <property name="label" translatable="yes">_Cancel</property>
       </object>
     </child>
     <child type="action">
       <object class="GtkButton" id="ok_button">
-        <property name="visible">1</property>
-        <property name="can-default">1</property>
         <property name="use-underline">1</property>
         <property name="label" translatable="yes">_Turn On</property>
       </object>
diff --git a/panels/network/cc-wifi-panel.c b/panels/network/cc-wifi-panel.c
index 9ca6e6ee5..1501803a8 100644
--- a/panels/network/cc-wifi-panel.c
+++ b/panels/network/cc-wifi-panel.c
@@ -355,12 +355,17 @@ wifi_panel_update_qr_image_cb (CcWifiPanel *self)
       str = get_qr_string_for_hotspot (self->client, hotspot);
       if (cc_qr_code_set_text (self->qr_code, str))
         {
+          g_autoptr(GdkPixbuf) pixbuf = NULL;
           cairo_surface_t *surface;
           gint scale;
 
           scale = gtk_widget_get_scale_factor (GTK_WIDGET (self->wifi_qr_image));
           surface = cc_qr_code_get_surface (self->qr_code, QR_IMAGE_SIZE, scale);
-          gtk_image_set_from_surface (self->wifi_qr_image, surface);
+          pixbuf = gdk_pixbuf_get_from_surface (surface,
+                                                0, 0,
+                                                QR_IMAGE_SIZE,
+                                                QR_IMAGE_SIZE);
+          gtk_image_set_from_pixbuf (self->wifi_qr_image, pixbuf);
         }
     }
 
@@ -426,10 +431,10 @@ remove_wifi_device (CcWifiPanel *self,
 
   /* Destroy all stack pages related to this device */
   child = gtk_stack_get_child_by_name (self->stack, id);
-  gtk_widget_destroy (child);
+  gtk_stack_remove (self->stack, child);
 
   child = gtk_stack_get_child_by_name (self->header_stack, id);
-  gtk_widget_destroy (child);
+  gtk_stack_remove (self->header_stack, child);
 
   /* Update the title widget */
   update_devices_names (self);
@@ -565,7 +570,7 @@ update_devices_names (CcWifiPanel *self)
       if (single_page_widget)
         {
           g_object_ref (single_page_widget);
-          gtk_container_remove (GTK_CONTAINER (self->center_stack), single_page_widget);
+          gtk_stack_remove (self->center_stack, single_page_widget);
           g_object_unref (single_page_widget);
         }
 
@@ -840,24 +845,39 @@ on_stack_visible_child_changed_cb (GtkStack    *stack,
           self->spinner_binding = g_object_bind_property (net_device,
                                                           "scanning",
                                                           self->spinner,
-                                                          "active",
+                                                          "spinning",
                                                           G_BINDING_DEFAULT | G_BINDING_SYNC_CREATE);
           break;
         }
     }
 }
 
+static void
+on_stop_hotspot_dialog_response_cb (GtkDialog   *dialog,
+                                    gint         response,
+                                    CcWifiPanel *self)
+{
+  if (response == GTK_RESPONSE_OK)
+    {
+      NetDeviceWifi *child;
+
+      child = NET_DEVICE_WIFI (gtk_stack_get_visible_child (self->stack));
+      net_device_wifi_turn_off_hotspot (child);
+    }
+
+  gtk_window_destroy (GTK_WINDOW (dialog));
+}
+
 static void
 hotspot_stop_clicked_cb (CcWifiPanel *self)
 {
   GtkWidget *dialog;
-  GtkWidget *window;
-  int response;
+  GtkNative *native;
 
   g_assert (CC_IS_WIFI_PANEL (self));
 
-  window = gtk_widget_get_toplevel (GTK_WIDGET (self));
-  dialog = gtk_message_dialog_new (GTK_WINDOW (window),
+  native = gtk_widget_get_native (GTK_WIDGET (self));
+  dialog = gtk_message_dialog_new (GTK_WINDOW (native),
                                    GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
                                    GTK_MESSAGE_OTHER,
                                    GTK_BUTTONS_NONE,
@@ -867,17 +887,9 @@ hotspot_stop_clicked_cb (CcWifiPanel *self)
                           _("_Stop Hotspot"), GTK_RESPONSE_OK,
                           NULL);
 
-  response = gtk_dialog_run (GTK_DIALOG (dialog));
-
-  if (response == GTK_RESPONSE_OK)
-    {
-      NetDeviceWifi *child;
-
-      child = NET_DEVICE_WIFI (gtk_stack_get_visible_child (self->stack));
-      net_device_wifi_turn_off_hotspot (child);
-    }
+  g_signal_connect (dialog, "response", G_CALLBACK (on_stop_hotspot_dialog_response_cb), self);
+  gtk_window_present (GTK_WINDOW (dialog));
 
-  gtk_widget_destroy (dialog);
 }
 
 /* Overrides */
diff --git a/panels/network/cc-wifi-panel.ui b/panels/network/cc-wifi-panel.ui
index 2ac7570f9..dfd12a8ac 100644
--- a/panels/network/cc-wifi-panel.ui
+++ b/panels/network/cc-wifi-panel.ui
@@ -2,17 +2,12 @@
 <interface>
   <requires lib="gtk+" version="3.20"/>
   <template class="CcWifiPanel" parent="CcPanel">
-    <property name="visible">True</property>
-    <property name="can-focus">False</property>
 
     <child>
       <object class="GtkScrolledWindow">
-        <property name="visible">True</property>
-        <property name="can-focus">False</property>
         <property name="hscrollbar-policy">never</property>
         <child>
-          <object class="HdyClamp">
-            <property name="visible">True</property>
+          <object class="AdwClamp">
             <property name="margin_top">32</property>
             <property name="margin_bottom">32</property>
             <property name="margin_start">12</property>
@@ -20,14 +15,12 @@
 
             <child>
               <object class="GtkBox">
-                <property name="visible">True</property>
                 <property name="hexpand">True</property>
                 <property name="orientation">vertical</property>
 
                 <!-- Airplane Mode -->
                 <child>
                   <object class="GtkListBox" id="rfkill_widget">
-                    <property name="visible">True</property>
                     <property name="margin_bottom">32</property>
                     <property name="selection-mode">none</property>
                     <style>
@@ -35,7 +28,6 @@
                     </style>
                     <child>
                       <object class="CcListRow" id="rfkill_row">
-                        <property name="visible">True</property>
                         <property name="margin-start">6</property>
                         <property name="margin-end">6</property>
                         <property name="margin-top">6</property>
@@ -53,271 +45,233 @@
 
                 <child>
                   <object class="GtkStack" id="main_stack">
-                    <property name="visible">True</property>
-                    <property name="can-focus">False</property>
-                    <property name="homogeneous">False</property>
+                    <property name="hhomogeneous">False</property>
+                    <property name="vhomogeneous">False</property>
                     <property name="transition_type">crossfade</property>
 
                     <!-- "No Wi-Fi Adapter" page -->
                     <child>
-                      <object class="GtkBox">
-                        <property name="visible">True</property>
-                        <property name="can_focus">False</property>
-                        <property name="expand">True</property>
-                        <property name="halign">center</property>
-                        <property name="valign">center</property>
-                        <property name="orientation">vertical</property>
-                        <child>
-                          <object class="GtkImage">
-                            <property name="visible">True</property>
-                            <property name="can_focus">False</property>
-                            <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="visible">True</property>
-                            <property name="can_focus">False</property>
-                            <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="visible">True</property>
-                            <property name="can_focus">False</property>
-                            <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>
-                      <packing>
+                      <object class="GtkStackPage">
                         <property name="name">no-wifi-devices</property>
-                      </packing>
-                    </child>
-
-                    <!-- "Airplane Mode" page -->
-                    <child>
-                      <object class="GtkBox">
-                        <property name="visible">True</property>
-                        <property name="can_focus">False</property>
-                        <property name="expand">True</property>
-                        <property name="halign">center</property>
-                        <property name="valign">center</property>
-                        <property name="orientation">vertical</property>
-                        <child>
-                          <object class="GtkImage">
-                            <property name="visible">True</property>
-                            <property name="can_focus">False</property>
-                            <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="visible">True</property>
-                            <property name="can_focus">False</property>
-                            <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="visible">True</property>
-                            <property name="can_focus">False</property>
-                            <property name="wrap">True</property>
-                            <property name="label" translatable="yes">Turn off to use Wi-Fi</property>
-                          </object>
-                        </child>
-                      </object>
-                      <packing>
-                        <property name="name">airplane-mode</property>
-                      </packing>
-                    </child>
-
-                    <!-- Wi-Fi connections and devices -->
-                    <child>
-                      <object class="GtkBox">
-                        <property name="visible">True</property>
-                        <property name="can-focus">False</property>
-                        <property name="orientation">vertical</property>
-
-                        <child>
-                          <object class="GtkBox" id="hotspot_box">
-                            <property name="visible">True</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>
-
-                            <!-- Hotspot QR code -->
                             <child>
-                              <object class="GtkImage" id="wifi_qr_image">
-                                <property name="visible">True</property>
-                                <property name="halign">center</property>
-                                <property name="width-request">180</property>
-                                <property name="height-request">180</property>
+                              <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="frame"/>
+                                  <class name="dim-label" />
                                 </style>
                               </object>
                             </child>
-
                             <child>
                               <object class="GtkLabel">
-                                <property name="visible">True</property>
-                                <property name="margin-top">12</property>
-                                <property name="label" translatable="yes">Wi-Fi Hotspot Active</property>
+                                <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.8" />
+                                  <attribute name="scale" value="1.2" />
                                 </attributes>
                               </object>
                             </child>
-
                             <child>
                               <object class="GtkLabel">
-                                <property name="visible">True</property>
-                                <property name="label" translatable="yes">Mobile devices can scan the QR 
code to connect.</property>
+                                <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>
+                        </property>
+                      </object>
+                    </child>
 
+                    <!-- "Airplane Mode" page -->
+                    <child>
+                      <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="GtkButton">
-                                <property name="visible">True</property>
-                                <property name="can-focus">True</property>
-                                <property name="halign">center</property>
-                                <property name="margin-top">12</property>
-                                <property name="label" translatable="yes">Turn Off Hotspot…</property>
-                                <signal name="clicked" handler="hotspot_stop_clicked_cb" swapped="yes"/>
+                              <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="destructive-action"/>
+                                  <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>
-                        </child>
+                        </property>
+                      </object>
+                    </child>
 
-                        <!-- Visible Networks label & spinner -->
-                        <child>
+                    <!-- Wi-Fi connections and devices -->
+                    <child>
+                      <object class="GtkStackPage">
+                        <property name="name">wifi-connections</property>
+                        <property name="child">
                           <object class="GtkBox">
-                            <property name="visible">True</property>
-                            <property name="hexpand">True</property>
-                            <property name="halign">start</property>
-                            <property name="spacing">6</property>
-                            <property name="margin_bottom">12</property>
+                            <property name="orientation">vertical</property>
+
                             <child>
-                              <object class="GtkLabel" id="list_label">
-                                <property name="visible">True</property>
-                                <property name="label" translatable="yes">Visible Networks</property>
-                                <property name="xalign">0.0</property>
-                                <attributes>
-                                  <attribute name="weight" value="bold"/>
-                                </attributes>
+                              <object class="GtkBox" id="hotspot_box">
+                                <property name="orientation">vertical</property>
+
+                                <!-- Hotspot QR code -->
+                                <child>
+                                  <object class="GtkImage" id="wifi_qr_image">
+                                    <property name="halign">center</property>
+                                    <property name="width-request">180</property>
+                                    <property name="height-request">180</property>
+                                    <style>
+                                      <class name="frame"/>
+                                    </style>
+                                  </object>
+                                </child>
+
+                                <child>
+                                  <object class="GtkLabel">
+                                    <property name="margin-top">12</property>
+                                    <property name="label" translatable="yes">Wi-Fi Hotspot Active</property>
+                                    <attributes>
+                                      <attribute name="weight" value="bold" />
+                                      <attribute name="scale" value="1.8" />
+                                    </attributes>
+                                  </object>
+                                </child>
+
+                                <child>
+                                  <object class="GtkLabel">
+                                    <property name="label" translatable="yes">Mobile devices can scan the QR 
code to connect.</property>
+                                  </object>
+                                </child>
+
+                                <child>
+                                  <object class="GtkButton">
+                                    <property name="halign">center</property>
+                                    <property name="margin-top">12</property>
+                                    <property name="label" translatable="yes">Turn Off Hotspot…</property>
+                                    <signal name="clicked" handler="hotspot_stop_clicked_cb" swapped="yes"/>
+                                    <style>
+                                      <class name="destructive-action"/>
+                                    </style>
+                                  </object>
+                                </child>
+
                               </object>
                             </child>
+
+                            <!-- Visible Networks label & spinner -->
                             <child>
-                              <object class="GtkSpinner" id="spinner">
-                                <property name="visible">True</property>
+                              <object class="GtkBox">
                                 <property name="hexpand">True</property>
+                                <property name="halign">start</property>
+                                <property name="spacing">6</property>
+                                <property name="margin_bottom">12</property>
+                                <child>
+                                  <object class="GtkLabel" id="list_label">
+                                    <property name="label" translatable="yes">Visible Networks</property>
+                                    <property name="xalign">0.0</property>
+                                    <attributes>
+                                      <attribute name="weight" value="bold"/>
+                                    </attributes>
+                                  </object>
+                                </child>
+                                <child>
+                                  <object class="GtkSpinner" id="spinner">
+                                    <property name="hexpand">True</property>
+                                  </object>
+                                </child>
                               </object>
                             </child>
-                          </object>
-                        </child>
 
-                        <!-- Stack with a listbox for each Wi-Fi device -->
-                        <child>
-                          <object class="GtkFrame">
-                            <property name="visible">True</property>
-                            <property name="valign">start</property>
-                            <style>
-                              <class name="view" />
-                            </style>
+                            <!-- Stack with a listbox for each Wi-Fi device -->
                             <child>
                               <object class="GtkStack" id="stack">
-                                <property name="visible">True</property>
                                 <property name="hexpand">True</property>
                                 <property name="vexpand">True</property>
                                 <property name="transition_type">crossfade</property>
                                 <signal name="notify::visible-child-name" 
handler="on_stack_visible_child_changed_cb" object="CcWifiPanel" swapped="no" />
                               </object>
                             </child>
-                          </object>
-                        </child>
 
+                          </object>
+                        </property>
                       </object>
-                      <packing>
-                        <property name="name">wifi-connections</property>
-                      </packing>
                     </child>
 
                     <!-- "NetworkManager Not Running" page -->
                     <child>
-                      <object class="GtkBox">
-                        <property name="visible">True</property>
-                        <property name="can_focus">False</property>
-                        <property name="expand">True</property>
-                        <property name="halign">center</property>
-                        <property name="valign">center</property>
-                        <property name="orientation">vertical</property>
-                        <property name="margin">18</property>
-                        <property name="spacing">18</property>
-                        <child type="center">
-                          <object class="GtkImage">
-                            <property name="visible">True</property>
-                            <property name="can_focus">False</property>
-                            <property name="icon_name">face-sad-symbolic</property>
-                            <property name="pixel_size">128</property>
-                            <style>
-                              <class name="dim-label" />
-                            </style>
-                          </object>
-                        </child>
-                        <child>
-                          <object class="GtkLabel">
-                            <property name="visible">True</property>
-                            <property name="can_focus">False</property>
-                            <property name="wrap">True</property>
-                            <property name="label" translatable="yes">NetworkManager needs to be 
running</property>
-                          </object>
-                          <packing>
-                            <property name="pack-type">end</property>
-                          </packing>
-                        </child>
-                        <child>
-                          <object class="GtkLabel">
-                            <property name="visible">True</property>
-                            <property name="can_focus">False</property>
-                            <property name="wrap">True</property>
-                            <property name="label" translatable="yes">Oops, something has gone wrong. Please 
contact your software vendor.</property>
-                            <attributes>
-                              <attribute name="scale" value="1.42" />
-                            </attributes>
+                      <object class="GtkStackPage">
+                        <property name="name">nm-not-running</property>
+                        <property name="child">
+                          <object class="GtkCenterBox">
+                            <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>
+                            <child type="center">
+                              <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="end">
+                              <object class="GtkLabel">
+                                <property name="wrap">True</property>
+                                <property name="label" translatable="yes">NetworkManager needs to be 
running</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 contact your software vendor.</property>
+                                <attributes>
+                                  <attribute name="scale" value="1.42" />
+                                </attributes>
+                              </object>
+                            </child>
                           </object>
-                          <packing>
-                            <property name="pack-type">end</property>
-                          </packing>
-                        </child>
+                        </property>
                       </object>
-                      <packing>
-                        <property name="name">nm-not-running</property>
-                      </packing>
                     </child>
+
                   </object>
                 </child>
 
@@ -333,26 +287,22 @@
 
   <!-- End Stack -->
   <object class="GtkStack" id="header_stack">
-    <property name="visible">True</property>
-    <property name="can_focus">False</property>
     <property name="halign">end</property>
   </object>
 
   <!-- Center Widget -->
   <object class="GtkStack" id="center_stack">
-    <property name="visible">True</property>
-    <property name="can_focus">False</property>
     <property name="halign">center</property>
     <property name="hhomogeneous">False</property>
     <child>
-      <object class="GtkStackSwitcher">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
-        <property name="stack">stack</property>
-      </object>
-      <packing>
+      <object class="GtkStackPage">
         <property name="name">many</property>
-      </packing>
+        <property name="child">
+          <object class="GtkStackSwitcher">
+            <property name="stack">stack</property>
+          </object>
+        </property>
+      </object>
     </child>
   </object>
 </interface>
diff --git a/panels/network/connection-editor/8021x-security-page.ui 
b/panels/network/connection-editor/8021x-security-page.ui
index cde5d85ee..5be96b357 100644
--- a/panels/network/connection-editor/8021x-security-page.ui
+++ b/panels/network/connection-editor/8021x-security-page.ui
@@ -2,8 +2,6 @@
 <interface>
   <!-- interface-requires gtk+ 3.0 -->
   <template class="CEPage8021xSecurity" parent="GtkGrid">
-    <property name="visible">True</property>
-    <property name="can_focus">False</property>
     <property name="margin_start">50</property>
     <property name="margin_end">50</property>
     <property name="margin_top">12</property>
@@ -14,49 +12,34 @@
     <property name="column_spacing">6</property>
     <child>
       <object class="GtkLabel" id="security_label">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
         <property name="xalign">1</property>
         <property name="label" translatable="yes">802.1x _Security</property>
         <property name="use_underline">True</property>
         <property name="mnemonic_widget">enable_8021x_switch</property>
+        <layout>
+          <property name="column">0</property>
+          <property name="row">0</property>
+        </layout>
       </object>
-      <packing>
-        <property name="left_attach">0</property>
-        <property name="top_attach">0</property>
-        <property name="width">1</property>
-        <property name="height">1</property>
-      </packing>
     </child>
     <child>
       <object class="GtkSwitch" id="enable_8021x_switch">
-        <property name="visible">True</property>
-        <property name="can_focus">True</property>
         <property name="halign">start</property>
         <property name="hexpand">True</property>
+        <layout>
+          <property name="column">1</property>
+          <property name="row">0</property>
+        </layout>
       </object>
-      <packing>
-        <property name="left_attach">1</property>
-        <property name="top_attach">0</property>
-        <property name="width">1</property>
-        <property name="height">1</property>
-      </packing>
     </child>
     <child>
       <object class="GtkBox" id="box">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
         <property name="orientation">vertical</property>
-        <child>
-          <placeholder/>
-        </child>
+        <layout>
+          <property name="column">0</property>
+          <property name="row">1</property>
+        </layout>
       </object>
-      <packing>
-        <property name="left_attach">0</property>
-        <property name="top_attach">1</property>
-        <property name="width">2</property>
-        <property name="height">1</property>
-      </packing>
     </child>
   </template>
 </interface>
diff --git a/panels/network/connection-editor/ce-ip-address-entry.c 
b/panels/network/connection-editor/ce-ip-address-entry.c
index 7bbcd6edd..586ea5d14 100644
--- a/panels/network/connection-editor/ce-ip-address-entry.c
+++ b/panels/network/connection-editor/ce-ip-address-entry.c
@@ -83,7 +83,7 @@ ce_ip_address_entry_is_empty (CEIPAddressEntry *self)
 
   g_return_val_if_fail (CE_IS_IP_ADDRESS_ENTRY (self), FALSE);
 
-  text = gtk_entry_get_text (GTK_ENTRY (self));
+  text = gtk_editable_get_text (GTK_EDITABLE (self));
   return text[0] == '\0';
 }
 
@@ -94,6 +94,6 @@ ce_ip_address_entry_is_valid (CEIPAddressEntry *self)
 
   g_return_val_if_fail (CE_IS_IP_ADDRESS_ENTRY (self), FALSE);
 
-  text = gtk_entry_get_text (GTK_ENTRY (self));
+  text = gtk_editable_get_text (GTK_EDITABLE (self));
   return text[0] == '\0' || nm_utils_ipaddr_valid (self->family, text);
 }
diff --git a/panels/network/connection-editor/ce-netmask-entry.c 
b/panels/network/connection-editor/ce-netmask-entry.c
index 9df5547d2..2fccf0fa4 100644
--- a/panels/network/connection-editor/ce-netmask-entry.c
+++ b/panels/network/connection-editor/ce-netmask-entry.c
@@ -107,7 +107,7 @@ ce_netmask_entry_is_empty (CENetmaskEntry *self)
 
   g_return_val_if_fail (CE_IS_NETMASK_ENTRY (self), FALSE);
 
-  text = gtk_entry_get_text (GTK_ENTRY (self));
+  text = gtk_editable_get_text (GTK_EDITABLE (self));
   return text[0] == '\0';
 }
 
@@ -118,7 +118,7 @@ ce_netmask_entry_is_valid (CENetmaskEntry *self)
 
   g_return_val_if_fail (CE_IS_NETMASK_ENTRY (self), FALSE);
 
-  text = gtk_entry_get_text (GTK_ENTRY (self));
+  text = gtk_editable_get_text (GTK_EDITABLE (self));
   return text[0] == '\0' || parse_netmask (text, NULL);
 }
 
@@ -130,7 +130,7 @@ ce_netmask_entry_get_prefix (CENetmaskEntry *self)
 
   g_return_val_if_fail (CE_IS_NETMASK_ENTRY (self), 0);
 
-  text = gtk_entry_get_text (GTK_ENTRY (self));
+  text = gtk_editable_get_text (GTK_EDITABLE (self));
   parse_netmask (text, &prefix);
 
   return prefix;
diff --git a/panels/network/connection-editor/ce-page-8021x-security.c 
b/panels/network/connection-editor/ce-page-8021x-security.c
index 1e4f1464a..3a15d0711 100644
--- a/panels/network/connection-editor/ce-page-8021x-security.c
+++ b/panels/network/connection-editor/ce-page-8021x-security.c
@@ -66,12 +66,10 @@ security_item_changed_cb (CEPage8021xSecurity *self)
 static void
 finish_setup (CEPage8021xSecurity *self, gpointer unused, GError *error, gpointer user_data)
 {
-       GtkWidget *parent;
-
        if (error)
                return;
 
-        self->group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
+       self->group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
 
        self->security = ws_wpa_eap_new (self->connection);
        if (!self->security) {
@@ -79,19 +77,18 @@ finish_setup (CEPage8021xSecurity *self, gpointer unused, GError *error, gpointe
                return;
        }
 
-        g_signal_connect_object (WIRELESS_SECURITY (self->security), "changed", G_CALLBACK 
(security_item_changed_cb), self, G_CONNECT_SWAPPED);
-       parent = gtk_widget_get_parent (GTK_WIDGET (self->security));
-       if (parent)
-               gtk_container_remove (GTK_CONTAINER (parent), GTK_WIDGET (self->security));
+       g_signal_connect_object (WIRELESS_SECURITY (self->security), "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));
 
        gtk_switch_set_active (self->enable_8021x_switch, self->initial_have_8021x);
        g_signal_connect_object (self->enable_8021x_switch, "notify::active", G_CALLBACK (enable_toggled), 
self, G_CONNECT_SWAPPED);
        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);
+       gtk_size_group_add_widget (self->group, GTK_WIDGET (self->security_label));
+       wireless_security_add_to_size_group (WIRELESS_SECURITY (self->security), self->group);
 
-       gtk_container_add (GTK_CONTAINER (self->box), GTK_WIDGET (self->security));
+       gtk_box_append (self->box, GTK_WIDGET (self->security));
 
 }
 
diff --git a/panels/network/connection-editor/ce-page-details.c 
b/panels/network/connection-editor/ce-page-details.c
index 390851569..ee335b1b2 100644
--- a/panels/network/connection-editor/ce-page-details.c
+++ b/panels/network/connection-editor/ce-page-details.c
@@ -177,7 +177,7 @@ all_user_changed (CEPageDetails *self)
         NMSettingConnection *sc;
 
         sc = nm_connection_get_setting_connection (self->connection);
-        all_users = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (self->all_user_check));
+        all_users = gtk_check_button_get_active (GTK_CHECK_BUTTON (self->all_user_check));
 
         g_object_set (sc, "permissions", NULL, NULL);
         if (!all_users)
@@ -192,7 +192,7 @@ restrict_data_changed (CEPageDetails *self)
 
         s_con = nm_connection_get_setting_connection (self->connection);
 
-        if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (self->restrict_data_check)))
+        if (gtk_check_button_get_active (GTK_CHECK_BUTTON (self->restrict_data_check)))
                 metered = NM_METERED_YES;
         else
                 metered = NM_METERED_NO;
@@ -220,8 +220,8 @@ update_restrict_data (CEPageDetails *self)
 
         metered = nm_setting_connection_get_metered (s_con);
 
-        gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (self->restrict_data_check),
-                                      metered == NM_METERED_YES || metered == NM_METERED_GUESS_YES);
+        gtk_check_button_set_active (GTK_CHECK_BUTTON (self->restrict_data_check),
+                                     metered == NM_METERED_YES || metered == NM_METERED_GUESS_YES);
         gtk_widget_show (GTK_WIDGET (self->restrict_data_check));
 
         g_signal_connect_object (self->restrict_data_check, "notify::active", G_CALLBACK 
(restrict_data_changed), self, G_CONNECT_SWAPPED);
@@ -456,8 +456,8 @@ connect_details_page (CEPageDetails *self)
         }
 
         /* All users check */
-        gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (self->all_user_check),
-                                      nm_setting_connection_get_num_permissions (sc) == 0);
+        gtk_check_button_set_active (GTK_CHECK_BUTTON (self->all_user_check),
+                                     nm_setting_connection_get_num_permissions (sc) == 0);
         g_signal_connect_object (self->all_user_check, "toggled", G_CALLBACK (all_user_changed), self, 
G_CONNECT_SWAPPED);
         g_signal_connect_object (self->all_user_check, "toggled", G_CALLBACK (ce_page_changed), self, 
G_CONNECT_SWAPPED);
 
diff --git a/panels/network/connection-editor/ce-page-ethernet.c 
b/panels/network/connection-editor/ce-page-ethernet.c
index 98fe46079..79c1b7d7b 100644
--- a/panels/network/connection-editor/ce-page-ethernet.c
+++ b/panels/network/connection-editor/ce-page-ethernet.c
@@ -72,8 +72,8 @@ mtu_output_cb (CEPageEthernet *self)
         else
                 buf = g_strdup_printf ("%d", val);
 
-        if (strcmp (buf, gtk_entry_get_text (GTK_ENTRY (self->mtu_spin))))
-                gtk_entry_set_text (GTK_ENTRY (self->mtu_spin), buf);
+        if (strcmp (buf, gtk_editable_get_text (GTK_EDITABLE (self->mtu_spin))))
+                gtk_editable_set_text (GTK_EDITABLE (self->mtu_spin), buf);
 }
 
 static void
@@ -86,7 +86,7 @@ connect_ethernet_page (CEPageEthernet *self)
         const gchar *cloned_mac;
 
         name = nm_setting_connection_get_id (self->setting_connection);
-        gtk_entry_set_text (self->name_entry, name);
+        gtk_editable_set_text (GTK_EDITABLE (self->name_entry), name);
 
         /* Device MAC address */
         mac_list = ce_page_get_mac_list (self->client, NM_TYPE_DEVICE_ETHERNET,
@@ -119,9 +119,9 @@ ui_to_setting (CEPageEthernet *self)
         const gchar *text;
         GtkWidget *entry;
 
-        entry = gtk_bin_get_child (GTK_BIN (self->mac_combo));
+        entry = gtk_combo_box_get_child (GTK_COMBO_BOX (self->mac_combo));
         if (entry) {
-                text = gtk_entry_get_text (GTK_ENTRY (entry));
+                text = gtk_editable_get_text (GTK_EDITABLE (entry));
                 device_mac = ce_page_trim_address (text);
         }
 
@@ -134,7 +134,7 @@ ui_to_setting (CEPageEthernet *self)
                       NULL);
 
         g_object_set (self->setting_connection,
-                      NM_SETTING_CONNECTION_ID, gtk_entry_get_text (self->name_entry),
+                      NM_SETTING_CONNECTION_ID, gtk_editable_get_text (GTK_EDITABLE (self->name_entry)),
                       NULL);
 }
 
@@ -153,9 +153,9 @@ ce_page_ethernet_validate (CEPage        *page,
         GtkWidget *entry;
         gboolean ret = TRUE;
 
-        entry = gtk_bin_get_child (GTK_BIN (self->mac_combo));
+        entry = gtk_combo_box_get_child (GTK_COMBO_BOX (self->mac_combo));
         if (entry) {
-                if (!ce_page_address_is_valid (gtk_entry_get_text (GTK_ENTRY (entry)))) {
+                if (!ce_page_address_is_valid (gtk_editable_get_text (GTK_EDITABLE (entry)))) {
                         widget_set_error (entry);
                         ret = FALSE;
                 } else {
@@ -164,10 +164,10 @@ ce_page_ethernet_validate (CEPage        *page,
         }
 
         if (!ce_page_cloned_mac_combo_valid (self->cloned_mac_combo)) {
-                widget_set_error (gtk_bin_get_child (GTK_BIN (self->cloned_mac_combo)));
+                widget_set_error (gtk_combo_box_get_child (GTK_COMBO_BOX (self->cloned_mac_combo)));
                 ret = FALSE;
         } else {
-                widget_unset_error (gtk_bin_get_child (GTK_BIN (self->cloned_mac_combo)));
+                widget_unset_error (gtk_combo_box_get_child (GTK_COMBO_BOX (self->cloned_mac_combo)));
         }
 
         if (!ret)
diff --git a/panels/network/connection-editor/ce-page-ip4.c b/panels/network/connection-editor/ce-page-ip4.c
index 140dedd75..36e586932 100644
--- a/panels/network/connection-editor/ce-page-ip4.c
+++ b/panels/network/connection-editor/ce-page-ip4.c
@@ -27,7 +27,6 @@
 #include <glib/gi18n.h>
 #include <NetworkManager.h>
 
-#include "list-box-helper.h"
 #include "ce-ip-address-entry.h"
 #include "ce-netmask-entry.h"
 #include "ce-page.h"
@@ -39,24 +38,24 @@ static void ensure_empty_routes_row (CEPageIP4 *self);
 
 struct _CEPageIP4
 {
-        GtkScrolledWindow parent;
+        AdwBin             parent;
 
         GtkBox            *address_box;
         GtkSizeGroup      *address_sizegroup;
         GtkSwitch         *auto_dns_switch;
         GtkSwitch         *auto_routes_switch;
-        GtkRadioButton    *automatic_radio;
+        GtkCheckButton    *automatic_radio;
         GtkBox            *content_box;
-        GtkRadioButton    *disabled_radio;
+        GtkCheckButton    *disabled_radio;
         GtkEntry          *dns_entry;
-        GtkRadioButton    *local_radio;
+        GtkCheckButton    *local_radio;
         GtkGrid           *main_box;
-        GtkRadioButton    *manual_radio;
+        GtkCheckButton    *manual_radio;
         GtkCheckButton    *never_default_check;
         GtkBox            *routes_box;
         GtkSizeGroup      *routes_metric_sizegroup;
         GtkSizeGroup      *routes_sizegroup;
-        GtkRadioButton    *shared_radio;
+        GtkCheckButton    *shared_radio;
 
         NMSettingIPConfig *setting;
 
@@ -66,7 +65,7 @@ struct _CEPageIP4
 
 static void ce_page_iface_init (CEPageInterface *);
 
-G_DEFINE_TYPE_WITH_CODE (CEPageIP4, ce_page_ip4, GTK_TYPE_SCROLLED_WINDOW,
+G_DEFINE_TYPE_WITH_CODE (CEPageIP4, ce_page_ip4, ADW_TYPE_BIN,
                          G_IMPLEMENT_INTERFACE (ce_page_get_type (), ce_page_iface_init))
 
 enum {
@@ -89,15 +88,15 @@ method_changed (CEPageIP4 *self)
         gboolean dns_enabled;
         gboolean routes_enabled;
 
-        if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (self->disabled_radio)) ||
-            gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (self->shared_radio))) {
+        if (gtk_check_button_get_active (GTK_CHECK_BUTTON (self->disabled_radio)) ||
+            gtk_check_button_get_active (GTK_CHECK_BUTTON (self->shared_radio))) {
                 addr_enabled = FALSE;
                 dns_enabled = FALSE;
                 routes_enabled = FALSE;
         } else {
-                addr_enabled = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (self->manual_radio));
-                dns_enabled = !gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (self->local_radio));
-                routes_enabled = !gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (self->local_radio));
+                addr_enabled = gtk_check_button_get_active (GTK_CHECK_BUTTON (self->manual_radio));
+                dns_enabled = !gtk_check_button_get_active (GTK_CHECK_BUTTON (self->local_radio));
+                routes_enabled = !gtk_check_button_get_active (GTK_CHECK_BUTTON (self->local_radio));
         }
 
         gtk_widget_set_visible (GTK_WIDGET (self->address_box), addr_enabled);
@@ -111,23 +110,24 @@ method_changed (CEPageIP4 *self)
 static void
 update_row_sensitivity (CEPageIP4 *self, GtkWidget *list)
 {
-        g_autoptr(GList) children = NULL;
+        GtkWidget *child;
         gint rows = 0, i = 0;
 
-        children = gtk_container_get_children (GTK_CONTAINER (list));
-        for (GList *l = children; l; l = l->next) {
-                GtkWidget *row = l->data;
+        for (child = gtk_widget_get_first_child (GTK_WIDGET (list));
+             child;
+             child = gtk_widget_get_next_sibling (child)) {
                 GtkWidget *button;
 
-                button = GTK_WIDGET (g_object_get_data (G_OBJECT (row), "delete-button"));
+                button = GTK_WIDGET (g_object_get_data (G_OBJECT (child), "delete-button"));
                 if (button != NULL)
                         rows++;
         }
-        for (GList *l = children; l; l = l->next) {
-                GtkWidget *row = l->data;
+        for (child = gtk_widget_get_first_child (GTK_WIDGET (list));
+             child;
+             child = gtk_widget_get_next_sibling (child)) {
                 GtkWidget *button;
 
-                button = GTK_WIDGET (g_object_get_data (G_OBJECT (row), "delete-button"));
+                button = GTK_WIDGET (g_object_get_data (G_OBJECT (child), "delete-button"));
                 if (button != NULL)
                         gtk_widget_set_sensitive (button, rows > 1 && ++i < rows);
         }
@@ -136,15 +136,15 @@ update_row_sensitivity (CEPageIP4 *self, GtkWidget *list)
 static void
 update_row_gateway_sensitivity (CEPageIP4 *self)
 {
-        g_autoptr(GList) children = NULL;
+        GtkWidget *child;
         gint rows = 0;
 
-        children = gtk_container_get_children (GTK_CONTAINER (self->address_list));
-        for (GList *l = children; l; l = l->next) {
-                GtkWidget *row = l->data;
+        for (child = gtk_widget_get_first_child (self->address_list);
+             child;
+             child = gtk_widget_get_next_sibling (child)) {
                 GtkWidget *entry;
 
-                entry = GTK_WIDGET (g_object_get_data (G_OBJECT (row), "gateway"));
+                entry = GTK_WIDGET (g_object_get_data (G_OBJECT (child), "gateway"));
 
                 gtk_widget_set_sensitive (entry, (rows == 0));
 
@@ -163,7 +163,7 @@ remove_row (CEPageIP4 *self, GtkButton *button)
         row = gtk_widget_get_parent (row_box);
         list = gtk_widget_get_parent (row);
 
-        gtk_container_remove (GTK_CONTAINER (list), row);
+        gtk_list_box_remove (GTK_LIST_BOX (list), row);
 
         ce_page_changed (CE_PAGE (self));
 
@@ -175,19 +175,20 @@ remove_row (CEPageIP4 *self, GtkButton *button)
 static gboolean
 validate_row (GtkWidget *row)
 {
+        GtkWidget *child;
         GtkWidget *box;
-        g_autoptr(GList) children = NULL;
         gboolean valid;
 
         valid = FALSE;
-        box = gtk_bin_get_child (GTK_BIN (row));
-        children = gtk_container_get_children (GTK_CONTAINER (box));
+        box = gtk_list_box_row_get_child (GTK_LIST_BOX_ROW (row));
 
-        for (GList *l = children; l != NULL; l = l->next) {
-                if (!GTK_IS_ENTRY (l->data))
+        for (child = gtk_widget_get_first_child (box);
+             child;
+             child = gtk_widget_get_next_sibling (child)) {
+                if (!GTK_IS_ENTRY (child))
                         continue;
 
-                valid = valid || gtk_entry_get_text_length (l->data) > 0;
+                valid = valid || gtk_entry_get_text_length (GTK_ENTRY (child)) > 0;
         }
 
         return valid;
@@ -203,55 +204,53 @@ add_address_row (CEPageIP4   *self,
         GtkWidget *row_box;
         GtkWidget *widget;
         GtkWidget *delete_button;
-        GtkWidget *image;
 
         row = gtk_list_box_row_new ();
+        gtk_list_box_row_set_activatable (GTK_LIST_BOX_ROW (row), FALSE);
 
         row_box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
-        gtk_style_context_add_class (gtk_widget_get_style_context (row_box), "linked");
+        gtk_widget_add_css_class (row_box, "linked");
 
         widget = GTK_WIDGET (ce_ip_address_entry_new (AF_INET));
         g_signal_connect_object (widget, "changed", G_CALLBACK (ce_page_changed), self, G_CONNECT_SWAPPED);
         g_signal_connect_object (widget, "activate", G_CALLBACK (ensure_empty_address_row), self, 
G_CONNECT_SWAPPED);
         g_object_set_data (G_OBJECT (row), "address", widget);
-        gtk_entry_set_text (GTK_ENTRY (widget), address);
-        gtk_entry_set_width_chars (GTK_ENTRY (widget), 16);
+        gtk_editable_set_text (GTK_EDITABLE (widget), address);
+        gtk_editable_set_width_chars (GTK_EDITABLE (widget), 16);
         gtk_widget_set_hexpand (widget, TRUE);
-        gtk_container_add (GTK_CONTAINER (row_box), widget);
+        gtk_box_append (GTK_BOX (row_box), widget);
 
         widget = GTK_WIDGET (ce_netmask_entry_new ());
         g_signal_connect_object (widget, "changed", G_CALLBACK (ce_page_changed), self, G_CONNECT_SWAPPED);
         g_signal_connect_object (widget, "activate", G_CALLBACK (ensure_empty_address_row), self, 
G_CONNECT_SWAPPED);
         g_object_set_data (G_OBJECT (row), "netmask", widget);
-        gtk_entry_set_text (GTK_ENTRY (widget), network);
-        gtk_entry_set_width_chars (GTK_ENTRY (widget), 16);
+        gtk_editable_set_text (GTK_EDITABLE (widget), network);
+        gtk_editable_set_width_chars (GTK_EDITABLE (widget), 16);
         gtk_widget_set_hexpand (widget, TRUE);
-        gtk_container_add (GTK_CONTAINER (row_box), widget);
+        gtk_box_append (GTK_BOX (row_box), widget);
 
         widget = GTK_WIDGET (ce_ip_address_entry_new (AF_INET));
         g_signal_connect_object (widget, "changed", G_CALLBACK (ce_page_changed), self, G_CONNECT_SWAPPED);
         g_signal_connect_object (widget, "activate", G_CALLBACK (ensure_empty_address_row), self, 
G_CONNECT_SWAPPED);
         g_object_set_data (G_OBJECT (row), "gateway", widget);
-        gtk_entry_set_text (GTK_ENTRY (widget), gateway ? gateway : "");
-        gtk_entry_set_width_chars (GTK_ENTRY (widget), 16);
+        gtk_editable_set_text (GTK_EDITABLE (widget), gateway ? gateway : "");
+        gtk_editable_set_width_chars (GTK_EDITABLE (widget), 16);
         gtk_widget_set_hexpand (widget, TRUE);
-        gtk_container_add (GTK_CONTAINER (row_box), widget);
+        gtk_box_append (GTK_BOX (row_box), widget);
 
-        delete_button = gtk_button_new ();
+        delete_button = gtk_button_new_from_icon_name ("edit-delete-symbolic");
         gtk_widget_set_sensitive (delete_button, FALSE);
-        gtk_style_context_add_class (gtk_widget_get_style_context (delete_button), "image-button");
         g_signal_connect_object (delete_button, "clicked", G_CALLBACK (remove_row), self, G_CONNECT_SWAPPED);
-        image = gtk_image_new_from_icon_name ("edit-delete-symbolic", GTK_ICON_SIZE_MENU);
-        atk_object_set_name (gtk_widget_get_accessible (delete_button), _("Delete Address"));
-        gtk_button_set_image (GTK_BUTTON (delete_button), image);
-        gtk_container_add (GTK_CONTAINER (row_box), delete_button);
+        gtk_accessible_update_property (GTK_ACCESSIBLE (delete_button),
+                                        GTK_ACCESSIBLE_PROPERTY_LABEL, _("Delete Address"),
+                                        -1);
+        gtk_box_append (GTK_BOX (row_box), delete_button);
         g_object_set_data (G_OBJECT (row), "delete-button", delete_button);
 
         gtk_size_group_add_widget (self->address_sizegroup, delete_button);
 
-        gtk_container_add (GTK_CONTAINER (row), row_box);
-        gtk_widget_show_all (row);
-        gtk_container_add (GTK_CONTAINER (self->address_list), row);
+        gtk_list_box_row_set_child (GTK_LIST_BOX_ROW (row), row_box);
+        gtk_list_box_append (GTK_LIST_BOX (self->address_list), row);
 
         update_row_gateway_sensitivity (self);
         update_row_sensitivity (self, self->address_list);
@@ -260,14 +259,10 @@ add_address_row (CEPageIP4   *self,
 static void
 ensure_empty_address_row (CEPageIP4 *self)
 {
-        g_autoptr(GList) children = NULL;
-        GList *l;
-
-        children = gtk_container_get_children (GTK_CONTAINER (self->address_list));
-        l = g_list_last (children);
+        GtkWidget *child = gtk_widget_get_last_child (self->address_list);
 
         /* Add the last, stub row if needed*/
-        if (!l || validate_row (l->data))
+        if (!child || validate_row (child))
                 add_address_row (self, "", "", "");
 }
 
@@ -279,8 +274,7 @@ add_address_box (CEPageIP4 *self)
 
         self->address_list = list = gtk_list_box_new ();
         gtk_list_box_set_selection_mode (GTK_LIST_BOX (list), GTK_SELECTION_NONE);
-        gtk_list_box_set_header_func (GTK_LIST_BOX (list), cc_list_box_update_header_func, NULL, NULL);
-        gtk_container_add (GTK_CONTAINER (self->address_box), list);
+        gtk_box_append (self->address_box, list);
 
         for (i = 0; i < nm_setting_ip_config_get_num_addresses (self->setting); i++) {
                 NMIPAddress *addr;
@@ -301,8 +295,6 @@ add_address_box (CEPageIP4 *self)
         }
         if (nm_setting_ip_config_get_num_addresses (self->setting) == 0)
                 ensure_empty_address_row (self);
-
-        gtk_widget_show_all (GTK_WIDGET (self->address_box));
 }
 
 static void
@@ -327,7 +319,7 @@ add_dns_section (CEPageIP4 *self)
                 g_string_append (string, address);
         }
 
-        gtk_entry_set_text (self->dns_entry, string->str);
+        gtk_editable_set_text (GTK_EDITABLE (self->dns_entry), string->str);
 
         g_signal_connect_object (self->dns_entry, "notify::text", G_CALLBACK (ce_page_changed), self, 
G_CONNECT_SWAPPED);
 
@@ -345,39 +337,39 @@ add_route_row (CEPageIP4   *self,
         GtkWidget *row_box;
         GtkWidget *widget;
         GtkWidget *delete_button;
-        GtkWidget *image;
 
         row = gtk_list_box_row_new ();
+        gtk_list_box_row_set_activatable (GTK_LIST_BOX_ROW (row), FALSE);
 
         row_box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
-        gtk_style_context_add_class (gtk_widget_get_style_context (row_box), "linked");
+        gtk_widget_add_css_class (row_box, "linked");
 
         widget = GTK_WIDGET (ce_ip_address_entry_new (AF_INET));
         g_signal_connect_object (widget, "changed", G_CALLBACK (ce_page_changed), self, G_CONNECT_SWAPPED);
         g_signal_connect_object (widget, "activate", G_CALLBACK (ensure_empty_routes_row), self, 
G_CONNECT_SWAPPED);
         g_object_set_data (G_OBJECT (row), "address", widget);
-        gtk_entry_set_text (GTK_ENTRY (widget), address);
-        gtk_entry_set_width_chars (GTK_ENTRY (widget), 16);
+        gtk_editable_set_text (GTK_EDITABLE (widget), address);
+        gtk_editable_set_width_chars (GTK_EDITABLE (widget), 16);
         gtk_widget_set_hexpand (widget, TRUE);
-        gtk_container_add (GTK_CONTAINER (row_box), widget);
+        gtk_box_append (GTK_BOX (row_box), widget);
 
         widget = GTK_WIDGET (ce_netmask_entry_new ());
         g_signal_connect_object (widget, "changed", G_CALLBACK (ce_page_changed), self, G_CONNECT_SWAPPED);
         g_signal_connect_object (widget, "activate", G_CALLBACK (ensure_empty_routes_row), self, 
G_CONNECT_SWAPPED);
         g_object_set_data (G_OBJECT (row), "netmask", widget);
-        gtk_entry_set_text (GTK_ENTRY (widget), netmask);
-        gtk_entry_set_width_chars (GTK_ENTRY (widget), 16);
+        gtk_editable_set_text (GTK_EDITABLE (widget), netmask);
+        gtk_editable_set_width_chars (GTK_EDITABLE (widget), 16);
         gtk_widget_set_hexpand (widget, TRUE);
-        gtk_container_add (GTK_CONTAINER (row_box), widget);
+        gtk_box_append (GTK_BOX (row_box), widget);
 
         widget = GTK_WIDGET (ce_ip_address_entry_new (AF_INET));
         g_signal_connect_object (widget, "changed", G_CALLBACK (ce_page_changed), self, G_CONNECT_SWAPPED);
         g_signal_connect_object (widget, "activate", G_CALLBACK (ensure_empty_routes_row), self, 
G_CONNECT_SWAPPED);
         g_object_set_data (G_OBJECT (row), "gateway", widget);
-        gtk_entry_set_text (GTK_ENTRY (widget), gateway ? gateway : "");
-        gtk_entry_set_width_chars (GTK_ENTRY (widget), 16);
+        gtk_editable_set_text (GTK_EDITABLE (widget), gateway ? gateway : "");
+        gtk_editable_set_width_chars (GTK_EDITABLE (widget), 16);
         gtk_widget_set_hexpand (widget, TRUE);
-        gtk_container_add (GTK_CONTAINER (row_box), widget);
+        gtk_box_append (GTK_BOX (row_box), widget);
 
         widget = gtk_entry_new ();
         g_signal_connect_object (widget, "changed", G_CALLBACK (ce_page_changed), self, G_CONNECT_SWAPPED);
@@ -385,30 +377,29 @@ add_route_row (CEPageIP4   *self,
         g_object_set_data (G_OBJECT (row), "metric", widget);
         if (metric >= 0) {
                 g_autofree gchar *s = g_strdup_printf ("%d", metric);
-                gtk_entry_set_text (GTK_ENTRY (widget), s);
+                gtk_editable_set_text (GTK_EDITABLE (widget), s);
         }
-        gtk_entry_set_width_chars (GTK_ENTRY (widget), 5);
+        gtk_editable_set_width_chars (GTK_EDITABLE (widget), 5);
         gtk_widget_set_hexpand (widget, TRUE);
-        gtk_container_add (GTK_CONTAINER (row_box), widget);
+        gtk_box_append (GTK_BOX (row_box), widget);
 
         gtk_size_group_add_widget (self->routes_metric_sizegroup, widget);
 
-        delete_button = gtk_button_new ();
-        gtk_style_context_add_class (gtk_widget_get_style_context (delete_button), "image-button");
+        delete_button = gtk_button_new_from_icon_name ("edit-delete-symbolic");
+        gtk_widget_set_sensitive (delete_button, FALSE);
         g_signal_connect_object (delete_button, "clicked", G_CALLBACK (remove_row), self, G_CONNECT_SWAPPED);
-        image = gtk_image_new_from_icon_name ("edit-delete-symbolic", GTK_ICON_SIZE_MENU);
-        atk_object_set_name (gtk_widget_get_accessible (delete_button), _("Delete Route"));
-        gtk_button_set_image (GTK_BUTTON (delete_button), image);
+        gtk_accessible_update_property (GTK_ACCESSIBLE (delete_button),
+                                        GTK_ACCESSIBLE_PROPERTY_LABEL, _("Delete Route"),
+                                        -1);
         gtk_widget_set_halign (delete_button, GTK_ALIGN_CENTER);
         gtk_widget_set_valign (delete_button, GTK_ALIGN_CENTER);
-        gtk_container_add (GTK_CONTAINER (row_box), delete_button);
+        gtk_box_append (GTK_BOX (row_box), delete_button);
         g_object_set_data (G_OBJECT (row), "delete-button", delete_button);
 
         gtk_size_group_add_widget (self->routes_sizegroup, delete_button);
 
-        gtk_container_add (GTK_CONTAINER (row), row_box);
-        gtk_widget_show_all (row);
-        gtk_container_add (GTK_CONTAINER (self->routes_list), row);
+        gtk_list_box_row_set_child (GTK_LIST_BOX_ROW (row), row_box);
+        gtk_list_box_append (GTK_LIST_BOX (self->routes_list), row);
 
         update_row_sensitivity (self, self->routes_list);
 }
@@ -416,14 +407,10 @@ add_route_row (CEPageIP4   *self,
 static void
 ensure_empty_routes_row (CEPageIP4 *self)
 {
-        g_autoptr(GList) children = NULL;
-        GList *l;
-
-        children = gtk_container_get_children (GTK_CONTAINER (self->routes_list));
-        l = g_list_last (children);
+        GtkWidget *child = gtk_widget_get_last_child (self->routes_list);
 
         /* Add the last, stub row if needed*/
-        if (!l || validate_row (l->data))
+        if (!child || validate_row (child))
                 add_route_row (self, "", "", "", -1);
 }
 
@@ -435,8 +422,7 @@ add_routes_box (CEPageIP4 *self)
 
         self->routes_list = list = gtk_list_box_new ();
         gtk_list_box_set_selection_mode (GTK_LIST_BOX (list), GTK_SELECTION_NONE);
-        gtk_list_box_set_header_func (GTK_LIST_BOX (list), cc_list_box_update_header_func, NULL, NULL);
-        gtk_container_add (GTK_CONTAINER (self->routes_box), list);
+        gtk_box_append (GTK_BOX (self->routes_box), list);
         gtk_switch_set_active (self->auto_routes_switch, !nm_setting_ip_config_get_ignore_auto_routes 
(self->setting));
         g_signal_connect_object (self->auto_routes_switch, "notify::active", G_CALLBACK (ce_page_changed), 
self, G_CONNECT_SWAPPED);
 
@@ -460,8 +446,6 @@ add_routes_box (CEPageIP4 *self)
         }
         if (nm_setting_ip_config_get_num_routes (self->setting) == 0)
                 ensure_empty_routes_row (self);
-
-        gtk_widget_show_all (GTK_WIDGET (self->routes_box));
 }
 
 static void
@@ -470,9 +454,6 @@ connect_ip4_page (CEPageIP4 *self)
         const gchar *str_method;
         guint method;
 
-        gtk_container_set_focus_vadjustment (GTK_CONTAINER (self->main_box),
-                                             gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW 
(self)));
-
         add_address_box (self);
         add_dns_section (self);
         add_routes_box (self);
@@ -499,8 +480,8 @@ connect_ip4_page (CEPageIP4 *self)
                 method = IP4_METHOD_DISABLED;
         }
 
-        gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (self->never_default_check),
-                                      nm_setting_ip_config_get_never_default (self->setting));
+        gtk_check_button_set_active (GTK_CHECK_BUTTON (self->never_default_check),
+                                     nm_setting_ip_config_get_never_default (self->setting));
         g_signal_connect_object (self->never_default_check, "toggled", G_CALLBACK (ce_page_changed), self, 
G_CONNECT_SWAPPED);
 
         g_signal_connect_object (self->automatic_radio, "toggled", G_CALLBACK (method_changed), self, 
G_CONNECT_SWAPPED);
@@ -510,19 +491,19 @@ connect_ip4_page (CEPageIP4 *self)
 
         switch (method) {
         case IP4_METHOD_AUTO:
-                gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (self->automatic_radio), TRUE);
+                gtk_check_button_set_active (GTK_CHECK_BUTTON (self->automatic_radio), TRUE);
                 break;
         case IP4_METHOD_LINK_LOCAL:
-                gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (self->local_radio), TRUE);
+                gtk_check_button_set_active (GTK_CHECK_BUTTON (self->local_radio), TRUE);
                 break;
         case IP4_METHOD_MANUAL:
-                gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (self->manual_radio), TRUE);
+                gtk_check_button_set_active (GTK_CHECK_BUTTON (self->manual_radio), TRUE);
                 break;
         case IP4_METHOD_SHARED:
-                gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (self->shared_radio), TRUE);
+                gtk_check_button_set_active (GTK_CHECK_BUTTON (self->shared_radio), TRUE);
                 break;
         case IP4_METHOD_DISABLED:
-                gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (self->disabled_radio), TRUE);
+                gtk_check_button_set_active (GTK_CHECK_BUTTON (self->disabled_radio), TRUE);
                 break;
         default:
                 break;
@@ -541,31 +522,33 @@ ui_to_setting (CEPageIP4 *self)
         GPtrArray *addresses = NULL;
         GPtrArray *dns_servers = NULL;
         GPtrArray *routes = NULL;
+        GtkWidget *child;
         GStrv dns_addresses = NULL;
-        g_autoptr(GList) address_children = NULL;
-        g_autoptr(GList) routes_children = NULL;
         gboolean ret = TRUE;
         const char *default_gateway = NULL;
+        gboolean add_addresses = FALSE;
+        gboolean add_routes = FALSE;
         gchar *dns_text = NULL;
         guint i;
 
-        if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (self->disabled_radio)))
+        if (gtk_check_button_get_active (GTK_CHECK_BUTTON (self->disabled_radio)))
                 method = NM_SETTING_IP4_CONFIG_METHOD_DISABLED;
-        else if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (self->automatic_radio)))
+        else if (gtk_check_button_get_active (GTK_CHECK_BUTTON (self->automatic_radio)))
                 method = NM_SETTING_IP4_CONFIG_METHOD_AUTO;
-        else if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (self->local_radio)))
+        else if (gtk_check_button_get_active (GTK_CHECK_BUTTON (self->local_radio)))
                 method = NM_SETTING_IP4_CONFIG_METHOD_LINK_LOCAL;
-        else if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (self->manual_radio)))
+        else if (gtk_check_button_get_active (GTK_CHECK_BUTTON (self->manual_radio)))
                 method = NM_SETTING_IP4_CONFIG_METHOD_MANUAL;
-        else if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (self->shared_radio)))
+        else if (gtk_check_button_get_active (GTK_CHECK_BUTTON (self->shared_radio)))
                 method = NM_SETTING_IP4_CONFIG_METHOD_SHARED;
 
         addresses = g_ptr_array_new_with_free_func ((GDestroyNotify) nm_ip_address_unref);
-        if (g_str_equal (method, NM_SETTING_IP4_CONFIG_METHOD_MANUAL))
-                address_children = gtk_container_get_children (GTK_CONTAINER (self->address_list));
+        add_addresses = g_str_equal (method, NM_SETTING_IP4_CONFIG_METHOD_MANUAL);
 
-        for (GList *l = address_children; l; l = l->next) {
-                GtkWidget *row = l->data;
+        for (child = gtk_widget_get_first_child (self->address_list);
+             add_addresses && child;
+             child = gtk_widget_get_next_sibling (child)) {
+                GtkWidget *row = child;
                 CEIPAddressEntry *address_entry;
                 CENetmaskEntry *netmask_entry;
                 CEIPAddressEntry *gateway_entry;
@@ -594,18 +577,18 @@ ui_to_setting (CEPageIP4 *self)
                 } else {
                          if (!ce_ip_address_entry_is_empty (gateway_entry)) {
                                  g_assert (default_gateway == NULL);
-                                 default_gateway = gtk_entry_get_text (GTK_ENTRY (gateway_entry));
+                                 default_gateway = gtk_editable_get_text (GTK_EDITABLE (gateway_entry));
                          }
                 }
 
                 if (!ret)
                         continue;
 
-                addr = nm_ip_address_new (AF_INET, gtk_entry_get_text (GTK_ENTRY (address_entry)), 
ce_netmask_entry_get_prefix (netmask_entry), NULL);
+                addr = nm_ip_address_new (AF_INET, gtk_editable_get_text (GTK_EDITABLE (address_entry)), 
ce_netmask_entry_get_prefix (netmask_entry), NULL);
                 if (addr)
                         g_ptr_array_add (addresses, addr);
 
-                if (!l || !l->next)
+                if (!gtk_widget_get_next_sibling (row))
                         ensure_empty_address_row (self);
         }
 
@@ -615,7 +598,7 @@ ui_to_setting (CEPageIP4 *self)
         }
 
         dns_servers = g_ptr_array_new_with_free_func (g_free);
-        dns_text = g_strstrip (g_strdup (gtk_entry_get_text (GTK_ENTRY (self->dns_entry))));
+        dns_text = g_strstrip (g_strdup (gtk_editable_get_text (GTK_EDITABLE (self->dns_entry))));
         if (g_str_equal (method, NM_SETTING_IP4_CONFIG_METHOD_AUTO) ||
             g_str_equal (method, NM_SETTING_IP4_CONFIG_METHOD_MANUAL))
                 dns_addresses = g_strsplit_set (dns_text, ", ", -1);
@@ -650,12 +633,13 @@ ui_to_setting (CEPageIP4 *self)
         }
 
         routes = g_ptr_array_new_with_free_func ((GDestroyNotify) nm_ip_route_unref);
-        if (g_str_equal (method, NM_SETTING_IP4_CONFIG_METHOD_AUTO) ||
-            g_str_equal (method, NM_SETTING_IP4_CONFIG_METHOD_MANUAL))
-                routes_children = gtk_container_get_children (GTK_CONTAINER (self->routes_list));
+        add_routes = g_str_equal (method, NM_SETTING_IP4_CONFIG_METHOD_AUTO) ||
+                     g_str_equal (method, NM_SETTING_IP4_CONFIG_METHOD_MANUAL);
 
-        for (GList *l = routes_children; l; l = l->next) {
-                GtkWidget *row = l->data;
+        for (child = gtk_widget_get_first_child (self->routes_list);
+             add_routes && child;
+             child = gtk_widget_get_next_sibling (child)) {
+                GtkWidget *row = child;
                 CEIPAddressEntry *address_entry;
                 CENetmaskEntry *netmask_entry;
                 CEIPAddressEntry *gateway_entry;
@@ -669,7 +653,7 @@ ui_to_setting (CEPageIP4 *self)
 
                 netmask_entry = CE_NETMASK_ENTRY (g_object_get_data (G_OBJECT (row), "netmask"));
                 gateway_entry = CE_IP_ADDRESS_ENTRY (g_object_get_data (G_OBJECT (row), "gateway"));
-                text_metric = gtk_entry_get_text (GTK_ENTRY (g_object_get_data (G_OBJECT (row), "metric")));
+                text_metric = gtk_editable_get_text (GTK_EDITABLE (g_object_get_data (G_OBJECT (row), 
"metric")));
 
                 if (ce_ip_address_entry_is_empty (address_entry) && ce_netmask_entry_is_empty 
(netmask_entry) && ce_ip_address_entry_is_empty (gateway_entry) && !*text_metric) {
                         /* ignore empty rows */
@@ -702,11 +686,15 @@ ui_to_setting (CEPageIP4 *self)
                 if (!ret)
                         continue;
 
-                route = nm_ip_route_new (AF_INET, gtk_entry_get_text (GTK_ENTRY (address_entry)), 
ce_netmask_entry_get_prefix (netmask_entry), gtk_entry_get_text (GTK_ENTRY (gateway_entry)), metric, NULL);
+                route = nm_ip_route_new (AF_INET,
+                                         gtk_editable_get_text (GTK_EDITABLE (address_entry)),
+                                         ce_netmask_entry_get_prefix (netmask_entry),
+                                         gtk_editable_get_text (GTK_EDITABLE (gateway_entry)),
+                                         metric, NULL);
                 if (route)
                         g_ptr_array_add (routes, route);
 
-                if (!l || !l->next)
+                if (!gtk_widget_get_next_sibling (row))
                         ensure_empty_routes_row (self);
         }
 
@@ -720,7 +708,7 @@ ui_to_setting (CEPageIP4 *self)
 
         ignore_auto_dns = !gtk_switch_get_active (self->auto_dns_switch);
         ignore_auto_routes = !gtk_switch_get_active (self->auto_routes_switch);
-        never_default = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (self->never_default_check));
+        never_default = gtk_check_button_get_active (GTK_CHECK_BUTTON (self->never_default_check));
 
         g_object_set (self->setting,
                       NM_SETTING_IP_CONFIG_METHOD, method,
diff --git a/panels/network/connection-editor/ce-page-ip4.h b/panels/network/connection-editor/ce-page-ip4.h
index b76905d3b..3e6545f89 100644
--- a/panels/network/connection-editor/ce-page-ip4.h
+++ b/panels/network/connection-editor/ce-page-ip4.h
@@ -21,12 +21,12 @@
 
 #pragma once
 
-#include <gtk/gtk.h>
+#include <adwaita.h>
 #include <NetworkManager.h>
 
 G_BEGIN_DECLS
 
-G_DECLARE_FINAL_TYPE (CEPageIP4, ce_page_ip4, CE, PAGE_IP4, GtkScrolledWindow)
+G_DECLARE_FINAL_TYPE (CEPageIP4, ce_page_ip4, CE, PAGE_IP4, AdwBin)
 
 CEPageIP4 *ce_page_ip4_new (NMConnection     *connection,
                             NMClient         *client);
diff --git a/panels/network/connection-editor/ce-page-ip6.c b/panels/network/connection-editor/ce-page-ip6.c
index 06e1842b5..d75eef3cb 100644
--- a/panels/network/connection-editor/ce-page-ip6.c
+++ b/panels/network/connection-editor/ce-page-ip6.c
@@ -27,7 +27,6 @@
 #include <glib/gi18n.h>
 #include <NetworkManager.h>
 
-#include "list-box-helper.h"
 #include "ce-ip-address-entry.h"
 #include "ce-page.h"
 #include "ce-page-ip6.h"
@@ -39,25 +38,25 @@ static void ensure_empty_routes_row (CEPageIP6 *self);
 
 struct _CEPageIP6
 {
-        GtkScrolledWindow parent;
+        AdwBin            parent;
 
         GtkBox            *address_box;
         GtkSizeGroup      *address_sizegroup;
         GtkSwitch         *auto_dns_switch;
         GtkSwitch         *auto_routes_switch;
-        GtkRadioButton    *automatic_radio;
+        GtkCheckButton    *automatic_radio;
         GtkBox            *content_box;
-        GtkRadioButton    *dhcp_radio;
-        GtkRadioButton    *disabled_radio;
+        GtkCheckButton    *dhcp_radio;
+        GtkCheckButton    *disabled_radio;
         GtkEntry          *dns_entry;
-        GtkRadioButton    *local_radio;
+        GtkCheckButton    *local_radio;
         GtkGrid           *main_box;
-        GtkRadioButton    *manual_radio;
+        GtkCheckButton    *manual_radio;
         GtkCheckButton    *never_default_check;
         GtkBox            *routes_box;
         GtkSizeGroup      *routes_metric_sizegroup;
         GtkSizeGroup      *routes_sizegroup;
-        GtkRadioButton    *shared_radio;
+        GtkCheckButton    *shared_radio;
 
         NMSettingIPConfig *setting;
 
@@ -67,7 +66,7 @@ struct _CEPageIP6
 
 static void ce_page_iface_init (CEPageInterface *);
 
-G_DEFINE_TYPE_WITH_CODE (CEPageIP6, ce_page_ip6, GTK_TYPE_SCROLLED_WINDOW,
+G_DEFINE_TYPE_WITH_CODE (CEPageIP6, ce_page_ip6, ADW_TYPE_BIN,
                          G_IMPLEMENT_INTERFACE (ce_page_get_type (), ce_page_iface_init))
 
 enum {
@@ -91,15 +90,15 @@ method_changed (CEPageIP6 *self)
         gboolean dns_enabled;
         gboolean routes_enabled;
 
-        if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (self->disabled_radio)) ||
-            gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (self->shared_radio))) {
+        if (gtk_check_button_get_active (self->disabled_radio) ||
+            gtk_check_button_get_active (self->shared_radio)) {
                 addr_enabled = FALSE;
                 dns_enabled = FALSE;
                 routes_enabled = FALSE;
         } else {
-                addr_enabled = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (self->manual_radio));
-                dns_enabled = !gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (self->local_radio));
-                routes_enabled = !gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (self->local_radio));
+                addr_enabled = gtk_check_button_get_active (self->manual_radio);
+                dns_enabled = !gtk_check_button_get_active (self->local_radio);
+                routes_enabled = !gtk_check_button_get_active (self->local_radio);
         }
 
         gtk_widget_set_visible (GTK_WIDGET (self->address_box), addr_enabled);
@@ -113,23 +112,24 @@ method_changed (CEPageIP6 *self)
 static void
 update_row_sensitivity (CEPageIP6 *self, GtkWidget *list)
 {
-        g_autoptr(GList) children = NULL;
+        GtkWidget *child;
         gint rows = 0, i = 0;
 
-        children = gtk_container_get_children (GTK_CONTAINER (list));
-        for (GList *l = children; l; l = l->next) {
-                GtkWidget *row = l->data;
+        for (child = gtk_widget_get_first_child (GTK_WIDGET (list));
+             child;
+             child = gtk_widget_get_next_sibling (child)) {
                 GtkWidget *button;
 
-                button = GTK_WIDGET (g_object_get_data (G_OBJECT (row), "delete-button"));
+                button = GTK_WIDGET (g_object_get_data (G_OBJECT (child), "delete-button"));
                 if (button != NULL)
                         rows++;
         }
-        for (GList *l = children; l; l = l->next) {
-                GtkWidget *row = l->data;
+        for (child = gtk_widget_get_first_child (GTK_WIDGET (list));
+             child;
+             child = gtk_widget_get_next_sibling (child)) {
                 GtkWidget *button;
 
-                button = GTK_WIDGET (g_object_get_data (G_OBJECT (row), "delete-button"));
+                button = GTK_WIDGET (g_object_get_data (G_OBJECT (child), "delete-button"));
                 if (button != NULL)
                         gtk_widget_set_sensitive (button, rows > 1 && ++i < rows);
         }
@@ -146,7 +146,7 @@ remove_row (CEPageIP6 *self, GtkButton *button)
         row = gtk_widget_get_parent (row_box);
         list = gtk_widget_get_parent (row);
 
-        gtk_container_remove (GTK_CONTAINER (list), row);
+        gtk_list_box_remove (GTK_LIST_BOX (list), row);
 
         ce_page_changed (CE_PAGE (self));
 
@@ -156,19 +156,20 @@ remove_row (CEPageIP6 *self, GtkButton *button)
 static gboolean
 validate_row (GtkWidget *row)
 {
+        GtkWidget *child;
         GtkWidget *box;
-        g_autoptr(GList) children = NULL;
         gboolean valid;
 
         valid = FALSE;
-        box = gtk_bin_get_child (GTK_BIN (row));
-        children = gtk_container_get_children (GTK_CONTAINER (box));
+        box = gtk_list_box_row_get_child (GTK_LIST_BOX_ROW (row));
 
-        for (GList *l = children; l != NULL; l = l->next) {
-                if (!GTK_IS_ENTRY (l->data))
+        for (child = gtk_widget_get_first_child (box);
+             child;
+             child = gtk_widget_get_next_sibling (child)) {
+                if (!GTK_IS_ENTRY (child))
                         continue;
 
-                valid = valid || gtk_entry_get_text_length (l->data) > 0;
+                valid = valid || gtk_entry_get_text_length (GTK_ENTRY (child)) > 0;
         }
 
         return valid;
@@ -184,55 +185,53 @@ add_address_row (CEPageIP6   *self,
         GtkWidget *row_box;
         GtkWidget *widget;
         GtkWidget *delete_button;
-        GtkWidget *image;
 
         row = gtk_list_box_row_new ();
+        gtk_list_box_row_set_activatable (GTK_LIST_BOX_ROW (row), FALSE);
 
         row_box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
-        gtk_style_context_add_class (gtk_widget_get_style_context (row_box), "linked");
+        gtk_widget_add_css_class (row_box, "linked");
 
         widget = GTK_WIDGET (ce_ip_address_entry_new (AF_INET6));
         g_signal_connect_object (widget, "changed", G_CALLBACK (ce_page_changed), self, G_CONNECT_SWAPPED);
         g_signal_connect_object (widget, "activate", G_CALLBACK (ensure_empty_address_row), self, 
G_CONNECT_SWAPPED);
         g_object_set_data (G_OBJECT (row), "address", widget);
-        gtk_entry_set_text (GTK_ENTRY (widget), address);
-        gtk_entry_set_width_chars (GTK_ENTRY (widget), 16);
+        gtk_editable_set_text (GTK_EDITABLE (widget), address);
+        gtk_editable_set_width_chars (GTK_EDITABLE (widget), 16);
         gtk_widget_set_hexpand (widget, TRUE);
-        gtk_container_add (GTK_CONTAINER (row_box), widget);
+        gtk_box_append (GTK_BOX (row_box), widget);
 
         widget = gtk_entry_new ();
         g_signal_connect_object (widget, "changed", G_CALLBACK (ce_page_changed), self, G_CONNECT_SWAPPED);
         g_signal_connect_object (widget, "activate", G_CALLBACK (ensure_empty_address_row), self, 
G_CONNECT_SWAPPED);
         g_object_set_data (G_OBJECT (row), "prefix", widget);
-        gtk_entry_set_text (GTK_ENTRY (widget), network);
-        gtk_entry_set_width_chars (GTK_ENTRY (widget), 16);
+        gtk_editable_set_text (GTK_EDITABLE (widget), network);
+        gtk_editable_set_width_chars (GTK_EDITABLE (widget), 16);
         gtk_widget_set_hexpand (widget, TRUE);
-        gtk_container_add (GTK_CONTAINER (row_box), widget);
+        gtk_box_append (GTK_BOX (row_box), widget);
 
         widget = GTK_WIDGET (ce_ip_address_entry_new (AF_INET6));
         g_signal_connect_object (widget, "changed", G_CALLBACK (ce_page_changed), self, G_CONNECT_SWAPPED);
         g_signal_connect_object (widget, "activate", G_CALLBACK (ensure_empty_address_row), self, 
G_CONNECT_SWAPPED);
         g_object_set_data (G_OBJECT (row), "gateway", widget);
-        gtk_entry_set_text (GTK_ENTRY (widget), gateway ? gateway : "");
-        gtk_entry_set_width_chars (GTK_ENTRY (widget), 16);
+        gtk_editable_set_text (GTK_EDITABLE (widget), gateway ? gateway : "");
+        gtk_editable_set_width_chars (GTK_EDITABLE (widget), 16);
         gtk_widget_set_hexpand (widget, TRUE);
-        gtk_container_add (GTK_CONTAINER (row_box), widget);
+        gtk_box_append (GTK_BOX (row_box), widget);
 
-        delete_button = gtk_button_new ();
+        delete_button = gtk_button_new_from_icon_name ("edit-delete-symbolic");
         gtk_widget_set_sensitive (delete_button, FALSE);
-        gtk_style_context_add_class (gtk_widget_get_style_context (delete_button), "image-button");
         g_signal_connect_object (delete_button, "clicked", G_CALLBACK (remove_row), self, G_CONNECT_SWAPPED);
-        image = gtk_image_new_from_icon_name ("edit-delete-symbolic", GTK_ICON_SIZE_MENU);
-        atk_object_set_name (gtk_widget_get_accessible (delete_button), _("Delete Address"));
-        gtk_button_set_image (GTK_BUTTON (delete_button), image);
-        gtk_container_add (GTK_CONTAINER (row_box), delete_button);
+        gtk_accessible_update_property (GTK_ACCESSIBLE (delete_button),
+                                        GTK_ACCESSIBLE_PROPERTY_LABEL, _("Delete Address"),
+                                        -1);
+        gtk_box_append (GTK_BOX (row_box), delete_button);
         g_object_set_data (G_OBJECT (row), "delete-button", delete_button);
 
         gtk_size_group_add_widget (self->address_sizegroup, delete_button);
 
-        gtk_container_add (GTK_CONTAINER (row), row_box);
-        gtk_widget_show_all (row);
-        gtk_container_add (GTK_CONTAINER (self->address_list), row);
+        gtk_list_box_row_set_child (GTK_LIST_BOX_ROW (row), row_box);
+        gtk_list_box_append (GTK_LIST_BOX (self->address_list), row);
 
         update_row_sensitivity (self, self->address_list);
 }
@@ -240,14 +239,10 @@ add_address_row (CEPageIP6   *self,
 static void
 ensure_empty_address_row (CEPageIP6 *self)
 {
-        g_autoptr(GList) children = NULL;
-        GList *l;
-
-        children = gtk_container_get_children (GTK_CONTAINER (self->address_list));
-        l = g_list_last (children);
+        GtkWidget *child = gtk_widget_get_last_child (self->address_list);
 
         /* Add the last, stub row if needed*/
-        if (!l || validate_row (l->data))
+        if (!child || validate_row (child))
                 add_address_row (self, "", "", "");
 }
 
@@ -259,8 +254,7 @@ add_address_box (CEPageIP6 *self)
 
         self->address_list = list = gtk_list_box_new ();
         gtk_list_box_set_selection_mode (GTK_LIST_BOX (list), GTK_SELECTION_NONE);
-        gtk_list_box_set_header_func (GTK_LIST_BOX (list), cc_list_box_update_header_func, NULL, NULL);
-        gtk_container_add (GTK_CONTAINER (self->address_box), list);
+        gtk_box_append (self->address_box, list);
 
         for (i = 0; i < nm_setting_ip_config_get_num_addresses (self->setting); i++) {
                 NMIPAddress *addr;
@@ -273,8 +267,6 @@ add_address_box (CEPageIP6 *self)
         }
         if (nm_setting_ip_config_get_num_addresses (self->setting) == 0)
                 ensure_empty_address_row (self);
-
-        gtk_widget_show_all (GTK_WIDGET (self->address_box));
 }
 
 static void
@@ -300,7 +292,7 @@ add_dns_section (CEPageIP6 *self)
 
         }
 
-        gtk_entry_set_text (self->dns_entry, string->str);
+        gtk_editable_set_text (GTK_EDITABLE (self->dns_entry), string->str);
 
         g_signal_connect_object (self->dns_entry, "notify::text", G_CALLBACK (ce_page_changed), self, 
G_CONNECT_SWAPPED);
 
@@ -318,67 +310,65 @@ add_route_row (CEPageIP6   *self,
         GtkWidget *row_box;
         GtkWidget *widget;
         GtkWidget *delete_button;
-        GtkWidget *image;
 
         row = gtk_list_box_row_new ();
+        gtk_list_box_row_set_activatable (GTK_LIST_BOX_ROW (row), FALSE);
 
         row_box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
-        gtk_style_context_add_class (gtk_widget_get_style_context (row_box), "linked");
+        gtk_widget_add_css_class (row_box, "linked");
 
         widget = GTK_WIDGET (ce_ip_address_entry_new (AF_INET6));
         g_signal_connect_object (widget, "changed", G_CALLBACK (ce_page_changed), self, G_CONNECT_SWAPPED);
         g_signal_connect_object (widget, "activate", G_CALLBACK (ensure_empty_routes_row), self, 
G_CONNECT_SWAPPED);
         g_object_set_data (G_OBJECT (row), "address", widget);
-        gtk_entry_set_text (GTK_ENTRY (widget), address);
-        gtk_entry_set_width_chars (GTK_ENTRY (widget), 16);
+        gtk_editable_set_text (GTK_EDITABLE (widget), address);
+        gtk_editable_set_width_chars (GTK_EDITABLE (widget), 16);
         gtk_widget_set_hexpand (widget, TRUE);
-        gtk_container_add (GTK_CONTAINER (row_box), widget);
+        gtk_box_append (GTK_BOX (row_box), widget);
 
         widget = gtk_entry_new ();
         g_signal_connect_object (widget, "changed", G_CALLBACK (ce_page_changed), self, G_CONNECT_SWAPPED);
         g_signal_connect_object (widget, "activate", G_CALLBACK (ensure_empty_routes_row), self, 
G_CONNECT_SWAPPED);
         g_object_set_data (G_OBJECT (row), "prefix", widget);
-        gtk_entry_set_text (GTK_ENTRY (widget), prefix ? prefix : "");
-        gtk_entry_set_width_chars (GTK_ENTRY (widget), 16);
+        gtk_editable_set_text (GTK_EDITABLE (widget), prefix ? prefix : "");
+        gtk_editable_set_width_chars (GTK_EDITABLE (widget), 16);
         gtk_widget_set_hexpand (widget, TRUE);
-        gtk_container_add (GTK_CONTAINER (row_box), widget);
+        gtk_box_append (GTK_BOX (row_box), widget);
 
         widget = GTK_WIDGET (ce_ip_address_entry_new (AF_INET6));
         g_signal_connect_object (widget, "changed", G_CALLBACK (ce_page_changed), self, G_CONNECT_SWAPPED);
         g_signal_connect_object (widget, "activate", G_CALLBACK (ensure_empty_routes_row), self, 
G_CONNECT_SWAPPED);
         g_object_set_data (G_OBJECT (row), "gateway", widget);
-        gtk_entry_set_text (GTK_ENTRY (widget), gateway);
-        gtk_entry_set_width_chars (GTK_ENTRY (widget), 16);
+        gtk_editable_set_text (GTK_EDITABLE (widget), gateway);
+        gtk_editable_set_width_chars (GTK_EDITABLE (widget), 16);
         gtk_widget_set_hexpand (widget, TRUE);
-        gtk_container_add (GTK_CONTAINER (row_box), widget);
+        gtk_box_append (GTK_BOX (row_box), widget);
 
         widget = gtk_entry_new ();
         g_signal_connect_object (widget, "changed", G_CALLBACK (ce_page_changed), self, G_CONNECT_SWAPPED);
         g_signal_connect_object (widget, "activate", G_CALLBACK (ensure_empty_routes_row), self, 
G_CONNECT_SWAPPED);
         g_object_set_data (G_OBJECT (row), "metric", widget);
-        gtk_entry_set_text (GTK_ENTRY (widget), metric ? metric : "");
-        gtk_entry_set_width_chars (GTK_ENTRY (widget), 5);
+        gtk_editable_set_text (GTK_EDITABLE (widget), metric ? metric : "");
+        gtk_editable_set_width_chars (GTK_EDITABLE (widget), 5);
         gtk_widget_set_hexpand (widget, TRUE);
-        gtk_container_add (GTK_CONTAINER (row_box), widget);
+        gtk_box_append (GTK_BOX (row_box), widget);
 
         gtk_size_group_add_widget (self->routes_metric_sizegroup, widget);
 
-        delete_button = gtk_button_new ();
-        gtk_style_context_add_class (gtk_widget_get_style_context (delete_button), "image-button");
+        delete_button = gtk_button_new_from_icon_name ("edit-delete-symbolic");
         g_signal_connect_object (delete_button, "clicked", G_CALLBACK (remove_row), self, G_CONNECT_SWAPPED);
-        image = gtk_image_new_from_icon_name ("edit-delete-symbolic", GTK_ICON_SIZE_MENU);
-        atk_object_set_name (gtk_widget_get_accessible (delete_button), _("Delete Route"));
-        gtk_button_set_image (GTK_BUTTON (delete_button), image);
+        gtk_accessible_update_property (GTK_ACCESSIBLE (delete_button),
+                                        GTK_ACCESSIBLE_PROPERTY_LABEL, _("Delete Route"),
+                                        -1);
         gtk_widget_set_halign (delete_button, GTK_ALIGN_CENTER);
         gtk_widget_set_valign (delete_button, GTK_ALIGN_CENTER);
-        gtk_container_add (GTK_CONTAINER (row_box), delete_button);
+        gtk_box_append (GTK_BOX (row_box), delete_button);
         g_object_set_data (G_OBJECT (row), "delete-button", delete_button);
 
         gtk_size_group_add_widget (self->routes_sizegroup, delete_button);
 
-        gtk_container_add (GTK_CONTAINER (row), row_box);
-        gtk_widget_show_all (row);
-        gtk_container_add (GTK_CONTAINER (self->routes_list), row);
+        gtk_list_box_row_set_child (GTK_LIST_BOX_ROW (row), row_box);
+        gtk_list_box_append (GTK_LIST_BOX (self->routes_list), row);
 
         update_row_sensitivity (self, self->routes_list);
 }
@@ -386,17 +376,10 @@ add_route_row (CEPageIP6   *self,
 static void
 ensure_empty_routes_row (CEPageIP6 *self)
 {
-        g_autoptr(GList) children = NULL;
-        GList *l;
-
-        children = gtk_container_get_children (GTK_CONTAINER (self->routes_list));
-        l = g_list_last (children);
-
-        while (l && l->next)
-                l = l->next;
+        GtkWidget *child = gtk_widget_get_last_child (self->routes_list);
 
         /* Add the last, stub row if needed*/
-        if (!l || validate_row (l->data))
+        if (!child || validate_row (child))
                 add_route_row (self, "", NULL, "", NULL);
 }
 
@@ -414,8 +397,7 @@ add_routes_box (CEPageIP6 *self)
 
         self->routes_list = list = gtk_list_box_new ();
         gtk_list_box_set_selection_mode (GTK_LIST_BOX (list), GTK_SELECTION_NONE);
-        gtk_list_box_set_header_func (GTK_LIST_BOX (list), cc_list_box_update_header_func, NULL, NULL);
-        gtk_container_add (GTK_CONTAINER (self->routes_box), list);
+        gtk_box_append (self->routes_box, list);
         gtk_switch_set_active (self->auto_routes_switch, !nm_setting_ip_config_get_ignore_auto_routes 
(self->setting));
         g_signal_connect_object (self->auto_routes_switch, "notify::active", G_CALLBACK (ce_page_changed), 
self, G_CONNECT_SWAPPED);
 
@@ -434,8 +416,6 @@ add_routes_box (CEPageIP6 *self)
         }
         if (nm_setting_ip_config_get_num_routes (self->setting) == 0)
                 add_empty_route_row (self);
-
-        gtk_widget_show_all (GTK_WIDGET (self->routes_box));
 }
 
 static void
@@ -444,9 +424,6 @@ connect_ip6_page (CEPageIP6 *self)
         const gchar *str_method;
         guint method;
 
-        gtk_container_set_focus_vadjustment (GTK_CONTAINER (self->main_box),
-                                             gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW 
(self)));
-
         add_address_box (self);
         add_dns_section (self);
         add_routes_box (self);
@@ -476,8 +453,8 @@ connect_ip6_page (CEPageIP6 *self)
                 method = IP6_METHOD_DISABLED;
         }
 
-        gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (self->never_default_check),
-                                      nm_setting_ip_config_get_never_default (self->setting));
+        gtk_check_button_set_active (GTK_CHECK_BUTTON (self->never_default_check),
+                                     nm_setting_ip_config_get_never_default (self->setting));
         g_signal_connect_object (self->never_default_check, "toggled", G_CALLBACK (ce_page_changed), self, 
G_CONNECT_SWAPPED);
 
         g_signal_connect_object (self->automatic_radio, "toggled", G_CALLBACK (method_changed), self, 
G_CONNECT_SWAPPED);
@@ -488,22 +465,22 @@ connect_ip6_page (CEPageIP6 *self)
 
         switch (method) {
         case IP6_METHOD_AUTO:
-                gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (self->automatic_radio), TRUE);
+                gtk_check_button_set_active (GTK_CHECK_BUTTON (self->automatic_radio), TRUE);
                 break;
         case IP6_METHOD_DHCP:
-                gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (self->dhcp_radio), TRUE);
+                gtk_check_button_set_active (GTK_CHECK_BUTTON (self->dhcp_radio), TRUE);
                 break;
         case IP6_METHOD_LINK_LOCAL:
-                gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (self->local_radio), TRUE);
+                gtk_check_button_set_active (GTK_CHECK_BUTTON (self->local_radio), TRUE);
                 break;
         case IP6_METHOD_MANUAL:
-                gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (self->manual_radio), TRUE);
+                gtk_check_button_set_active (GTK_CHECK_BUTTON (self->manual_radio), TRUE);
                 break;
         case IP6_METHOD_SHARED:
-                gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (self->shared_radio), TRUE);
+                gtk_check_button_set_active (GTK_CHECK_BUTTON (self->shared_radio), TRUE);
                 break;
         case IP6_METHOD_DISABLED:
-                gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (self->disabled_radio), TRUE);
+                gtk_check_button_set_active (GTK_CHECK_BUTTON (self->disabled_radio), TRUE);
                 break;
         default:
                 break;
@@ -515,41 +492,44 @@ connect_ip6_page (CEPageIP6 *self)
 static gboolean
 ui_to_setting (CEPageIP6 *self)
 {
+        GtkWidget *child;
         const gchar *method;
         gboolean ignore_auto_dns;
         gboolean ignore_auto_routes;
         gboolean never_default;
-        g_autoptr(GList) address_children = NULL;
-        g_autoptr(GList) routes_children = NULL;
+        gboolean add_addresses = FALSE;
+        gboolean add_routes = FALSE;
         gboolean ret = TRUE;
         GStrv dns_addresses = NULL;
         gchar *dns_text = NULL;
         guint i;
 
-        if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (self->disabled_radio)))
+        if (gtk_check_button_get_active (self->disabled_radio))
                 method = NM_SETTING_IP6_CONFIG_METHOD_DISABLED;
-        else if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (self->manual_radio)))
+        else if (gtk_check_button_get_active (self->manual_radio))
                 method = NM_SETTING_IP6_CONFIG_METHOD_MANUAL;
-        else if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (self->local_radio)))
+        else if (gtk_check_button_get_active (self->local_radio))
                 method = NM_SETTING_IP6_CONFIG_METHOD_LINK_LOCAL;
-        else if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (self->dhcp_radio)))
+        else if (gtk_check_button_get_active (self->dhcp_radio))
                 method = NM_SETTING_IP6_CONFIG_METHOD_DHCP;
-        else if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (self->automatic_radio)))
+        else if (gtk_check_button_get_active (self->automatic_radio))
                 method = NM_SETTING_IP6_CONFIG_METHOD_AUTO;
-        else if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (self->shared_radio)))
+        else if (gtk_check_button_get_active (self->shared_radio))
                 method = NM_SETTING_IP6_CONFIG_METHOD_SHARED;
 
         nm_setting_ip_config_clear_addresses (self->setting);
         if (g_str_equal (method, NM_SETTING_IP6_CONFIG_METHOD_MANUAL)) {
-                address_children = gtk_container_get_children (GTK_CONTAINER (self->address_list));
+                add_addresses = TRUE;
         } else {
                 g_object_set (G_OBJECT (self->setting),
                               NM_SETTING_IP_CONFIG_GATEWAY, NULL,
                               NULL);
        }
 
-        for (GList *l = address_children; l; l = l->next) {
-                GtkWidget *row = l->data;
+        for (child = gtk_widget_get_first_child (self->address_list);
+             add_addresses && child;
+             child = gtk_widget_get_next_sibling (child)) {
+                GtkWidget *row = child;
                 CEIPAddressEntry *address_entry;
                 CEIPAddressEntry *gateway_entry;
                 const gchar *text_prefix;
@@ -561,7 +541,7 @@ ui_to_setting (CEPageIP6 *self)
                 if (!address_entry)
                         continue;
 
-                text_prefix = gtk_entry_get_text (GTK_ENTRY (g_object_get_data (G_OBJECT (row), "prefix")));
+                text_prefix = gtk_editable_get_text (GTK_EDITABLE (g_object_get_data (G_OBJECT (row), 
"prefix")));
                 gateway_entry = CE_IP_ADDRESS_ENTRY (g_object_get_data (G_OBJECT (row), "gateway"));
 
                 if (ce_ip_address_entry_is_empty (address_entry) && !*text_prefix && 
ce_ip_address_entry_is_empty (gateway_entry)) {
@@ -587,19 +567,19 @@ ui_to_setting (CEPageIP6 *self)
                 if (!ret)
                         continue;
 
-                addr = nm_ip_address_new (AF_INET6, gtk_entry_get_text (GTK_ENTRY (address_entry)), prefix, 
NULL);
+                addr = nm_ip_address_new (AF_INET6, gtk_editable_get_text (GTK_EDITABLE (address_entry)), 
prefix, NULL);
                 if (!ce_ip_address_entry_is_empty (gateway_entry))
                         g_object_set (G_OBJECT (self->setting),
-                                      NM_SETTING_IP_CONFIG_GATEWAY, gtk_entry_get_text (GTK_ENTRY 
(gateway_entry)),
+                                      NM_SETTING_IP_CONFIG_GATEWAY, gtk_editable_get_text (GTK_EDITABLE 
(gateway_entry)),
                                       NULL);
                 nm_setting_ip_config_add_address (self->setting, addr);
 
-                if (!l || !l->next)
+                if (!gtk_widget_get_next_sibling (row))
                         ensure_empty_address_row (self);
         }
 
         nm_setting_ip_config_clear_dns (self->setting);
-        dns_text = g_strstrip (g_strdup (gtk_entry_get_text (GTK_ENTRY (self->dns_entry))));
+        dns_text = g_strstrip (g_strdup (gtk_editable_get_text (GTK_EDITABLE (self->dns_entry))));
 
         if (g_str_equal (method, NM_SETTING_IP6_CONFIG_METHOD_AUTO) ||
             g_str_equal (method, NM_SETTING_IP6_CONFIG_METHOD_DHCP) ||
@@ -629,13 +609,14 @@ ui_to_setting (CEPageIP6 *self)
         }
 
         nm_setting_ip_config_clear_routes (self->setting);
-        if (g_str_equal (method, NM_SETTING_IP6_CONFIG_METHOD_AUTO) ||
-            g_str_equal (method, NM_SETTING_IP6_CONFIG_METHOD_DHCP) ||
-            g_str_equal (method, NM_SETTING_IP6_CONFIG_METHOD_MANUAL))
-                routes_children = gtk_container_get_children (GTK_CONTAINER (self->routes_list));
-
-        for (GList *l = routes_children; l; l = l->next) {
-                GtkWidget *row = l->data;
+        add_routes = g_str_equal (method, NM_SETTING_IP6_CONFIG_METHOD_AUTO) ||
+                     g_str_equal (method, NM_SETTING_IP6_CONFIG_METHOD_DHCP) ||
+                     g_str_equal (method, NM_SETTING_IP6_CONFIG_METHOD_MANUAL);
+
+        for (child = gtk_widget_get_first_child (self->routes_list);
+             add_routes && child;
+             child = gtk_widget_get_next_sibling (child)) {
+                GtkWidget *row = child;
                 CEIPAddressEntry *address_entry;
                 CEIPAddressEntry *gateway_entry;
                 const gchar *text_prefix;
@@ -649,9 +630,9 @@ ui_to_setting (CEPageIP6 *self)
                 if (!address_entry)
                         continue;
 
-                text_prefix = gtk_entry_get_text (GTK_ENTRY (g_object_get_data (G_OBJECT (row), "prefix")));
+                text_prefix = gtk_editable_get_text (GTK_EDITABLE (g_object_get_data (G_OBJECT (row), 
"prefix")));
                 gateway_entry = CE_IP_ADDRESS_ENTRY (g_object_get_data (G_OBJECT (row), "gateway"));
-                text_metric = gtk_entry_get_text (GTK_ENTRY (g_object_get_data (G_OBJECT (row), "metric")));
+                text_metric = gtk_editable_get_text (GTK_EDITABLE (g_object_get_data (G_OBJECT (row), 
"metric")));
 
                 if (ce_ip_address_entry_is_empty (address_entry) && !*text_prefix && 
ce_ip_address_entry_is_empty (gateway_entry) && !*text_metric) {
                         /* ignore empty rows */
@@ -691,11 +672,16 @@ ui_to_setting (CEPageIP6 *self)
                 if (!ret)
                         continue;
 
-                route = nm_ip_route_new (AF_INET6, gtk_entry_get_text (GTK_ENTRY (address_entry)), prefix, 
gtk_entry_get_text (GTK_ENTRY (gateway_entry)), metric, NULL);
+                route = nm_ip_route_new (AF_INET6,
+                                         gtk_editable_get_text (GTK_EDITABLE (address_entry)),
+                                         prefix,
+                                         gtk_editable_get_text (GTK_EDITABLE (gateway_entry)),
+                                         metric,
+                                         NULL);
                 nm_setting_ip_config_add_route (self->setting, route);
                 nm_ip_route_unref (route);
 
-                if (!l || !l->next)
+                if (!gtk_widget_get_next_sibling (row))
                         ensure_empty_routes_row (self);
         }
 
@@ -704,7 +690,7 @@ ui_to_setting (CEPageIP6 *self)
 
         ignore_auto_dns = !gtk_switch_get_active (self->auto_dns_switch);
         ignore_auto_routes = !gtk_switch_get_active (self->auto_routes_switch);
-        never_default = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (self->never_default_check));
+        never_default = gtk_check_button_get_active (self->never_default_check);
 
         g_object_set (self->setting,
                       NM_SETTING_IP_CONFIG_METHOD, method,
diff --git a/panels/network/connection-editor/ce-page-ip6.h b/panels/network/connection-editor/ce-page-ip6.h
index 718a62cbb..c2c7d1be1 100644
--- a/panels/network/connection-editor/ce-page-ip6.h
+++ b/panels/network/connection-editor/ce-page-ip6.h
@@ -21,12 +21,12 @@
 
 #pragma once
 
-#include <gtk/gtk.h>
+#include <adwaita.h>
 #include <NetworkManager.h>
 
 G_BEGIN_DECLS
 
-G_DECLARE_FINAL_TYPE (CEPageIP6, ce_page_ip6, CE, PAGE_IP6, GtkScrolledWindow)
+G_DECLARE_FINAL_TYPE (CEPageIP6, ce_page_ip6, CE, PAGE_IP6, AdwBin)
 
 CEPageIP6 *ce_page_ip6_new (NMConnection     *connection,
                             NMClient         *client);
diff --git a/panels/network/connection-editor/ce-page-security.c 
b/panels/network/connection-editor/ce-page-security.c
index f640cbe13..a63b9394a 100644
--- a/panels/network/connection-editor/ce-page-security.c
+++ b/panels/network/connection-editor/ce-page-security.c
@@ -157,28 +157,23 @@ wsec_size_group_clear (GtkSizeGroup *group)
 static void
 security_combo_changed (CEPageSecurity *self)
 {
-        GList *l, *children;
         g_autoptr(WirelessSecurity) sec = NULL;
+        GtkWidget *child;
 
         wsec_size_group_clear (self->group);
 
-        children = gtk_container_get_children (GTK_CONTAINER (self->box));
-        for (l = children; l; l = l->next) {
-                gtk_container_remove (GTK_CONTAINER (self->box), GTK_WIDGET (l->data));
-        }
+        while ((child = gtk_widget_get_first_child (GTK_WIDGET (self->box))) != NULL)
+                gtk_box_remove (self->box, child);
 
         sec = security_combo_get_active (self);
         if (sec) {
-                GtkWidget *parent;
-
-                parent = gtk_widget_get_parent (GTK_WIDGET (sec));
-                if (parent)
-                        gtk_container_remove (GTK_CONTAINER (parent), GTK_WIDGET (sec));
+                if (gtk_widget_get_parent (GTK_WIDGET (sec)))
+                        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);
 
-                gtk_container_add (GTK_CONTAINER (self->box), g_object_ref (GTK_WIDGET (sec)));
+                gtk_box_append (self->box, g_object_ref (GTK_WIDGET (sec)));
         }
 
         ce_page_changed (CE_PAGE (self));
diff --git a/panels/network/connection-editor/ce-page-vpn.c b/panels/network/connection-editor/ce-page-vpn.c
index 9ad0a26f2..36afde53d 100644
--- a/panels/network/connection-editor/ce-page-vpn.c
+++ b/panels/network/connection-editor/ce-page-vpn.c
@@ -63,14 +63,7 @@ G_DEFINE_TYPE_WITH_CODE (CEPageVpn, ce_page_vpn, GTK_TYPE_BOX,
 static void
 vpn_gnome3ify_editor (GtkWidget *widget)
 {
-        if (GTK_IS_CONTAINER (widget)) {
-                GList *children, *iter;
-
-                children = gtk_container_get_children (GTK_CONTAINER (widget));
-                for (iter = children; iter; iter = iter->next)
-                        vpn_gnome3ify_editor (iter->data);
-                g_list_free (children);
-        } else if (GTK_IS_LABEL (widget)) {
+        if (GTK_IS_LABEL (widget)) {
                 const char *text;
                 gfloat xalign;
                 g_autofree gchar *newtext = NULL;
@@ -87,6 +80,13 @@ vpn_gnome3ify_editor (GtkWidget *widget)
                 newtext = g_strndup (text, len - 1);
                 gtk_label_set_text (GTK_LABEL (widget), newtext);
                 gtk_label_set_xalign (GTK_LABEL (widget), 1.0);
+        } else if (GTK_IS_WIDGET (widget)) {
+                GtkWidget *child;
+
+                for (child = gtk_widget_get_first_child (widget);
+                     child;
+                     child = gtk_widget_get_next_sibling (child))
+                        vpn_gnome3ify_editor (child);
         }
 }
 
@@ -109,10 +109,8 @@ load_vpn_plugin (CEPageVpn *self)
        }
         vpn_gnome3ify_editor (ui_widget);
 
-        gtk_widget_destroy (GTK_WIDGET (self->failure_label));
-
-        gtk_box_pack_start (GTK_BOX (self), ui_widget, TRUE, TRUE, 0);
-       gtk_widget_show_all (ui_widget);
+        gtk_box_remove (GTK_BOX (self), GTK_WIDGET (self->failure_label));
+        gtk_box_append (GTK_BOX (self), ui_widget);
 
         g_signal_connect_object (self->editor, "changed", G_CALLBACK (ce_page_changed), self, 
G_CONNECT_SWAPPED);
 }
@@ -123,7 +121,7 @@ connect_vpn_page (CEPageVpn *self)
         const gchar *name;
 
         name = nm_setting_connection_get_id (self->setting_connection);
-        gtk_entry_set_text (self->name_entry, name);
+        gtk_editable_set_text (GTK_EDITABLE (self->name_entry), name);
         g_signal_connect_object (self->name_entry, "changed", G_CALLBACK (ce_page_changed), self, 
G_CONNECT_SWAPPED);
 }
 
@@ -158,7 +156,7 @@ ce_page_vpn_validate (CEPage        *page,
         CEPageVpn *self = CE_PAGE_VPN (page);
 
         g_object_set (self->setting_connection,
-                      NM_SETTING_CONNECTION_ID, gtk_entry_get_text (self->name_entry),
+                      NM_SETTING_CONNECTION_ID, gtk_editable_get_text (GTK_EDITABLE (self->name_entry)),
                       NULL);
 
         if (!nm_setting_verify (NM_SETTING (self->setting_connection), NULL, error))
diff --git a/panels/network/connection-editor/ce-page-wifi.c b/panels/network/connection-editor/ce-page-wifi.c
index 7246170b7..5a662920e 100644
--- a/panels/network/connection-editor/ce-page-wifi.c
+++ b/panels/network/connection-editor/ce-page-wifi.c
@@ -65,7 +65,7 @@ connect_wifi_page (CEPageWifi *self)
                 utf8_ssid = nm_utils_ssid_to_utf8 (g_bytes_get_data (ssid, NULL), g_bytes_get_size (ssid));
         else
                 utf8_ssid = g_strdup ("");
-        gtk_entry_set_text (self->ssid_entry, utf8_ssid);
+        gtk_editable_set_text (GTK_EDITABLE (self->ssid_entry), utf8_ssid);
 
         g_signal_connect_object (self->ssid_entry, "changed", G_CALLBACK (ce_page_changed), self, 
G_CONNECT_SWAPPED);
 
@@ -101,18 +101,18 @@ ui_to_setting (CEPageWifi *self)
         g_autofree gchar *device_mac = NULL;
         g_autofree gchar *cloned_mac = NULL;
 
-        utf8_ssid = gtk_entry_get_text (self->ssid_entry);
+        utf8_ssid = gtk_editable_get_text (GTK_EDITABLE (self->ssid_entry));
         if (!utf8_ssid || !*utf8_ssid)
                 ssid = NULL;
         else {
                 ssid = g_bytes_new_static (utf8_ssid, strlen (utf8_ssid));
         }
-        entry = gtk_bin_get_child (GTK_BIN (self->bssid_combo));
-        bssid = gtk_entry_get_text (GTK_ENTRY (entry));
+        entry = gtk_combo_box_get_child (GTK_COMBO_BOX (self->bssid_combo));
+        bssid = gtk_editable_get_text (GTK_EDITABLE (entry));
         if (*bssid == '\0')
                 bssid = NULL;
-        entry = gtk_bin_get_child (GTK_BIN (self->mac_combo));
-        device_mac = ce_page_trim_address (gtk_entry_get_text (GTK_ENTRY (entry)));
+        entry = gtk_combo_box_get_child (GTK_COMBO_BOX (self->mac_combo));
+        device_mac = ce_page_trim_address (gtk_editable_get_text (GTK_EDITABLE (entry)));
         cloned_mac = ce_page_cloned_mac_get (self->cloned_mac_combo);
 
         g_object_set (self->setting,
@@ -138,16 +138,16 @@ ce_page_wifi_class_validate (CEPage        *parent,
         GtkWidget *entry;
         gboolean ret = TRUE;
 
-        entry = gtk_bin_get_child (GTK_BIN (self->bssid_combo));
-        if (!ce_page_address_is_valid (gtk_entry_get_text (GTK_ENTRY (entry)))) {
+        entry = gtk_combo_box_get_child (GTK_COMBO_BOX (self->bssid_combo));
+        if (!ce_page_address_is_valid (gtk_editable_get_text (GTK_EDITABLE (entry)))) {
                 widget_set_error (entry);
                 ret = FALSE;
         } else {
                 widget_unset_error (entry);
         }
 
-        entry = gtk_bin_get_child (GTK_BIN (self->mac_combo));
-        if (!ce_page_address_is_valid (gtk_entry_get_text (GTK_ENTRY (entry)))) {
+        entry = gtk_combo_box_get_child (GTK_COMBO_BOX (self->mac_combo));
+        if (!ce_page_address_is_valid (gtk_editable_get_text (GTK_EDITABLE (entry)))) {
                 widget_set_error (entry);
                 ret = FALSE;
         } else {
@@ -155,10 +155,10 @@ ce_page_wifi_class_validate (CEPage        *parent,
         }
 
         if (!ce_page_cloned_mac_combo_valid (self->cloned_mac_combo)) {
-                widget_set_error (gtk_bin_get_child (GTK_BIN (self->cloned_mac_combo)));
+                widget_set_error (gtk_combo_box_get_child (GTK_COMBO_BOX (self->cloned_mac_combo)));
                 ret = FALSE;
         } else {
-                widget_unset_error (gtk_bin_get_child (GTK_BIN (self->cloned_mac_combo)));
+                widget_unset_error (gtk_combo_box_get_child (GTK_COMBO_BOX (self->cloned_mac_combo)));
         }
 
         if (!ret)
diff --git a/panels/network/connection-editor/ce-page.c b/panels/network/connection-editor/ce-page.c
index fb5d3993f..b6f07796f 100644
--- a/panels/network/connection-editor/ce-page.c
+++ b/panels/network/connection-editor/ce-page.c
@@ -207,9 +207,9 @@ ce_page_setup_mac_combo (GtkComboBoxText  *combo,
                         gtk_combo_box_text_prepend_text (combo, current_mac);
                 }
 
-                entry = gtk_bin_get_child (GTK_BIN (combo));
+                entry = gtk_combo_box_get_child (GTK_COMBO_BOX (combo));
                 if (entry)
-                        gtk_entry_set_text (GTK_ENTRY (entry), active_mac ? active_mac : current_mac);
+                        gtk_editable_set_text (GTK_EDITABLE (entry), active_mac ? active_mac : current_mac);
         }
 }
 
@@ -253,9 +253,9 @@ ce_page_setup_cloned_mac_combo (GtkComboBoxText *combo, const char *current)
        if (active != -1) {
                gtk_combo_box_set_active (GTK_COMBO_BOX (combo), active);
        } else if (current && current[0]) {
-               entry = gtk_bin_get_child (GTK_BIN (combo));
+               entry = gtk_combo_box_get_child (GTK_COMBO_BOX (combo));
                g_assert (entry);
-               gtk_entry_set_text (GTK_ENTRY (entry), current);
+               gtk_editable_set_text (GTK_EDITABLE (entry), current);
        }
 }
 
diff --git a/panels/network/connection-editor/connection-editor.ui 
b/panels/network/connection-editor/connection-editor.ui
index 6a83f134e..98105ce78 100644
--- a/panels/network/connection-editor/connection-editor.ui
+++ b/panels/network/connection-editor/connection-editor.ui
@@ -2,22 +2,16 @@
 <interface>
   <!-- interface-requires gtk+ 3.0 -->
   <template class="NetConnectionEditor" parent="GtkDialog">
-    <property name="can_focus">False</property>
-    <property name="border_width">0</property>
     <property name="resizable">False</property>
     <property name="modal">True</property>
     <property name="default_width">500</property>
     <property name="default_height">300</property>
-    <property name="type_hint">dialog</property>
     <!-- This doesn't seem to work for a template, so it is also hardcoded. -->
     <property name="use_header_bar">1</property>
-    <signal name="delete-event" handler="delete_event_cb" swapped="yes"/>
+    <signal name="close-request" handler="close_request_cb" swapped="yes"/>
     <child type="action">
       <object class="GtkButton" id="cancel_button">
         <property name="label" translatable="yes">_Cancel</property>
-        <property name="visible">True</property>
-        <property name="can_focus">True</property>
-        <property name="receives_default">True</property>
         <property name="use_underline">True</property>
         <signal name="clicked" handler="cancel_clicked_cb" object="NetConnectionEditor" swapped="yes"/>
       </object>
@@ -25,83 +19,49 @@
     <child type="action">
       <object class="GtkButton" id="apply_button">
         <property name="label" translatable="yes">_Apply</property>
-        <property name="visible">True</property>
-        <property name="can_focus">True</property>
-        <property name="can_default">True</property>
-        <property name="receives_default">True</property>
         <property name="use_underline">True</property>
         <signal name="clicked" handler="apply_clicked_cb" object="NetConnectionEditor" swapped="yes"/>
       </object>
     </child>
-    <child internal-child="vbox">
+    <child>
       <object class="GtkBox">
-        <property name="can_focus">False</property>
         <property name="orientation">vertical</property>
         <property name="spacing">0</property>
-        <property name="border_width">0</property>
         <child>
           <object class="GtkStack" id="toplevel_stack">
-            <property name="visible">True</property>
+            <property name="hexpand">True</property>
+            <property name="vexpand">True</property>
             <child>
               <object class="GtkSpinner" id="spinner">
-                <property name="visible">True</property>
-                <property name="active">True</property>
+                <property name="spinning">True</property>
               </object>
             </child>
             <child>
               <object class="GtkNotebook" id="notebook">
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
                 <property name="show_border">False</property>
               </object>
             </child>
             <child>
               <object class="GtkBox" id="add_connection_box">
-                <property name="visible">True</property>
-                <property name="can_focus">False</property>
                 <property name="vexpand">True</property>
                 <child>
                   <object class="GtkBox">
-                    <property name="visible">True</property>
-                    <property name="can_focus">False</property>
-                    <property name="orientation">vertical</property>
+                    <property name="hexpand">True</property>
                     <property name="vexpand">True</property>
+                    <property name="orientation">vertical</property>
                     <child>
-                      <object class="GtkFrame" id="add_connection_frame">
-                        <property name="width_request">300</property>
-                        <property name="visible">True</property>
-                        <property name="can_focus">False</property>
-                        <property name="label_xalign">0</property>
-                        <property name="shadow_type">in</property>
+                      <object class="AdwBin" id="add_connection_frame">
+                        <property name="hexpand">True</property>
                         <property name="vexpand">True</property>
+                        <property name="width_request">300</property>
                         <property name="valign">start</property>
-                        <child>
-                          <placeholder/>
-                        </child>
                       </object>
-                      <packing>
-                        <property name="expand">True</property>
-                        <property name="fill">True</property>
-                        <property name="position">0</property>
-                      </packing>
                     </child>
                   </object>
-                  <packing>
-                    <property name="expand">True</property>
-                    <property name="position">0</property>
-                  </packing>
                 </child>
               </object>
-              <packing>
-                <property name="position">1</property>
-              </packing>
             </child>
           </object>
-          <packing>
-            <property name="expand">True</property>
-            <property name="fill">True</property>
-            <property name="position">1</property>
-          </packing>
         </child>
       </object>
     </child>
diff --git a/panels/network/connection-editor/details-page.ui 
b/panels/network/connection-editor/details-page.ui
index 7dfabbe6d..109ee0a2e 100644
--- a/panels/network/connection-editor/details-page.ui
+++ b/panels/network/connection-editor/details-page.ui
@@ -2,8 +2,6 @@
 <interface>
   <!-- interface-requires gtk+ 3.0 -->
   <template class="CEPageDetails" parent="GtkGrid">
-    <property name="visible">True</property>
-    <property name="can_focus">False</property>
     <property name="margin_start">24</property>
     <property name="margin_end">24</property>
     <property name="margin_top">24</property>
@@ -12,350 +10,310 @@
     <property name="column_spacing">12</property>
     <child>
       <object class="GtkLabel" id="strength_heading_label">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
         <property name="xalign">1</property>
         <property name="label" translatable="yes">Signal Strength</property>
         <property name="mnemonic_widget">strength_label</property>
+        <layout>
+          <property name="column">0</property>
+          <property name="row">0</property>
+          <property name="column-span">1</property>
+          <property name="row-span">1</property>
+        </layout>
         <style>
           <class name="dim-label"/>
         </style>
       </object>
-      <packing>
-        <property name="left_attach">0</property>
-        <property name="top_attach">0</property>
-        <property name="width">1</property>
-        <property name="height">1</property>
-      </packing>
     </child>
     <child>
       <object class="GtkLabel" id="strength_label">
-        <property name="visible">True</property>
-        <property name="can_focus">True</property>
         <property name="hexpand">True</property>
         <property name="xalign">0</property>
         <property name="label">Weak</property>
         <property name="selectable">True</property>
         <property name="max-width-chars">50</property>
         <property name="ellipsize">end</property>
+        <layout>
+          <property name="column">1</property>
+          <property name="row">0</property>
+          <property name="column-span">1</property>
+          <property name="row-span">1</property>
+        </layout>
       </object>
-      <packing>
-        <property name="left_attach">1</property>
-        <property name="top_attach">0</property>
-        <property name="width">1</property>
-        <property name="height">1</property>
-      </packing>
     </child>
     <child>
       <object class="GtkLabel" id="speed_heading_label">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
         <property name="xalign">1</property>
         <property name="label" translatable="yes">Link speed</property>
         <property name="mnemonic_widget">speed_label</property>
+        <layout>
+          <property name="column">0</property>
+          <property name="row">1</property>
+          <property name="column-span">1</property>
+          <property name="row-span">1</property>
+        </layout>
         <style>
           <class name="dim-label"/>
         </style>
       </object>
-      <packing>
-        <property name="left_attach">0</property>
-        <property name="top_attach">1</property>
-        <property name="width">1</property>
-        <property name="height">1</property>
-      </packing>
     </child>
     <child>
       <object class="GtkLabel" id="speed_label">
-        <property name="visible">True</property>
-        <property name="can_focus">True</property>
         <property name="xalign">0</property>
         <property name="label">1Mb/sec</property>
         <property name="selectable">True</property>
         <property name="hexpand">True</property>
         <property name="max-width-chars">50</property>
         <property name="ellipsize">end</property>
+        <layout>
+          <property name="column">1</property>
+          <property name="row">1</property>
+          <property name="column-span">1</property>
+          <property name="row-span">1</property>
+        </layout>
       </object>
-      <packing>
-        <property name="left_attach">1</property>
-        <property name="top_attach">1</property>
-        <property name="width">1</property>
-        <property name="height">1</property>
-      </packing>
     </child>
     <child>
       <object class="GtkLabel" id="security_heading_label">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
         <property name="xalign">1</property>
         <property name="label" translatable="yes">Security</property>
         <property name="mnemonic_widget">security_label</property>
+        <layout>
+          <property name="column">0</property>
+          <property name="row">2</property>
+          <property name="column-span">1</property>
+          <property name="row-span">1</property>
+        </layout>
         <style>
           <class name="dim-label"/>
         </style>
       </object>
-      <packing>
-        <property name="left_attach">0</property>
-        <property name="top_attach">2</property>
-        <property name="width">1</property>
-        <property name="height">1</property>
-      </packing>
     </child>
     <child>
       <object class="GtkLabel" id="ipv4_heading_label">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
         <property name="xalign">1</property>
         <property name="label" translatable="yes">IPv4 Address</property>
         <property name="mnemonic_widget">ipv4_label</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>
-      <packing>
-        <property name="left_attach">0</property>
-        <property name="top_attach">3</property>
-        <property name="width">1</property>
-        <property name="height">1</property>
-      </packing>
     </child>
     <child>
       <object class="GtkLabel" id="ipv6_heading_label">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
         <property name="xalign">1</property>
         <property name="label" translatable="yes">IPv6 Address</property>
         <property name="mnemonic_widget">ipv6_label</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>
-      <packing>
-        <property name="left_attach">0</property>
-        <property name="top_attach">4</property>
-        <property name="width">1</property>
-        <property name="height">1</property>
-      </packing>
     </child>
     <child>
       <object class="GtkLabel" id="mac_heading_label">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
         <property name="xalign">1</property>
         <property name="label" translatable="yes">Hardware Address</property>
         <property name="mnemonic_widget">mac_label</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>
-      <packing>
-        <property name="left_attach">0</property>
-        <property name="top_attach">5</property>
-        <property name="width">1</property>
-        <property name="height">1</property>
-      </packing>
     </child>
     <child>
       <object class="GtkLabel" id="freq_heading_label">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
         <property name="xalign">1</property>
         <property name="label" translatable="yes">Supported Frequencies</property>
         <property name="mnemonic_widget">freq_label</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>
-      <packing>
-        <property name="left_attach">0</property>
-        <property name="top_attach">6</property>
-        <property name="width">1</property>
-        <property name="height">1</property>
-      </packing>
     </child>
     <child>
       <object class="GtkLabel" id="route_heading_label">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
         <property name="xalign">1</property>
         <property name="label" translatable="yes">Default Route</property>
         <property name="mnemonic_widget">route_label</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>
-      <packing>
-        <property name="left_attach">0</property>
-        <property name="top_attach">7</property>
-        <property name="width">1</property>
-        <property name="height">1</property>
-      </packing>
     </child>
     <child>
       <object class="GtkLabel" id="dns4_heading_label">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
         <property name="xalign">1</property>
         <property name="yalign">0</property>
         <property name="label" translatable="yes">DNS</property>
         <property name="mnemonic_widget">dns4_label</property>
+        <layout>
+          <property name="column">0</property>
+          <property name="row">8</property>
+          <property name="column-span">1</property>
+          <property name="row-span">1</property>
+        </layout>
         <style>
           <class name="dim-label"/>
         </style>
       </object>
-      <packing>
-        <property name="left_attach">0</property>
-        <property name="top_attach">8</property>
-        <property name="width">1</property>
-        <property name="height">1</property>
-      </packing>
     </child>
     <child>
       <object class="GtkLabel" id="dns6_heading_label">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
         <property name="xalign">1</property>
         <property name="yalign">0</property>
         <property name="label" translatable="yes">DNS</property>
         <property name="mnemonic_widget">dns6_label</property>
+        <layout>
+          <property name="column">0</property>
+          <property name="row">9</property>
+          <property name="column-span">1</property>
+          <property name="row-span">1</property>
+        </layout>
         <style>
           <class name="dim-label"/>
         </style>
       </object>
-      <packing>
-        <property name="left_attach">0</property>
-        <property name="top_attach">9</property>
-        <property name="width">1</property>
-        <property name="height">1</property>
-      </packing>
     </child>
     <child>
       <object class="GtkLabel" id="last_used_heading_label">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
         <property name="xalign">1</property>
         <property name="label" translatable="yes">Last Used</property>
         <property name="mnemonic_widget">last_used_label</property>
+        <layout>
+          <property name="column">0</property>
+          <property name="row">10</property>
+          <property name="column-span">1</property>
+          <property name="row-span">1</property>
+        </layout>
         <style>
           <class name="dim-label"/>
         </style>
       </object>
-      <packing>
-        <property name="left_attach">0</property>
-        <property name="top_attach">10</property>
-        <property name="width">1</property>
-        <property name="height">1</property>
-      </packing>
     </child>
     <child>
       <object class="GtkLabel" id="security_label">
-        <property name="visible">True</property>
-        <property name="can_focus">True</property>
         <property name="xalign">0</property>
         <property name="label">WPA</property>
         <property name="selectable">True</property>
         <property name="hexpand">True</property>
         <property name="max-width-chars">50</property>
         <property name="ellipsize">end</property>
+        <layout>
+          <property name="column">1</property>
+          <property name="row">2</property>
+          <property name="column-span">1</property>
+          <property name="row-span">1</property>
+        </layout>
       </object>
-      <packing>
-        <property name="left_attach">1</property>
-        <property name="top_attach">2</property>
-        <property name="width">1</property>
-        <property name="height">1</property>
-      </packing>
     </child>
     <child>
       <object class="GtkLabel" id="ipv4_label">
-        <property name="visible">True</property>
-        <property name="can_focus">True</property>
         <property name="xalign">0</property>
         <property name="label">127.0.0.1</property>
         <property name="selectable">True</property>
         <property name="hexpand">True</property>
         <property name="max-width-chars">50</property>
         <property name="ellipsize">end</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>
-      <packing>
-        <property name="left_attach">1</property>
-        <property name="top_attach">3</property>
-        <property name="width">1</property>
-        <property name="height">1</property>
-      </packing>
     </child>
     <child>
       <object class="GtkLabel" id="ipv6_label">
-        <property name="visible">True</property>
-        <property name="can_focus">True</property>
         <property name="xalign">0</property>
         <property name="label">::1</property>
         <property name="selectable">True</property>
         <property name="hexpand">True</property>
         <property name="max-width-chars">50</property>
         <property name="ellipsize">end</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>
-      <packing>
-        <property name="left_attach">1</property>
-        <property name="top_attach">4</property>
-        <property name="width">1</property>
-        <property name="height">1</property>
-      </packing>
     </child>
     <child>
       <object class="GtkLabel" id="mac_label">
-        <property name="visible">True</property>
-        <property name="can_focus">True</property>
         <property name="xalign">0</property>
         <property name="label">AA:BB:CC:DD:55:66:77:88</property>
         <property name="selectable">True</property>
         <property name="hexpand">True</property>
         <property name="max-width-chars">50</property>
         <property name="ellipsize">end</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>
-      <packing>
-        <property name="left_attach">1</property>
-        <property name="top_attach">5</property>
-        <property name="width">1</property>
-        <property name="height">1</property>
-      </packing>
     </child>
     <child>
       <object class="GtkLabel" id="freq_label">
-        <property name="visible">True</property>
-        <property name="can_focus">True</property>
         <property name="xalign">0</property>
         <property name="label">2.4 GHz / 5 GHz</property>
         <property name="selectable">True</property>
         <property name="hexpand">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>
-      <packing>
-        <property name="left_attach">1</property>
-        <property name="top_attach">6</property>
-        <property name="width">1</property>
-        <property name="height">1</property>
-      </packing>
     </child>
     <child>
       <object class="GtkLabel" id="route_label">
-        <property name="visible">True</property>
-        <property name="can_focus">True</property>
         <property name="xalign">0</property>
         <property name="label">127.0.0.1</property>
         <property name="selectable">True</property>
         <property name="hexpand">True</property>
         <property name="max-width-chars">50</property>
         <property name="ellipsize">end</property>
+        <layout>
+          <property name="column">1</property>
+          <property name="row">7</property>
+          <property name="column-span">1</property>
+          <property name="row-span">1</property>
+        </layout>
       </object>
-      <packing>
-        <property name="left_attach">1</property>
-        <property name="top_attach">7</property>
-        <property name="width">1</property>
-        <property name="height">1</property>
-      </packing>
     </child>
     <child>
       <object class="GtkLabel" id="dns4_label">
-        <property name="visible">True</property>
-        <property name="can_focus">True</property>
         <property name="xalign">0</property>
         <property name="yalign">0</property>
         <property name="label">127.0.0.1</property>
@@ -364,18 +322,16 @@
         <property name="hexpand">True</property>
         <property name="max-width-chars">50</property>
         <property name="ellipsize">end</property>
+        <layout>
+          <property name="column">1</property>
+          <property name="row">8</property>
+          <property name="column-span">1</property>
+          <property name="row-span">1</property>
+        </layout>
       </object>
-      <packing>
-        <property name="left_attach">1</property>
-        <property name="top_attach">8</property>
-        <property name="width">1</property>
-        <property name="height">1</property>
-      </packing>
     </child>
     <child>
       <object class="GtkLabel" id="dns6_label">
-        <property name="visible">True</property>
-        <property name="can_focus">True</property>
         <property name="xalign">0</property>
         <property name="yalign">0</property>
         <property name="label">::1</property>
@@ -384,85 +340,74 @@
         <property name="hexpand">True</property>
         <property name="max-width-chars">50</property>
         <property name="ellipsize">end</property>
+        <layout>
+          <property name="column">1</property>
+          <property name="row">9</property>
+          <property name="column-span">1</property>
+          <property name="row-span">1</property>
+        </layout>
       </object>
-      <packing>
-        <property name="left_attach">1</property>
-        <property name="top_attach">9</property>
-        <property name="width">1</property>
-        <property name="height">1</property>
-      </packing>
     </child>
     <child>
       <object class="GtkLabel" id="last_used_label">
-        <property name="visible">True</property>
-        <property name="can_focus">True</property>
         <property name="xalign">0</property>
         <property name="label">today</property>
         <property name="selectable">True</property>
         <property name="hexpand">True</property>
         <property name="max-width-chars">50</property>
         <property name="ellipsize">end</property>
+        <layout>
+          <property name="column">1</property>
+          <property name="row">10</property>
+          <property name="column-span">1</property>
+          <property name="row-span">1</property>
+        </layout>
       </object>
-      <packing>
-        <property name="left_attach">1</property>
-        <property name="top_attach">10</property>
-        <property name="width">1</property>
-        <property name="height">1</property>
-      </packing>
     </child>
     <child>
       <object class="GtkCheckButton" id="auto_connect_check">
         <property name="label" translatable="yes">Connect _automatically</property>
-        <property name="visible">True</property>
-        <property name="can_focus">True</property>
-        <property name="receives_default">False</property>
         <property name="valign">end</property>
         <property name="use_underline">True</property>
-        <property name="xalign">0</property>
-        <property name="draw_indicator">True</property>
         <property name="margin_top">12</property>
+        <layout>
+          <property name="column">0</property>
+          <property name="row">11</property>
+          <property name="column-span">2</property>
+          <property name="row-span">1</property>
+        </layout>
       </object>
-      <packing>
-        <property name="left_attach">0</property>
-        <property name="top_attach">11</property>
-        <property name="width">2</property>
-        <property name="height">1</property>
-      </packing>
     </child>
     <child>
       <object class="GtkCheckButton" id="all_user_check">
         <property name="label" translatable="yes">Make available to _other users</property>
-        <property name="visible">True</property>
-        <property name="can_focus">True</property>
-        <property name="receives_default">False</property>
         <property name="use_underline">True</property>
-        <property name="xalign">0</property>
-        <property name="draw_indicator">True</property>
+        <layout>
+          <property name="column">0</property>
+          <property name="row">12</property>
+          <property name="column-span">2</property>
+          <property name="row-span">1</property>
+        </layout>
       </object>
-      <packing>
-        <property name="left_attach">0</property>
-        <property name="top_attach">12</property>
-        <property name="width">2</property>
-        <property name="height">1</property>
-      </packing>
     </child>
 
     <!-- "Restrict Data Usage" section -->
     <child>
       <object class="GtkCheckButton" id="restrict_data_check">
-        <property name="can_focus">True</property>
         <property name="margin_bottom">12</property>
+        <layout>
+          <property name="column">0</property>
+          <property name="row">13</property>
+          <property name="column-span">2</property>
+          <property name="row-span">1</property>
+        </layout>
 
         <child>
           <object class="GtkBox">
-            <property name="visible">True</property>
-            <property name="can_focus">True</property>
             <property name="orientation">vertical</property>
 
             <child>
               <object class="GtkLabel">
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
                 <property name="xalign">0</property>
                 <property name="label" translatable="yes">_Metered connection: has data limits or can incur 
charges</property>
                 <property name="hexpand">True</property>
@@ -472,8 +417,6 @@
 
             <child>
               <object class="GtkLabel">
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
                 <property name="xalign">0</property>
                 <property name="label" translatable="yes">Software updates and other large downloads will 
not be started automatically.</property>
                 <property name="wrap">True</property>
@@ -490,33 +433,25 @@
         </child>
 
       </object>
-      <packing>
-        <property name="left_attach">0</property>
-        <property name="top_attach">13</property>
-        <property name="width">2</property>
-        <property name="height">1</property>
-      </packing>
     </child>
 
     <child>
       <object class="GtkButton" id="forget_button">
-        <property name="visible">True</property>
-        <property name="can_focus">True</property>
         <property name="use_underline">True</property>
         <property name="hexpand">True</property>
         <property name="vexpand">True</property>
         <property name="halign">end</property>
         <property name="valign">end</property>
+        <layout>
+          <property name="column">0</property>
+          <property name="row">14</property>
+          <property name="column-span">2</property>
+          <property name="row-span">1</property>
+        </layout>
         <style>
           <class name="destructive-action" />
         </style>
       </object>
-      <packing>
-        <property name="left_attach">0</property>
-        <property name="top_attach">14</property>
-        <property name="width">2</property>
-        <property name="height">1</property>
-      </packing>
     </child>
   </template>
 </interface>
diff --git a/panels/network/connection-editor/ethernet-page.ui 
b/panels/network/connection-editor/ethernet-page.ui
index 4f7331b31..ad4f2cbb3 100644
--- a/panels/network/connection-editor/ethernet-page.ui
+++ b/panels/network/connection-editor/ethernet-page.ui
@@ -7,8 +7,6 @@
     <property name="page_increment">10</property>
   </object>
   <template class="CEPageEthernet" parent="GtkGrid">
-    <property name="visible">True</property>
-    <property name="can_focus">False</property>
     <property name="margin_start">50</property>
     <property name="margin_end">50</property>
     <property name="margin_top">12</property>
@@ -19,159 +17,105 @@
     <property name="column_spacing">6</property>
     <child>
       <object class="GtkLabel">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
         <property name="xalign">1</property>
         <property name="label" translatable="yes">_Name</property>
         <property name="use_underline">True</property>
         <property name="mnemonic_widget">name_entry</property>
+        <layout>
+          <property name="column">0</property>
+          <property name="row">0</property>
+        </layout>
       </object>
-      <packing>
-        <property name="left_attach">0</property>
-        <property name="top_attach">0</property>
-        <property name="width">1</property>
-        <property name="height">1</property>
-      </packing>
     </child>
     <child>
       <object class="GtkEntry" id="name_entry">
-        <property name="visible">True</property>
-        <property name="can_focus">True</property>
         <property name="invisible_char">â—Ź</property>
+        <layout>
+          <property name="column">1</property>
+          <property name="row">0</property>
+        </layout>
       </object>
-      <packing>
-        <property name="left_attach">1</property>
-        <property name="top_attach">0</property>
-        <property name="width">1</property>
-        <property name="height">1</property>
-      </packing>
     </child>
     <child>
       <object class="GtkLabel">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
         <property name="xalign">1</property>
         <property name="label" translatable="yes">_MAC Address</property>
         <property name="use_underline">True</property>
         <property name="mnemonic_widget">mac_combo</property>
+        <layout>
+          <property name="column">0</property>
+          <property name="row">1</property>
+        </layout>
       </object>
-      <packing>
-        <property name="left_attach">0</property>
-        <property name="top_attach">1</property>
-        <property name="width">1</property>
-        <property name="height">1</property>
-      </packing>
     </child>
     <child>
       <object class="GtkComboBoxText" id="mac_combo">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
         <property name="has_entry">True</property>
         <property name="entry_text_column">0</property>
         <property name="id_column">1</property>
+        <layout>
+          <property name="column">1</property>
+          <property name="row">1</property>
+        </layout>
       </object>
-      <packing>
-        <property name="left_attach">1</property>
-        <property name="top_attach">1</property>
-        <property name="width">1</property>
-        <property name="height">1</property>
-      </packing>
     </child>
     <child>
       <object class="GtkComboBoxText" id="cloned_mac_combo">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
         <property name="has_entry">True</property>
         <property name="hexpand">True</property>
         <property name="active_id">0</property>
+        <layout>
+          <property name="column">1</property>
+          <property name="row">2</property>
+        </layout>
         <child internal-child="entry">
           <object class="GtkEntry">
-            <property name="can_focus">True</property>
           </object>
         </child>
       </object>
-      <packing>
-        <property name="left_attach">1</property>
-        <property name="top_attach">2</property>
-        <property name="width">1</property>
-        <property name="height">1</property>
-      </packing>
     </child>
     <child>
       <object class="GtkLabel">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
         <property name="xalign">1</property>
         <property name="label" translatable="yes">M_TU</property>
         <property name="use_underline">True</property>
         <property name="mnemonic_widget">mtu_spin</property>
+        <layout>
+          <property name="column">0</property>
+          <property name="row">3</property>
+        </layout>
       </object>
-      <packing>
-        <property name="left_attach">0</property>
-        <property name="top_attach">3</property>
-        <property name="width">1</property>
-        <property name="height">1</property>
-      </packing>
     </child>
     <child>
       <object class="GtkLabel">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
         <property name="valign">center</property>
         <property name="xalign">1</property>
         <property name="label" translatable="yes">_Cloned Address</property>
         <property name="use_underline">True</property>
         <property name="mnemonic_widget">cloned_mac_combo</property>
+        <layout>
+          <property name="column">0</property>
+          <property name="row">2</property>
+        </layout>
       </object>
-      <packing>
-        <property name="left_attach">0</property>
-        <property name="top_attach">2</property>
-        <property name="width">1</property>
-        <property name="height">1</property>
-      </packing>
     </child>
     <child>
       <object class="GtkLabel" id="mtu_label">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
         <property name="label" translatable="yes">bytes</property>
+        <layout>
+          <property name="column">2</property>
+          <property name="row">3</property>
+        </layout>
       </object>
-      <packing>
-        <property name="left_attach">2</property>
-        <property name="top_attach">3</property>
-        <property name="width">1</property>
-        <property name="height">1</property>
-      </packing>
     </child>
     <child>
       <object class="GtkSpinButton" id="mtu_spin">
-        <property name="visible">True</property>
-        <property name="can_focus">True</property>
-        <property name="invisible_char">â—Ź</property>
-        <property name="invisible_char_set">True</property>
         <property name="adjustment">mtu_adjustment</property>
+        <layout>
+          <property name="column">1</property>
+          <property name="row">3</property>
+        </layout>
       </object>
-      <packing>
-        <property name="left_attach">1</property>
-        <property name="top_attach">3</property>
-        <property name="width">1</property>
-        <property name="height">1</property>
-      </packing>
-    </child>
-    <child>
-      <placeholder/>
-    </child>
-    <child>
-      <placeholder/>
-    </child>
-    <child>
-      <placeholder/>
-    </child>
-    <child>
-      <placeholder/>
-    </child>
-    <child>
-      <placeholder/>
     </child>
   </template>
 </interface>
diff --git a/panels/network/connection-editor/ip4-page.ui b/panels/network/connection-editor/ip4-page.ui
index 714036b55..ce7934d9d 100644
--- a/panels/network/connection-editor/ip4-page.ui
+++ b/panels/network/connection-editor/ip4-page.ui
@@ -1,420 +1,313 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <interface>
   <!-- interface-requires gtk+ 3.0 -->
-  <template class="CEPageIP4" parent="GtkScrolledWindow">
-    <property name="visible">True</property>
-    <property name="can_focus">True</property>
-    <property name="hscrollbar_policy">never</property>
+  <template class="CEPageIP4" parent="AdwBin">
     <child>
-      <object class="GtkViewport">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
+      <object class="GtkScrolledWindow">
+        <property name="hscrollbar_policy">never</property>
         <child>
-          <object class="GtkGrid" id="main_box">
-            <property name="visible">True</property>
-            <property name="can_focus">False</property>
-            <property name="margin_start">24</property>
-            <property name="margin_end">24</property>
-            <property name="margin_top">24</property>
-            <property name="margin_bottom">24</property>
-            <property name="orientation">vertical</property>
-            <property name="row-spacing">6</property>
-            <property name="column-spacing">6</property>
+          <object class="GtkViewport">
             <child>
-              <object class="GtkLabel">
-                <property name="visible">True</property>
-                <property name="can_focus">False</property>
-                <property name="label" translatable="yes">IPv_4 Method</property>
-                <property name="use_underline">True</property>
-                <property name="mnemonic_widget">disabled_radio</property>
-                <property name="xalign">0.0</property>
-                <attributes>
-                  <attribute name="weight" value="bold"/>
-                </attributes>
-              </object>
-              <packing>
-                <property name="top-attach">0</property>
-                <property name="left-attach">0</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkRadioButton" id="automatic_radio">
-                <property name="label" translatable="yes">Automatic (DHCP)</property>
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="receives_default">False</property>
-                <property name="draw_indicator">True</property>
-              </object>
-              <packing>
-                <property name="top-attach">0</property>
-                <property name="left-attach">1</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkRadioButton" id="local_radio">
-                <property name="label" translatable="yes">Link-Local Only</property>
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="receives_default">False</property>
-                <property name="draw_indicator">True</property>
-                <property name="group">automatic_radio</property>
-              </object>
-              <packing>
-                <property name="top-attach">0</property>
-                <property name="left-attach">2</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkRadioButton" id="manual_radio">
-                <property name="label" translatable="yes">Manual</property>
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="receives_default">False</property>
-                <property name="draw_indicator">True</property>
-                <property name="group">automatic_radio</property>
-              </object>
-              <packing>
-                <property name="top-attach">1</property>
-                <property name="left-attach">1</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkRadioButton" id="disabled_radio">
-                <property name="label" translatable="yes">Disable</property>
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="receives_default">False</property>
-                <property name="draw_indicator">True</property>
-                <property name="group">automatic_radio</property>
-              </object>
-              <packing>
-                <property name="top-attach">1</property>
-                <property name="left-attach">2</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkRadioButton" id="shared_radio">
-                <property name="label" translatable="yes">Shared to other computers</property>
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="receives_default">False</property>
-                <property name="draw_indicator">True</property>
-                <property name="group">automatic_radio</property>
-              </object>
-              <packing>
-                <property name="top-attach">2</property>
-                <property name="left-attach">1</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkBox" id="content_box">
-                <property name="visible">True</property>
-                <property name="can_focus">False</property>
+              <object class="GtkGrid" id="main_box">
+                <property name="margin_start">24</property>
+                <property name="margin_end">24</property>
+                <property name="margin_top">24</property>
+                <property name="margin_bottom">24</property>
                 <property name="orientation">vertical</property>
-                <property name="spacing">6</property>
+                <property name="row-spacing">6</property>
+                <property name="column-spacing">6</property>
+                <child>
+                  <object class="GtkLabel">
+                    <property name="label" translatable="yes">IPv_4 Method</property>
+                    <property name="use_underline">True</property>
+                    <property name="mnemonic_widget">disabled_radio</property>
+                    <property name="xalign">0.0</property>
+                    <layout>
+                      <property name="row">0</property>
+                      <property name="column">0</property>
+                    </layout>
+                    <attributes>
+                      <attribute name="weight" value="bold"/>
+                    </attributes>
+                  </object>
+                </child>
+                <child>
+                  <object class="GtkCheckButton" id="automatic_radio">
+                    <property name="label" translatable="yes">Automatic (DHCP)</property>
+                    <layout>
+                      <property name="row">0</property>
+                      <property name="column">1</property>
+                    </layout>
+                  </object>
+                </child>
+                <child>
+                  <object class="GtkCheckButton" id="local_radio">
+                    <property name="label" translatable="yes">Link-Local Only</property>
+                    <property name="group">automatic_radio</property>
+                    <layout>
+                      <property name="row">0</property>
+                      <property name="column">2</property>
+                    </layout>
+                  </object>
+                </child>
+                <child>
+                  <object class="GtkCheckButton" id="manual_radio">
+                    <property name="label" translatable="yes">Manual</property>
+                    <property name="group">automatic_radio</property>
+                    <layout>
+                      <property name="row">1</property>
+                      <property name="column">1</property>
+                    </layout>
+                  </object>
+                </child>
+                <child>
+                  <object class="GtkCheckButton" id="disabled_radio">
+                    <property name="label" translatable="yes">Disable</property>
+                    <property name="group">automatic_radio</property>
+                    <layout>
+                      <property name="row">1</property>
+                      <property name="column">2</property>
+                    </layout>
+                  </object>
+                </child>
+                <child>
+                  <object class="GtkCheckButton" id="shared_radio">
+                    <property name="label" translatable="yes">Shared to other computers</property>
+                    <property name="group">automatic_radio</property>
+                    <layout>
+                      <property name="row">2</property>
+                      <property name="column">1</property>
+                    </layout>
+                  </object>
+                </child>
                 <child>
-                  <object class="GtkBox" id="address_box">
-                    <property name="visible">True</property>
-                    <property name="can_focus">False</property>
+                  <object class="GtkBox" id="content_box">
                     <property name="orientation">vertical</property>
+                    <property name="spacing">6</property>
+                    <layout>
+                      <property name="row">3</property>
+                      <property name="column">0</property>
+                      <property name="column-span">3</property>
+                    </layout>
                     <child>
-                      <object class="GtkLabel">
-                        <property name="visible">True</property>
-                        <property name="can_focus">False</property>
-                        <property name="xalign">0</property>
-                        <property name="label" translatable="yes">Addresses</property>
-                        <property name="margin_top">24</property>
-                        <property name="margin_bottom">8</property>
-                        <attributes>
-                          <attribute name="weight" value="bold"/>
-                        </attributes>
-                      </object>
-                    </child>
-                    <child>
-                      <object class="GtkBox">
-                        <property name="visible">True</property>
-                        <property name="can_focus">False</property>
-                        <property name="orientation">horizontal</property>
+                      <object class="GtkBox" id="address_box">
+                        <property name="orientation">vertical</property>
                         <child>
                           <object class="GtkLabel">
-                            <property name="visible">True</property>
-                            <property name="can_focus">False</property>
-                            <property name="hexpand">True</property>
-                            <property name="label" translatable="yes">Address</property>
-                            <style>
-                              <class name="dim-label" />
-                            </style>
+                            <property name="xalign">0</property>
+                            <property name="label" translatable="yes">Addresses</property>
+                            <property name="margin_top">24</property>
+                            <property name="margin_bottom">8</property>
                             <attributes>
-                              <attribute name="scale" value="0.8"/>
+                              <attribute name="weight" value="bold"/>
                             </attributes>
                           </object>
                         </child>
                         <child>
-                          <object class="GtkLabel">
-                            <property name="visible">True</property>
-                            <property name="can_focus">False</property>
+                          <object class="GtkBox">
+                            <property name="orientation">horizontal</property>
+                            <child>
+                              <object class="GtkLabel">
+                                <property name="hexpand">True</property>
+                                <property name="label" translatable="yes">Address</property>
+                                <style>
+                                  <class name="dim-label" />
+                                </style>
+                                <attributes>
+                                  <attribute name="scale" value="0.8"/>
+                                </attributes>
+                              </object>
+                            </child>
+                            <child>
+                              <object class="GtkLabel">
+                                <property name="hexpand">True</property>
+                                <property name="label" translatable="yes">Netmask</property>
+                                <style>
+                                  <class name="dim-label" />
+                                </style>
+                                <attributes>
+                                  <attribute name="scale" value="0.8"/>
+                                </attributes>
+                              </object>
+                            </child>
+                            <child>
+                              <object class="GtkLabel">
+                                <property name="hexpand">True</property>
+                                <property name="label" translatable="yes">Gateway</property>
+                                <style>
+                                  <class name="dim-label" />
+                                </style>
+                                <attributes>
+                                  <attribute name="scale" value="0.8"/>
+                                </attributes>
+                              </object>
+                            </child>
+
+                            <!-- This invisible box is used to add some width in the
+                                 end of the header row, assuming the space used by the
+                                 delete button in the rows -->
+                            <child>
+                              <object class="GtkBox" id="address_stub_box">
+                              </object>
+                            </child>
+                          </object>
+                        </child>
+                      </object>
+                    </child>
+                    <child>
+                      <object class="GtkBox">
+                        <property name="margin_top">24</property>
+                        <property name="spacing">6</property>
+                        <child>
+                          <object class="GtkLabel" id="dns4_label">
                             <property name="hexpand">True</property>
-                            <property name="label" translatable="yes">Netmask</property>
-                            <style>
-                              <class name="dim-label" />
-                            </style>
+                            <property name="xalign">0</property>
+                            <property name="label" translatable="yes">DNS</property>
                             <attributes>
-                              <attribute name="scale" value="0.8"/>
+                              <attribute name="weight" value="bold"/>
                             </attributes>
                           </object>
                         </child>
                         <child>
                           <object class="GtkLabel">
-                            <property name="visible">True</property>
-                            <property name="can_focus">False</property>
                             <property name="hexpand">True</property>
-                            <property name="label" translatable="yes">Gateway</property>
-                            <style>
-                              <class name="dim-label" />
-                            </style>
-                            <attributes>
-                              <attribute name="scale" value="0.8"/>
-                            </attributes>
+                            <property name="xalign">1</property>
+                            <property name="label" translatable="yes">Automatic</property>
                           </object>
                         </child>
-
-                        <!-- This invisible box is used to add some width in the
-                             end of the header row, assuming the space used by the
-                             delete button in the rows -->
                         <child>
-                          <object class="GtkBox" id="address_stub_box">
-                            <property name="visible">True</property>
-                            <property name="can_focus">False</property>
+                          <object class="GtkSwitch" id="auto_dns_switch">
+                            <property name="halign">end</property>
+                            <property name="valign">center</property>
+                            <accessibility>
+                              <property name="label" translatable="yes">Automatic DNS</property>
+                            </accessibility>
                           </object>
                         </child>
                       </object>
                     </child>
-                  </object>
-                  <packing>
-                    <property name="expand">False</property>
-                    <property name="fill">True</property>
-                    <property name="position">1</property>
-                  </packing>
-                </child>
-                <child>
-                  <object class="GtkBox">
-                    <property name="visible">True</property>
-                    <property name="can_focus">False</property>
-                    <property name="margin_top">24</property>
-                    <property name="spacing">6</property>
-                    <child>
-                      <object class="GtkLabel" id="dns4_label">
-                        <property name="visible">True</property>
-                        <property name="can_focus">False</property>
-                        <property name="hexpand">True</property>
-                        <property name="xalign">0</property>
-                        <property name="label" translatable="yes">DNS</property>
-                        <attributes>
-                          <attribute name="weight" value="bold"/>
-                        </attributes>
-                      </object>
-                    </child>
-                    <child>
-                      <object class="GtkLabel">
-                        <property name="visible">True</property>
-                        <property name="can_focus">False</property>
-                        <property name="hexpand">True</property>
-                        <property name="xalign">1</property>
-                        <property name="label" translatable="yes">Automatic</property>
-                      </object>
-                    </child>
                     <child>
-                      <object class="GtkSwitch" id="auto_dns_switch">
-                        <property name="visible">True</property>
-                        <property name="can_focus">True</property>
-                        <property name="halign">end</property>
-                        <property name="valign">center</property>
-                        <child internal-child="accessible">
-                          <object class="AtkObject">
-                            <property name="accessible-name" translatable="yes">Automatic DNS</property>
-                          </object>
-                        </child>
+                      <object class="GtkEntry" id="dns_entry">
                       </object>
                     </child>
-                  </object>
-                  <packing>
-                    <property name="position">2</property>
-                  </packing>
-                </child>
-                <child>
-                  <object class="GtkEntry" id="dns_entry">
-                    <property name="visible">True</property>
-                    <property name="can_focus">True</property>
-                    </object>
-                  <packing>
-                    <property name="position">3</property>
-                  </packing>
-                </child>
-                <child>
-                  <object class="GtkLabel">
-                    <property name="visible">True</property>
-                    <property name="can_focus">False</property>
-                    <property name="xalign">0</property>
-                    <property name="label" translatable="yes">Separate IP addresses with commas</property>
-                    <style>
-                      <class name="dim-label" />
-                    </style>
-                    <attributes>
-                      <attribute name="scale" value="0.8"/>
-                    </attributes>
-                  </object>
-                </child>
-                <child>
-                  <object class="GtkBox">
-                    <property name="visible">True</property>
-                    <property name="can_focus">False</property>
-                    <property name="margin_top">24</property>
-                    <property name="spacing">6</property>
                     <child>
                       <object class="GtkLabel">
-                        <property name="visible">True</property>
-                        <property name="can_focus">False</property>
                         <property name="xalign">0</property>
-                        <property name="hexpand">True</property>
-                        <property name="label" translatable="yes">Routes</property>
+                        <property name="label" translatable="yes">Separate IP addresses with 
commas</property>
+                        <style>
+                          <class name="dim-label" />
+                        </style>
                         <attributes>
-                          <attribute name="weight" value="bold"/>
+                          <attribute name="scale" value="0.8"/>
                         </attributes>
                       </object>
                     </child>
-                    <child>
-                      <object class="GtkLabel">
-                        <property name="visible">True</property>
-                        <property name="can_focus">False</property>
-                        <property name="hexpand">True</property>
-                        <property name="xalign">1</property>
-                        <property name="label" translatable="yes">Automatic</property>
-                      </object>
-                    </child>
-                    <child>
-                      <object class="GtkSwitch" id="auto_routes_switch">
-                        <property name="visible">True</property>
-                        <property name="can_focus">True</property>
-                        <property name="halign">end</property>
-                        <property name="valign">center</property>
-                        <child internal-child="accessible">
-                          <object class="AtkObject">
-                            <property name="accessible-name" translatable="yes">Automatic Routes</property>
-                          </object>
-                        </child>
-                      </object>
-                    </child>
-                  </object>
-                  <packing>
-                    <property name="position">5</property>
-                  </packing>
-                </child>
-                <child>
-                  <object class="GtkBox" id="routes_box">
-                    <property name="visible">True</property>
-                    <property name="can_focus">False</property>
-                    <property name="orientation">vertical</property>
                     <child>
                       <object class="GtkBox">
-                        <property name="visible">True</property>
-                        <property name="can_focus">False</property>
-                        <property name="orientation">horizontal</property>
-                        <child>
-                          <object class="GtkLabel" id="routes_address_label">
-                            <property name="visible">True</property>
-                            <property name="can_focus">False</property>
-                            <property name="hexpand">True</property>
-                            <property name="label" translatable="yes">Address</property>
-                            <style>
-                              <class name="dim-label" />
-                            </style>
-                            <attributes>
-                              <attribute name="scale" value="0.8"/>
-                            </attributes>
-                          </object>
-                        </child>
+                        <property name="margin_top">24</property>
+                        <property name="spacing">6</property>
                         <child>
                           <object class="GtkLabel">
-                            <property name="visible">True</property>
-                            <property name="can_focus">False</property>
+                            <property name="xalign">0</property>
                             <property name="hexpand">True</property>
-                            <property name="label" translatable="yes">Netmask</property>
-                            <style>
-                              <class name="dim-label" />
-                            </style>
+                            <property name="label" translatable="yes">Routes</property>
                             <attributes>
-                              <attribute name="scale" value="0.8"/>
+                              <attribute name="weight" value="bold"/>
                             </attributes>
                           </object>
                         </child>
                         <child>
                           <object class="GtkLabel">
-                            <property name="visible">True</property>
-                            <property name="can_focus">False</property>
                             <property name="hexpand">True</property>
-                            <property name="label" translatable="yes">Gateway</property>
-                            <style>
-                              <class name="dim-label" />
-                            </style>
-                            <attributes>
-                              <attribute name="scale" value="0.8"/>
-                            </attributes>
+                            <property name="xalign">1</property>
+                            <property name="label" translatable="yes">Automatic</property>
                           </object>
                         </child>
                         <child>
-                          <object class="GtkLabel" id="routes_metric_label">
-                            <property name="visible">True</property>
-                            <property name="can_focus">False</property>
-                            <property name="label" translatable="yes" comments="Translators: Please see 
https://en.wikipedia.org/wiki/Metrics_(networking)">Metric</property>
-                            <style>
-                              <class name="dim-label" />
-                            </style>
-                            <attributes>
-                              <attribute name="scale" value="0.8"/>
-                            </attributes>
+                          <object class="GtkSwitch" id="auto_routes_switch">
+                            <property name="halign">end</property>
+                            <property name="valign">center</property>
+                            <accessibility>
+                              <property name="label" translatable="yes">Automatic Routes</property>
+                            </accessibility>
                           </object>
                         </child>
-
-                        <!-- This invisible box is used to add some width in the
-                             end of the header row, assuming the space used by the
-                             delete button in the rows -->
+                      </object>
+                    </child>
+                    <child>
+                      <object class="GtkBox" id="routes_box">
+                        <property name="orientation">vertical</property>
                         <child>
-                          <object class="GtkBox" id="routes_stub_box">
-                            <property name="visible">True</property>
-                            <property name="can_focus">False</property>
+                          <object class="GtkBox">
+                            <property name="orientation">horizontal</property>
+                            <child>
+                              <object class="GtkLabel" id="routes_address_label">
+                                <property name="hexpand">True</property>
+                                <property name="label" translatable="yes">Address</property>
+                                <style>
+                                  <class name="dim-label" />
+                                </style>
+                                <attributes>
+                                  <attribute name="scale" value="0.8"/>
+                                </attributes>
+                              </object>
+                            </child>
+                            <child>
+                              <object class="GtkLabel">
+                                <property name="hexpand">True</property>
+                                <property name="label" translatable="yes">Netmask</property>
+                                <style>
+                                  <class name="dim-label" />
+                                </style>
+                                <attributes>
+                                  <attribute name="scale" value="0.8"/>
+                                </attributes>
+                              </object>
+                            </child>
+                            <child>
+                              <object class="GtkLabel">
+                                <property name="hexpand">True</property>
+                                <property name="label" translatable="yes">Gateway</property>
+                                <style>
+                                  <class name="dim-label" />
+                                </style>
+                                <attributes>
+                                  <attribute name="scale" value="0.8"/>
+                                </attributes>
+                              </object>
+                            </child>
+                            <child>
+                              <object class="GtkLabel" id="routes_metric_label">
+                                <property name="label" translatable="yes" comments="Translators: Please see 
https://en.wikipedia.org/wiki/Metrics_(networking)">Metric</property>
+                                <style>
+                                  <class name="dim-label" />
+                                </style>
+                                <attributes>
+                                  <attribute name="scale" value="0.8"/>
+                                </attributes>
+                              </object>
+                            </child>
+
+                            <!-- This invisible box is used to add some width in the
+                                 end of the header row, assuming the space used by the
+                                 delete button in the rows -->
+                            <child>
+                              <object class="GtkBox" id="routes_stub_box">
+                              </object>
+                            </child>
                           </object>
                         </child>
                       </object>
                     </child>
+                    <child>
+                      <object class="GtkCheckButton" id="never_default_check">
+                        <property name="label" translatable="yes">Use this connection _only for resources on 
its network</property>
+                        <property name="use_underline">True</property>
+                      </object>
+                    </child>
                   </object>
-                  <packing>
-                    <property name="expand">False</property>
-                    <property name="fill">True</property>
-                    <property name="position">6</property>
-                  </packing>
-                </child>
-                <child>
-                  <object class="GtkCheckButton" id="never_default_check">
-                    <property name="label" translatable="yes">Use this connection _only for resources on its 
network</property>
-                    <property name="visible">True</property>
-                    <property name="can_focus">True</property>
-                    <property name="receives_default">False</property>
-                    <property name="use_underline">True</property>
-                    <property name="xalign">0</property>
-                    <property name="draw_indicator">True</property>
-                  </object>
-                  <packing>
-                    <property name="expand">False</property>
-                    <property name="fill">True</property>
-                    <property name="position">7</property>
-                  </packing>
                 </child>
               </object>
-              <packing>
-                <property name="top-attach">3</property>
-                <property name="left-attach">0</property>
-                <property name="width">3</property>
-              </packing>
             </child>
           </object>
         </child>
diff --git a/panels/network/connection-editor/ip6-page.ui b/panels/network/connection-editor/ip6-page.ui
index 06044c468..c6ec8f525 100644
--- a/panels/network/connection-editor/ip6-page.ui
+++ b/panels/network/connection-editor/ip6-page.ui
@@ -1,434 +1,322 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <interface>
   <!-- interface-requires gtk+ 3.0 -->
-  <template class="CEPageIP6" parent="GtkScrolledWindow">
-    <property name="visible">True</property>
-    <property name="can_focus">True</property>
-    <property name="hscrollbar_policy">never</property>
+  <template class="CEPageIP6" parent="AdwBin">column
     <child>
-      <object class="GtkViewport">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
+      <object class="GtkScrolledWindow">
+        <property name="hscrollbar_policy">never</property>
         <child>
-          <object class="GtkGrid" id="main_box">
-            <property name="visible">True</property>
-            <property name="can_focus">False</property>
-            <property name="margin_start">24</property>
-            <property name="margin_end">24</property>
-            <property name="margin_top">24</property>
-            <property name="margin_bottom">24</property>
-            <property name="orientation">vertical</property>
-            <property name="row-spacing">6</property>
-            <property name="column-spacing">6</property>
+          <object class="GtkViewport">
             <child>
-              <object class="GtkLabel">
-                <property name="visible">True</property>
-                <property name="can_focus">False</property>
-                <property name="label" translatable="yes">IPv_6 Method</property>
-                <property name="use_underline">True</property>
-                <property name="mnemonic_widget">disabled_radio</property>
-                <property name="xalign">0.0</property>
-                <attributes>
-                  <attribute name="weight" value="bold"/>
-                </attributes>
-              </object>
-              <packing>
-                <property name="top-attach">0</property>
-                <property name="left-attach">0</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkRadioButton" id="automatic_radio">
-                <property name="label" translatable="yes">Automatic</property>
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="receives_default">False</property>
-                <property name="draw_indicator">True</property>
-              </object>
-              <packing>
-                <property name="top-attach">0</property>
-                <property name="left-attach">1</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkRadioButton" id="dhcp_radio">
-                <property name="label" translatable="yes">Automatic, DHCP only</property>
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="receives_default">False</property>
-                <property name="draw_indicator">True</property>
-                <property name="group">automatic_radio</property>
-              </object>
-              <packing>
-                <property name="top-attach">0</property>
-                <property name="left-attach">2</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkRadioButton" id="local_radio">
-                <property name="label" translatable="yes">Link-Local Only</property>
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="receives_default">False</property>
-                <property name="draw_indicator">True</property>
-                <property name="group">automatic_radio</property>
-              </object>
-              <packing>
-                <property name="top-attach">1</property>
-                <property name="left-attach">1</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkRadioButton" id="manual_radio">
-                <property name="label" translatable="yes">Manual</property>
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="receives_default">False</property>
-                <property name="draw_indicator">True</property>
-                <property name="group">automatic_radio</property>
-              </object>
-              <packing>
-                <property name="top-attach">1</property>
-                <property name="left-attach">2</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkRadioButton" id="disabled_radio">
-                <property name="label" translatable="yes">Disable</property>
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="receives_default">False</property>
-                <property name="draw_indicator">True</property>
-                <property name="group">automatic_radio</property>
-              </object>
-              <packing>
-                <property name="top-attach">2</property>
-                <property name="left-attach">1</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkRadioButton" id="shared_radio">
-                <property name="label" translatable="yes">Shared to other computers</property>
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="receives_default">False</property>
-                <property name="draw_indicator">True</property>
-                <property name="group">automatic_radio</property>
-              </object>
-              <packing>
-                <property name="top-attach">2</property>
-                <property name="left-attach">2</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkBox" id="content_box">
-                <property name="visible">True</property>
-                <property name="can_focus">False</property>
+              <object class="GtkGrid" id="main_box">
+                <property name="margin_start">24</property>
+                <property name="margin_end">24</property>
+                <property name="margin_top">24</property>
+                <property name="margin_bottom">24</property>
                 <property name="orientation">vertical</property>
-                <property name="spacing">6</property>
+                <property name="row-spacing">6</property>
+                <property name="column-spacing">6</property>
                 <child>
-                  <object class="GtkBox" id="address_box">
-                    <property name="visible">True</property>
-                    <property name="can_focus">False</property>
+                  <object class="GtkLabel">
+                    <property name="label" translatable="yes">IPv_6 Method</property>
+                    <property name="use_underline">True</property>
+                    <property name="mnemonic_widget">disabled_radio</property>
+                    <property name="xalign">0.0</property>
+                    <layout>
+                      <property name="row">0</property>
+                      <property name="column">0</property>
+                    </layout>
+                    <attributes>
+                      <attribute name="weight" value="bold"/>
+                    </attributes>
+                  </object>
+                </child>
+                <child>
+                  <object class="GtkCheckButton" id="automatic_radio">
+                    <property name="label" translatable="yes">Automatic</property>
+                    <layout>
+                      <property name="row">0</property>
+                      <property name="column">1</property>
+                    </layout>
+                  </object>
+                </child>
+                <child>
+                  <object class="GtkCheckButton" id="dhcp_radio">
+                    <property name="label" translatable="yes">Automatic, DHCP only</property>
+                    <property name="group">automatic_radio</property>
+                    <layout>
+                      <property name="row">0</property>
+                      <property name="column">2</property>
+                    </layout>
+                  </object>
+                </child>
+                <child>
+                  <object class="GtkCheckButton" id="local_radio">
+                    <property name="label" translatable="yes">Link-Local Only</property>
+                    <property name="group">automatic_radio</property>
+                    <layout>
+                      <property name="row">1</property>
+                      <property name="column">1</property>
+                    </layout>
+                  </object>
+                </child>
+                <child>
+                  <object class="GtkCheckButton" id="manual_radio">
+                    <property name="label" translatable="yes">Manual</property>
+                    <property name="group">automatic_radio</property>
+                    <layout>
+                      <property name="row">1</property>
+                      <property name="column">2</property>
+                    </layout>
+                  </object>
+                </child>
+                <child>
+                  <object class="GtkCheckButton" id="disabled_radio">
+                    <property name="label" translatable="yes">Disable</property>
+                    <property name="group">automatic_radio</property>
+                    <layout>
+                      <property name="row">2</property>
+                      <property name="column">1</property>
+                    </layout>
+                  </object>
+                </child>
+                <child>
+                  <object class="GtkCheckButton" id="shared_radio">
+                    <property name="label" translatable="yes">Shared to other computers</property>
+                    <property name="group">automatic_radio</property>
+                    <layout>
+                      <property name="row">2</property>
+                      <property name="column">2</property>
+                    </layout>
+                  </object>
+                </child>
+                <child>
+                  <object class="GtkBox" id="content_box">
                     <property name="orientation">vertical</property>
+                    <property name="spacing">6</property>
+                    <layout>
+                      <property name="row">3</property>
+                      <property name="column">0</property>
+                      <property name="column-span">3</property>
+                    </layout>
                     <child>
-                      <object class="GtkLabel">
-                        <property name="visible">True</property>
-                        <property name="can_focus">False</property>
-                        <property name="xalign">0</property>
-                        <property name="label" translatable="yes">Addresses</property>
-                        <property name="margin_top">24</property>
-                        <property name="margin_bottom">8</property>
-                        <attributes>
-                          <attribute name="weight" value="bold"/>
-                        </attributes>
-                      </object>
-                    </child>
-                    <child>
-                      <object class="GtkBox">
-                        <property name="visible">True</property>
-                        <property name="can_focus">False</property>
-                        <property name="orientation">horizontal</property>
+                      <object class="GtkBox" id="address_box">
+                        <property name="orientation">vertical</property>
                         <child>
-                          <object class="GtkLabel" id="address_address_label">
-                            <property name="visible">True</property>
-                            <property name="can_focus">False</property>
-                            <property name="hexpand">True</property>
-                            <property name="label" translatable="yes">Address</property>
-                            <style>
-                              <class name="dim-label" />
-                            </style>
+                          <object class="GtkLabel">
+                            <property name="xalign">0</property>
+                            <property name="label" translatable="yes">Addresses</property>
+                            <property name="margin_top">24</property>
+                            <property name="margin_bottom">8</property>
                             <attributes>
-                              <attribute name="scale" value="0.8"/>
+                              <attribute name="weight" value="bold"/>
                             </attributes>
                           </object>
                         </child>
                         <child>
-                          <object class="GtkLabel">
-                            <property name="visible">True</property>
-                            <property name="can_focus">False</property>
+                          <object class="GtkBox">
+                            <property name="orientation">horizontal</property>
+                            <child>
+                              <object class="GtkLabel" id="address_address_label">
+                                <property name="hexpand">True</property>
+                                <property name="label" translatable="yes">Address</property>
+                                <style>
+                                  <class name="dim-label" />
+                                </style>
+                                <attributes>
+                                  <attribute name="scale" value="0.8"/>
+                                </attributes>
+                              </object>
+                            </child>
+                            <child>
+                              <object class="GtkLabel">
+                                <property name="hexpand">True</property>
+                                <property name="label" translatable="yes">Prefix</property>
+                                <style>
+                                  <class name="dim-label" />
+                                </style>
+                                <attributes>
+                                  <attribute name="scale" value="0.8"/>
+                                </attributes>
+                              </object>
+                            </child>
+                            <child>
+                              <object class="GtkLabel">
+                                <property name="hexpand">True</property>
+                                <property name="label" translatable="yes">Gateway</property>
+                                <style>
+                                  <class name="dim-label" />
+                                </style>
+                                <attributes>
+                                  <attribute name="scale" value="0.8"/>
+                                </attributes>
+                              </object>
+                            </child>
+
+                            <!-- This invisible box is used to add some width in the
+                                 end of the header row, assuming the space used by the
+                                 delete button in the rows -->
+                            <child>
+                              <object class="GtkBox" id="address_stub_box">
+                              </object>
+                            </child>
+                          </object>
+                        </child>
+                      </object>
+                    </child>
+                    <child>
+                      <object class="GtkBox">
+                        <property name="margin_top">24</property>
+                        <property name="spacing">6</property>
+                        <child>
+                          <object class="GtkLabel" id="dns6_label">
                             <property name="hexpand">True</property>
-                            <property name="label" translatable="yes">Prefix</property>
-                            <style>
-                              <class name="dim-label" />
-                            </style>
+                            <property name="xalign">0</property>
+                            <property name="label" translatable="yes">DNS</property>
                             <attributes>
-                              <attribute name="scale" value="0.8"/>
+                              <attribute name="weight" value="bold"/>
                             </attributes>
                           </object>
                         </child>
                         <child>
                           <object class="GtkLabel">
-                            <property name="visible">True</property>
-                            <property name="can_focus">False</property>
                             <property name="hexpand">True</property>
-                            <property name="label" translatable="yes">Gateway</property>
-                            <style>
-                              <class name="dim-label" />
-                            </style>
-                            <attributes>
-                              <attribute name="scale" value="0.8"/>
-                            </attributes>
+                            <property name="xalign">1</property>
+                            <property name="label" translatable="yes">Automatic</property>
                           </object>
                         </child>
-
-                        <!-- This invisible box is used to add some width in the
-                             end of the header row, assuming the space used by the
-                             delete button in the rows -->
                         <child>
-                          <object class="GtkBox" id="address_stub_box">
-                            <property name="visible">True</property>
-                            <property name="can_focus">False</property>
+                          <object class="GtkSwitch" id="auto_dns_switch">
+                            <property name="halign">end</property>
+                            <property name="valign">center</property>
+                            <accessibility>
+                              <property name="label" translatable="yes">Automatic DNS</property>
+                            </accessibility>
                           </object>
                         </child>
                       </object>
                     </child>
-                  </object>
-                  <packing>
-                    <property name="expand">False</property>
-                    <property name="fill">True</property>
-                    <property name="position">1</property>
-                  </packing>
-                </child>
-                <child>
-                  <object class="GtkBox">
-                    <property name="visible">True</property>
-                    <property name="can_focus">False</property>
-                    <property name="margin_top">24</property>
-                    <property name="spacing">6</property>
                     <child>
-                      <object class="GtkLabel" id="dns6_label">
-                        <property name="visible">True</property>
-                        <property name="can_focus">False</property>
-                        <property name="hexpand">True</property>
-                        <property name="xalign">0</property>
-                        <property name="label" translatable="yes">DNS</property>
-                        <attributes>
-                          <attribute name="weight" value="bold"/>
-                        </attributes>
-                      </object>
-                    </child>
-                    <child>
-                      <object class="GtkLabel">
-                        <property name="visible">True</property>
-                        <property name="can_focus">False</property>
-                        <property name="hexpand">True</property>
-                        <property name="xalign">1</property>
-                        <property name="label" translatable="yes">Automatic</property>
-                      </object>
-                    </child>
-                    <child>
-                      <object class="GtkSwitch" id="auto_dns_switch">
-                        <property name="visible">True</property>
-                        <property name="can_focus">True</property>
-                        <property name="halign">end</property>
-                        <property name="valign">center</property>
-                        <child internal-child="accessible">
-                          <object class="AtkObject">
-                            <property name="accessible-name" translatable="yes">Automatic DNS</property>
-                          </object>
-                        </child>
-                      </object>
+                      <object class="GtkEntry" id="dns_entry" />
                     </child>
-                  </object>
-                  <packing>
-                    <property name="position">2</property>
-                  </packing>
-                </child>
-                <child>
-                  <object class="GtkEntry" id="dns_entry">
-                    <property name="visible">True</property>
-                    <property name="can_focus">True</property>
-                    </object>
-                  <packing>
-                    <property name="position">3</property>
-                  </packing>
-                </child>
-                <child>
-                  <object class="GtkLabel">
-                    <property name="visible">True</property>
-                    <property name="can_focus">False</property>
-                    <property name="xalign">0</property>
-                    <property name="label" translatable="yes">Separate IP addresses with commas</property>
-                    <style>
-                      <class name="dim-label" />
-                    </style>
-                    <attributes>
-                      <attribute name="scale" value="0.8"/>
-                    </attributes>
-                  </object>
-                </child>
-                <child>
-                  <object class="GtkBox">
-                    <property name="visible">True</property>
-                    <property name="can_focus">False</property>
-                    <property name="margin_top">24</property>
-                    <property name="spacing">6</property>
                     <child>
                       <object class="GtkLabel">
-                        <property name="visible">True</property>
-                        <property name="can_focus">False</property>
                         <property name="xalign">0</property>
-                        <property name="hexpand">True</property>
-                        <property name="label" translatable="yes">Routes</property>
+                        <property name="label" translatable="yes">Separate IP addresses with 
commas</property>
+                        <style>
+                          <class name="dim-label" />
+                        </style>
                         <attributes>
-                          <attribute name="weight" value="bold"/>
+                          <attribute name="scale" value="0.8"/>
                         </attributes>
                       </object>
                     </child>
-                    <child>
-                      <object class="GtkLabel">
-                        <property name="visible">True</property>
-                        <property name="can_focus">False</property>
-                        <property name="hexpand">True</property>
-                        <property name="xalign">1</property>
-                        <property name="label" translatable="yes">Automatic</property>
-                      </object>
-                    </child>
-                    <child>
-                      <object class="GtkSwitch" id="auto_routes_switch">
-                        <property name="visible">True</property>
-                        <property name="can_focus">True</property>
-                        <property name="halign">end</property>
-                        <property name="valign">center</property>
-                        <child internal-child="accessible">
-                          <object class="AtkObject">
-                            <property name="accessible-name" translatable="yes">Automatic Routes</property>
-                          </object>
-                        </child>
-                      </object>
-                    </child>
-                  </object>
-                  <packing>
-                    <property name="position">5</property>
-                  </packing>
-                </child>
-                <child>
-                  <object class="GtkBox" id="routes_box">
-                    <property name="visible">True</property>
-                    <property name="can_focus">False</property>
-                    <property name="orientation">vertical</property>
                     <child>
                       <object class="GtkBox">
-                        <property name="visible">True</property>
-                        <property name="can_focus">False</property>
-                        <property name="orientation">horizontal</property>
-                        <child>
-                          <object class="GtkLabel" id="routes_address_label">
-                            <property name="visible">True</property>
-                            <property name="can_focus">False</property>
-                            <property name="hexpand">True</property>
-                            <property name="label" translatable="yes">Address</property>
-                            <style>
-                              <class name="dim-label" />
-                            </style>
-                            <attributes>
-                              <attribute name="scale" value="0.8"/>
-                            </attributes>
-                          </object>
-                        </child>
+                        <property name="margin_top">24</property>
+                        <property name="spacing">6</property>
                         <child>
-                          <object class="GtkLabel" id="routes_prefix_label">
-                            <property name="visible">True</property>
-                            <property name="can_focus">False</property>
+                          <object class="GtkLabel">
+                            <property name="xalign">0</property>
                             <property name="hexpand">True</property>
-                            <property name="label" translatable="yes">Prefix</property>
-                            <style>
-                              <class name="dim-label" />
-                            </style>
+                            <property name="label" translatable="yes">Routes</property>
                             <attributes>
-                              <attribute name="scale" value="0.8"/>
+                              <attribute name="weight" value="bold"/>
                             </attributes>
                           </object>
                         </child>
                         <child>
                           <object class="GtkLabel">
-                            <property name="visible">True</property>
-                            <property name="can_focus">False</property>
                             <property name="hexpand">True</property>
-                            <property name="label" translatable="yes">Gateway</property>
-                            <style>
-                              <class name="dim-label" />
-                            </style>
-                            <attributes>
-                              <attribute name="scale" value="0.8"/>
-                            </attributes>
+                            <property name="xalign">1</property>
+                            <property name="label" translatable="yes">Automatic</property>
                           </object>
                         </child>
                         <child>
-                          <object class="GtkLabel" id="routes_metric_label">
-                            <property name="visible">True</property>
-                            <property name="can_focus">False</property>
-                            <property name="label" translatable="yes" comments="Translators: Please see 
https://en.wikipedia.org/wiki/Metrics_(networking)">Metric</property>
-                            <style>
-                              <class name="dim-label" />
-                            </style>
-                            <attributes>
-                              <attribute name="scale" value="0.8"/>
-                            </attributes>
+                          <object class="GtkSwitch" id="auto_routes_switch">
+                            <property name="halign">end</property>
+                            <property name="valign">center</property>
+                            <accessibility>
+                              <property name="label" translatable="yes">Automatic Routes</property>
+                            </accessibility>
                           </object>
                         </child>
-
-                        <!-- This invisible box is used to add some width in the
-                             end of the header row, assuming the space used by the
-                             delete button in the rows -->
+                      </object>
+                    </child>
+                    <child>
+                      <object class="GtkBox" id="routes_box">
+                        <property name="orientation">vertical</property>
                         <child>
-                          <object class="GtkBox" id="routes_stub_box">
-                            <property name="visible">True</property>
-                            <property name="can_focus">False</property>
+                          <object class="GtkBox">
+                            <property name="orientation">horizontal</property>
+                            <child>
+                              <object class="GtkLabel" id="routes_address_label">
+                                <property name="hexpand">True</property>
+                                <property name="label" translatable="yes">Address</property>
+                                <style>
+                                  <class name="dim-label" />
+                                </style>
+                                <attributes>
+                                  <attribute name="scale" value="0.8"/>
+                                </attributes>
+                              </object>
+                            </child>
+                            <child>
+                              <object class="GtkLabel" id="routes_prefix_label">
+                                <property name="hexpand">True</property>
+                                <property name="label" translatable="yes">Prefix</property>
+                                <style>
+                                  <class name="dim-label" />
+                                </style>
+                                <attributes>
+                                  <attribute name="scale" value="0.8"/>
+                                </attributes>
+                              </object>
+                            </child>
+                            <child>
+                              <object class="GtkLabel">
+                                <property name="hexpand">True</property>
+                                <property name="label" translatable="yes">Gateway</property>
+                                <style>
+                                  <class name="dim-label" />
+                                </style>
+                                <attributes>
+                                  <attribute name="scale" value="0.8"/>
+                                </attributes>
+                              </object>
+                            </child>
+                            <child>
+                              <object class="GtkLabel" id="routes_metric_label">
+                                <property name="label" translatable="yes" comments="Translators: Please see 
https://en.wikipedia.org/wiki/Metrics_(networking)">Metric</property>
+                                <style>
+                                  <class name="dim-label" />
+                                </style>
+                                <attributes>
+                                  <attribute name="scale" value="0.8"/>
+                                </attributes>
+                              </object>
+                            </child>
+
+                            <!-- This invisible box is used to add some width in the
+                                 end of the header row, assuming the space used by the
+                                 delete button in the rows -->
+                            <child>
+                              <object class="GtkBox" id="routes_stub_box">
+                              </object>
+                            </child>
                           </object>
                         </child>
                       </object>
                     </child>
+                    <child>
+                      <object class="GtkCheckButton" id="never_default_check">
+                        <property name="label" translatable="yes">Use this connection _only for resources on 
its network</property>
+                        <property name="use_underline">True</property>
+                      </object>
+                    </child>
                   </object>
-                  <packing>
-                    <property name="expand">False</property>
-                    <property name="fill">True</property>
-                    <property name="position">6</property>
-                  </packing>
-                </child>
-                <child>
-                  <object class="GtkCheckButton" id="never_default_check">
-                    <property name="label" translatable="yes">Use this connection _only for resources on its 
network</property>
-                    <property name="visible">True</property>
-                    <property name="can_focus">True</property>
-                    <property name="receives_default">False</property>
-                    <property name="use_underline">True</property>
-                    <property name="xalign">0</property>
-                    <property name="draw_indicator">True</property>
-                  </object>
-                  <packing>
-                    <property name="expand">False</property>
-                    <property name="fill">True</property>
-                    <property name="position">7</property>
-                  </packing>
                 </child>
               </object>
-              <packing>
-                <property name="top-attach">3</property>
-                <property name="left-attach">0</property>
-                <property name="width">3</property>
-              </packing>
             </child>
           </object>
         </child>
diff --git a/panels/network/connection-editor/net-connection-editor.c 
b/panels/network/connection-editor/net-connection-editor.c
index 505b8ee25..4b7fadc25 100644
--- a/panels/network/connection-editor/net-connection-editor.c
+++ b/panels/network/connection-editor/net-connection-editor.c
@@ -26,7 +26,6 @@
 
 #include <NetworkManager.h>
 
-#include "list-box-helper.h"
 #include "net-connection-editor.h"
 #include "net-connection-editor-resources.h"
 #include "ce-page.h"
@@ -53,7 +52,7 @@ struct _NetConnectionEditor
         GtkDialog parent;
 
         GtkBox           *add_connection_box;
-        GtkFrame         *add_connection_frame;
+        AdwBin           *add_connection_frame;
         GtkButton        *apply_button;
         GtkButton        *cancel_button;
         GtkNotebook      *notebook;
@@ -87,7 +86,7 @@ cancel_editing (NetConnectionEditor *self)
 }
 
 static void
-delete_event_cb (NetConnectionEditor *self)
+close_request_cb (NetConnectionEditor *self)
 {
         cancel_editing (self);
 }
@@ -226,8 +225,8 @@ net_connection_editor_class_init (NetConnectionEditorClass *class)
         gtk_widget_class_bind_template_child (widget_class, NetConnectionEditor, notebook);
         gtk_widget_class_bind_template_child (widget_class, NetConnectionEditor, toplevel_stack);
 
-        gtk_widget_class_bind_template_callback (widget_class, delete_event_cb);
         gtk_widget_class_bind_template_callback (widget_class, cancel_clicked_cb);
+        gtk_widget_class_bind_template_callback (widget_class, close_request_cb);
         gtk_widget_class_bind_template_callback (widget_class, apply_clicked_cb);
 }
 
@@ -255,9 +254,7 @@ net_connection_editor_error_dialog (NetConnectionEditor *self,
                                                           "%s", secondary_text);
         }
 
-        g_signal_connect (dialog, "delete-event", G_CALLBACK (gtk_widget_destroy), NULL);
-        g_signal_connect (dialog, "response", G_CALLBACK (gtk_widget_destroy), NULL);
-        gtk_dialog_run (GTK_DIALOG (dialog));
+        gtk_window_present (GTK_WINDOW (dialog));
 }
 
 static void
@@ -323,7 +320,7 @@ update_sensitivity (NetConnectionEditor *self)
 {
         NMSettingConnection *sc;
         gboolean sensitive;
-        GList *pages;
+        gint i;
 
         if (!editor_is_initialized (self))
                 return;
@@ -336,10 +333,9 @@ update_sensitivity (NetConnectionEditor *self)
                 sensitive = self->can_modify;
         }
 
-        pages = gtk_container_get_children (GTK_CONTAINER (self->notebook));
-        for (GList *l = pages; l; l = l->next) {
-                CEPage *page = l->data;
-                gtk_widget_set_sensitive (GTK_WIDGET (page), sensitive);
+        for (i = 0; i < gtk_notebook_get_n_pages (self->notebook); i++) {
+                GtkWidget *page = gtk_notebook_get_nth_page (self->notebook, i);
+                gtk_widget_set_sensitive (page, sensitive);
         }
 }
 
@@ -347,15 +343,14 @@ static void
 validate (NetConnectionEditor *self)
 {
         gboolean valid = FALSE;
-        GList *pages;
+        gint i;
 
         if (!editor_is_initialized (self))
                 goto done;
 
         valid = TRUE;
-        pages = gtk_container_get_children (GTK_CONTAINER (self->notebook));
-        for (GList *l = pages; l; l = l->next) {
-                CEPage *page = l->data;
+        for (i = 0; i < gtk_notebook_get_n_pages (self->notebook); i++) {
+                CEPage *page = CE_PAGE (gtk_notebook_get_nth_page (self->notebook, i));
                 g_autoptr(GError) error = NULL;
 
                 if (!ce_page_validate (page, self->connection, &error)) {
@@ -406,18 +401,16 @@ page_initialized (NetConnectionEditor *self, GError *error, CEPage *page)
 {
         GtkWidget *label;
         gint position;
-        GList *children, *l;
         gint i;
 
         position = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (page), "position"));
         g_object_set_data (G_OBJECT (page), "position", GINT_TO_POINTER (position));
-        children = gtk_container_get_children (GTK_CONTAINER (self->notebook));
-        for (l = children, i = 0; l; l = l->next, i++) {
-                gint pos = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (l->data), "position"));
+        for (i = 0; i < gtk_notebook_get_n_pages (self->notebook); i++) {
+                GtkWidget *page = gtk_notebook_get_nth_page (self->notebook, i);
+                gint pos = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (page), "position"));
                 if (pos > position)
                         break;
         }
-        g_list_free (children);
 
         label = gtk_label_new (ce_page_get_title (page));
 
@@ -608,11 +601,7 @@ complete_vpn_connection (NetConnectionEditor *self, NMConnection *connection)
 static void
 finish_add_connection (NetConnectionEditor *self, NMConnection *connection)
 {
-        GtkBin *frame;
-
-        frame = GTK_BIN (self->add_connection_frame);
-        gtk_widget_destroy (gtk_bin_get_child (frame));
-
+        adw_bin_set_child (self->add_connection_frame, NULL);
         gtk_stack_set_visible_child (self->toplevel_stack, GTK_WIDGET (self->notebook));
         gtk_widget_show (GTK_WIDGET (self->apply_button));
 
@@ -664,18 +653,16 @@ static void
 select_vpn_type (NetConnectionEditor *self, GtkListBox *list)
 {
         GSList *vpn_plugins, *iter;
-        GList *l;
-        GList *children;
         GtkWidget *row, *row_box;
         GtkWidget *name_label, *desc_label;
+        GtkWidget *child;
 
         /* Get the available VPN types */
         vpn_plugins = vpn_get_plugins ();
 
         /* Remove the previous menu contents */
-        children = gtk_container_get_children (GTK_CONTAINER (list));
-        for (l = children; l != NULL; l = l->next)
-                gtk_widget_destroy (l->data);
+        while ((child = gtk_widget_get_first_child (GTK_WIDGET (list))) != NULL)
+                gtk_list_box_remove (list, child);
 
         /* Add the VPN types */
         for (iter = vpn_plugins; iter; iter = iter->next) {
@@ -684,7 +671,6 @@ select_vpn_type (NetConnectionEditor *self, GtkListBox *list)
                 g_autofree gchar *desc = NULL;
                 g_autofree gchar *desc_markup = NULL;
                 g_autofree gchar *service_name = NULL;
-                GtkStyleContext *context;
 
                 g_object_get (plugin,
                               NM_VPN_EDITOR_PLUGIN_NAME, &name,
@@ -703,20 +689,18 @@ select_vpn_type (NetConnectionEditor *self, GtkListBox *list)
 
                 name_label = gtk_label_new (name);
                 gtk_widget_set_halign (name_label, GTK_ALIGN_START);
-                gtk_box_pack_start (GTK_BOX (row_box), name_label, FALSE, TRUE, 0);
+                gtk_box_append (GTK_BOX (row_box), name_label);
 
                 desc_label = gtk_label_new (NULL);
                 gtk_label_set_markup (GTK_LABEL (desc_label), desc_markup);
-                gtk_label_set_line_wrap (GTK_LABEL (desc_label), TRUE);
+                gtk_label_set_wrap (GTK_LABEL (desc_label), TRUE);
                 gtk_widget_set_halign (desc_label, GTK_ALIGN_START);
-                context = gtk_widget_get_style_context (desc_label);
-                gtk_style_context_add_class (context, "dim-label");
-                gtk_box_pack_start (GTK_BOX (row_box), desc_label, FALSE, TRUE, 0);
+                gtk_widget_add_css_class (desc_label, "dim-label");
+                gtk_box_append (GTK_BOX (row_box), desc_label);
 
-                gtk_container_add (GTK_CONTAINER (row), row_box);
-                gtk_widget_show_all (row);
+                gtk_list_box_row_set_child (GTK_LIST_BOX_ROW (row), row_box);
                 g_object_set_data_full (G_OBJECT (row), "service_name", g_steal_pointer (&service_name), 
g_free);
-                gtk_container_add (GTK_CONTAINER (list), row);
+                gtk_list_box_append (list, row);
         }
 
         /* Import */
@@ -730,12 +714,11 @@ select_vpn_type (NetConnectionEditor *self, GtkListBox *list)
 
         name_label = gtk_label_new (_("Import from file…"));
         gtk_widget_set_halign (name_label, GTK_ALIGN_START);
-        gtk_box_pack_start (GTK_BOX (row_box), name_label, FALSE, TRUE, 0);
+        gtk_box_append (GTK_BOX (row_box), name_label);
 
-        gtk_container_add (GTK_CONTAINER (row), row_box);
-        gtk_widget_show_all (row);
+        gtk_list_box_row_set_child (GTK_LIST_BOX_ROW (row), row_box);
         g_object_set_data (G_OBJECT (row), "service_name", "import");
-        gtk_container_add (GTK_CONTAINER (list), row);
+        gtk_list_box_append (list, row);
 
         g_signal_connect_object (list, "row-activated",
                                  G_CALLBACK (vpn_type_activated), self, G_CONNECT_SWAPPED);
@@ -744,19 +727,14 @@ select_vpn_type (NetConnectionEditor *self, GtkListBox *list)
 static void
 net_connection_editor_add_connection (NetConnectionEditor *self)
 {
-        GtkContainer *frame;
         GtkListBox *list;
 
-        frame = GTK_CONTAINER (self->add_connection_frame);
-
         list = GTK_LIST_BOX (gtk_list_box_new ());
         gtk_list_box_set_selection_mode (list, GTK_SELECTION_NONE);
-        gtk_list_box_set_header_func (list, cc_list_box_update_header_func, NULL, NULL);
 
         select_vpn_type (self, list);
 
-        gtk_widget_show_all (GTK_WIDGET (list));
-        gtk_container_add (frame, GTK_WIDGET (list));
+        adw_bin_set_child (self->add_connection_frame, GTK_WIDGET (list));
 
         gtk_stack_set_visible_child (self->toplevel_stack, GTK_WIDGET (self->add_connection_box));
         gtk_widget_hide (GTK_WIDGET (self->apply_button));
diff --git a/panels/network/connection-editor/security-page.ui 
b/panels/network/connection-editor/security-page.ui
index f35c2502d..9a1c0debe 100644
--- a/panels/network/connection-editor/security-page.ui
+++ b/panels/network/connection-editor/security-page.ui
@@ -2,8 +2,6 @@
 <interface>
   <!-- interface-requires gtk+ 3.0 -->
   <template class="CEPageSecurity" parent="GtkGrid">
-    <property name="visible">True</property>
-    <property name="can_focus">False</property>
     <property name="margin_start">50</property>
     <property name="margin_end">50</property>
     <property name="margin_top">12</property>
@@ -14,48 +12,34 @@
     <property name="column_spacing">6</property>
     <child>
       <object class="GtkLabel" id="security_label">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
         <property name="xalign">1</property>
         <property name="label" translatable="yes">S_ecurity</property>
         <property name="use_underline">True</property>
         <property name="mnemonic_widget">security_combo</property>
+        <layout>
+          <property name="column">0</property>
+          <property name="row">0</property>
+        </layout>
       </object>
-      <packing>
-        <property name="left_attach">0</property>
-        <property name="top_attach">0</property>
-        <property name="width">1</property>
-        <property name="height">1</property>
-      </packing>
     </child>
     <child>
       <object class="GtkComboBox" id="security_combo">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
         <property name="hexpand">True</property>
+        <layout>
+          <property name="column">1</property>
+          <property name="row">0</property>
+        </layout>
       </object>
-      <packing>
-        <property name="left_attach">1</property>
-        <property name="top_attach">0</property>
-        <property name="width">1</property>
-        <property name="height">1</property>
-      </packing>
     </child>
     <child>
       <object class="GtkBox" id="box">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
         <property name="orientation">vertical</property>
-        <child>
-          <placeholder/>
-        </child>
+        <layout>
+          <property name="column">0</property>
+          <property name="row">1</property>
+          <property name="column-span">2</property>
+        </layout>
       </object>
-      <packing>
-        <property name="left_attach">0</property>
-        <property name="top_attach">1</property>
-        <property name="width">2</property>
-        <property name="height">1</property>
-      </packing>
     </child>
   </template>
 </interface>
diff --git a/panels/network/connection-editor/vpn-helpers.c b/panels/network/connection-editor/vpn-helpers.c
index 8ef486bb9..81ff4a2b8 100644
--- a/panels/network/connection-editor/vpn-helpers.c
+++ b/panels/network/connection-editor/vpn-helpers.c
@@ -97,6 +97,56 @@ vpn_get_plugins (void)
        return plugins;
 }
 
+
+typedef struct {
+       GMainLoop *mainloop;
+       gint response;
+} RunData;
+
+static void
+on_dialog_close_request_cb (GtkDialog *dialog,
+                            gint       response,
+                            RunData   *data)
+{
+       data->response = GTK_RESPONSE_CLOSE;
+       g_main_loop_quit (data->mainloop);
+}
+
+static void
+on_dialog_response_cb (GtkDialog *dialog,
+                       gint       response,
+                       RunData   *data)
+{
+       data->response = response;
+       g_main_loop_quit (data->mainloop);
+}
+
+static int
+run_dialog (GtkDialog *dialog)
+{
+       g_autoptr(GMainLoop) mainloop = NULL;
+       RunData run_data;
+       gulong response_id;
+       gulong close_id;
+
+       mainloop = g_main_loop_new (NULL, FALSE);
+       run_data = (RunData) {
+               .response = GTK_RESPONSE_CLOSE,
+               .mainloop = mainloop,
+       };
+
+       close_id = g_signal_connect (dialog, "close-request", G_CALLBACK (on_dialog_close_request_cb), 
&run_data);
+       response_id = g_signal_connect_swapped (dialog, "response", G_CALLBACK (on_dialog_response_cb), 
&run_data);
+
+       gtk_window_present (GTK_WINDOW (dialog));
+       g_main_loop_run (mainloop);
+
+       g_clear_signal_handler (&close_id, dialog);
+       g_clear_signal_handler (&response_id, dialog);
+
+       return run_data.response;
+}
+
 typedef struct {
        VpnImportCallback callback;
        gpointer user_data;
@@ -106,6 +156,7 @@ static void
 import_vpn_from_file_cb (GtkWidget *dialog, gint response, gpointer user_data)
 {
        g_autofree gchar *filename = NULL;
+       g_autoptr(GFile) file = NULL;
        ActionInfo *info = (ActionInfo *) user_data;
        NMConnection *connection = NULL;
        g_autoptr(GError) error = NULL;
@@ -114,12 +165,13 @@ import_vpn_from_file_cb (GtkWidget *dialog, gint response, gpointer user_data)
        if (response != GTK_RESPONSE_ACCEPT)
                goto out;
 
-       filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog));
-       if (!filename) {
+       file = gtk_file_chooser_get_file (GTK_FILE_CHOOSER (dialog));
+       if (!file) {
                g_warning ("%s: didn't get a filename back from the chooser!", __func__);
                goto out;
        }
 
+       filename = g_file_get_path (file);
        for (iter = vpn_get_plugins (); !connection && iter; iter = iter->next) {
                NMVpnEditorPlugin *plugin;
 
@@ -140,35 +192,33 @@ import_vpn_from_file_cb (GtkWidget *dialog, gint response, gpointer user_data)
                gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (err_dialog),
                                                 _("The file “%s” could not be read or does not contain 
recognized VPN connection information\n\nError: %s."),
                                                 bname, error ? error->message : "unknown error");
-               g_signal_connect (err_dialog, "delete-event", G_CALLBACK (gtk_widget_destroy), NULL);
-               g_signal_connect (err_dialog, "response", G_CALLBACK (gtk_widget_destroy), NULL);
-               gtk_dialog_run (GTK_DIALOG (err_dialog));
+               run_dialog (GTK_DIALOG (err_dialog));
        }
 
 out:
-       gtk_widget_hide (dialog);
-       gtk_widget_destroy (dialog);
+       gtk_window_destroy (GTK_WINDOW (dialog));
 
        info->callback (connection, info->user_data);
        g_free (info);
 }
 
-static void
+static gboolean
 destroy_import_chooser (GtkWidget *dialog, gpointer user_data)
 {
        ActionInfo *info = (ActionInfo *) user_data;
 
-       gtk_widget_destroy (dialog);
        info->callback (NULL, info->user_data);
        g_free (info);
+
+       return FALSE;
 }
 
 void
 vpn_import (GtkWindow *parent, VpnImportCallback callback, gpointer user_data)
 {
+       g_autoptr(GFile) home_folder = NULL;
        GtkWidget *dialog;
        ActionInfo *info;
-       const char *home_folder;
 
        dialog = gtk_file_chooser_dialog_new (_("Select file to import"),
                                              parent,
@@ -177,16 +227,15 @@ vpn_import (GtkWindow *parent, VpnImportCallback callback, gpointer user_data)
                                              _("_Open"), GTK_RESPONSE_ACCEPT,
                                              NULL);
        gtk_window_set_modal (GTK_WINDOW (dialog), TRUE);
-       home_folder = g_get_home_dir ();
-       gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (dialog), home_folder);
+       home_folder = g_file_new_for_path (g_get_home_dir ());
+       gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (dialog), home_folder, NULL);
 
        info = g_malloc0 (sizeof (ActionInfo));
        info->callback = callback;
        info->user_data = user_data;
 
-       g_signal_connect (G_OBJECT (dialog), "close", G_CALLBACK (destroy_import_chooser), info);
+       g_signal_connect (G_OBJECT (dialog), "close-request", G_CALLBACK (destroy_import_chooser), info);
        g_signal_connect (G_OBJECT (dialog), "response", G_CALLBACK (import_vpn_from_file_cb), info);
-       gtk_widget_show_all (dialog);
        gtk_window_present (GTK_WINDOW (dialog));
 }
 
@@ -194,6 +243,7 @@ static void
 export_vpn_to_file_cb (GtkWidget *dialog, gint response, gpointer user_data)
 {
        g_autoptr(NMConnection) connection = NM_CONNECTION (user_data);
+       g_autoptr(GFile) file = NULL;
        char *filename = NULL;
        g_autoptr(GError) error = NULL;
        NMVpnEditorPlugin *plugin;
@@ -206,12 +256,13 @@ export_vpn_to_file_cb (GtkWidget *dialog, gint response, gpointer user_data)
        if (response != GTK_RESPONSE_ACCEPT)
                goto out;
 
-       filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog));
-       if (!filename) {
+       file = gtk_file_chooser_get_file (GTK_FILE_CHOOSER (dialog));
+       if (!file) {
                g_set_error (&error, G_IO_ERROR, G_IO_ERROR_FAILED, "no filename");
                goto done;
        }
 
+       filename = g_file_get_path (file);
        if (g_file_test (filename, G_FILE_TEST_EXISTS)) {
                int replace_response;
                GtkWidget *replace_dialog;
@@ -227,8 +278,8 @@ export_vpn_to_file_cb (GtkWidget *dialog, gint response, gpointer user_data)
                gtk_dialog_add_buttons (GTK_DIALOG (replace_dialog), _("_Replace"), GTK_RESPONSE_OK, NULL);
                gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (replace_dialog),
                                                          _("Do you want to replace %s with the VPN 
connection you are saving?"), bname);
-               replace_response = gtk_dialog_run (GTK_DIALOG (replace_dialog));
-               gtk_widget_destroy (replace_dialog);
+               replace_response = run_dialog (GTK_DIALOG (replace_dialog));
+               gtk_window_destroy (GTK_WINDOW (replace_dialog));
                if (replace_response != GTK_RESPONSE_OK)
                        goto out;
        }
@@ -265,25 +316,21 @@ done:
                gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (err_dialog),
                                                 _("The VPN connection “%s” could not be exported to 
%s.\n\nError: %s."),
                                                 id ? id : "(unknown)", bname, error ? error->message : 
"unknown error");
-               g_signal_connect (err_dialog, "delete-event", G_CALLBACK (gtk_widget_destroy), NULL);
-               g_signal_connect (err_dialog, "response", G_CALLBACK (gtk_widget_destroy), NULL);
-               gtk_widget_show_all (err_dialog);
-               gtk_window_present (GTK_WINDOW (err_dialog));
+               run_dialog (GTK_DIALOG (err_dialog));
        }
 
 out:
-       gtk_widget_hide (dialog);
-       gtk_widget_destroy (dialog);
+       gtk_window_destroy (GTK_WINDOW (dialog));
 }
 
 void
 vpn_export (NMConnection *connection)
 {
+       g_autoptr(GFile) home_folder = NULL;
        GtkWidget *dialog;
        NMVpnEditorPlugin *plugin;
        NMSettingVpn *s_vpn = NULL;
        const char *service_type;
-       const char *home_folder;
 
        s_vpn = nm_connection_get_setting_vpn (connection);
        service_type = s_vpn ? nm_setting_vpn_get_service_type (s_vpn) : NULL;
@@ -299,8 +346,8 @@ vpn_export (NMConnection *connection)
                                              _("_Cancel"), GTK_RESPONSE_CANCEL,
                                              _("_Save"), GTK_RESPONSE_ACCEPT,
                                              NULL);
-       home_folder = g_get_home_dir ();
-       gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (dialog), home_folder);
+       home_folder = g_file_new_for_path (g_get_home_dir ());
+       gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (dialog), home_folder, NULL);
 
        plugin = vpn_get_plugin_by_service (service_type);
        if (plugin) {
@@ -311,8 +358,6 @@ vpn_export (NMConnection *connection)
                        gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER (dialog), suggested);
        }
 
-       g_signal_connect (G_OBJECT (dialog), "close", G_CALLBACK (gtk_widget_destroy), NULL);
        g_signal_connect (G_OBJECT (dialog), "response", G_CALLBACK (export_vpn_to_file_cb), g_object_ref 
(connection));
-       gtk_widget_show_all (dialog);
        gtk_window_present (GTK_WINDOW (dialog));
 }
diff --git a/panels/network/connection-editor/vpn-page.ui b/panels/network/connection-editor/vpn-page.ui
index 682e7a707..98f801ba7 100644
--- a/panels/network/connection-editor/vpn-page.ui
+++ b/panels/network/connection-editor/vpn-page.ui
@@ -2,8 +2,6 @@
 <interface>
   <!-- interface-requires gtk+ 3.0 -->
   <template class="CEPageVpn" parent="GtkBox">
-    <property name="visible">True</property>
-    <property name="can_focus">False</property>
     <property name="margin_start">50</property>
     <property name="margin_end">50</property>
     <property name="margin_top">12</property>
@@ -12,59 +10,32 @@
     <property name="spacing">10</property>
     <child>
       <object class="GtkBox">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
         <property name="spacing">6</property>
         <child>
           <object class="GtkLabel">
-            <property name="visible">True</property>
-            <property name="can_focus">False</property>
             <property name="xalign">1</property>
             <property name="label" translatable="yes">_Name</property>
             <property name="use_underline">True</property>
             <property name="mnemonic_widget">name_entry</property>
           </object>
-          <packing>
-            <property name="expand">False</property>
-            <property name="fill">True</property>
-            <property name="position">0</property>
-          </packing>
         </child>
         <child>
           <object class="GtkEntry" id="name_entry">
-            <property name="visible">True</property>
-            <property name="can_focus">True</property>
+            <property name="hexpand">True</property>
             <property name="invisible_char">â—Ź</property>
             <property name="invisible_char_set">True</property>
           </object>
-          <packing>
-            <property name="expand">True</property>
-            <property name="fill">True</property>
-            <property name="position">1</property>
-          </packing>
         </child>
       </object>
-      <packing>
-        <property name="expand">False</property>
-        <property name="fill">True</property>
-        <property name="position">0</property>
-      </packing>
     </child>
     <child>
       <object class="GtkLabel" id="failure_label">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
         <property name="xalign">0</property>
         <property name="label" translatable="yes">(Error: unable to load VPN connection editor)</property>
         <attributes>
           <attribute name="style" value="italic"/>
         </attributes>
       </object>
-      <packing>
-        <property name="expand">False</property>
-        <property name="fill">True</property>
-        <property name="position">3</property>
-      </packing>
     </child>
   </template>
 </interface>
diff --git a/panels/network/connection-editor/wifi-page.ui b/panels/network/connection-editor/wifi-page.ui
index e15678040..6662b8f0c 100644
--- a/panels/network/connection-editor/wifi-page.ui
+++ b/panels/network/connection-editor/wifi-page.ui
@@ -2,8 +2,6 @@
 <interface>
   <!-- interface-requires gtk+ 3.0 -->
   <template class="CEPageWifi" parent="GtkGrid">
-    <property name="visible">True</property>
-    <property name="can_focus">False</property>
     <property name="margin_start">50</property>
     <property name="margin_end">50</property>
     <property name="margin_top">12</property>
@@ -14,131 +12,98 @@
     <property name="column_spacing">6</property>
     <child>
       <object class="GtkLabel">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
         <property name="xalign">1</property>
         <property name="label" translatable="yes">_SSID</property>
         <property name="use_underline">True</property>
         <property name="mnemonic_widget">ssid_entry</property>
+        <layout>
+          <property name="column">0</property>
+          <property name="row">0</property>
+        </layout>
       </object>
-      <packing>
-        <property name="left_attach">0</property>
-        <property name="top_attach">0</property>
-        <property name="width">1</property>
-        <property name="height">1</property>
-      </packing>
     </child>
     <child>
       <object class="GtkLabel">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
         <property name="xalign">1</property>
         <property name="label" translatable="yes">_BSSID</property>
         <property name="use_underline">True</property>
         <property name="mnemonic_widget">bssid_combo</property>
+        <layout>
+          <property name="column">0</property>
+          <property name="row">1</property>
+        </layout>
       </object>
-      <packing>
-        <property name="left_attach">0</property>
-        <property name="top_attach">1</property>
-        <property name="width">1</property>
-        <property name="height">1</property>
-      </packing>
     </child>
     <child>
       <object class="GtkEntry" id="ssid_entry">
-        <property name="visible">True</property>
-        <property name="can_focus">True</property>
         <property name="hexpand">True</property>
         <property name="invisible_char">â—Ź</property>
         <property name="invisible_char_set">True</property>
+        <layout>
+          <property name="column">1</property>
+          <property name="row">0</property>
+        </layout>
       </object>
-      <packing>
-        <property name="left_attach">1</property>
-        <property name="top_attach">0</property>
-        <property name="width">1</property>
-        <property name="height">1</property>
-      </packing>
     </child>
     <child>
       <object class="GtkLabel">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
         <property name="xalign">1</property>
         <property name="label" translatable="yes">_MAC Address</property>
         <property name="use_underline">True</property>
         <property name="mnemonic_widget">mac_combo</property>
+        <layout>
+          <property name="column">0</property>
+          <property name="row">2</property>
+        </layout>
       </object>
-      <packing>
-        <property name="left_attach">0</property>
-        <property name="top_attach">2</property>
-        <property name="width">1</property>
-        <property name="height">1</property>
-      </packing>
     </child>
     <child>
       <object class="GtkComboBoxText" id="cloned_mac_combo">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
         <property name="has_entry">True</property>
         <property name="hexpand">True</property>
         <property name="active_id">0</property>
+        <layout>
+          <property name="column">1</property>
+          <property name="row">3</property>
+        </layout>
         <child internal-child="entry">
           <object class="GtkEntry">
-            <property name="can_focus">True</property>
           </object>
         </child>
       </object>
-      <packing>
-        <property name="left_attach">1</property>
-        <property name="top_attach">3</property>
-        <property name="width">1</property>
-        <property name="height">1</property>
-      </packing>
     </child>
     <child>
       <object class="GtkLabel">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
         <property name="label" translatable="yes">_Cloned Address</property>
         <property name="use_underline">True</property>
         <property name="mnemonic_widget">cloned_mac_combo</property>
+        <layout>
+          <property name="column">0</property>
+          <property name="row">3</property>
+        </layout>
       </object>
-      <packing>
-        <property name="left_attach">0</property>
-        <property name="top_attach">3</property>
-        <property name="width">1</property>
-        <property name="height">1</property>
-      </packing>
     </child>
     <child>
       <object class="GtkComboBoxText" id="bssid_combo">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
         <property name="has_entry">True</property>
         <property name="entry_text_column">0</property>
         <property name="id_column">1</property>
+        <layout>
+          <property name="column">1</property>
+          <property name="row">1</property>
+        </layout>
       </object>
-      <packing>
-        <property name="left_attach">1</property>
-        <property name="top_attach">1</property>
-        <property name="width">1</property>
-        <property name="height">1</property>
-      </packing>
     </child>
     <child>
       <object class="GtkComboBoxText" id="mac_combo">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
         <property name="has_entry">True</property>
         <property name="entry_text_column">0</property>
         <property name="id_column">1</property>
+        <layout>
+          <property name="column">1</property>
+          <property name="row">2</property>
+        </layout>
       </object>
-      <packing>
-        <property name="left_attach">1</property>
-        <property name="top_attach">2</property>
-        <property name="width">1</property>
-        <property name="height">1</property>
-      </packing>
     </child>
   </template>
 </interface>
diff --git a/panels/network/net-device-ethernet.c b/panels/network/net-device-ethernet.c
index a4c3a7275..81e4687d9 100644
--- a/panels/network/net-device-ethernet.c
+++ b/panels/network/net-device-ethernet.c
@@ -23,12 +23,11 @@
 
 #include <glib-object.h>
 #include <glib/gi18n.h>
-#include <handy.h>
+#include <adwaita.h>
 #include <NetworkManager.h>
 
 #include "panel-common.h"
 
-#include "list-box-helper.h"
 #include "connection-editor/net-connection-editor.h"
 #include "connection-editor/ce-page.h"
 
@@ -40,8 +39,8 @@ struct _NetDeviceEthernet
 
         GtkListBox        *connection_list;
         GtkButton         *details_button;
-        GtkFrame          *details_frame;
-        HdyActionRow      *details_row;
+        GtkListBox        *details_listbox;
+        AdwActionRow      *details_row;
         GtkLabel          *device_label;
         GtkSwitch         *device_off_switch;
         GtkScrolledWindow *scrolled_window;
@@ -221,7 +220,7 @@ device_ethernet_refresh_ui (NetDeviceEthernet *self)
                 }
         }
         status = panel_device_status_to_localized_string (self->device, speed_text);
-        hdy_preferences_row_set_title (HDY_PREFERENCES_ROW (self->details_row), status);
+        adw_preferences_row_set_title (ADW_PREFERENCES_ROW (self->details_row), status);
 
         populate_ui (self);
 }
@@ -243,7 +242,7 @@ show_details (NetDeviceEthernet *self, GtkButton *button, const gchar *title)
         connection = NM_CONNECTION (g_object_get_data (G_OBJECT (row), "connection"));
 
         editor = net_connection_editor_new (connection, self->device, NULL, self->client);
-        gtk_window_set_transient_for (GTK_WINDOW (editor), GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET 
(self))));
+        gtk_window_set_transient_for (GTK_WINDOW (editor), GTK_WINDOW (gtk_widget_get_native (GTK_WIDGET 
(self))));
         if (title)
                 net_connection_editor_set_title (editor, title);
         g_signal_connect_object (editor, "done", G_CALLBACK (editor_done), self, G_CONNECT_SWAPPED);
@@ -276,7 +275,6 @@ add_row (NetDeviceEthernet *self, NMConnection *connection)
         GtkWidget *details;
         NMActiveConnection *aconn;
         gboolean active;
-        GtkWidget *image;
 
         active = FALSE;
 
@@ -290,25 +288,25 @@ add_row (NetDeviceEthernet *self, NMConnection *connection)
 
         row = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
         box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
-        gtk_box_pack_start (GTK_BOX (row), box, FALSE, TRUE, 0);
+        gtk_box_append (GTK_BOX (row), box);
         widget = gtk_label_new (nm_connection_get_id (connection));
         gtk_widget_set_margin_start (widget, 12);
         gtk_widget_set_margin_end (widget, 12);
         gtk_widget_set_margin_top (widget, 8);
         gtk_widget_set_margin_bottom (widget, 8);
-        gtk_box_pack_start (GTK_BOX (box), widget, FALSE, TRUE, 0);
+        gtk_box_append (GTK_BOX (box), widget);
 
         if (active) {
-                widget = gtk_image_new_from_icon_name ("object-select-symbolic", GTK_ICON_SIZE_MENU);
+                widget = gtk_image_new_from_icon_name ("object-select-symbolic");
                 gtk_widget_set_halign (widget, GTK_ALIGN_CENTER);
                 gtk_widget_set_valign (widget, GTK_ALIGN_CENTER);
-                gtk_box_pack_start (GTK_BOX (box), widget, FALSE, TRUE, 0);
+                gtk_box_append (GTK_BOX (box), widget);
 
                 details = gtk_grid_new ();
                 gtk_grid_set_row_spacing (GTK_GRID (details), 10);
                 gtk_grid_set_column_spacing (GTK_GRID (details), 10);
 
-                gtk_box_pack_start (GTK_BOX (row), details, FALSE, TRUE, 0);
+                gtk_box_append (GTK_BOX (row), details);
 
                 add_details (details, self->device, connection);
         }
@@ -316,31 +314,26 @@ add_row (NetDeviceEthernet *self, NMConnection *connection)
         /* filler */
         widget = gtk_label_new ("");
         gtk_widget_set_hexpand (widget, TRUE);
-        gtk_box_pack_start (GTK_BOX (box), widget, TRUE, TRUE, 0);
+        gtk_box_append (GTK_BOX (box), widget);
 
-        image = gtk_image_new_from_icon_name ("emblem-system-symbolic", GTK_ICON_SIZE_MENU);
-        gtk_widget_show (image);
-        widget = gtk_button_new ();
-        gtk_style_context_add_class (gtk_widget_get_style_context (widget), "image-button");
+        widget = gtk_button_new_from_icon_name ("emblem-system-symbolic");
         gtk_widget_set_margin_start (widget, 12);
         gtk_widget_set_margin_end (widget, 12);
         gtk_widget_set_margin_top (widget, 8);
         gtk_widget_set_margin_bottom (widget, 8);
-        gtk_widget_show (widget);
-        gtk_container_add (GTK_CONTAINER (widget), image);
         gtk_widget_set_halign (widget, GTK_ALIGN_CENTER);
         gtk_widget_set_valign (widget, GTK_ALIGN_CENTER);
-        atk_object_set_name (gtk_widget_get_accessible (widget), _("Options…"));
-        gtk_box_pack_start (GTK_BOX (box), widget, FALSE, TRUE, 0);
+        gtk_accessible_update_property (GTK_ACCESSIBLE (widget),
+                                        GTK_ACCESSIBLE_PROPERTY_LABEL, _("Options…"),
+                                        -1);
+        gtk_box_append (GTK_BOX (box), widget);
         g_object_set_data (G_OBJECT (widget), "edit", widget);
         g_object_set_data (G_OBJECT (widget), "row", row);
         g_signal_connect_object (widget, "clicked", G_CALLBACK (show_details_for_row), self, 
G_CONNECT_SWAPPED);
 
-        gtk_widget_show_all (row);
-
         g_object_set_data (G_OBJECT (row), "connection", connection);
 
-        gtk_container_add (GTK_CONTAINER (self->connection_list), row);
+        gtk_list_box_append (self->connection_list, row);
 }
 
 static void
@@ -353,16 +346,13 @@ connection_removed (NetDeviceEthernet  *self, NMRemoteConnection *connection)
 static void
 populate_ui (NetDeviceEthernet *self)
 {
-        GList *children, *c;
         GSList *connections, *l;
         NMConnection *connection;
+        GtkWidget *child;
         gint n_connections;
 
-        children = gtk_container_get_children (GTK_CONTAINER (self->connection_list));
-        for (c = children; c; c = c->next) {
-                gtk_container_remove (GTK_CONTAINER (self->connection_list), c->data);
-        }
-        g_list_free (children);
+        while ((child = gtk_widget_get_first_child (GTK_WIDGET (self->connection_list))) != NULL)
+               gtk_list_box_remove (self->connection_list, child);
 
         connections = net_device_get_valid_connections (self->client, self->device);
         for (l = connections; l; l = l->next) {
@@ -374,7 +364,7 @@ populate_ui (NetDeviceEthernet *self)
         n_connections = g_slist_length (connections);
 
         if (n_connections > 1) {
-                gtk_widget_hide (GTK_WIDGET (self->details_frame));
+                gtk_widget_hide (GTK_WIDGET (self->details_listbox));
                 for (l = connections; l; l = l->next) {
                         NMConnection *connection = l->data;
                         add_row (self, connection);
@@ -383,13 +373,13 @@ populate_ui (NetDeviceEthernet *self)
         } else if (n_connections == 1) {
                 connection = connections->data;
                 gtk_widget_hide (GTK_WIDGET (self->scrolled_window));
-                gtk_widget_show_all (GTK_WIDGET (self->details_frame));
+                gtk_widget_show (GTK_WIDGET (self->details_listbox));
                 g_object_set_data (G_OBJECT (self->details_button), "row", self->details_button);
                 g_object_set_data (G_OBJECT (self->details_button), "connection", connection);
 
         } else {
                 gtk_widget_hide (GTK_WIDGET (self->scrolled_window));
-                gtk_widget_hide (GTK_WIDGET (self->details_frame));
+                gtk_widget_hide (GTK_WIDGET (self->details_listbox));
         }
 
         g_slist_free (connections);
@@ -430,7 +420,7 @@ add_profile_button_clicked_cb (NetDeviceEthernet *self)
         nm_connection_add_setting (connection, nm_setting_wired_new ());
 
         editor = net_connection_editor_new (connection, self->device, NULL, self->client);
-        gtk_window_set_transient_for (GTK_WINDOW (editor), GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET 
(self))));
+        gtk_window_set_transient_for (GTK_WINDOW (editor), GTK_WINDOW (gtk_widget_get_native (GTK_WIDGET 
(self))));
         g_signal_connect_object (editor, "done", G_CALLBACK (editor_done), self, G_CONNECT_SWAPPED);
         gtk_window_present (GTK_WINDOW (editor));
 }
@@ -460,12 +450,14 @@ static void
 connection_list_row_activated_cb (NetDeviceEthernet *self, GtkListBoxRow *row)
 {
         NMConnection *connection;
+        GtkWidget *child;
 
         if (!NM_IS_DEVICE_ETHERNET (self->device) ||
             !nm_device_ethernet_get_carrier (NM_DEVICE_ETHERNET (self->device)))
                 return;
 
-        connection = NM_CONNECTION (g_object_get_data (G_OBJECT (gtk_bin_get_child (GTK_BIN (row))), 
"connection"));
+        child = gtk_list_box_row_get_child (GTK_LIST_BOX_ROW (row));
+        connection = NM_CONNECTION (g_object_get_data (G_OBJECT (child), "connection"));
 
         nm_client_activate_connection_async (self->client,
                                              connection,
@@ -497,7 +489,7 @@ net_device_ethernet_class_init (NetDeviceEthernetClass *klass)
 
         gtk_widget_class_bind_template_child (widget_class, NetDeviceEthernet, connection_list);
         gtk_widget_class_bind_template_child (widget_class, NetDeviceEthernet, details_button);
-        gtk_widget_class_bind_template_child (widget_class, NetDeviceEthernet, details_frame);
+        gtk_widget_class_bind_template_child (widget_class, NetDeviceEthernet, details_listbox);
         gtk_widget_class_bind_template_child (widget_class, NetDeviceEthernet, details_row);
         gtk_widget_class_bind_template_child (widget_class, NetDeviceEthernet, device_label);
         gtk_widget_class_bind_template_child (widget_class, NetDeviceEthernet, device_off_switch);
@@ -515,8 +507,6 @@ net_device_ethernet_init (NetDeviceEthernet *self)
         gtk_widget_init_template (GTK_WIDGET (self));
 
         self->connections = g_hash_table_new (NULL, NULL);
-
-        gtk_list_box_set_header_func (self->connection_list, cc_list_box_update_header_func, NULL, NULL);
 }
 
 NetDeviceEthernet *
diff --git a/panels/network/net-device-mobile.c b/panels/network/net-device-mobile.c
index 886180ebc..5dc677d91 100644
--- a/panels/network/net-device-mobile.c
+++ b/panels/network/net-device-mobile.c
@@ -107,7 +107,6 @@ network_combo_changed_cb (NetDeviceMobile *self)
         GtkTreeIter iter;
         GtkTreeModel *model;
         NMConnection *connection;
-        GtkWidget *toplevel;
 
         if (self->updating_device)
                 return;
@@ -122,8 +121,8 @@ network_combo_changed_cb (NetDeviceMobile *self)
                             COLUMN_ID, &object_path,
                             -1);
         if (g_strcmp0 (object_path, NULL) == 0) {
-                toplevel = gtk_widget_get_toplevel (GTK_WIDGET (self));
-                cc_network_panel_connect_to_3g_network (toplevel, self->client, self->device);
+                GtkNative *native = gtk_widget_get_native (GTK_WIDGET (self));
+                cc_network_panel_connect_to_3g_network (GTK_WIDGET (native), self->client, self->device);
                 return;
         }
 
diff --git a/panels/network/net-device-wifi.c b/panels/network/net-device-wifi.c
index 69fe2e122..216e462b0 100644
--- a/panels/network/net-device-wifi.c
+++ b/panels/network/net-device-wifi.c
@@ -30,7 +30,6 @@
 #include <polkit/polkit.h>
 
 #include "cc-wifi-hotspot-dialog.h"
-#include "list-box-helper.h"
 #include "hostname-helper.h"
 #include "network-dialogs.h"
 #include "panel-common.h"
@@ -51,17 +50,19 @@ static void show_hotspot_ui (NetDeviceWifi *self);
 
 struct _NetDeviceWifi
 {
-        GtkStack                 parent;
+        AdwBin                   parent;
 
         GtkBox                  *center_box;
         GtkButton               *connect_hidden_button;
         GtkSwitch               *device_off_switch;
         GtkBox                  *header_box;
+        GtkPopover              *header_button_popover;
         GtkBox                  *hotspot_box;
         CcListRow               *hotspot_name_row;
         CcListRow               *hotspot_security_row;
         CcListRow               *hotspot_password_row;
         GtkBox                  *listbox_box;
+        GtkStack                *stack;
         GtkButton               *start_hotspot_button;
         GtkLabel                *status_label;
         GtkLabel                *title_label;
@@ -89,7 +90,7 @@ enum {
         PROP_LAST,
 };
 
-G_DEFINE_TYPE (NetDeviceWifi, net_device_wifi, GTK_TYPE_STACK)
+G_DEFINE_TYPE (NetDeviceWifi, net_device_wifi, ADW_TYPE_BIN)
 
 static void
 disable_scan_timeout (NetDeviceWifi *self)
@@ -385,10 +386,9 @@ device_off_switch_changed_cb (NetDeviceWifi *self)
 static void
 connect_hidden_button_clicked_cb (NetDeviceWifi *self)
 {
-        GtkWidget *toplevel;
-
-        toplevel = gtk_widget_get_toplevel (GTK_WIDGET (self));
-        cc_network_panel_connect_to_hidden_network (toplevel, self->client);
+        GtkNative *native = gtk_widget_get_native (GTK_WIDGET (self));
+        cc_network_panel_connect_to_hidden_network (GTK_WIDGET (native), self->client);
+        gtk_popover_popdown (self->header_button_popover);
 }
 
 static void
@@ -582,7 +582,7 @@ static void
 show_hotspot_ui (NetDeviceWifi *self)
 {
         /* show hotspot tab */
-        gtk_stack_set_visible_child (GTK_STACK (self), GTK_WIDGET (self->hotspot_box));
+        gtk_stack_set_visible_child (self->stack, GTK_WIDGET (self->hotspot_box));
 }
 
 static void
@@ -676,29 +676,10 @@ overwrite_ssid_cb (GObject      *source_object,
 }
 
 static void
-start_hotspot_button_clicked_cb (NetDeviceWifi *self)
+on_wifi_hotspot_dialog_respnse_cb (GtkDialog     *dialog,
+                                   gint           response,
+                                   NetDeviceWifi *self)
 {
-        g_autofree gchar *active_ssid = NULL;
-        GtkWidget *window;
-        NMConnection *c;
-        g_autofree gchar *hostname = NULL;
-        g_autofree gchar *ssid = NULL;
-        gint response;
-
-        window = gtk_widget_get_toplevel (GTK_WIDGET (self));
-
-        if (!self->hotspot_dialog)
-                self->hotspot_dialog = cc_wifi_hotspot_dialog_new (GTK_WINDOW (window));
-        cc_wifi_hotspot_dialog_set_device (self->hotspot_dialog, NM_DEVICE_WIFI (self->device));
-        hostname = get_hostname ();
-        ssid =  pretty_hostname_to_ssid (hostname);
-        cc_wifi_hotspot_dialog_set_hostname (self->hotspot_dialog, ssid);
-                c = net_device_wifi_get_hotspot_connection (self);
-        if (c)
-                cc_wifi_hotspot_dialog_set_connection (self->hotspot_dialog, c);
-
-        response = gtk_dialog_run (GTK_DIALOG (self->hotspot_dialog));
-
         if (response == GTK_RESPONSE_APPLY) {
                 NMConnection *connection;
 
@@ -722,6 +703,31 @@ start_hotspot_button_clicked_cb (NetDeviceWifi *self)
         gtk_widget_hide (GTK_WIDGET (self->hotspot_dialog));
 }
 
+static void
+start_hotspot_button_clicked_cb (NetDeviceWifi *self)
+{
+        GtkNative *native;
+        NMConnection *c;
+        g_autofree gchar *hostname = NULL;
+        g_autofree gchar *ssid = NULL;
+
+        native = gtk_widget_get_native (GTK_WIDGET (self));
+
+        if (!self->hotspot_dialog)
+                self->hotspot_dialog = cc_wifi_hotspot_dialog_new (GTK_WINDOW (native));
+        cc_wifi_hotspot_dialog_set_device (self->hotspot_dialog, NM_DEVICE_WIFI (self->device));
+        hostname = get_hostname ();
+        ssid =  pretty_hostname_to_ssid (hostname);
+        cc_wifi_hotspot_dialog_set_hostname (self->hotspot_dialog, ssid);
+                c = net_device_wifi_get_hotspot_connection (self);
+        if (c)
+                cc_wifi_hotspot_dialog_set_connection (self->hotspot_dialog, c);
+
+        g_signal_connect (self->hotspot_dialog, "response", G_CALLBACK (on_wifi_hotspot_dialog_respnse_cb), 
self);
+        gtk_window_present (GTK_WINDOW (self->hotspot_dialog));
+        gtk_popover_popdown (self->header_button_popover);
+}
+
 static void
 stop_shared_connection (NetDeviceWifi *self)
 {
@@ -754,7 +760,7 @@ stop_shared_connection (NetDeviceWifi *self)
 static void
 show_wifi_list (NetDeviceWifi *self)
 {
-        gtk_stack_set_visible_child (GTK_STACK (self), GTK_WIDGET (self->listbox_box));
+        gtk_stack_set_visible_child (self->stack, GTK_WIDGET (self->listbox_box));
 }
 
 static void
@@ -819,7 +825,7 @@ really_forget (GtkDialog *dialog, gint response, gpointer data)
         NMRemoteConnection *connection;
         NetDeviceWifi *self;
 
-        gtk_widget_destroy (GTK_WIDGET (dialog));
+        gtk_window_destroy (GTK_WINDOW (dialog));
 
         if (response != GTK_RESPONSE_OK)
                 return;
@@ -838,11 +844,11 @@ really_forget (GtkDialog *dialog, gint response, gpointer data)
 static void
 forget_selected (GtkButton *forget, CcWifiConnectionList *list)
 {
-        GtkWidget *window;
+        GtkNative *native;
         GtkWidget *dialog;
 
-        window = gtk_widget_get_toplevel (GTK_WIDGET (forget));
-        dialog = gtk_message_dialog_new (GTK_WINDOW (window),
+        native = gtk_widget_get_native (GTK_WIDGET (forget));
+        dialog = gtk_message_dialog_new (GTK_WINDOW (native),
                                          GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
                                          GTK_MESSAGE_OTHER,
                                          GTK_BUTTONS_NONE,
@@ -973,7 +979,7 @@ show_details_for_row (NetDeviceWifi *self, CcWifiConnectionRow *row, CcWifiConne
         ap = cc_wifi_connection_row_best_access_point (row);
 
         editor = net_connection_editor_new (connection, self->device, ap, self->client);
-        gtk_window_set_transient_for (GTK_WINDOW (editor), GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET 
(row))));
+        gtk_window_set_transient_for (GTK_WINDOW (editor), GTK_WINDOW (gtk_widget_get_native (GTK_WIDGET 
(row))));
         gtk_window_present (GTK_WINDOW (editor));
 }
 
@@ -1018,63 +1024,53 @@ on_connection_list_row_activated_cb (NetDeviceWifi        *self,
 static void
 history_button_clicked_cb (NetDeviceWifi *self)
 {
+        GtkListBox *listbox;
         GtkWidget *dialog;
-        GtkWidget *window;
+        GtkNative *native;
         GtkWidget *forget;
         GtkWidget *header;
         GtkWidget *swin;
         GtkWidget *content_area;
         GtkWidget *separator;
         GtkWidget *list;
-        GList *list_rows;
+        GtkWidget *child;
 
         dialog = g_object_new (GTK_TYPE_DIALOG, "use-header-bar", 1, NULL);
-        window = gtk_widget_get_toplevel (GTK_WIDGET (self));
-        gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (window));
+        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_modal (GTK_WINDOW (dialog), TRUE);
         gtk_window_set_default_size (GTK_WINDOW (dialog), 500, 400);
 
         /* Dialog's header */
         header = gtk_header_bar_new ();
-        gtk_widget_show (header);
-        gtk_header_bar_set_title (GTK_HEADER_BAR (header), _("Known Wi-Fi Networks"));
-        gtk_header_bar_set_show_close_button (GTK_HEADER_BAR (header), TRUE);
+        gtk_header_bar_set_show_title_buttons (GTK_HEADER_BAR (header), TRUE);
         gtk_window_set_titlebar (GTK_WINDOW (dialog), header);
 
-        g_signal_connect (dialog, "response",
-                          G_CALLBACK (gtk_widget_destroy), NULL);
-
-        g_signal_connect (dialog, "delete-event",
-                          G_CALLBACK (gtk_widget_destroy), NULL);
+        g_signal_connect (dialog, "response", G_CALLBACK (gtk_window_destroy), NULL);
 
         content_area = gtk_dialog_get_content_area (GTK_DIALOG (dialog));
-        gtk_container_set_border_width (GTK_CONTAINER (content_area), 0);
+        gtk_orientable_set_orientation (GTK_ORIENTABLE (content_area), GTK_ORIENTATION_VERTICAL);
 
-        swin = gtk_scrolled_window_new (NULL, NULL);
-        gtk_widget_show (swin);
+        swin = gtk_scrolled_window_new ();
         gtk_widget_set_vexpand (swin, TRUE);
         gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (swin), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
-        gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (swin), GTK_SHADOW_NONE);
-        gtk_container_add (GTK_CONTAINER (content_area), swin);
+        gtk_box_append (GTK_BOX (content_area), swin);
 
         list = GTK_WIDGET (cc_wifi_connection_list_new (self->client,
                                                         NM_DEVICE_WIFI (self->device),
                                                         FALSE, FALSE, TRUE));
-        gtk_widget_show (list);
-        gtk_list_box_set_selection_mode (GTK_LIST_BOX (list), GTK_SELECTION_NONE);
-        gtk_list_box_set_header_func (GTK_LIST_BOX (list), cc_list_box_update_header_func, NULL, NULL);
-        gtk_list_box_set_sort_func (GTK_LIST_BOX (list), (GtkListBoxSortFunc)history_sort, NULL, NULL);
-        gtk_container_add (GTK_CONTAINER (swin), list);
+        listbox = cc_wifi_connection_list_get_list_box (CC_WIFI_CONNECTION_LIST (list));
+        gtk_list_box_set_selection_mode (listbox, GTK_SELECTION_NONE);
+        gtk_list_box_set_sort_func (listbox, (GtkListBoxSortFunc)history_sort, NULL, NULL);
+        gtk_scrolled_window_set_child (GTK_SCROLLED_WINDOW (swin), list);
 
         /* Horizontal separator */
         separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
-        gtk_widget_show (separator);
-        gtk_container_add (GTK_CONTAINER (content_area), separator);
+        gtk_box_append (GTK_BOX (content_area), separator);
 
         /* translators: This is the label for the "Forget wireless network" functionality */
         forget = gtk_button_new_with_mnemonic (C_("Wi-Fi Network", "_Forget"));
-        gtk_widget_show (forget);
         gtk_widget_set_halign (forget, GTK_ALIGN_START);
         gtk_widget_set_margin_top (forget, 6);
         gtk_widget_set_margin_bottom (forget, 6);
@@ -1084,7 +1080,7 @@ history_button_clicked_cb (NetDeviceWifi *self)
 
         g_signal_connect (forget, "clicked",
                           G_CALLBACK (forget_selected), list);
-        gtk_container_add (GTK_CONTAINER (content_area), forget);
+        gtk_box_append (GTK_BOX (content_area), forget);
 
         g_object_set_data (G_OBJECT (list), "forget", forget);
         g_object_set_data (G_OBJECT (list), "net", self);
@@ -1097,7 +1093,7 @@ history_button_clicked_cb (NetDeviceWifi *self)
                                  G_CALLBACK (on_connection_list_row_removed_cb),
                                  self,
                                  G_CONNECT_SWAPPED);
-        g_signal_connect_object (list, "row-activated",
+        g_signal_connect_object (listbox, "row-activated",
                                  G_CALLBACK (on_connection_list_row_activated_cb),
                                  self,
                                  G_CONNECT_SWAPPED);
@@ -1106,16 +1102,17 @@ history_button_clicked_cb (NetDeviceWifi *self)
                                  self,
                                  G_CONNECT_SWAPPED);
 
-        list_rows = gtk_container_get_children (GTK_CONTAINER (list));
-        while (list_rows)
+        for (child = gtk_widget_get_first_child (GTK_WIDGET (listbox));
+             child;
+             child = gtk_widget_get_next_sibling (child))
           {
             on_connection_list_row_added_cb (self,
-                                             CC_WIFI_CONNECTION_ROW (list_rows->data),
+                                             CC_WIFI_CONNECTION_ROW (child),
                                              CC_WIFI_CONNECTION_LIST (list));
-            list_rows = g_list_delete_link (list_rows, list_rows);
           }
 
         gtk_window_present (GTK_WINDOW (dialog));
+        gtk_popover_popdown (self->header_button_popover);
 }
 
 static void
@@ -1175,11 +1172,13 @@ net_device_wifi_class_init (NetDeviceWifiClass *klass)
         gtk_widget_class_bind_template_child (widget_class, NetDeviceWifi, connect_hidden_button);
         gtk_widget_class_bind_template_child (widget_class, NetDeviceWifi, device_off_switch);
         gtk_widget_class_bind_template_child (widget_class, NetDeviceWifi, header_box);
+        gtk_widget_class_bind_template_child (widget_class, NetDeviceWifi, header_button_popover);
         gtk_widget_class_bind_template_child (widget_class, NetDeviceWifi, hotspot_box);
         gtk_widget_class_bind_template_child (widget_class, NetDeviceWifi, hotspot_name_row);
         gtk_widget_class_bind_template_child (widget_class, NetDeviceWifi, hotspot_security_row);
         gtk_widget_class_bind_template_child (widget_class, NetDeviceWifi, hotspot_password_row);
         gtk_widget_class_bind_template_child (widget_class, NetDeviceWifi, listbox_box);
+        gtk_widget_class_bind_template_child (widget_class, NetDeviceWifi, stack);
         gtk_widget_class_bind_template_child (widget_class, NetDeviceWifi, start_hotspot_button);
         gtk_widget_class_bind_template_child (widget_class, NetDeviceWifi, status_label);
         gtk_widget_class_bind_template_child (widget_class, NetDeviceWifi, title_label);
@@ -1228,6 +1227,7 @@ NetDeviceWifi *
 net_device_wifi_new (CcPanel *panel, NMClient *client, NMDevice *device)
 {
         NetDeviceWifi *self;
+        GtkListBox *listbox;
         GtkWidget *list;
 
         self = g_object_new (net_device_wifi_get_type (), NULL);
@@ -1241,13 +1241,12 @@ net_device_wifi_new (CcPanel *panel, NMClient *client, NMDevice *device)
         g_signal_connect_object (device, "state-changed", G_CALLBACK (nm_device_wifi_refresh_ui), self, 
G_CONNECT_SWAPPED);
 
         list = GTK_WIDGET (cc_wifi_connection_list_new (client, NM_DEVICE_WIFI (device), TRUE, TRUE, FALSE));
-        gtk_widget_show (list);
-        gtk_container_add (GTK_CONTAINER (self->listbox_box), list);
+        gtk_box_append (self->listbox_box, list);
 
-        gtk_list_box_set_header_func (GTK_LIST_BOX (list), cc_list_box_update_header_func, NULL, NULL);
-        gtk_list_box_set_sort_func (GTK_LIST_BOX (list), (GtkListBoxSortFunc)ap_sort, self, NULL);
+        listbox = cc_wifi_connection_list_get_list_box (CC_WIFI_CONNECTION_LIST (list));
+        gtk_list_box_set_sort_func (listbox, (GtkListBoxSortFunc)ap_sort, self, NULL);
 
-        g_signal_connect_object (list, "row-activated",
+        g_signal_connect_object (listbox, "row-activated",
                                  G_CALLBACK (ap_activated), self, G_CONNECT_SWAPPED);
         g_signal_connect_object (list, "configure",
                                  G_CALLBACK (show_details_for_row), self, G_CONNECT_SWAPPED);
diff --git a/panels/network/net-device-wifi.h b/panels/network/net-device-wifi.h
index 22866be68..1d4ae7dfa 100644
--- a/panels/network/net-device-wifi.h
+++ b/panels/network/net-device-wifi.h
@@ -21,13 +21,12 @@
 
 #pragma once
 
-#include <gtk/gtk.h>
 #include <shell/cc-panel.h>
 #include <NetworkManager.h>
 
 G_BEGIN_DECLS
 
-G_DECLARE_FINAL_TYPE (NetDeviceWifi, net_device_wifi, NET, DEVICE_WIFI, GtkStack)
+G_DECLARE_FINAL_TYPE (NetDeviceWifi, net_device_wifi, NET, DEVICE_WIFI, AdwBin)
 
 NetDeviceWifi *net_device_wifi_new               (CcPanel       *panel,
                                                   NMClient      *client,
diff --git a/panels/network/net-proxy.c b/panels/network/net-proxy.c
index 8182adc4b..fc6c7448c 100644
--- a/panels/network/net-proxy.c
+++ b/panels/network/net-proxy.c
@@ -36,12 +36,12 @@ typedef enum
 
 struct _NetProxy
 {
-        GtkFrame          parent;
+        AdwBin            parent;
 
-        GtkRadioButton   *automatic_radio;
+        GtkCheckButton   *automatic_radio;
         GtkDialog        *dialog;
-        GtkRadioButton   *manual_radio;
-        GtkRadioButton   *none_radio;
+        GtkCheckButton   *manual_radio;
+        GtkCheckButton   *none_radio;
         GtkEntry         *proxy_ftp_entry;
         GtkEntry         *proxy_http_entry;
         GtkEntry         *proxy_https_entry;
@@ -59,7 +59,7 @@ struct _NetProxy
         GSettings        *settings;
 };
 
-G_DEFINE_TYPE (NetProxy, net_proxy, GTK_TYPE_FRAME)
+G_DEFINE_TYPE (NetProxy, net_proxy, ADW_TYPE_BIN)
 
 static const gchar *
 panel_get_string_for_value (ProxyMode mode)
@@ -155,11 +155,11 @@ panel_proxy_mode_setup_widgets (NetProxy *self, ProxyMode value)
 }
 
 static void
-panel_proxy_mode_radio_changed_cb (NetProxy *self, GtkRadioButton *radio)
+panel_proxy_mode_radio_changed_cb (NetProxy *self, GtkCheckButton *radio)
 {
         ProxyMode value;
 
-        if (!gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (radio)))
+        if (!gtk_check_button_get_active (GTK_CHECK_BUTTON (radio)))
                 return;
 
         /* get selected radio */
@@ -185,7 +185,7 @@ panel_proxy_mode_radio_changed_cb (NetProxy *self, GtkRadioButton *radio)
 static void
 show_dialog_cb (NetProxy *self)
 {
-        gtk_window_set_transient_for (GTK_WINDOW (self->dialog), GTK_WINDOW (gtk_widget_get_toplevel 
(GTK_WIDGET (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));
 }
 
@@ -350,26 +350,19 @@ net_proxy_init (NetProxy *self)
         /* setup the radio before connecting to the :toggled signal */
         switch (value) {
         case MODE_DISABLED:
-                gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (self->none_radio), TRUE);
+                gtk_check_button_set_active (GTK_CHECK_BUTTON (self->none_radio), TRUE);
                 break;
         case MODE_MANUAL:
-                gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (self->manual_radio), TRUE);
+                gtk_check_button_set_active (GTK_CHECK_BUTTON (self->manual_radio), TRUE);
                 break;
         case MODE_AUTOMATIC:
-                gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (self->automatic_radio), TRUE);
+                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);
-
-        /* prevent the dialog from being destroyed */
-        g_signal_connect_object (self->dialog,
-                                 "delete-event",
-                                 G_CALLBACK (gtk_widget_hide_on_delete),
-                                 self->dialog,
-                                 G_CONNECT_SWAPPED);
 }
 
 NetProxy *
diff --git a/panels/network/net-proxy.h b/panels/network/net-proxy.h
index d0e019a33..5469c251d 100644
--- a/panels/network/net-proxy.h
+++ b/panels/network/net-proxy.h
@@ -21,11 +21,11 @@
 
 #pragma once
 
-#include <gtk/gtk.h>
+#include <adwaita.h>
 
 G_BEGIN_DECLS
 
-G_DECLARE_FINAL_TYPE (NetProxy, net_proxy, NET, PROXY, GtkFrame)
+G_DECLARE_FINAL_TYPE (NetProxy, net_proxy, NET, PROXY, AdwBin)
 
 NetProxy *net_proxy_new (void);
 
diff --git a/panels/network/net-vpn.c b/panels/network/net-vpn.c
index 44400662b..3e2c84745 100644
--- a/panels/network/net-vpn.c
+++ b/panels/network/net-vpn.c
@@ -154,7 +154,7 @@ edit_connection (NetVpn *self)
         g_autofree gchar *title = NULL;
 
         editor = net_connection_editor_new (self->connection, NULL, NULL, self->client);
-        gtk_window_set_transient_for (GTK_WINDOW (editor), GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET 
(self))));
+        gtk_window_set_transient_for (GTK_WINDOW (editor), GTK_WINDOW (gtk_widget_get_native (GTK_WIDGET 
(self))));
         title = g_strdup_printf (_("%s VPN"), nm_connection_get_id (self->connection));
         net_connection_editor_set_title (editor, title);
 
diff --git a/panels/network/network-bluetooth.ui b/panels/network/network-bluetooth.ui
index e068af397..14ec590fc 100644
--- a/panels/network/network-bluetooth.ui
+++ b/panels/network/network-bluetooth.ui
@@ -2,28 +2,20 @@
 <interface>
   <!-- interface-requires gtk+ 3.0 -->
   <template class="NetDeviceBluetooth" parent="GtkBox">
-    <property name="can_focus">False</property>
     <property name="orientation">vertical</property>
     <child>
       <object class="GtkSeparator" id="separator">
-        <property name="can_focus">False</property>
         <property name="orientation">horizontal</property>
       </object>
     </child>
     <child>
       <object class="GtkListBox">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
         <property name="selection_mode">none</property>
         <child>
           <object class="GtkListBoxRow">
-            <property name="visible">True</property>
-            <property name="can_focus">False</property>
             <property name="activatable">False</property>
             <child>
               <object class="GtkBox">
-                <property name="visible">True</property>
-                <property name="can_focus">False</property>
                 <property name="margin_top">8</property>
                 <property name="margin_bottom">8</property>
                 <property name="margin_start">12</property>
@@ -31,8 +23,6 @@
                 <property name="spacing">12</property>
                 <child>
                   <object class="GtkLabel" id="device_label">
-                    <property name="visible">True</property>
-                    <property name="can_focus">False</property>
                     <property name="hexpand">True</property>
                     <property name="xalign">0.0</property>
                     <property name="label" translatable="yes">Wired</property>
@@ -41,22 +31,15 @@
                 </child>
                 <child>
                   <object class="GtkSwitch" id="device_off_switch">
-                    <property name="visible">True</property>
-                    <property name="can_focus">True</property>
                     <property name="valign">center</property>
                     <signal name="notify::active" handler="device_off_switch_changed_cb" 
object="NetDeviceBluetooth" swapped="yes"/>
-                    <child internal-child="accessible">
-                      <object class="AtkObject">
-                        <property name="accessible-name" translatable="yes">Turn device off</property>
-                      </object>
-                    </child>
+                    <accessibility>
+                      <property name="label" translatable="yes">Turn device off</property>
+                    </accessibility>
                   </object>
                 </child>
                 <child>
                   <object class="GtkButton" id="options_button">
-                    <property name="visible">True</property>
-                    <property name="can_focus">True</property>
-                    <property name="receives_default">True</property>
                     <property name="valign">center</property>
                     <property name="use_underline">True</property>
                     <signal name="clicked" handler="options_button_clicked_cb" object="NetDeviceBluetooth" 
swapped="yes"/>
@@ -65,17 +48,13 @@
                     </style>
                     <child>
                       <object class="GtkImage">
-                        <property name="visible">True</property>
-                        <property name="can_focus">False</property>
                         <property name="icon_name">emblem-system-symbolic</property>
                         <property name="icon_size">1</property>
                       </object>
                     </child>
-                    <child internal-child="accessible">
-                      <object class="AtkObject">
-                        <property name="accessible-name" translatable="yes">Options…</property>
-                      </object>
-                    </child>
+                    <accessibility>
+                      <property name="label" translatable="yes">Options…</property>
+                    </accessibility>
                   </object>
                 </child>
               </object>
diff --git a/panels/network/network-dialogs.c b/panels/network/network-dialogs.c
index 41ceec5e5..83df99a72 100644
--- a/panels/network/network-dialogs.c
+++ b/panels/network/network-dialogs.c
@@ -167,7 +167,7 @@ wireless_dialog_response_cb (GtkDialog *foo,
 
 done:
        gtk_widget_hide (GTK_WIDGET (dialog));
-       gtk_widget_destroy (GTK_WIDGET (dialog));
+       gtk_window_destroy (GTK_WINDOW (dialog));
 }
 
 static void
@@ -179,7 +179,7 @@ show_wireless_dialog (GtkWidget        *toplevel,
 
         g_debug ("About to parent and show a network dialog");
 
-        g_assert (gtk_widget_is_toplevel (toplevel));
+        g_assert (GTK_IS_NATIVE (toplevel));
         g_object_set (G_OBJECT (dialog),
                       "modal", TRUE,
                       "transient-for", toplevel,
diff --git a/panels/network/network-ethernet.ui b/panels/network/network-ethernet.ui
index 392282872..0864c981b 100644
--- a/panels/network/network-ethernet.ui
+++ b/panels/network/network-ethernet.ui
@@ -2,17 +2,12 @@
 <interface>
   <!-- interface-requires gtk+ 3.0 -->
   <template class="NetDeviceEthernet" parent="GtkBox">
-    <property name="can_focus">False</property>
     <property name="spacing">6</property>
     <property name="orientation">vertical</property>
     <child>
       <object class="GtkBox">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
         <child>
           <object class="GtkLabel" id="device_label">
-            <property name="visible">True</property>
-            <property name="can_focus">False</property>
             <property name="hexpand">True</property>
             <property name="xalign">0</property>
             <property name="label" translatable="yes">Wired</property>
@@ -24,18 +19,11 @@
         </child>
         <child>
           <object class="GtkButton">
-            <property name="visible">True</property>
-            <property name="can_focus">True</property>
-            <property name="receives_default">True</property>
-            <property name="relief">none</property>
+            <property name="icon_name">list-add-symbolic</property>
             <signal name="clicked" handler="add_profile_button_clicked_cb" object="NetDeviceEthernet" 
swapped="yes"/>
-            <child>
-              <object class="GtkImage">
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="icon_name">list-add-symbolic</property>
-              </object>
-            </child>
+            <style>
+              <class name="flat" />
+            </style>
           </object>
         </child>
       </object>
@@ -43,21 +31,15 @@
 
     <child>
       <object class="GtkBox">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
         <property name="orientation">vertical</property>
         <property name="spacing">6</property>
         <child>
           <object class="GtkScrolledWindow" id="scrolled_window">
-            <property name="visible">True</property>
-            <property name="can_focus">True</property>
             <property name="hexpand">True</property>
             <property name="hscrollbar_policy">never</property>
             <property name="vscrollbar_policy">never</property>
-            <property name="shadow_type">in</property>
             <child>
               <object class="GtkListBox" id="connection_list">
-                <property name="visible">True</property>
                 <property name="selection-mode">none</property>
                 <signal name="row-activated" handler="connection_list_row_activated_cb" 
object="NetDeviceEthernet" swapped="yes"/>
               </object>
@@ -67,54 +49,33 @@
 
         <!-- Single profile row -->
         <child>
-          <object class="GtkFrame" id="details_frame">
-            <property name="visible">True</property>
-            <property name="can_focus">False</property>
-            <property name="expand">True</property>
+          <object class="GtkListBox" id="details_listbox">
+            <property name="selection_mode">none</property>
+            <style>
+              <class name="content" />
+            </style>
             <child>
-              <object class="GtkListBox">
-                <property name="visible">True</property>
-                <property name="can_focus">False</property>
-                <property name="selection_mode">none</property>
+              <object class="AdwActionRow" id="details_row">
+                <property name="selectable">False</property>
+                <property name="title">Cable unplugged</property>
                 <child>
-                  <object class="HdyActionRow" id="details_row">
-                    <property name="visible">True</property>
-                    <property name="can_focus">False</property>
-                    <property name="selectable">False</property>
-                    <property name="title">Cable unplugged</property>
-                    <child>
-                      <object class="GtkSwitch" id="device_off_switch">
-                        <property name="visible">True</property>
-                        <property name="can_focus">True</property>
-                        <property name="halign">end</property>
-                        <property name="valign">center</property>
-                        <signal name="notify::active" handler="device_off_switch_changed_cb" 
object="NetDeviceEthernet" swapped="yes"/>
-                      </object>
-                    </child>
-                    <child>
-                      <object class="GtkButton" id="details_button">
-                        <property name="visible">True</property>
-                        <property name="can_focus">True</property>
-                        <property name="receives_default">True</property>
-                        <property name="halign">end</property>
-                        <property name="valign">center</property>
-                        <signal name="clicked" handler="details_button_clicked_cb" 
object="NetDeviceEthernet" swapped="yes"/>
-                        <child>
-                          <object class="GtkImage">
-                            <property name="visible">True</property>
-                            <property name="can_focus">False</property>
-                            <property name="icon-name">emblem-system-symbolic</property>
-                          </object>
-                        </child>
-                        <child internal-child="accessible">
-                          <object class="AtkObject">
-                            <property name="accessible-name" translatable="yes">Options…</property>
-                          </object>
-                       </child>
-                     </object>
-                    </child>
+                  <object class="GtkSwitch" id="device_off_switch">
+                    <property name="halign">end</property>
+                    <property name="valign">center</property>
+                    <signal name="notify::active" handler="device_off_switch_changed_cb" 
object="NetDeviceEthernet" swapped="yes"/>
                   </object>
                 </child>
+                <child>
+                  <object class="GtkButton" id="details_button">
+                    <property name="halign">end</property>
+                    <property name="valign">center</property>
+                    <property name="icon-name">emblem-system-symbolic</property>
+                    <signal name="clicked" handler="details_button_clicked_cb" object="NetDeviceEthernet" 
swapped="yes"/>
+                    <accessibility>
+                      <property name="label" translatable="yes">Options…</property>
+                    </accessibility>
+                 </object>
+                </child>
               </object>
             </child>
           </object>
diff --git a/panels/network/network-mobile.ui b/panels/network/network-mobile.ui
index 6f8340b74..aa9a161b1 100644
--- a/panels/network/network-mobile.ui
+++ b/panels/network/network-mobile.ui
@@ -10,300 +10,242 @@
     </columns>
   </object>
       <template class="NetDeviceMobile" parent="GtkBox">
-        <property name="can_focus">False</property>
-        <property name="border_width">12</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="orientation">vertical</property>
         <property name="spacing">6</property>
         <child>
           <object class="GtkGrid">
-            <property name="visible">True</property>
-            <property name="can_focus">False</property>
             <property name="valign">start</property>
             <property name="row_spacing">10</property>
             <property name="column_spacing">6</property>
             <child>
               <object class="GtkLabel" id="imei_heading_label">
-                <property name="visible">True</property>
-                <property name="can_focus">False</property>
                 <property name="xalign">1</property>
                 <property name="label" translatable="yes">IMEI</property>
                 <property name="mnemonic_widget">imei_label</property>
+                <layout>
+                  <property name="column">0</property>
+                  <property name="row">1</property>
+                </layout>
                 <style>
                   <class name="dim-label"/>
                 </style>
               </object>
-              <packing>
-                <property name="left_attach">0</property>
-                <property name="top_attach">1</property>
-                <property name="width">1</property>
-                <property name="height">1</property>
-              </packing>
             </child>
             <child>
               <object class="GtkLabel" id="provider_heading_label">
-                <property name="visible">True</property>
-                <property name="can_focus">False</property>
                 <property name="xalign">1</property>
                 <property name="label" translatable="yes">Provider</property>
                 <property name="mnemonic_widget">provider_label</property>
+                <layout>
+                  <property name="column">0</property>
+                  <property name="row">3</property>
+                </layout>
                 <style>
                   <class name="dim-label"/>
                 </style>
               </object>
-              <packing>
-                <property name="left_attach">0</property>
-                <property name="top_attach">3</property>
-                <property name="width">1</property>
-                <property name="height">1</property>
-              </packing>
             </child>
             <child>
               <object class="GtkLabel" id="imei_label">
-                <property name="visible">True</property>
-                <property name="can_focus">False</property>
                 <property name="xalign">0</property>
                 <property name="label">1234567890</property>
                 <property name="selectable">True</property>
                 <property name="max-width-chars">50</property>
                 <property name="ellipsize">end</property>
+                <layout>
+                  <property name="column">1</property>
+                  <property name="row">1</property>
+                  <property name="column-span">2</property>
+                </layout>
               </object>
-              <packing>
-                <property name="left_attach">1</property>
-                <property name="top_attach">1</property>
-                <property name="width">2</property>
-                <property name="height">1</property>
-              </packing>
             </child>
             <child>
               <object class="GtkLabel" id="provider_label">
-                <property name="visible">True</property>
-                <property name="can_focus">False</property>
                 <property name="xalign">0</property>
                 <property name="label">SuperTel Supremo        </property>
                 <property name="selectable">True</property>
                 <property name="max-width-chars">50</property>
                 <property name="ellipsize">end</property>
+                <layout>
+                  <property name="column">1</property>
+                  <property name="row">3</property>
+                  <property name="column-span">2</property>
+                </layout>
               </object>
-              <packing>
-                <property name="left_attach">1</property>
-                <property name="top_attach">3</property>
-                <property name="width">2</property>
-                <property name="height">1</property>
-              </packing>
             </child>
             <child>
               <object class="GtkLabel" id="ipv4_label">
-                <property name="visible">True</property>
-                <property name="can_focus">False</property>
                 <property name="xalign">0</property>
                 <property name="label">127.0.0.1</property>
                 <property name="selectable">True</property>
                 <property name="max-width-chars">50</property>
                 <property name="ellipsize">end</property>
+                <layout>
+                  <property name="column">1</property>
+                  <property name="row">4</property>
+                  <property name="column-span">2</property>
+                </layout>
               </object>
-              <packing>
-                <property name="left_attach">1</property>
-                <property name="top_attach">4</property>
-                <property name="width">2</property>
-                <property name="height">1</property>
-              </packing>
             </child>
             <child>
               <object class="GtkLabel" id="ipv6_label">
-                <property name="visible">True</property>
-                <property name="can_focus">False</property>
                 <property name="xalign">0</property>
                 <property name="selectable">True</property>
                 <property name="max-width-chars">50</property>
                 <property name="ellipsize">end</property>
+                <layout>
+                  <property name="column">1</property>
+                  <property name="row">5</property>
+                  <property name="column-span">2</property>
+                </layout>
               </object>
-              <packing>
-                <property name="left_attach">1</property>
-                <property name="top_attach">5</property>
-                <property name="width">2</property>
-                <property name="height">1</property>
-              </packing>
             </child>
             <child>
               <object class="GtkLabel" id="route_label">
-                <property name="visible">True</property>
-                <property name="can_focus">False</property>
                 <property name="xalign">0</property>
                 <property name="selectable">True</property>
                 <property name="max-width-chars">50</property>
                 <property name="ellipsize">end</property>
+                <layout>
+                  <property name="column">1</property>
+                  <property name="row">6</property>
+                  <property name="column-span">2</property>
+                </layout>
               </object>
-              <packing>
-                <property name="left_attach">1</property>
-                <property name="top_attach">6</property>
-                <property name="width">2</property>
-                <property name="height">1</property>
-              </packing>
             </child>
             <child>
               <object class="GtkLabel" id="dns4_label">
-                <property name="visible">True</property>
-                <property name="can_focus">False</property>
                 <property name="xalign">0</property>
                 <property name="yalign">0</property>
                 <property name="wrap">True</property>
                 <property name="selectable">True</property>
                 <property name="max-width-chars">50</property>
                 <property name="ellipsize">end</property>
+                <layout>
+                  <property name="column">1</property>
+                  <property name="row">7</property>
+                  <property name="column-span">2</property>
+                </layout>
               </object>
-              <packing>
-                <property name="left_attach">1</property>
-                <property name="top_attach">7</property>
-                <property name="width">2</property>
-                <property name="height">1</property>
-              </packing>
             </child>
             <child>
               <object class="GtkLabel" id="dns6_label">
-                <property name="visible">True</property>
-                <property name="can_focus">False</property>
                 <property name="xalign">0</property>
                 <property name="yalign">0</property>
                 <property name="wrap">True</property>
                 <property name="selectable">True</property>
                 <property name="max-width-chars">50</property>
                 <property name="ellipsize">end</property>
+                <layout>
+                  <property name="column">1</property>
+                  <property name="row">8</property>
+                  <property name="column-span">2</property>
+                </layout>
               </object>
-              <packing>
-                <property name="left_attach">1</property>
-                <property name="top_attach">8</property>
-                <property name="width">2</property>
-                <property name="height">1</property>
-              </packing>
             </child>
             <child>
               <object class="GtkAlignment">
-                <property name="visible">True</property>
-                <property name="can_focus">False</property>
                 <property name="halign">end</property>
                 <property name="valign">start</property>
-                <child>
-                  <placeholder/>
-                </child>
+                <layout>
+                  <property name="column">2</property>
+                  <property name="row">0</property>
+                </layout>
               </object>
-              <packing>
-                <property name="left_attach">2</property>
-                <property name="top_attach">0</property>
-                <property name="width">1</property>
-                <property name="height">1</property>
-              </packing>
             </child>
             <child>
               <object class="GtkLabel" id="ipv4_heading_label">
-                <property name="visible">True</property>
-                <property name="can_focus">False</property>
                 <property name="xalign">1</property>
                 <property name="label" translatable="yes">IP Address</property>
+                <layout>
+                  <property name="column">0</property>
+                  <property name="row">4</property>
+                </layout>
                 <style>
                   <class name="dim-label"/>
                 </style>
               </object>
-              <packing>
-                <property name="left_attach">0</property>
-                <property name="top_attach">4</property>
-                <property name="width">1</property>
-                <property name="height">1</property>
-              </packing>
             </child>
             <child>
               <object class="GtkLabel" id="ipv6_heading_label">
-                <property name="visible">True</property>
-                <property name="can_focus">False</property>
                 <property name="xalign">1</property>
                 <property name="label" translatable="yes">IPv6 Address</property>
+                <layout>
+                  <property name="column">0</property>
+                  <property name="row">5</property>
+                </layout>
                 <style>
                   <class name="dim-label"/>
                 </style>
               </object>
-              <packing>
-                <property name="left_attach">0</property>
-                <property name="top_attach">5</property>
-                <property name="width">1</property>
-                <property name="height">1</property>
-              </packing>
             </child>
             <child>
               <object class="GtkLabel" id="route_heading_label">
-                <property name="visible">True</property>
-                <property name="can_focus">False</property>
                 <property name="xalign">1</property>
                 <property name="label" translatable="yes">Default Route</property>
+                <layout>
+                  <property name="column">0</property>
+                  <property name="row">6</property>
+                </layout>
                 <style>
                   <class name="dim-label"/>
                 </style>
               </object>
-              <packing>
-                <property name="left_attach">0</property>
-                <property name="top_attach">6</property>
-                <property name="width">1</property>
-                <property name="height">1</property>
-              </packing>
             </child>
             <child>
               <object class="GtkLabel" id="dns4_heading_label">
-                <property name="visible">True</property>
-                <property name="can_focus">False</property>
                 <property name="xalign">1</property>
                 <property name="yalign">0</property>
                 <property name="label" translatable="yes">DNS</property>
+                <layout>
+                  <property name="column">0</property>
+                  <property name="row">7</property>
+                </layout>
                 <style>
                   <class name="dim-label"/>
                 </style>
               </object>
-              <packing>
-                <property name="left_attach">0</property>
-                <property name="top_attach">7</property>
-                <property name="width">1</property>
-                <property name="height">1</property>
-              </packing>
             </child>
             <child>
               <object class="GtkLabel" id="dns6_heading_label">
-                <property name="visible">True</property>
-                <property name="can_focus">False</property>
                 <property name="xalign">1</property>
                 <property name="yalign">0</property>
                 <property name="label" translatable="yes">DNS</property>
+                <layout>
+                  <property name="column">0</property>
+                  <property name="row">8</property>
+                </layout>
                 <style>
                   <class name="dim-label"/>
                 </style>
               </object>
-              <packing>
-                <property name="left_attach">0</property>
-                <property name="top_attach">8</property>
-                <property name="width">1</property>
-                <property name="height">1</property>
-              </packing>
             </child>
             <child>
               <object class="GtkLabel" id="network_label">
-                <property name="visible">True</property>
-                <property name="can_focus">False</property>
                 <property name="xalign">1</property>
                 <property name="label" translatable="yes">Network</property>
+                <layout>
+                  <property name="column">0</property>
+                  <property name="row">2</property>
+                </layout>
                 <style>
                   <class name="dim-label"/>
                 </style>
               </object>
-              <packing>
-                <property name="left_attach">0</property>
-                <property name="top_attach">2</property>
-                <property name="width">1</property>
-                <property name="height">1</property>
-              </packing>
             </child>
             <child>
               <object class="GtkComboBox" id="network_combo">
-                <property name="visible">True</property>
-                <property name="can_focus">False</property>
                 <property name="model">mobile_connections_list_store</property>
                 <property name="entry_text_column">1</property>
                 <signal name="changed" handler="network_combo_changed_cb" object="NetDeviceMobile" 
swapped="yes"/>
+                <layout>
+                  <property name="column">1</property>
+                  <property name="row">2</property>
+                </layout>
                 <child>
                   <object class="GtkCellRendererText"/>
                   <attributes>
@@ -311,22 +253,17 @@
                   </attributes>
                 </child>
               </object>
-              <packing>
-                <property name="left_attach">1</property>
-                <property name="top_attach">2</property>
-                <property name="width">1</property>
-                <property name="height">1</property>
-              </packing>
             </child>
             <child>
               <object class="GtkBox">
-                <property name="visible">True</property>
-                <property name="can_focus">False</property>
                 <property name="spacing">6</property>
+                <layout>
+                  <property name="column">0</property>
+                  <property name="row">0</property>
+                  <property name="column-span">3</property>
+                </layout>
                 <child>
                   <object class="GtkImage">
-                    <property name="visible">True</property>
-                    <property name="can_focus">False</property>
                     <property name="halign">end</property>
                     <property name="valign">start</property>
                     <property name="xalign">1</property>
@@ -334,24 +271,15 @@
                     <property name="icon_name">network-cellular-connected</property>
                     <property name="icon-size">6</property>
                   </object>
-                  <packing>
-                    <property name="expand">False</property>
-                    <property name="fill">True</property>
-                    <property name="position">0</property>
-                  </packing>
                 </child>
                 <child>
                   <object class="GtkBox">
-                    <property name="visible">True</property>
-                    <property name="can_focus">False</property>
                     <property name="valign">start</property>
                     <property name="hexpand">True</property>
                     <property name="spacing">3</property>
                     <property name="orientation">vertical</property>
                     <child>
                       <object class="GtkLabel" id="device_label">
-                        <property name="visible">True</property>
-                        <property name="can_focus">False</property>
                         <property name="xalign">0</property>
                         <property name="label">Mobile Broadband</property>
                         <property name="ellipsize">end</property>
@@ -360,105 +288,39 @@
                           <attribute name="scale" value="1.2"/>
                         </attributes>
                       </object>
-                      <packing>
-                        <property name="expand">False</property>
-                        <property name="fill">False</property>
-                        <property name="position">0</property>
-                      </packing>
                     </child>
                     <child>
                       <object class="GtkLabel" id="status_label">
-                        <property name="visible">True</property>
-                        <property name="can_focus">False</property>
                         <property name="xalign">0</property>
                         <property name="label">Not connected</property>
                       </object>
-                      <packing>
-                        <property name="expand">False</property>
-                        <property name="fill">False</property>
-                        <property name="position">1</property>
-                      </packing>
                     </child>
                   </object>
-                  <packing>
-                    <property name="expand">False</property>
-                    <property name="fill">True</property>
-                    <property name="position">1</property>
-                  </packing>
                 </child>
                 <child>
                   <object class="GtkSwitch" id="device_off_switch">
-                    <property name="visible">True</property>
-                    <property name="can_focus">True</property>
                     <property name="halign">end</property>
                     <property name="valign">center</property>
                     <signal name="notify::active" handler="device_off_switch_changed_cb" 
object="NetDeviceMobile" swapped="yes"/>
                   </object>
-                  <packing>
-                    <property name="expand">False</property>
-                    <property name="fill">True</property>
-                    <property name="position">2</property>
-                  </packing>
                 </child>
               </object>
-              <packing>
-                <property name="left_attach">0</property>
-                <property name="top_attach">0</property>
-                <property name="width">3</property>
-                <property name="height">1</property>
-              </packing>
-            </child>
-            <child>
-              <placeholder/>
             </child>
           </object>
-          <packing>
-            <property name="expand">False</property>
-            <property name="fill">True</property>
-            <property name="position">0</property>
-          </packing>
         </child>
         <child>
-          <object class="GtkAlignment">
-            <property name="visible">True</property>
-            <property name="can_focus">False</property>
-            <property name="xalign">1</property>
-            <property name="yalign">1</property>
-            <property name="xscale">0</property>
-            <property name="yscale">0</property>
-            <property name="top_padding">12</property>
-            <child>
-              <object class="GtkButton" id="options_button">
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="receives_default">True</property>
-                <property name="use_underline">True</property>
-                <signal name="clicked" handler="options_button_clicked_cb" object="NetDeviceMobile" 
swapped="yes"/>
-                <style>
-                  <class name="image-button"/>
-                </style>
-                <child>
-                  <object class="GtkImage">
-                    <property name="visible">True</property>
-                    <property name="can_focus">False</property>
-                    <property name="icon_name">emblem-system-symbolic</property>
-                    <property name="icon_size">1</property>
-                  </object>
-                </child>
-                <child internal-child="accessible">
-                  <object class="AtkObject">
-                    <property name="accessible-name" translatable="yes">Options…</property>
-                  </object>
-                </child>
-              </object>
-            </child>
+          <object class="GtkButton" id="options_button">
+            <property name="halign">end</property>
+            <property name="valign">end</property>
+            <property name="hexpand">True</property>
+            <property name="vexpand">True</property>
+            <property name="margin-top">12</property>
+            <property name="icon_name">emblem-system-symbolic</property>
+            <signal name="clicked" handler="options_button_clicked_cb" object="NetDeviceMobile" 
swapped="yes"/>
+            <accessibility>
+              <property name="label" translatable="yes">Options…</property>
+            </accessibility>
           </object>
-          <packing>
-            <property name="expand">True</property>
-            <property name="fill">True</property>
-            <property name="pack_type">end</property>
-            <property name="position">1</property>
-          </packing>
         </child>
       </template>
 </interface>
diff --git a/panels/network/network-proxy.ui b/panels/network/network-proxy.ui
index dcc88d5f5..ba7f43389 100644
--- a/panels/network/network-proxy.ui
+++ b/panels/network/network-proxy.ui
@@ -17,23 +17,18 @@
     <property name="upper">65535</property>
     <property name="step_increment">1</property>
   </object>
-  <template class="NetProxy" parent="GtkFrame">
-    <property name="visible">True</property>
-    <property name="can_focus">False</property>
+  <template class="NetProxy" parent="AdwBin">
     <child>
       <object class="GtkListBox">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
         <property name="selection_mode">none</property>
+        <style>
+          <class name="content" />
+        </style>
         <child>
           <object class="GtkListBoxRow">
-            <property name="visible">True</property>
-            <property name="can_focus">False</property>
             <property name="activatable">False</property>
             <child>
               <object class="GtkBox">
-                <property name="visible">True</property>
-                <property name="can_focus">False</property>
                 <property name="spacing">12</property>
                 <property name="margin_top">8</property>
                 <property name="margin_bottom">8</property>
@@ -41,8 +36,6 @@
                 <property name="margin_end">12</property>
                 <child>
                   <object class="GtkLabel">
-                    <property name="visible">True</property>
-                    <property name="can_focus">False</property>
                     <property name="hexpand">True</property>
                     <property name="label" translatable="yes">Network Proxy</property>
                     <property name="ellipsize">end</property>
@@ -54,8 +47,6 @@
                 </child>
                 <child>
                   <object class="GtkLabel" id="status_label">
-                    <property name="visible">True</property>
-                    <property name="can_focus">True</property>
                     <property name="margin_top">8</property>
                     <property name="margin_bottom">8</property>
                     <style>
@@ -65,13 +56,9 @@
                 </child>
                 <child>
                   <object class="GtkButton">
-                    <property name="visible">True</property>
-                    <property name="can_focus">True</property>
                     <signal name="clicked" handler="show_dialog_cb" object="NetProxy" swapped="yes"/>
                     <child>
                       <object class="GtkImage">
-                        <property name="visible">True</property>
-                        <property name="can_focus">False</property>
                         <property name="icon_name">emblem-system-symbolic</property>
                       </object>
                     </child>
@@ -86,403 +73,327 @@
   </template>
   <object class="GtkDialog" id="dialog">
     <property name="use_header_bar">1</property>
-    <property name="can_focus">False</property>
-    <property name="border_width">18</property>
     <property name="default_height">350</property>
     <property name="modal">True</property>
-    <property name="type_hint">dialog</property>
-    <property name="window_position">center</property>
     <property name="destroy_with_parent">True</property>
+    <property name="hide-on-close">True</property>
     <property name="title" translatable="yes">Network Proxy</property>
-    <child internal-child="vbox">
+    <child>
       <object class="GtkBox">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
-        <property name="border_width">0</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="GtkRadioButton" id="automatic_radio">
-            <property name="visible">True</property>
-            <property name="can_focus">True</property>
+          <object class="GtkCheckButton" id="automatic_radio">
             <property name="label" translatable="yes">Automatic</property>
-            <property name="receives_default">False</property>
-            <property name="draw_indicator">True</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="GtkRadioButton" id="manual_radio">
-            <property name="visible">True</property>
-            <property name="can_focus">True</property>
+          <object class="GtkCheckButton" id="manual_radio">
             <property name="label" translatable="yes">Manual</property>
-            <property name="receives_default">False</property>
-            <property name="draw_indicator">True</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="GtkRadioButton" id="none_radio">
-            <property name="visible">True</property>
-            <property name="can_focus">True</property>
+          <object class="GtkCheckButton" id="none_radio">
             <property name="label" translatable="yes">Disabled</property>
-            <property name="receives_default">False</property>
-            <property name="draw_indicator">True</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="visible">True</property>
-            <property name="can_focus">False</property>
             <property name="transition_type">crossfade</property>
 
             <!-- Disabled (empty box) -->
             <child>
-              <object class="GtkBox">
-                <property name="visible">True</property>
-                <property name="can_focus">False</property>
-              </object>
-              <packing>
+              <object class="GtkStackPage">
                 <property name="name">disabled</property>
-              </packing>
+                <property name="child">
+                  <object class="GtkBox" />
+                </property>
+              </object>
             </child>
 
             <!-- Manual -->
             <child>
-              <object class="GtkGrid">
-                <property name="visible">True</property>
-                <property name="can_focus">False</property>
-                <property name="valign">start</property>
-                <property name="border_width">12</property>
-                <property name="row_spacing">10</property>
-                <property name="column_spacing">6</property>
-                <child>
-                  <object class="GtkAlignment">
-                    <property name="visible">True</property>
-                    <property name="can_focus">False</property>
-                    <property name="halign">end</property>
+              <object class="GtkStackPage">
+                <property name="name">manual</property>
+                <property name="child">
+                  <object class="GtkGrid">
                     <property name="valign">start</property>
-                  </object>
-                  <packing>
-                    <property name="left_attach">2</property>
-                    <property name="top_attach">0</property>
-                    <property name="width">1</property>
-                    <property name="height">1</property>
-                  </packing>
-                </child>
-                <child>
-                  <object class="GtkLabel">
-                    <property name="visible">True</property>
-                    <property name="can_focus">False</property>
-                    <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>
-                    <style>
-                      <class name="dim-label"/>
-                    </style>
-                  </object>
-                  <packing>
-                    <property name="left_attach">0</property>
-                    <property name="top_attach">3</property>
-                    <property name="width">1</property>
-                    <property name="height">1</property>
-                  </packing>
-                </child>
-                <child>
-                  <object class="GtkLabel">
-                    <property name="visible">True</property>
-                    <property name="can_focus">False</property>
-                    <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>
-                    <style>
-                      <class name="dim-label"/>
-                    </style>
-                  </object>
-                  <packing>
-                    <property name="left_attach">0</property>
-                    <property name="top_attach">4</property>
-                    <property name="width">1</property>
-                    <property name="height">1</property>
-                  </packing>
-                </child>
-                <child>
-                  <object class="GtkLabel">
-                    <property name="visible">True</property>
-                    <property name="can_focus">False</property>
-                    <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>
-                    <style>
-                      <class name="dim-label"/>
-                    </style>
-                  </object>
-                  <packing>
-                    <property name="left_attach">0</property>
-                    <property name="top_attach">5</property>
-                    <property name="width">1</property>
-                    <property name="height">1</property>
-                  </packing>
-                </child>
-                <child>
-                  <object class="GtkLabel">
-                    <property name="visible">True</property>
-                    <property name="can_focus">False</property>
-                    <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>
-                    <style>
-                      <class name="dim-label"/>
-                    </style>
-                  </object>
-                  <packing>
-                    <property name="left_attach">0</property>
-                    <property name="top_attach">6</property>
-                    <property name="width">1</property>
-                    <property name="height">1</property>
-                  </packing>
-                </child>
-                <child>
-                  <object class="GtkLabel">
-                    <property name="visible">True</property>
-                    <property name="can_focus">False</property>
-                    <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>
-                    <style>
-                      <class name="dim-label"/>
-                    </style>
-                  </object>
-                  <packing>
-                    <property name="left_attach">0</property>
-                    <property name="top_attach">7</property>
-                    <property name="width">1</property>
-                    <property name="height">1</property>
-                  </packing>
-                </child>
-                <child>
-                  <object class="GtkEntry" id="proxy_http_entry">
-                    <property name="visible">True</property>
-                    <property name="can_focus">True</property>
-                    <property name="invisible_char">â—Ź</property>
-                    <property name="invisible_char_set">True</property>
-                  </object>
-                  <packing>
-                    <property name="left_attach">1</property>
-                    <property name="top_attach">3</property>
-                    <property name="width">1</property>
-                    <property name="height">1</property>
-                  </packing>
-                </child>
-                <child>
-                  <object class="GtkSpinButton">
-                    <property name="visible">True</property>
-                    <property name="can_focus">True</property>
-                    <property name="invisible_char">â—Ź</property>
-                    <property name="xalign">1</property>
-                    <property name="invisible_char_set">True</property>
-                    <property name="adjustment">proxy_port_http_adjustment</property>
-                    <child internal-child="accessible">
-                      <object class="AtkObject">
-                        <property name="accessible-name" translatable="yes">HTTP proxy port</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>
-                  </object>
-                  <packing>
-                    <property name="left_attach">2</property>
-                    <property name="top_attach">3</property>
-                    <property name="width">1</property>
-                    <property name="height">1</property>
-                  </packing>
-                </child>
-                <child>
-                  <object class="GtkEntry" id="proxy_https_entry">
-                    <property name="visible">True</property>
-                    <property name="can_focus">True</property>
-                    <property name="invisible_char">â—Ź</property>
-                    <property name="invisible_char_set">True</property>
-                  </object>
-                  <packing>
-                    <property name="left_attach">1</property>
-                    <property name="top_attach">4</property>
-                    <property name="width">1</property>
-                    <property name="height">1</property>
-                  </packing>
-                </child>
-                <child>
-                  <object class="GtkEntry" id="proxy_ftp_entry">
-                    <property name="visible">True</property>
-                    <property name="can_focus">True</property>
-                    <property name="invisible_char">â—Ź</property>
-                    <property name="invisible_char_set">True</property>
-                  </object>
-                  <packing>
-                    <property name="left_attach">1</property>
-                    <property name="top_attach">5</property>
-                    <property name="width">1</property>
-                    <property name="height">1</property>
-                  </packing>
-                </child>
-                <child>
-                  <object class="GtkEntry" id="proxy_socks_entry">
-                    <property name="visible">True</property>
-                    <property name="can_focus">True</property>
-                    <property name="invisible_char">â—Ź</property>
-                    <property name="invisible_char_set">True</property>
-                  </object>
-                  <packing>
-                    <property name="left_attach">1</property>
-                    <property name="top_attach">6</property>
-                    <property name="width">1</property>
-                    <property name="height">1</property>
-                  </packing>
-                </child>
-                <child>
-                  <object class="GtkEntry" id="proxy_ignore_entry">
-                    <property name="visible">True</property>
-                    <property name="can_focus">True</property>
-                    <property name="invisible_char">â—Ź</property>
-                    <property name="invisible_char_set">True</property>
-                  </object>
-                  <packing>
-                    <property name="left_attach">1</property>
-                    <property name="top_attach">7</property>
-                    <property name="width">2</property>
-                    <property name="height">1</property>
-                  </packing>
-                </child>
-                <child>
-                  <object class="GtkSpinButton">
-                    <property name="visible">True</property>
-                    <property name="can_focus">True</property>
-                    <property name="invisible_char">â—Ź</property>
-                    <property name="xalign">1</property>
-                    <property name="invisible_char_set">True</property>
-                    <property name="adjustment">proxy_port_https_adjustment</property>
-                    <child internal-child="accessible">
-                      <object class="AtkObject">
-                        <property name="accessible-name" translatable="yes">HTTPS proxy port</property>
+                    <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>
-                  </object>
-                  <packing>
-                    <property name="left_attach">2</property>
-                    <property name="top_attach">4</property>
-                    <property name="width">1</property>
-                    <property name="height">1</property>
-                  </packing>
-                </child>
-                <child>
-                  <object class="GtkSpinButton">
-                    <property name="visible">True</property>
-                    <property name="can_focus">True</property>
-                    <property name="invisible_char">â—Ź</property>
-                    <property name="xalign">1</property>
-                    <property name="invisible_char_set">True</property>
-                    <property name="adjustment">proxy_port_ftp_adjustment</property>
-                    <child internal-child="accessible">
-                      <object class="AtkObject">
-                        <property name="accessible-name" translatable="yes">FTP proxy port</property>
+                    <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>
-                  </object>
-                  <packing>
-                    <property name="left_attach">2</property>
-                    <property name="top_attach">5</property>
-                    <property name="width">1</property>
-                    <property name="height">1</property>
-                  </packing>
-                </child>
-                <child>
-                  <object class="GtkSpinButton">
-                    <property name="visible">True</property>
-                    <property name="can_focus">True</property>
-                    <property name="invisible_char">â—Ź</property>
-                    <property name="xalign">1</property>
-                    <property name="invisible_char_set">True</property>
-                    <property name="adjustment">proxy_port_socks_adjustment</property>
-                    <child internal-child="accessible">
-                      <object class="AtkObject">
-                        <property name="accessible-name" translatable="yes">Socks proxy port</property>
+                    <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>
-                  <packing>
-                    <property name="left_attach">2</property>
-                    <property name="top_attach">6</property>
-                    <property name="width">1</property>
-                    <property name="height">1</property>
-                  </packing>
-                </child>
+                </property>
               </object>
-              <packing>
-                <property name="name">manual</property>
-              </packing>
             </child>
 
             <!-- Automatic -->
             <child>
-              <object class="GtkGrid">
-                <property name="visible">True</property>
-                <property name="can_focus">False</property>
-                <property name="row_spacing">12</property>
-                <property name="column_spacing">12</property>
-                <child>
-                  <object class="GtkLabel">
-                    <property name="visible">True</property>
-                    <property name="can_focus">False</property>
-                    <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>
-                    <style>
-                      <class name="dim-label"/>
-                    </style>
-                  </object>
-                  <packing>
-                    <property name="top_attach">0</property>
-                    <property name="left_attach">0</property>
-                  </packing>
-                </child>
-                <child>
-                  <object class="GtkEntry" id="proxy_url_entry">
-                    <property name="visible">True</property>
-                    <property name="can_focus">True</property>
-                    <property name="invisible_char">â—Ź</property>
-                    <property name="invisible_char_set">True</property>
-                  </object>
-                  <packing>
-                    <property name="top_attach">0</property>
-                    <property name="left_attach">1</property>
-                  </packing>
-                </child>
-                <child>
-                  <object class="GtkLabel" id="proxy_warning_label">
-                    <property name="visible">False</property>
-                    <property name="can_focus">False</property>
-                    <property name="xalign">0</property>
-                    <property name="label">WPAD warning…</property>
-                    <property name="wrap">True</property>
-                    <property name="width_chars">50</property>
+              <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>
-                  <packing>
-                    <property name="top_attach">1</property>
-                    <property name="left_attach">0</property>
-                    <property name="width">2</property>
-                  </packing>
-                </child>
+                </property>
               </object>
-              <packing>
-                <property name="name">automatic</property>
-              </packing>
             </child>
+
           </object>
         </child>
       </object>
diff --git a/panels/network/network-vpn.ui b/panels/network/network-vpn.ui
index f60add2b8..bd6dd3d4a 100644
--- a/panels/network/network-vpn.ui
+++ b/panels/network/network-vpn.ui
@@ -2,14 +2,12 @@
 <interface>
   <!-- interface-requires gtk+ 3.0 -->
   <template class="NetVpn" parent="GtkBox">
-    <property name="can_focus">False</property>
     <property name="hexpand">True</property>
     <property name="orientation">vertical</property>
 
     <!-- HACK: a separator above the row, since we don't have a real listbox widget in the panel -->
     <child>
       <object class="GtkSeparator" id="separator">
-        <property name="can_focus">False</property>
         <property name="orientation">horizontal</property>
       </object>
     </child>
@@ -17,18 +15,15 @@
     <!-- Main listbox -->
     <child>
       <object class="GtkListBox">
-        <property name="visible">True</property>
-        <property name="can_focus">True</property>
         <property name="selection_mode">none</property>
+        <style>
+          <class name="content" />
+        </style>
         <child>
           <object class="GtkListBoxRow">
-            <property name="visible">True</property>
-            <property name="can_focus">True</property>
             <property name="activatable">False</property>
             <child>
               <object class="GtkBox">
-                <property name="visible">True</property>
-                <property name="can_focus">False</property>
                 <property name="valign">start</property>
                 <property name="margin_top">8</property>
                 <property name="margin_bottom">8</property>
@@ -37,8 +32,6 @@
                 <property name="spacing">12</property>
                 <child>
                   <object class="GtkLabel" id="device_label">
-                    <property name="visible">True</property>
-                    <property name="can_focus">False</property>
                     <property name="xalign">0</property>
                     <property name="ellipsize">end</property>
                     <property name="hexpand">True</property>
@@ -46,37 +39,21 @@
                 </child>
                 <child>
                   <object class="GtkSwitch" id="device_off_switch">
-                    <property name="visible">True</property>
-                    <property name="can_focus">True</property>
                     <property name="halign">end</property>
                     <property name="valign">center</property>
                     <signal name="notify::active" handler="device_off_toggled" object="NetVpn" 
swapped="yes"/>
-                    <child internal-child="accessible">
-                      <object class="AtkObject">
-                        <property name="accessible-name" translatable="yes">Turn VPN connection 
off</property>
-                      </object>
-                    </child>
+                    <accessibility>
+                      <property name="label" translatable="yes">Turn VPN connection off</property>
+                    </accessibility>
                   </object>
                 </child>
                 <child>
                   <object class="GtkButton" id="options_button">
-                    <property name="visible">True</property>
-                    <property name="can_focus">True</property>
-                    <property name="receives_default">True</property>
-                    <property name="use_underline">True</property>
+                    <property name="icon_name">emblem-system-symbolic</property>
                     <signal name="clicked" handler="edit_connection" object="NetVpn" swapped="yes"/>
-                    <child>
-                      <object class="GtkImage">
-                        <property name="visible">True</property>
-                        <property name="can_focus">False</property>
-                        <property name="icon_name">emblem-system-symbolic</property>
-                      </object>
-                    </child>
-                    <child internal-child="accessible">
-                      <object class="AtkObject">
-                        <property name="accessible-name" translatable="yes">Options…</property>
-                      </object>
-                    </child>
+                    <accessibility>
+                      <property name="label" translatable="yes">Options…</property>
+                    </accessibility>
                   </object>
                 </child>
               </object>
diff --git a/panels/network/network-wifi.ui b/panels/network/network-wifi.ui
index b3e03c31e..2d5f13207 100644
--- a/panels/network/network-wifi.ui
+++ b/panels/network/network-wifi.ui
@@ -1,39 +1,56 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <interface>
   <!-- interface-requires gtk+ 3.0 -->
-  <template class="NetDeviceWifi" parent="GtkStack">
-    <child>
-      <object class="GtkBox" id="listbox_box">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
-        <property name="orientation">vertical</property>
-        <property name="height-request">140</property>
-      </object>
-    </child>
+  <template class="NetDeviceWifi" parent="AdwBin">
 
-    <!-- Wi-Fi Hotspot deails -->
     <child>
-      <object class="GtkListBox" id="hotspot_box">
-        <property name="visible">True</property>
-        <property name="selection-mode">none</property>
-        <child>
-          <object class="CcListRow" id="hotspot_name_row">
-            <property name="visible">True</property>
-            <property name="title" context="Wi-Fi Hotspot" translatable="yes">Network Name</property>
-          </object>
-        </child>
+      <object class="GtkStack" id="stack">
+        <property name="valign">start</property>
+        <property name="vhomogeneous">False</property>
+
         <child>
-          <object class="CcListRow" id="hotspot_security_row">
-            <property name="visible">True</property>
-            <property name="title" context="Wi-Fi Hotspot" translatable="yes">Security type</property>
+          <object class="GtkStackPage">
+            <property name="child">
+              <object class="GtkBox" id="listbox_box">
+                <property name="orientation">vertical</property>
+                <property name="height-request">140</property>
+              </object>
+            </property>
           </object>
         </child>
+
+        <!-- Wi-Fi Hotspot deails -->
         <child>
-          <object class="CcListRow" id="hotspot_password_row">
-            <property name="visible">True</property>
-            <property name="title" context="Wi-Fi Hotspot" translatable="yes">Password</property>
+          <object class="GtkStackPage">
+            <property name="child">
+              <object class="GtkListBox" id="hotspot_box">
+                <property name="selection-mode">none</property>
+                <style>
+                  <class name="content" />
+                </style>
+                <child>
+                  <object class="CcListRow" id="hotspot_name_row">
+                    <property name="activatable">False</property>
+                    <property name="title" context="Wi-Fi Hotspot" translatable="yes">Network Name</property>
+                  </object>
+                </child>
+                <child>
+                  <object class="CcListRow" id="hotspot_security_row">
+                    <property name="activatable">False</property>
+                    <property name="title" context="Wi-Fi Hotspot" translatable="yes">Security 
type</property>
+                  </object>
+                </child>
+                <child>
+                  <object class="CcListRow" id="hotspot_password_row">
+                    <property name="activatable">False</property>
+                    <property name="title" context="Wi-Fi Hotspot" translatable="yes">Password</property>
+                  </object>
+                </child>
+              </object>
+            </property>
           </object>
         </child>
+
       </object>
     </child>
 
@@ -41,15 +58,11 @@
 
   <!-- Center widget -->
   <object class="GtkBox" id="center_box">
-    <property name="visible">True</property>
-    <property name="can_focus">False</property>
     <property name="orientation">vertical</property>
     <property name="halign">center</property>
     <property name="valign">center</property>
     <child>
       <object class="GtkLabel" id="title_label">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
         <property name="label" translatable="yes">Wi-Fi</property>
         <style>
           <class name="title" />
@@ -58,8 +71,6 @@
     </child>
     <child>
       <object class="GtkLabel" id="status_label">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
         <style>
           <class name="subtitle" />
         </style>
@@ -69,32 +80,22 @@
 
   <!-- Box with the On/Off switch + menu button -->
   <object class="GtkBox" id="header_box">
-    <property name="visible">True</property>
-    <property name="can_focus">False</property>
     <property name="spacing">6</property>
     <property name="halign">end</property>
     <child>
       <object class="GtkSwitch" id="device_off_switch">
-        <property name="visible">True</property>
-        <property name="can_focus">True</property>
         <property name="valign">center</property>
         <signal name="notify::active" handler="device_off_switch_changed_cb" object="NetDeviceWifi" 
swapped="yes"/>
-        <child internal-child="accessible">
-          <object class="AtkObject">
-            <property name="accessible-name" translatable="yes">Turn Wi-Fi off</property>
-          </object>
-        </child>
+        <accessibility>
+          <property name="label" translatable="yes">Turn Wi-Fi off</property>
+        </accessibility>
       </object>
     </child>
     <child>
       <object class="GtkMenuButton" id="header_button">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
         <property name="popover">header_button_popover</property>
         <child>
           <object class="GtkImage">
-            <property name="visible">True</property>
-            <property name="can_focus">False</property>
             <property name="icon_name">view-more-symbolic</property>
           </object>
         </child>
@@ -103,44 +104,36 @@
   </object>
 
   <!-- Menu Popover -->
-  <object class="GtkPopoverMenu" id="header_button_popover">
+  <object class="GtkPopover" id="header_button_popover">
+    <style>
+      <class name="menu" />
+    </style>
     <child>
       <object class="GtkBox">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
-        <property name="margin">12</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">6</property>
         <property name="orientation">vertical</property>
         <child>
-          <object class="GtkModelButton" id="connect_hidden_button">
+          <object class="GtkButton" id="connect_hidden_button">
             <property name="label" translatable="yes">_Connect to Hidden Network…</property>
-            <property name="visible">True</property>
-            <property name="can_focus">True</property>
-            <property name="receives_default">True</property>
             <property name="use_underline">True</property>
-            <property name="xalign">0.0</property>
             <signal name="clicked" handler="connect_hidden_button_clicked_cb" object="NetDeviceWifi" 
swapped="yes"/>
           </object>
         </child>
         <child>
-          <object class="GtkModelButton" id="start_hotspot_button">
+          <object class="GtkButton" id="start_hotspot_button">
             <property name="label" translatable="yes">_Turn On Wi-Fi Hotspot…</property>
-            <property name="visible">True</property>
-            <property name="can_focus">True</property>
-            <property name="receives_default">True</property>
             <property name="use_underline">True</property>
-            <property name="xalign">0.0</property>
             <signal name="clicked" handler="start_hotspot_button_clicked_cb" object="NetDeviceWifi" 
swapped="yes"/>
           </object>
         </child>
         <child>
-          <object class="GtkModelButton">
+          <object class="GtkButton">
             <property name="label" translatable="yes">_Known Wi-Fi Networks</property>
-            <property name="visible">True</property>
-            <property name="can_focus">True</property>
-            <property name="receives_default">True</property>
             <property name="use_underline">True</property>
-            <property name="xalign">0.0</property>
             <signal name="clicked" handler="history_button_clicked_cb" object="NetDeviceWifi" swapped="yes"/>
           </object>
         </child>
diff --git a/panels/network/wireless-security/eap-method-fast.c 
b/panels/network/wireless-security/eap-method-fast.c
index ecd1fb985..0988b8cf3 100644
--- a/panels/network/wireless-security/eap-method-fast.c
+++ b/panels/network/wireless-security/eap-method-fast.c
@@ -27,6 +27,7 @@
 #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
@@ -40,7 +41,7 @@ struct _EAPMethodFAST {
        GtkLabel             *inner_auth_label;
        GtkListStore         *inner_auth_model;
        GtkBox               *inner_auth_box;
-       GtkFileChooserButton *pac_file_button;
+       WsFileChooserButton  *pac_file_button;
        GtkLabel             *pac_file_label;
        GtkCheckButton       *pac_provision_check;
        GtkComboBox          *pac_provision_combo;
@@ -76,12 +77,12 @@ static gboolean
 validate (EAPMethod *parent, GError **error)
 {
        EAPMethodFAST *self = (EAPMethodFAST *) parent;
-       const char *file;
+       g_autoptr(GFile) file = NULL;
        gboolean provisioning;
        gboolean valid = TRUE;
 
-       provisioning = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (self->pac_provision_check));
-       file = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (self->pac_file_button));
+       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"));
@@ -110,9 +111,10 @@ 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;
-       char *filename;
        gboolean enabled;
        int pac_provisioning = 0;
 
@@ -121,14 +123,15 @@ fill_connection (EAPMethod *parent, NMConnection *connection, NMSettingSecretFla
 
        nm_setting_802_1x_add_eap_method (s_8021x, "fast");
 
-       text = gtk_entry_get_text (self->anon_identity_entry);
+       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);
 
-       filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (self->pac_file_button));
+       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_toggle_button_get_active (GTK_TOGGLE_BUTTON (self->pac_provision_check));
+       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);
@@ -158,21 +161,21 @@ static void
 inner_auth_combo_changed_cb (EAPMethodFAST *self)
 {
        EAPMethod *inner_method;
-       GList *children;
+       GtkWidget *child;
 
        inner_method = get_inner_method (self);
 
        /* Remove the previous method and migrate username/password across */
-       children = gtk_container_get_children (GTK_CONTAINER (self->inner_auth_box));
-       if (children != NULL) {
-               EAPMethod *old_eap = g_list_nth_data (children, 0);
+       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_container_remove (GTK_CONTAINER (self->inner_auth_box), GTK_WIDGET (old_eap));
+               gtk_box_remove (self->inner_auth_box, child);
        }
 
-       gtk_container_add (GTK_CONTAINER (self->inner_auth_box), g_object_ref (GTK_WIDGET (inner_method)));
+       gtk_box_append (self->inner_auth_box, g_object_ref (GTK_WIDGET (inner_method)));
 
        eap_method_emit_changed (EAP_METHOD (self));
 }
@@ -246,7 +249,7 @@ pac_toggled_cb (EAPMethodFAST *self)
 {
        gboolean enabled = FALSE;
 
-       enabled = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (self->pac_provision_check));
+       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));
@@ -269,6 +272,8 @@ 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/ControlCenter/network/eap-method-fast.ui");
 
        gtk_widget_class_bind_template_child (widget_class, EAPMethodFAST, anon_identity_entry);
@@ -306,7 +311,6 @@ eap_method_fast_new (NMConnection *connection)
        EAPMethodFAST *self;
        GtkFileFilter *filter;
        NMSetting8021x *s_8021x = NULL;
-       const char *filename;
        gboolean provisioning_enabled = TRUE;
        const gchar *phase2_auth = NULL;
        GtkTreeIter iter;
@@ -335,31 +339,30 @@ eap_method_fast_new (NMConnection *connection)
        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_toggle_button_set_active (GTK_TOGGLE_BUTTON (self->pac_provision_check), provisioning_enabled);
+       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_entry_set_text (self->anon_identity_entry, 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);
 
-       gtk_file_chooser_set_local_only (GTK_FILE_CHOOSER (self->pac_file_button), TRUE);
-       gtk_file_chooser_button_set_title (self->pac_file_button,
-                                          _("Choose a PAC file"));
-       g_signal_connect_swapped (self->pac_file_button, "selection-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 (GTK_FILE_CHOOSER (self->pac_file_button), filter);
+       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 (GTK_FILE_CHOOSER (self->pac_file_button), filter);
+       gtk_file_chooser_add_filter (ws_file_chooser_button_get_filechooser (self->pac_file_button), filter);
 
        if (connection && s_8021x) {
-               filename = nm_setting_802_1x_get_pac_file (s_8021x);
-               if (filename)
-                       gtk_file_chooser_set_filename (GTK_FILE_CHOOSER (self->pac_file_button), filename);
+               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);
diff --git a/panels/network/wireless-security/eap-method-fast.ui 
b/panels/network/wireless-security/eap-method-fast.ui
index 3d4f1dd25..ad63b1818 100644
--- a/panels/network/wireless-security/eap-method-fast.ui
+++ b/panels/network/wireless-security/eap-method-fast.ui
@@ -37,96 +37,82 @@
     </data>
   </object>
   <template class="EAPMethodFAST" parent="GtkGrid">
-    <property name="can_focus">False</property>
     <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="visible">True</property>
-        <property name="can_focus">False</property>
         <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>
-      <packing>
-        <property name="left_attach">0</property>
-        <property name="top_attach">0</property>
-      </packing>
     </child>
     <child>
       <object class="GtkEntry" id="anon_identity_entry">
-        <property name="visible">True</property>
-        <property name="can_focus">True</property>
         <property name="hexpand">True</property>
-        <property name="activates_default">True</property>
+        <layout>
+          <property name="column">1</property>
+          <property name="row">0</property>
+        </layout>
       </object>
-      <packing>
-        <property name="left_attach">1</property>
-        <property name="top_attach">0</property>
-      </packing>
     </child>
     <child>
       <object class="GtkLabel" id="pac_file_label">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
         <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>
-      <packing>
-        <property name="left_attach">0</property>
-        <property name="top_attach">2</property>
-      </packing>
     </child>
     <child>
-      <object class="GtkFileChooserButton" id="pac_file_button">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
+      <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>
-      <packing>
-        <property name="left_attach">1</property>
-        <property name="top_attach">2</property>
-      </packing>
     </child>
     <child>
       <object class="GtkBox" id="inner_auth_box">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
         <property name="orientation">vertical</property>
-        <child>
-          <placeholder/>
-        </child>
+        <layout>
+          <property name="column">0</property>
+          <property name="column-span">2</property>
+          <property name="row">4</property>
+        </layout>
       </object>
-      <packing>
-        <property name="left_attach">0</property>
-        <property name="width">2</property>
-        <property name="top_attach">4</property>
-      </packing>
     </child>
     <child>
       <object class="GtkLabel" id="inner_auth_label">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
         <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>
-      <packing>
-        <property name="left_attach">0</property>
-        <property name="top_attach">3</property>
-      </packing>
     </child>
     <child>
       <object class="GtkComboBox" id="inner_auth_combo">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
         <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>
@@ -134,31 +120,25 @@
           </attributes>
         </child>
       </object>
-      <packing>
-        <property name="left_attach">1</property>
-        <property name="top_attach">3</property>
-      </packing>
     </child>
     <child>
       <object class="GtkCheckButton" id="pac_provision_check">
         <property name="label" translatable="yes">Allow automatic PAC pro_visioning</property>
-        <property name="visible">True</property>
-        <property name="can_focus">True</property>
-        <property name="receives_default">False</property>
         <property name="use_underline">True</property>
-        <property name="draw_indicator">True</property>
+        <layout>
+          <property name="column">0</property>
+          <property name="row">1</property>
+        </layout>
       </object>
-      <packing>
-        <property name="left_attach">0</property>
-        <property name="top_attach">1</property>
-      </packing>
     </child>
     <child>
       <object class="GtkComboBox" id="pac_provision_combo">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
         <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>
@@ -166,10 +146,6 @@
           </attributes>
         </child>
       </object>
-      <packing>
-        <property name="left_attach">1</property>
-        <property name="top_attach">1</property>
-      </packing>
     </child>
   </template>
 </interface>
diff --git a/panels/network/wireless-security/eap-method-leap.c 
b/panels/network/wireless-security/eap-method-leap.c
index d218ade19..a5ff59e2e 100644
--- a/panels/network/wireless-security/eap-method-leap.c
+++ b/panels/network/wireless-security/eap-method-leap.c
@@ -47,7 +47,7 @@ static void
 show_toggled_cb (EAPMethodLEAP *self)
 {
        gboolean visible;
-       visible = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (self->show_password_check));
+       visible = gtk_check_button_get_active (GTK_CHECK_BUTTON (self->show_password_check));
        gtk_entry_set_visibility (self->password_entry, visible);
 }
 
@@ -59,7 +59,7 @@ validate (EAPMethod *parent, GError **error)
        const char *text;
        gboolean ret = TRUE;
 
-       text = gtk_entry_get_text (self->username_entry);
+       text = gtk_editable_get_text (GTK_EDITABLE (self->username_entry));
        if (!text || !strlen (text)) {
                widget_set_error (GTK_WIDGET (self->username_entry));
                g_set_error_literal (error, NMA_ERROR, NMA_ERROR_GENERIC, _("missing EAP-LEAP username"));
@@ -73,7 +73,7 @@ validate (EAPMethod *parent, GError **error)
                return TRUE;
        }
 
-       text = gtk_entry_get_text (self->password_entry);
+       text = gtk_editable_get_text (GTK_EDITABLE (self->password_entry));
        if (!text || !strlen (text)) {
                widget_set_error (GTK_WIDGET (self->password_entry));
                if (ret) {
@@ -106,8 +106,8 @@ fill_connection (EAPMethod *parent, NMConnection *connection, NMSettingSecretFla
 
        nm_setting_802_1x_add_eap_method (s_8021x, "leap");
 
-       g_object_set (s_8021x, NM_SETTING_802_1X_IDENTITY, gtk_entry_get_text (self->username_entry), NULL);
-       g_object_set (s_8021x, NM_SETTING_802_1X_PASSWORD, gtk_entry_get_text (self->password_entry), NULL);
+       g_object_set (s_8021x, NM_SETTING_802_1X_IDENTITY, gtk_editable_get_text (GTK_EDITABLE 
(self->username_entry)), NULL);
+       g_object_set (s_8021x, NM_SETTING_802_1X_PASSWORD, gtk_editable_get_text (GTK_EDITABLE 
(self->password_entry)), NULL);
 
        /* Save 802.1X password flags to the connection */
        secret_flags = nma_utils_menu_to_secret_flags (GTK_WIDGET (self->password_entry));
@@ -146,42 +146,42 @@ static const gchar *
 get_username (EAPMethod *method)
 {
        EAPMethodLEAP *self = EAP_METHOD_LEAP (method);
-       return gtk_entry_get_text (self->username_entry);
+       return gtk_editable_get_text (GTK_EDITABLE (self->username_entry));
 }
 
 static void
 set_username (EAPMethod *method, const gchar *username)
 {
        EAPMethodLEAP *self = EAP_METHOD_LEAP (method);
-       gtk_entry_set_text (self->username_entry, username);
+       gtk_editable_set_text (GTK_EDITABLE (self->username_entry), username);
 }
 
 static const gchar *
 get_password (EAPMethod *method)
 {
        EAPMethodLEAP *self = EAP_METHOD_LEAP (method);
-       return gtk_entry_get_text (self->password_entry);
+       return gtk_editable_get_text (GTK_EDITABLE (self->password_entry));
 }
 
 static void
 set_password (EAPMethod *method, const gchar *password)
 {
        EAPMethodLEAP *self = EAP_METHOD_LEAP (method);
-       gtk_entry_set_text (self->password_entry, password);
+       gtk_editable_set_text (GTK_EDITABLE (self->password_entry), password);
 }
 
 static gboolean
 get_show_password (EAPMethod *method)
 {
        EAPMethodLEAP *self = EAP_METHOD_LEAP (method);
-       return gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (self->show_password_check));
+       return gtk_check_button_get_active (GTK_CHECK_BUTTON (self->show_password_check));
 }
 
 static void
 set_show_password (EAPMethod *method, gboolean show_password)
 {
        EAPMethodLEAP *self = EAP_METHOD_LEAP (method);
-       gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (self->show_password_check), show_password);
+       gtk_check_button_set_active (self->show_password_check, show_password);
 }
 
 static void
diff --git a/panels/network/wireless-security/eap-method-leap.ui 
b/panels/network/wireless-security/eap-method-leap.ui
index abb6ea442..3f945bd3d 100644
--- a/panels/network/wireless-security/eap-method-leap.ui
+++ b/panels/network/wireless-security/eap-method-leap.ui
@@ -2,79 +2,62 @@
 <interface>
   <requires lib="gtk+" version="3.4"/>
   <template class="EAPMethodLEAP" parent="GtkGrid">
-    <property name="can_focus">False</property>
     <property name="valign">start</property>
     <property name="column_spacing">6</property>
     <property name="row_spacing">6</property>
-    <child>
-      <placeholder/>
-    </child>
     <child>
       <object class="GtkLabel" id="username_label">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
         <property name="xalign">1</property>
         <property name="label" translatable="yes">_Username</property>
         <property name="use_underline">True</property>
         <property name="mnemonic_widget">username_entry</property>
+        <layout>
+          <property name="column">0</property>
+          <property name="row">0</property>
+        </layout>
       </object>
-      <packing>
-        <property name="left_attach">0</property>
-        <property name="top_attach">0</property>
-      </packing>
     </child>
     <child>
       <object class="GtkLabel" id="password_label">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
         <property name="xalign">1</property>
         <property name="label" translatable="yes">_Password</property>
         <property name="use_underline">True</property>
         <property name="mnemonic_widget">password_entry</property>
+        <layout>
+          <property name="column">0</property>
+          <property name="row">1</property>
+        </layout>
       </object>
-      <packing>
-        <property name="left_attach">0</property>
-        <property name="top_attach">1</property>
-      </packing>
     </child>
     <child>
       <object class="GtkEntry" id="password_entry">
-        <property name="visible">True</property>
-        <property name="can_focus">True</property>
         <property name="hexpand">True</property>
         <property name="visibility">False</property>
-        <property name="activates_default">True</property>
+        <layout>
+          <property name="column">1</property>
+          <property name="row">1</property>
+        </layout>
       </object>
-      <packing>
-        <property name="left_attach">1</property>
-        <property name="top_attach">1</property>
-      </packing>
     </child>
     <child>
       <object class="GtkCheckButton" id="show_password_check">
         <property name="label" translatable="yes">Sho_w password</property>
-        <property name="visible">True</property>
-        <property name="can_focus">True</property>
         <property name="hexpand">True</property>
-        <property name="receives_default">False</property>
         <property name="use_underline">True</property>
-        <property name="draw_indicator">True</property>
+        <layout>
+          <property name="column">1</property>
+          <property name="row">2</property>
+        </layout>
       </object>
-      <packing>
-        <property name="left_attach">1</property>
-        <property name="top_attach">2</property>
-      </packing>
     </child>
     <child>
       <object class="GtkEntry" id="username_entry">
-        <property name="visible">True</property>
-        <property name="can_focus">True</property>
         <property name="hexpand">True</property>
+        <layout>
+          <property name="column">1</property>
+          <property name="row">0</property>
+        </layout>
       </object>
-      <packing>
-        <property name="left_attach">1</property>
-        <property name="top_attach">0</property>
-      </packing>
     </child>
   </template>
 </interface>
diff --git a/panels/network/wireless-security/eap-method-peap.c 
b/panels/network/wireless-security/eap-method-peap.c
index 08997cde3..b30419da1 100644
--- a/panels/network/wireless-security/eap-method-peap.c
+++ b/panels/network/wireless-security/eap-method-peap.c
@@ -27,6 +27,7 @@
 #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
@@ -36,7 +37,7 @@ struct _EAPMethodPEAP {
 
        GtkEntry             *anon_identity_entry;
        GtkLabel             *anon_identity_label;
-       GtkFileChooserButton *ca_cert_button;
+       WsFileChooserButton  *ca_cert_button;
        GtkLabel             *ca_cert_label;
        GtkCheckButton       *ca_cert_not_required_check;
        GtkBox               *inner_auth_box;
@@ -82,17 +83,17 @@ validate (EAPMethod *method, GError **error)
        EAPMethodPEAP *self = EAP_METHOD_PEAP (method);
        g_autoptr(GError) local_error = NULL;
 
-       if (!eap_method_validate_filepicker (GTK_FILE_CHOOSER (self->ca_cert_button),
+       if (!eap_method_validate_filepicker (ws_file_chooser_button_get_filechooser (self->ca_cert_button),
                                             TYPE_CA_CERT, NULL, NULL, &local_error)) {
                g_set_error (error, NMA_ERROR, NMA_ERROR_GENERIC, _("invalid EAP-PEAP CA certificate: %s"), 
local_error->message);
                return FALSE;
        }
 
-       if (!gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (self->ca_cert_not_required_check))) {
-               g_autofree gchar *filename = NULL;
+       if (!gtk_check_button_get_active (GTK_CHECK_BUTTON (self->ca_cert_not_required_check))) {
+               g_autoptr(GFile) file = NULL;
 
-               filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (self->ca_cert_button));
-               if (filename == NULL) {
+               file = ws_file_chooser_button_get_file (self->ca_cert_button);
+               if (file == NULL) {
                        g_set_error_literal (error, NMA_ERROR, NMA_ERROR_GENERIC, _("invalid EAP-PEAP CA 
certificate: no certificate specified"));
                        return FALSE;
                }
@@ -104,8 +105,8 @@ validate (EAPMethod *method, GError **error)
 static void
 ca_cert_not_required_toggled (EAPMethodPEAP *self)
 {
-       eap_method_ca_cert_not_required_toggled (GTK_TOGGLE_BUTTON (self->ca_cert_not_required_check),
-                                                GTK_FILE_CHOOSER (self->ca_cert_button));
+       eap_method_ca_cert_not_required_toggled (self->ca_cert_not_required_check,
+                                                ws_file_chooser_button_get_filechooser 
(self->ca_cert_button));
        eap_method_emit_changed (EAP_METHOD (self));
 }
 
@@ -133,6 +134,7 @@ fill_connection (EAPMethod *method, NMConnection *connection, NMSettingSecretFla
        NMSetting8021xCKFormat format = NM_SETTING_802_1X_CK_FORMAT_UNKNOWN;
        const char *text;
        g_autofree gchar *filename = NULL;
+       g_autoptr(GFile) file = NULL;
        int peapver_active = 0;
        g_autoptr(GError) error = NULL;
        gboolean ca_cert_error = FALSE;
@@ -142,11 +144,12 @@ fill_connection (EAPMethod *method, NMConnection *connection, NMSettingSecretFla
 
        nm_setting_802_1x_add_eap_method (s_8021x, "peap");
 
-       text = gtk_entry_get_text (self->anon_identity_entry);
+       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);
 
-       filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (self->ca_cert_button));
+       file = ws_file_chooser_button_get_file (self->ca_cert_button);
+       filename = file ? g_file_get_path (file) : NULL;
        if (!nm_setting_802_1x_set_ca_cert (s_8021x, filename, NM_SETTING_802_1X_CK_SCHEME_PATH, &format, 
&error)) {
                g_warning ("Couldn't read CA certificate '%s': %s", filename, error ? error->message : 
"(unknown)");
                ca_cert_error = TRUE;
@@ -173,21 +176,21 @@ static void
 inner_auth_combo_changed_cb (EAPMethodPEAP *self)
 {
        EAPMethod *inner_method;
-       GList *children;
+       GtkWidget *child;
 
        inner_method = get_inner_method (self);
 
        /* Remove the previous method and migrate username/password across */
-       children = gtk_container_get_children (GTK_CONTAINER (self->inner_auth_box));
-       if (children != NULL) {
-               EAPMethod *old_eap = g_list_nth_data (children, 0);
+       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_container_remove (GTK_CONTAINER (self->inner_auth_box), GTK_WIDGET (old_eap));
+               gtk_box_remove (self->inner_auth_box, GTK_WIDGET (old_eap));
        }
 
-       gtk_container_add (GTK_CONTAINER (self->inner_auth_box), g_object_ref (GTK_WIDGET (inner_method)));
+       gtk_box_append (self->inner_auth_box, g_object_ref (GTK_WIDGET (inner_method)));
 
        eap_method_emit_changed (EAP_METHOD (self));
 }
@@ -323,21 +326,21 @@ eap_method_peap_new (NMConnection *connection)
 
        g_signal_connect_swapped (self->ca_cert_not_required_check, "toggled", G_CALLBACK 
(ca_cert_not_required_toggled), self);
 
-       gtk_file_chooser_set_local_only (GTK_FILE_CHOOSER (self->ca_cert_button), TRUE);
-       gtk_file_chooser_button_set_title (self->ca_cert_button,
-                                          _("Choose a Certificate Authority certificate"));
-       g_signal_connect_swapped (self->ca_cert_button, "selection-changed", G_CALLBACK (changed_cb), self);
+       g_signal_connect_swapped (self->ca_cert_button, "notify::file", G_CALLBACK (changed_cb), self);
        filter = eap_method_default_file_chooser_filter_new (FALSE);
-       gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (self->ca_cert_button), filter);
+       gtk_file_chooser_add_filter (ws_file_chooser_button_get_filechooser (self->ca_cert_button),
+                                                                filter);
        if (connection && s_8021x) {
                filename = NULL;
                if (nm_setting_802_1x_get_ca_cert_scheme (s_8021x) == NM_SETTING_802_1X_CK_SCHEME_PATH) {
                        filename = nm_setting_802_1x_get_ca_cert_path (s_8021x);
-                       if (filename)
-                               gtk_file_chooser_set_filename (GTK_FILE_CHOOSER (self->ca_cert_button), 
filename);
+                       if (filename) {
+                               g_autoptr(GFile) file = g_file_new_for_path (filename);
+                               ws_file_chooser_button_set_file (self->ca_cert_button, file);
+                       }
                }
-               gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (self->ca_cert_not_required_check),
-                                             !filename && eap_method_ca_cert_ignore_get (EAP_METHOD (self), 
connection));
+               gtk_check_button_set_active (self->ca_cert_not_required_check,
+                                            !filename && eap_method_ca_cert_ignore_get (EAP_METHOD (self), 
connection));
        }
 
        self->em_mschap_v2 = eap_method_simple_new (connection, "mschapv2", TRUE, FALSE);
@@ -389,7 +392,7 @@ eap_method_peap_new (NMConnection *connection)
        g_signal_connect_swapped (self->version_combo, "changed", G_CALLBACK (changed_cb), self);
 
        if (s_8021x && nm_setting_802_1x_get_anonymous_identity (s_8021x))
-               gtk_entry_set_text (self->anon_identity_entry, 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);
 
        return self;
diff --git a/panels/network/wireless-security/eap-method-peap.ui 
b/panels/network/wireless-security/eap-method-peap.ui
index 32766bf7a..ac04783d9 100644
--- a/panels/network/wireless-security/eap-method-peap.ui
+++ b/panels/network/wireless-security/eap-method-peap.ui
@@ -41,95 +41,82 @@
     </data>
   </object>
   <template class="EAPMethodPEAP" parent="GtkGrid">
-    <property name="can_focus">False</property>
     <property name="column_spacing">6</property>
     <property name="row_spacing">6</property>
     <child>
       <object class="GtkLabel" id="anon_identity_label">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
         <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>
-      <packing>
-        <property name="left_attach">0</property>
-        <property name="top_attach">0</property>
-      </packing>
     </child>
     <child>
       <object class="GtkEntry" id="anon_identity_entry">
-        <property name="visible">True</property>
-        <property name="can_focus">True</property>
         <property name="hexpand">True</property>
-        <property name="activates_default">True</property>
+        <layout>
+          <property name="column">1</property>
+          <property name="row">0</property>
+        </layout>
       </object>
-      <packing>
-        <property name="left_attach">1</property>
-        <property name="top_attach">0</property>
-      </packing>
     </child>
     <child>
       <object class="GtkLabel" id="ca_cert_label">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
         <property name="xalign">1</property>
         <property name="label" translatable="yes">C_A certificate</property>
         <property name="use_underline">True</property>
         <property name="mnemonic_widget">ca_cert_button</property>
+        <layout>
+          <property name="column">0</property>
+          <property name="row">1</property>
+        </layout>
       </object>
-      <packing>
-        <property name="left_attach">0</property>
-        <property name="top_attach">1</property>
-      </packing>
     </child>
     <child>
-      <object class="GtkFileChooserButton" id="ca_cert_button">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
+      <object class="WsFileChooserButton" id="ca_cert_button">
         <property name="hexpand">True</property>
+        <property name="title" translatable="yes">Choose a Certificate Authority certificate</property>
+        <layout>
+          <property name="column">1</property>
+          <property name="row">1</property>
+        </layout>
       </object>
-      <packing>
-        <property name="left_attach">1</property>
-        <property name="top_attach">1</property>
-      </packing>
     </child>
     <child>
       <object class="GtkCheckButton" id="ca_cert_not_required_check">
         <property name="label" translatable="yes">No CA certificate is _required</property>
-        <property name="visible">True</property>
-        <property name="can_focus">True</property>
         <property name="hexpand">True</property>
-        <property name="receives_default">False</property>
         <property name="use_underline">True</property>
-        <property name="draw_indicator">True</property>
+        <layout>
+          <property name="column">1</property>
+          <property name="row">2</property>
+        </layout>
       </object>
-      <packing>
-        <property name="left_attach">1</property>
-        <property name="top_attach">2</property>
-      </packing>
     </child>
     <child>
       <object class="GtkLabel" id="version_label">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
         <property name="xalign">1</property>
         <property name="label" translatable="yes">PEAP _version</property>
         <property name="use_underline">True</property>
         <property name="mnemonic_widget">version_combo</property>
+        <layout>
+          <property name="column">0</property>
+          <property name="row">3</property>
+        </layout>
       </object>
-      <packing>
-        <property name="left_attach">0</property>
-        <property name="top_attach">3</property>
-      </packing>
     </child>
     <child>
       <object class="GtkComboBox" id="version_combo">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
         <property name="hexpand">True</property>
         <property name="model">version_model</property>
+        <layout>
+          <property name="column">1</property>
+          <property name="row">3</property>
+        </layout>
         <child>
           <object class="GtkCellRendererText"/>
           <attributes>
@@ -137,31 +124,27 @@
           </attributes>
         </child>
       </object>
-      <packing>
-        <property name="left_attach">1</property>
-        <property name="top_attach">3</property>
-      </packing>
     </child>
     <child>
       <object class="GtkLabel" id="inner_auth_label">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
         <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">4</property>
+        </layout>
       </object>
-      <packing>
-        <property name="left_attach">0</property>
-        <property name="top_attach">4</property>
-      </packing>
     </child>
     <child>
       <object class="GtkComboBox" id="inner_auth_combo">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
         <property name="hexpand">True</property>
         <property name="model">inner_auth_model</property>
+        <layout>
+          <property name="column">1</property>
+          <property name="row">4</property>
+        </layout>
         <child>
           <object class="GtkCellRendererText"/>
           <attributes>
@@ -169,25 +152,16 @@
           </attributes>
         </child>
       </object>
-      <packing>
-        <property name="left_attach">1</property>
-        <property name="top_attach">4</property>
-      </packing>
     </child>
     <child>
       <object class="GtkBox" id="inner_auth_box">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
         <property name="orientation">vertical</property>
-        <child>
-          <placeholder/>
-        </child>
+        <layout>
+          <property name="column">0</property>
+          <property name="row">5</property>
+          <property name="column-span">2</property>
+        </layout>
       </object>
-      <packing>
-        <property name="left_attach">0</property>
-        <property name="top_attach">5</property>
-        <property name="width">2</property>
-      </packing>
     </child>
   </template>
 </interface>
diff --git a/panels/network/wireless-security/eap-method-simple.c 
b/panels/network/wireless-security/eap-method-simple.c
index bb405a48b..d0f0b2200 100644
--- a/panels/network/wireless-security/eap-method-simple.c
+++ b/panels/network/wireless-security/eap-method-simple.c
@@ -54,7 +54,7 @@ show_toggled_cb (EAPMethodSimple *self)
 {
        gboolean visible;
 
-       visible = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (self->show_password_check));
+       visible = gtk_check_button_get_active (GTK_CHECK_BUTTON (self->show_password_check));
        gtk_entry_set_visibility (self->password_entry, visible);
 }
 
@@ -72,7 +72,7 @@ validate (EAPMethod *method, GError **error)
        const char *text;
        gboolean ret = TRUE;
 
-       text = gtk_entry_get_text (self->username_entry);
+       text = gtk_editable_get_text (GTK_EDITABLE (self->username_entry));
        if (!text || !strlen (text)) {
                widget_set_error (GTK_WIDGET (self->username_entry));
                g_set_error_literal (error, NMA_ERROR, NMA_ERROR_GENERIC, _("missing EAP username"));
@@ -84,7 +84,7 @@ validate (EAPMethod *method, GError **error)
        if (always_ask_selected (self->password_entry))
                widget_unset_error (GTK_WIDGET (self->password_entry));
        else {
-               text = gtk_entry_get_text (self->password_entry);
+               text = gtk_editable_get_text (GTK_EDITABLE (self->password_entry));
                if (!text || !strlen (text)) {
                        widget_set_error (GTK_WIDGET (self->password_entry));
                        if (ret) {
@@ -139,7 +139,7 @@ fill_connection (EAPMethod *method, NMConnection *connection, NMSettingSecretFla
        } else
                nm_setting_802_1x_add_eap_method (s_8021x, self->name);
 
-       g_object_set (s_8021x, NM_SETTING_802_1X_IDENTITY, gtk_entry_get_text (self->username_entry), NULL);
+       g_object_set (s_8021x, NM_SETTING_802_1X_IDENTITY, gtk_editable_get_text (GTK_EDITABLE 
(self->username_entry)), NULL);
 
        /* Save the password always ask setting */
        not_saved = always_ask_selected (self->password_entry);
@@ -152,7 +152,7 @@ fill_connection (EAPMethod *method, NMConnection *connection, NMSettingSecretFla
         * user checked "Always Ask".
         */
        if (not_saved == FALSE)
-               g_object_set (s_8021x, NM_SETTING_802_1X_PASSWORD, gtk_entry_get_text (self->password_entry), 
NULL);
+               g_object_set (s_8021x, NM_SETTING_802_1X_PASSWORD, gtk_editable_get_text (GTK_EDITABLE 
(self->password_entry)), NULL);
 
        /* Update secret flags and popup when editing the connection */
        nma_utils_update_password_storage (GTK_WIDGET (self->password_entry), flags,
@@ -193,42 +193,42 @@ static const gchar *
 get_username (EAPMethod *method)
 {
        EAPMethodSimple *self = EAP_METHOD_SIMPLE (method);
-       return gtk_entry_get_text (self->username_entry);
+       return gtk_editable_get_text (GTK_EDITABLE (self->username_entry));
 }
 
 static void
 set_username (EAPMethod *method, const gchar *username)
 {
        EAPMethodSimple *self = EAP_METHOD_SIMPLE (method);
-       gtk_entry_set_text (self->username_entry, username);
+       gtk_editable_set_text (GTK_EDITABLE (self->username_entry), username);
 }
 
 static const gchar *
 get_password (EAPMethod *method)
 {
        EAPMethodSimple *self = EAP_METHOD_SIMPLE (method);
-       return gtk_entry_get_text (self->password_entry);
+       return gtk_editable_get_text (GTK_EDITABLE (self->password_entry));
 }
 
 static void
 set_password (EAPMethod *method, const gchar *password)
 {
        EAPMethodSimple *self = EAP_METHOD_SIMPLE (method);
-       gtk_entry_set_text (self->password_entry, password);
+       gtk_editable_set_text (GTK_EDITABLE (self->password_entry), password);
 }
 
 static gboolean
 get_show_password (EAPMethod *method)
 {
        EAPMethodSimple *self = EAP_METHOD_SIMPLE (method);
-       return gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (self->show_password_check));
+       return gtk_check_button_get_active (GTK_CHECK_BUTTON (self->show_password_check));
 }
 
 static void
 set_show_password (EAPMethod *method, gboolean show_password)
 {
        EAPMethodSimple *self = EAP_METHOD_SIMPLE (method);
-       gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (self->show_password_check), show_password);
+       gtk_check_button_set_active (GTK_CHECK_BUTTON (self->show_password_check), show_password);
 }
 
 static gboolean
@@ -249,7 +249,7 @@ password_storage_changed (EAPMethodSimple *self)
        if (always_ask) {
                /* we always clear this button and do not restore it
                 * (because we want to hide the password). */
-               gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (self->show_password_check), FALSE);
+               gtk_check_button_set_active (GTK_CHECK_BUTTON (self->show_password_check), FALSE);
        }
 
        gtk_widget_set_sensitive (GTK_WIDGET (self->show_password_check), !always_ask);
diff --git a/panels/network/wireless-security/eap-method-simple.ui 
b/panels/network/wireless-security/eap-method-simple.ui
index 59691ba7b..e5c37c96b 100644
--- a/panels/network/wireless-security/eap-method-simple.ui
+++ b/panels/network/wireless-security/eap-method-simple.ui
@@ -2,95 +2,67 @@
 <interface>
   <requires lib="gtk+" version="3.4"/>
   <template class="EAPMethodSimple" parent="GtkGrid">
-    <property name="can_focus">False</property>
     <property name="valign">start</property>
     <property name="column_spacing">6</property>
     <property name="row_spacing">6</property>
-    <child>
-      <placeholder/>
-    </child>
     <child>
       <object class="GtkLabel" id="username_label">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
         <property name="xalign">1</property>
         <property name="label" translatable="yes">_Username</property>
         <property name="use_underline">True</property>
         <property name="mnemonic_widget">username_entry</property>
+        <layout>
+          <property name="column">0</property>
+          <property name="row">0</property>
+        </layout>
       </object>
-      <packing>
-        <property name="left_attach">0</property>
-        <property name="top_attach">0</property>
-      </packing>
     </child>
     <child>
       <object class="GtkLabel" id="password_label">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
         <property name="xalign">1</property>
         <property name="label" translatable="yes">_Password</property>
         <property name="use_underline">True</property>
         <property name="mnemonic_widget">password_entry</property>
+        <layout>
+          <property name="column">0</property>
+          <property name="row">1</property>
+        </layout>
       </object>
-      <packing>
-        <property name="left_attach">0</property>
-        <property name="top_attach">1</property>
-      </packing>
     </child>
     <child>
       <object class="GtkEntry" id="password_entry">
-        <property name="visible">True</property>
-        <property name="can_focus">True</property>
         <property name="hexpand">True</property>
         <property name="visibility">False</property>
-        <property name="activates_default">True</property>
+        <layout>
+          <property name="column">1</property>
+          <property name="row">1</property>
+        </layout>
       </object>
-      <packing>
-        <property name="left_attach">1</property>
-        <property name="top_attach">1</property>
-      </packing>
     </child>
     <child>
       <object class="GtkEntry" id="username_entry">
-        <property name="visible">True</property>
-        <property name="can_focus">True</property>
         <property name="hexpand">True</property>
-        <property name="activates_default">True</property>
+        <layout>
+          <property name="column">1</property>
+          <property name="row">0</property>
+        </layout>
       </object>
-      <packing>
-        <property name="left_attach">1</property>
-        <property name="top_attach">0</property>
-      </packing>
     </child>
     <child>
       <object class="GtkBox">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
         <property name="hexpand">True</property>
         <property name="orientation">vertical</property>
+        <layout>
+          <property name="column">1</property>
+          <property name="row">2</property>
+        </layout>
         <child>
           <object class="GtkCheckButton" id="show_password_check">
             <property name="label" translatable="yes">Sho_w password</property>
-            <property name="visible">True</property>
-            <property name="can_focus">True</property>
-            <property name="receives_default">False</property>
             <property name="use_underline">True</property>
-            <property name="draw_indicator">True</property>
           </object>
-          <packing>
-            <property name="expand">True</property>
-            <property name="fill">True</property>
-            <property name="position">0</property>
-          </packing>
-        </child>
-        <child>
-          <placeholder/>
         </child>
       </object>
-      <packing>
-        <property name="left_attach">1</property>
-        <property name="top_attach">2</property>
-      </packing>
     </child>
   </template>
 </interface>
diff --git a/panels/network/wireless-security/eap-method-tls.c 
b/panels/network/wireless-security/eap-method-tls.c
index fb039d740..3bf79adb8 100644
--- a/panels/network/wireless-security/eap-method-tls.c
+++ b/panels/network/wireless-security/eap-method-tls.c
@@ -27,21 +27,22 @@
 #include "helpers.h"
 #include "nma-ui-utils.h"
 #include "ui-helpers.h"
+#include "ws-file-chooser-button.h"
 
 struct _EAPMethodTLS {
        GtkGrid parent;
 
-       GtkFileChooserButton *ca_cert_button;
+       WsFileChooserButton  *ca_cert_button;
        GtkLabel             *ca_cert_label;
        GtkCheckButton       *ca_cert_not_required_check;
        GtkEntry             *identity_entry;
        GtkLabel             *identity_label;
-       GtkFileChooserButton *private_key_button;
+       WsFileChooserButton  *private_key_button;
        GtkLabel             *private_key_label;
        GtkEntry             *private_key_password_entry;
        GtkLabel             *private_key_password_label;
        GtkCheckButton       *show_password_check;
-       GtkFileChooserButton *user_cert_button;
+       WsFileChooserButton  *user_cert_button;
        GtkLabel             *user_cert_label;
 
        gchar *username;
@@ -70,7 +71,7 @@ show_toggled_cb (EAPMethodTLS *self)
 {
        gboolean visible;
 
-       visible = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (self->show_password_check));
+       visible = gtk_check_button_get_active (GTK_CHECK_BUTTON (self->show_password_check));
        gtk_entry_set_visibility (self->private_key_password_entry, visible);
 }
 
@@ -86,7 +87,7 @@ validate (EAPMethod *method, GError **error)
        g_autoptr(GError) user_cert_error = NULL;
        gboolean ret = TRUE;
 
-       identity = gtk_entry_get_text (self->identity_entry);
+       identity = gtk_editable_get_text (GTK_EDITABLE (self->identity_entry));
        if (!identity || !strlen (identity)) {
                widget_set_error (GTK_WIDGET (self->identity_entry));
                g_set_error_literal (error, NMA_ERROR, NMA_ERROR_GENERIC, _("missing EAP-TLS identity"));
@@ -95,18 +96,18 @@ validate (EAPMethod *method, GError **error)
                widget_unset_error (GTK_WIDGET (self->identity_entry));
        }
 
-       if (!eap_method_validate_filepicker (GTK_FILE_CHOOSER (self->ca_cert_button),
+       if (!eap_method_validate_filepicker (ws_file_chooser_button_get_filechooser (self->ca_cert_button),
                                             TYPE_CA_CERT, NULL, NULL, &ca_cert_error)) {
                widget_set_error (GTK_WIDGET (self->ca_cert_button));
                if (ret) {
                        g_set_error (error, NMA_ERROR, NMA_ERROR_GENERIC, _("invalid EAP-TLS CA certificate: 
%s"), ca_cert_error->message);
                        ret = FALSE;
                }
-       } else if (!gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (self->ca_cert_not_required_check))) {
-               g_autofree gchar *filename = NULL;
+       } else if (!gtk_check_button_get_active (GTK_CHECK_BUTTON (self->ca_cert_not_required_check))) {
+               g_autoptr(GFile) file = NULL;
 
-               filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (self->ca_cert_button));
-               if (filename == NULL) {
+               file = ws_file_chooser_button_get_file (self->ca_cert_button);
+               if (file == NULL) {
                        widget_set_error (GTK_WIDGET (self->ca_cert_button));
                        if (ret) {
                                g_set_error_literal (error, NMA_ERROR, NMA_ERROR_GENERIC, _("invalid EAP-TLS 
CA certificate: no certificate specified"));
@@ -115,12 +116,12 @@ validate (EAPMethod *method, GError **error)
                }
        }
 
-       password = gtk_entry_get_text (self->private_key_password_entry);
+       password = gtk_editable_get_text (GTK_EDITABLE (self->private_key_password_entry));
        secret_flags = nma_utils_menu_to_secret_flags (GTK_WIDGET (self->private_key_password_entry));
        if (secret_flags & NM_SETTING_SECRET_FLAG_NOT_SAVED)
                password = NULL;
 
-       if (!eap_method_validate_filepicker (GTK_FILE_CHOOSER (self->private_key_button),
+       if (!eap_method_validate_filepicker (ws_file_chooser_button_get_filechooser 
(self->private_key_button),
                                             TYPE_PRIVATE_KEY,
                                             password,
                                             &format,
@@ -133,7 +134,7 @@ validate (EAPMethod *method, GError **error)
        }
 
        if (format != NM_SETTING_802_1X_CK_FORMAT_PKCS12) {
-               if (!eap_method_validate_filepicker (GTK_FILE_CHOOSER (self->user_cert_button),
+               if (!eap_method_validate_filepicker (ws_file_chooser_button_get_filechooser 
(self->user_cert_button),
                                                     TYPE_CLIENT_CERT, NULL, NULL, &user_cert_error)) {
                        if (ret) {
                                g_set_error (error, NMA_ERROR, NMA_ERROR_GENERIC, _("invalid EAP-TLS 
user-certificate: %s"), user_cert_error->message);
@@ -149,8 +150,8 @@ validate (EAPMethod *method, GError **error)
 static void
 ca_cert_not_required_toggled (EAPMethodTLS *self)
 {
-       eap_method_ca_cert_not_required_toggled (GTK_TOGGLE_BUTTON (self->ca_cert_not_required_check),
-                                                GTK_FILE_CHOOSER (self->ca_cert_button));
+       eap_method_ca_cert_not_required_toggled (self->ca_cert_not_required_check,
+                                                ws_file_chooser_button_get_filechooser 
(self->ca_cert_button));
        eap_method_emit_changed (EAP_METHOD (self));
 }
 
@@ -175,7 +176,9 @@ fill_connection (EAPMethod *method, NMConnection *connection, NMSettingSecretFla
        NMSetting8021x *s_8021x;
        NMSettingSecretFlags secret_flags;
        g_autofree gchar *ca_filename = NULL;
+       g_autoptr(GFile) ca_file = NULL;
        g_autofree gchar *pk_filename = NULL;
+       g_autoptr(GFile) pk_file = NULL;
        const char *password = NULL;
        gboolean ca_cert_error = FALSE;
        g_autoptr(GError) error = NULL;
@@ -186,16 +189,17 @@ fill_connection (EAPMethod *method, NMConnection *connection, NMSettingSecretFla
 
        nm_setting_802_1x_add_eap_method (s_8021x, "tls");
 
-       g_object_set (s_8021x, NM_SETTING_802_1X_IDENTITY, gtk_entry_get_text (self->identity_entry), NULL);
+       g_object_set (s_8021x, NM_SETTING_802_1X_IDENTITY, gtk_editable_get_text (GTK_EDITABLE 
(self->identity_entry)), NULL);
 
        /* TLS private key */
-       password = gtk_entry_get_text (self->private_key_password_entry);
+       password = gtk_editable_get_text (GTK_EDITABLE (self->private_key_password_entry));
        secret_flags = nma_utils_menu_to_secret_flags (GTK_WIDGET (self->private_key_password_entry));
        if (secret_flags & NM_SETTING_SECRET_FLAG_NOT_SAVED)
                password = NULL;
 
-       pk_filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (self->private_key_button));
-       g_assert (pk_filename);
+       pk_file = ws_file_chooser_button_get_file (self->private_key_button);
+       g_assert (pk_file);
+       pk_filename = g_file_get_path (pk_file);
 
        if (!nm_setting_802_1x_set_private_key (s_8021x, pk_filename, password, 
NM_SETTING_802_1X_CK_SCHEME_PATH, &format, &error))
                g_warning ("Couldn't read private key '%s': %s", pk_filename, error ? error->message : 
"(unknown)");
@@ -211,13 +215,15 @@ fill_connection (EAPMethod *method, NMConnection *connection, NMSettingSecretFla
        /* TLS client certificate */
        if (format != NM_SETTING_802_1X_CK_FORMAT_PKCS12) {
                g_autofree gchar *cc_filename = NULL;
+               g_autoptr(GFile) cc_file = NULL;
                g_autoptr(GError) error = NULL;
 
                /* If the key is pkcs#12 nm_setting_802_1x_set_private_key() already
                 * set the client certificate for us.
                 */
-               cc_filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (self->user_cert_button));
-               g_assert (cc_filename);
+               cc_file = ws_file_chooser_button_get_file (self->private_key_button);
+               g_assert (cc_file);
+               cc_filename = g_file_get_path (cc_file);
 
                format = NM_SETTING_802_1X_CK_FORMAT_UNKNOWN;
                if (!nm_setting_802_1x_set_client_cert (s_8021x, cc_filename, 
NM_SETTING_802_1X_CK_SCHEME_PATH, &format, &error))
@@ -225,7 +231,8 @@ fill_connection (EAPMethod *method, NMConnection *connection, NMSettingSecretFla
        }
 
        /* TLS CA certificate */
-       ca_filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (self->ca_cert_button));
+       ca_file = ws_file_chooser_button_get_file (self->private_key_button);
+       ca_filename = ca_file ? g_file_get_path (ca_file) : NULL;
 
        format = NM_SETTING_802_1X_CK_FORMAT_UNKNOWN;
        if (!nm_setting_802_1x_set_ca_cert (s_8021x, ca_filename, NM_SETTING_802_1X_CK_SCHEME_PATH, &format, 
&error2)) {
@@ -242,14 +249,14 @@ private_key_picker_helper (EAPMethodTLS *self, const char *filename, gboolean ch
        NMSetting8021xCKFormat cert_format = NM_SETTING_802_1X_CK_FORMAT_UNKNOWN;
        const char *password;
 
-       password = gtk_entry_get_text (self->private_key_password_entry);
+       password = gtk_editable_get_text (GTK_EDITABLE (self->private_key_password_entry));
 
        setting = (NMSetting8021x *) nm_setting_802_1x_new ();
        nm_setting_802_1x_set_private_key (setting, filename, password, NM_SETTING_802_1X_CK_SCHEME_PATH, 
&cert_format, NULL);
 
        /* With PKCS#12, the client cert must be the same as the private key */
        if (cert_format == NM_SETTING_802_1X_CK_FORMAT_PKCS12) {
-               gtk_file_chooser_unselect_all (GTK_FILE_CHOOSER (self->user_cert_button));
+               ws_file_chooser_button_set_file (self->user_cert_button, NULL);
                gtk_widget_set_sensitive (GTK_WIDGET (self->user_cert_button), FALSE);
        } else if (changed)
                gtk_widget_set_sensitive (GTK_WIDGET (self->user_cert_button), TRUE);
@@ -257,12 +264,12 @@ private_key_picker_helper (EAPMethodTLS *self, const char *filename, gboolean ch
        /* Warn the user if the private key is unencrypted */
        if (!eap_method_is_encrypted_private_key (filename)) {
                GtkWidget *dialog;
-               GtkWidget *toplevel;
+               GtkNative *native;
                GtkWindow *parent_window = NULL;
 
-               toplevel = gtk_widget_get_toplevel (GTK_WIDGET (self));
-               if (gtk_widget_is_toplevel (toplevel))
-                       parent_window = GTK_WINDOW (toplevel);
+               native = gtk_widget_get_native (GTK_WIDGET (self));
+               if (GTK_IS_WINDOW (native))
+                       parent_window = GTK_WINDOW (native);
 
                dialog = gtk_message_dialog_new (parent_window,
                                                 GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
@@ -273,18 +280,19 @@ private_key_picker_helper (EAPMethodTLS *self, const char *filename, gboolean ch
                gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog),
                                                          "%s",
                                                          _("The selected private key does not appear to be 
protected by a password. This could allow your security credentials to be compromised. Please select a 
password-protected private key.\n\n(You can password-protect your private key with openssl)"));
-               gtk_dialog_run (GTK_DIALOG (dialog));
-               gtk_widget_destroy (dialog);
+               gtk_window_present (GTK_WINDOW (dialog));
        }
 }
 
 static void
-private_key_picker_file_set_cb (GtkWidget *chooser, gpointer user_data)
+private_key_picker_file_set_cb (WsFileChooserButton *chooser, gpointer user_data)
 {
        EAPMethodTLS *self = user_data;
+       g_autoptr(GFile) file = NULL;
        g_autofree gchar *filename = NULL;
 
-       filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (chooser));
+       file = ws_file_chooser_button_get_file (chooser);
+       filename = file ? g_file_get_path (file) : NULL;
        if (filename)
                private_key_picker_helper (self, filename, TRUE);
 }
@@ -309,7 +317,7 @@ changed_cb (EAPMethodTLS *self)
 
 static void
 setup_filepicker (EAPMethodTLS *self,
-                  GtkFileChooserButton *button,
+                  WsFileChooserButton *button,
                   const char *title,
                   NMSetting8021x *s_8021x,
                   SchemeFunc scheme_func,
@@ -320,14 +328,13 @@ setup_filepicker (EAPMethodTLS *self,
        GtkFileFilter *filter;
        const char *filename = NULL;
 
-       gtk_file_chooser_set_local_only (GTK_FILE_CHOOSER (button), TRUE);
-       gtk_file_chooser_button_set_title (button, title);
-
        if (s_8021x && path_func && scheme_func) {
                if (scheme_func (s_8021x) == NM_SETTING_802_1X_CK_SCHEME_PATH) {
                        filename = path_func (s_8021x);
-                       if (filename)
-                               gtk_file_chooser_set_filename (GTK_FILE_CHOOSER (button), filename);
+                       if (filename) {
+                               g_autoptr(GFile) file = g_file_new_for_path (filename);
+                               ws_file_chooser_button_set_file (button, file);
+                       }
                }
        }
 
@@ -335,17 +342,17 @@ setup_filepicker (EAPMethodTLS *self,
         * and desensitize the user cert button.
         */
        if (privkey) {
-               g_signal_connect (button, "selection-changed",
-                                 (GCallback) private_key_picker_file_set_cb,
+               g_signal_connect (button, "notify::file",
+                                 G_CALLBACK (private_key_picker_file_set_cb),
                                  self);
                if (filename)
                        private_key_picker_helper (self, filename, FALSE);
        }
 
-       g_signal_connect_swapped (button, "selection-changed", G_CALLBACK (changed_cb), self);
+       g_signal_connect_swapped (button, "notify::file", G_CALLBACK (changed_cb), self);
 
        filter = eap_method_default_file_chooser_filter_new (privkey);
-       gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (button), filter);
+       gtk_file_chooser_add_filter (ws_file_chooser_button_get_filechooser (button), filter);
 
        /* For some reason, GTK+ calls set_current_filter (..., NULL) from 
         * gtkfilechooserdefault.c::show_and_select_files_finished_loading() on our
@@ -372,8 +379,10 @@ update_secrets (EAPMethod *method, NMConnection *connection)
        s_8021x = nm_connection_get_setting_802_1x (connection);
        if (s_8021x && (nm_setting_802_1x_get_private_key_scheme (s_8021x) == 
NM_SETTING_802_1X_CK_SCHEME_PATH)) {
                filename = nm_setting_802_1x_get_private_key_path (s_8021x);
-               if (filename)
-                       gtk_file_chooser_set_filename (GTK_FILE_CHOOSER (self->private_key_button), filename);
+               if (filename) {
+                       g_autoptr(GFile) file = g_file_new_for_path (filename);
+                       ws_file_chooser_button_set_file (self->private_key_button, file);
+               }
        }
 }
 
@@ -450,6 +459,8 @@ eap_method_tls_class_init (EAPMethodTLSClass *klass)
 
        object_class->dispose = eap_method_tls_dispose;
 
+       g_type_ensure (WS_TYPE_FILE_CHOOSER_BUTTON);
+
        gtk_widget_class_set_template_from_resource (widget_class, 
"/org/gnome/ControlCenter/network/eap-method-tls.ui");
 
        gtk_widget_class_bind_template_child (widget_class, EAPMethodTLS, ca_cert_button);
@@ -499,7 +510,7 @@ eap_method_tls_new (NMConnection *connection)
 
        g_signal_connect_swapped (self->identity_entry, "changed", G_CALLBACK (changed_cb), self);
        if (s_8021x && nm_setting_802_1x_get_identity (s_8021x))
-               gtk_entry_set_text (self->identity_entry, nm_setting_802_1x_get_identity (s_8021x));
+               gtk_editable_set_text (GTK_EDITABLE (self->identity_entry), nm_setting_802_1x_get_identity 
(s_8021x));
 
        setup_filepicker (self,
                          self->user_cert_button,
@@ -523,9 +534,11 @@ eap_method_tls_new (NMConnection *connection)
                          nm_setting_802_1x_get_private_key_path,
                          TRUE, FALSE);
 
-       if (connection && eap_method_ca_cert_ignore_get (EAP_METHOD (self), connection))
-               ca_not_required = !gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (self->ca_cert_button));
-       gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (self->ca_cert_not_required_check), ca_not_required);
+       if (connection && eap_method_ca_cert_ignore_get (EAP_METHOD (self), connection)) {
+               g_autoptr(GFile) file = ws_file_chooser_button_get_file (self->ca_cert_button);
+               ca_not_required = !file;
+       }
+       gtk_check_button_set_active (self->ca_cert_not_required_check, ca_not_required);
 
        /* Fill secrets, if any */
        if (connection)
diff --git a/panels/network/wireless-security/eap-method-tls.ui 
b/panels/network/wireless-security/eap-method-tls.ui
index 61f8e5d4d..69c261013 100644
--- a/panels/network/wireless-security/eap-method-tls.ui
+++ b/panels/network/wireless-security/eap-method-tls.ui
@@ -2,170 +2,138 @@
 <interface>
   <requires lib="gtk+" version="3.4"/>
   <template class="EAPMethodTLS" parent="GtkGrid">
-    <property name="can_focus">False</property>
     <property name="valign">start</property>
     <property name="column_spacing">6</property>
     <property name="row_spacing">6</property>
-    <child>
-      <placeholder/>
-    </child>
     <child>
       <object class="GtkLabel" id="identity_label">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
         <property name="xalign">1</property>
         <property name="label" translatable="yes">I_dentity</property>
         <property name="use_underline">True</property>
         <property name="mnemonic_widget">identity_entry</property>
+        <layout>
+          <property name="column">0</property>
+          <property name="row">0</property>
+        </layout>
       </object>
-      <packing>
-        <property name="left_attach">0</property>
-        <property name="top_attach">0</property>
-      </packing>
     </child>
     <child>
       <object class="GtkEntry" id="identity_entry">
-        <property name="visible">True</property>
-        <property name="can_focus">True</property>
         <property name="hexpand">True</property>
-        <property name="activates_default">True</property>
+        <layout>
+          <property name="column">1</property>
+          <property name="row">0</property>
+        </layout>
       </object>
-      <packing>
-        <property name="left_attach">1</property>
-        <property name="top_attach">0</property>
-      </packing>
     </child>
     <child>
       <object class="GtkLabel" id="user_cert_label">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
         <property name="xalign">1</property>
         <property name="label" translatable="yes">_User certificate</property>
         <property name="use_underline">True</property>
         <property name="mnemonic_widget">user_cert_button</property>
+        <layout>
+          <property name="column">0</property>
+          <property name="row">1</property>
+        </layout>
       </object>
-      <packing>
-        <property name="left_attach">0</property>
-        <property name="top_attach">1</property>
-      </packing>
     </child>
     <child>
-      <object class="GtkFileChooserButton" id="user_cert_button">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
+      <object class="WsFileChooserButton" id="user_cert_button">
         <property name="hexpand">True</property>
+        <property name="title" translatable="yes">Choose a Certificate Authority certificate</property>
+        <layout>
+          <property name="column">1</property>
+          <property name="row">1</property>
+        </layout>
       </object>
-      <packing>
-        <property name="left_attach">1</property>
-        <property name="top_attach">1</property>
-      </packing>
     </child>
     <child>
       <object class="GtkLabel" id="ca_cert_label">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
         <property name="xalign">1</property>
         <property name="label" translatable="yes">C_A certificate</property>
         <property name="use_underline">True</property>
         <property name="mnemonic_widget">ca_cert_button</property>
+        <layout>
+          <property name="column">0</property>
+          <property name="row">2</property>
+        </layout>
       </object>
-      <packing>
-        <property name="left_attach">0</property>
-        <property name="top_attach">2</property>
-      </packing>
     </child>
     <child>
-      <object class="GtkFileChooserButton" id="ca_cert_button">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
+      <object class="WsFileChooserButton" id="ca_cert_button">
         <property name="hexpand">True</property>
+        <property name="title" translatable="yes">Choose a Certificate Authority certificate</property>
+        <layout>
+          <property name="column">1</property>
+          <property name="row">2</property>
+        </layout>
       </object>
-      <packing>
-        <property name="left_attach">1</property>
-        <property name="top_attach">2</property>
-      </packing>
     </child>
     <child>
       <object class="GtkCheckButton" id="ca_cert_not_required_check">
         <property name="label" translatable="yes">No CA certificate is _required</property>
-        <property name="visible">True</property>
-        <property name="can_focus">True</property>
         <property name="hexpand">True</property>
-        <property name="receives_default">False</property>
         <property name="use_underline">True</property>
-        <property name="draw_indicator">True</property>
+        <layout>
+          <property name="column">1</property>
+          <property name="row">3</property>
+        </layout>
       </object>
-      <packing>
-        <property name="left_attach">1</property>
-        <property name="top_attach">3</property>
-      </packing>
     </child>
     <child>
       <object class="GtkLabel" id="private_key_label">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
         <property name="xalign">1</property>
         <property name="label" translatable="yes">Private _key</property>
         <property name="use_underline">True</property>
         <property name="mnemonic_widget">private_key_button</property>
+        <layout>
+          <property name="column">0</property>
+          <property name="row">4</property>
+        </layout>
       </object>
-      <packing>
-        <property name="left_attach">0</property>
-        <property name="top_attach">4</property>
-      </packing>
     </child>
     <child>
-      <object class="GtkFileChooserButton" id="private_key_button">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
+      <object class="WsFileChooserButton" id="private_key_button">
         <property name="hexpand">True</property>
+        <layout>
+          <property name="column">1</property>
+          <property name="row">4</property>
+        </layout>
       </object>
-      <packing>
-        <property name="left_attach">1</property>
-        <property name="top_attach">4</property>
-      </packing>
     </child>
     <child>
       <object class="GtkLabel" id="private_key_password_label">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
         <property name="xalign">1</property>
         <property name="label" translatable="yes">_Private key password</property>
         <property name="use_underline">True</property>
         <property name="mnemonic_widget">private_key_password_entry</property>
+        <layout>
+          <property name="column">0</property>
+          <property name="row">5</property>
+        </layout>
       </object>
-      <packing>
-        <property name="left_attach">0</property>
-        <property name="top_attach">5</property>
-      </packing>
     </child>
     <child>
       <object class="GtkEntry" id="private_key_password_entry">
-        <property name="visible">True</property>
-        <property name="can_focus">True</property>
         <property name="hexpand">True</property>
         <property name="visibility">False</property>
-        <property name="activates_default">True</property>
+        <layout>
+          <property name="column">1</property>
+          <property name="row">5</property>
+        </layout>
       </object>
-      <packing>
-        <property name="left_attach">1</property>
-        <property name="top_attach">5</property>
-      </packing>
     </child>
     <child>
       <object class="GtkCheckButton" id="show_password_check">
         <property name="label" translatable="yes">Sho_w password</property>
-        <property name="visible">True</property>
-        <property name="can_focus">True</property>
         <property name="hexpand">True</property>
-        <property name="receives_default">False</property>
         <property name="use_underline">True</property>
-        <property name="draw_indicator">True</property>
+        <layout>
+          <property name="column">1</property>
+          <property name="row">6</property>
+        </layout>
       </object>
-      <packing>
-        <property name="left_attach">1</property>
-        <property name="top_attach">6</property>
-      </packing>
     </child>
   </template>
 </interface>
diff --git a/panels/network/wireless-security/eap-method-ttls.c 
b/panels/network/wireless-security/eap-method-ttls.c
index fc7cd603a..699566706 100644
--- a/panels/network/wireless-security/eap-method-ttls.c
+++ b/panels/network/wireless-security/eap-method-ttls.c
@@ -26,6 +26,7 @@
 #include "eap-method-simple.h"
 #include "eap-method-ttls.h"
 #include "helpers.h"
+#include "ws-file-chooser-button.h"
 
 #define I_NAME_COLUMN 0
 #define I_ID_COLUMN   1
@@ -35,7 +36,7 @@ struct _EAPMethodTTLS {
 
        GtkEntry             *anon_identity_entry;
        GtkLabel             *anon_identity_label;
-       GtkFileChooserButton *ca_cert_button;
+       WsFileChooserButton  *ca_cert_button;
        GtkLabel             *ca_cert_label;
        GtkCheckButton       *ca_cert_not_required_check;
        GtkEntry             *domain_match_entry;
@@ -93,16 +94,16 @@ validate (EAPMethod *method, GError **error)
        EAPMethodTTLS *self = EAP_METHOD_TTLS (method);
        g_autoptr(GError) local_error = NULL;
 
-       if (!eap_method_validate_filepicker (GTK_FILE_CHOOSER (self->ca_cert_button),
+       if (!eap_method_validate_filepicker (ws_file_chooser_button_get_filechooser (self->ca_cert_button),
                                             TYPE_CA_CERT, NULL, NULL, &local_error)) {
                g_set_error (error, NMA_ERROR, NMA_ERROR_GENERIC, _("invalid EAP-TTLS CA certificate: %s"), 
local_error->message);
                return FALSE;
        }
-       if (!gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (self->ca_cert_not_required_check))) {
-               g_autofree gchar *filename = NULL;
+       if (!gtk_check_button_get_active (GTK_CHECK_BUTTON (self->ca_cert_not_required_check))) {
+               g_autoptr(GFile) file = NULL;
 
-               filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (self->ca_cert_button));
-               if (filename == NULL) {
+               file = ws_file_chooser_button_get_file (self->ca_cert_button);
+               if (file == NULL) {
                        g_set_error_literal (error, NMA_ERROR, NMA_ERROR_GENERIC, _("invalid EAP-TTLS CA 
certificate: no certificate specified"));
                        return FALSE;
                }
@@ -114,8 +115,8 @@ validate (EAPMethod *method, GError **error)
 static void
 ca_cert_not_required_toggled (EAPMethodTTLS *self)
 {
-       eap_method_ca_cert_not_required_toggled (GTK_TOGGLE_BUTTON (self->ca_cert_not_required_check),
-                                                GTK_FILE_CHOOSER (self->ca_cert_button));
+       eap_method_ca_cert_not_required_toggled (self->ca_cert_not_required_check,
+                                                ws_file_chooser_button_get_filechooser 
(self->ca_cert_button));
        eap_method_emit_changed (EAP_METHOD (self));
 }
 
@@ -148,6 +149,7 @@ fill_connection (EAPMethod *method, NMConnection *connection, NMSettingSecretFla
        const char *text;
        g_autofree gchar *filename = NULL;
        g_autoptr(GError) error = NULL;
+       g_autoptr(GFile) file = NULL;
        gboolean ca_cert_error = FALSE;
 
        s_8021x = nm_connection_get_setting_802_1x (connection);
@@ -155,15 +157,16 @@ fill_connection (EAPMethod *method, NMConnection *connection, NMSettingSecretFla
 
        nm_setting_802_1x_add_eap_method (s_8021x, "ttls");
 
-       text = gtk_entry_get_text (self->anon_identity_entry);
+       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);
 
-       text = gtk_entry_get_text (self->domain_match_entry);
+       text = gtk_editable_get_text (GTK_EDITABLE (self->domain_match_entry));
        if (text && strlen (text))
                g_object_set (s_8021x, NM_SETTING_802_1X_DOMAIN_SUFFIX_MATCH, text, NULL);
 
-       filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (self->ca_cert_button));
+       file = ws_file_chooser_button_get_file (self->ca_cert_button);
+       filename = file ? g_file_get_path (file) : NULL;
        if (!nm_setting_802_1x_set_ca_cert (s_8021x, filename, NM_SETTING_802_1X_CK_SCHEME_PATH, &format, 
&error)) {
                g_warning ("Couldn't read CA certificate '%s': %s", filename, error ? error->message : 
"(unknown)");
                ca_cert_error = TRUE;
@@ -177,21 +180,21 @@ static void
 inner_auth_combo_changed_cb (EAPMethodTTLS *self)
 {
        EAPMethod *inner_method;
-       GList *children;
+       GtkWidget *child;
 
        inner_method = get_inner_method (self);
 
        /* Remove the previous method and migrate username/password across */
-       children = gtk_container_get_children (GTK_CONTAINER (self->inner_auth_box));
-       if (children != NULL) {
-               EAPMethod *old_eap = g_list_nth_data (children, 0);
+       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_container_remove (GTK_CONTAINER (self->inner_auth_box), GTK_WIDGET (old_eap));
+               gtk_box_remove (self->inner_auth_box, child);
        }
 
-       gtk_container_add (GTK_CONTAINER (self->inner_auth_box), g_object_ref (GTK_WIDGET (inner_method)));
+       gtk_box_append (self->inner_auth_box, g_object_ref (GTK_WIDGET (inner_method)));
 
        eap_method_emit_changed (EAP_METHOD (self));
 }
@@ -331,28 +334,28 @@ eap_method_ttls_new (NMConnection *connection)
 
        g_signal_connect_swapped (self->ca_cert_not_required_check, "toggled", G_CALLBACK 
(ca_cert_not_required_toggled), self);
 
-       gtk_file_chooser_set_local_only (GTK_FILE_CHOOSER (self->ca_cert_button), TRUE);
-       gtk_file_chooser_button_set_title (self->ca_cert_button,
-                                          _("Choose a Certificate Authority certificate"));
-       g_signal_connect_swapped (self->ca_cert_button, "selection-changed", G_CALLBACK (changed_cb), self);
+       g_signal_connect_swapped (self->ca_cert_button, "notify::file", G_CALLBACK (changed_cb), self);
        filter = eap_method_default_file_chooser_filter_new (FALSE);
-       gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (self->ca_cert_button), filter);
+       gtk_file_chooser_add_filter (ws_file_chooser_button_get_filechooser (self->ca_cert_button),
+                                                                filter);
        if (connection && s_8021x) {
                filename = NULL;
                if (nm_setting_802_1x_get_ca_cert_scheme (s_8021x) == NM_SETTING_802_1X_CK_SCHEME_PATH) {
                        filename = nm_setting_802_1x_get_ca_cert_path (s_8021x);
-                       if (filename)
-                               gtk_file_chooser_set_filename (GTK_FILE_CHOOSER (self->ca_cert_button), 
filename);
+                       if (filename) {
+                               g_autoptr(GFile) file = g_file_new_for_path (filename);
+                               ws_file_chooser_button_set_file (self->ca_cert_button, file);
+                       }
                }
-               gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (self->ca_cert_not_required_check),
-                                             !filename && eap_method_ca_cert_ignore_get (EAP_METHOD (self), 
connection));
+               gtk_check_button_set_active (self->ca_cert_not_required_check,
+                                            !filename && eap_method_ca_cert_ignore_get (EAP_METHOD (self), 
connection));
        }
 
        if (s_8021x && nm_setting_802_1x_get_anonymous_identity (s_8021x))
-               gtk_entry_set_text (self->anon_identity_entry, 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);
        if (s_8021x && nm_setting_802_1x_get_domain_suffix_match (s_8021x))
-               gtk_entry_set_text (self->domain_match_entry, nm_setting_802_1x_get_domain_suffix_match 
(s_8021x));
+               gtk_editable_set_text (GTK_EDITABLE (self->domain_match_entry), 
nm_setting_802_1x_get_domain_suffix_match (s_8021x));
        g_signal_connect_swapped (self->domain_match_entry, "changed", G_CALLBACK (changed_cb), self);
 
        self->em_pap = eap_method_simple_new (connection, "pap", TRUE, FALSE);
diff --git a/panels/network/wireless-security/eap-method-ttls.ui 
b/panels/network/wireless-security/eap-method-ttls.ui
index 2ba7d2011..b10dac29a 100644
--- a/panels/network/wireless-security/eap-method-ttls.ui
+++ b/panels/network/wireless-security/eap-method-ttls.ui
@@ -40,122 +40,103 @@
     </data>
   </object>
   <template class="EAPMethodTTLS" parent="GtkGrid">
-    <property name="can_focus">False</property>
     <property name="column_spacing">6</property>
     <property name="row_spacing">6</property>
     <child>
       <object class="GtkLabel" id="anon_identity_label">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
         <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>
-      <packing>
-        <property name="left_attach">0</property>
-        <property name="top_attach">0</property>
-      </packing>
     </child>
     <child>
       <object class="GtkEntry" id="anon_identity_entry">
-        <property name="visible">True</property>
-        <property name="can_focus">True</property>
         <property name="hexpand">True</property>
-        <property name="activates_default">True</property>
+        <layout>
+          <property name="column">1</property>
+          <property name="row">0</property>
+        </layout>
       </object>
-      <packing>
-        <property name="left_attach">1</property>
-        <property name="top_attach">0</property>
-      </packing>
     </child>
     <child>
       <object class="GtkLabel" id="domain_match_label">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
         <property name="label" translatable="yes">_Domain</property>
         <property name="use_underline">True</property>
         <property name="mnemonic_widget">domain_match_entry</property>
         <property name="xalign">1</property>
+        <layout>
+          <property name="column">0</property>
+          <property name="row">1</property>
+        </layout>
       </object>
-      <packing>
-        <property name="left_attach">0</property>
-        <property name="top_attach">1</property>
-      </packing>
     </child>
     <child>
       <object class="GtkEntry" id="domain_match_entry">
-        <property name="visible">True</property>
-        <property name="can_focus">True</property>
         <property name="hexpand">True</property>
-        <property name="activates_default">True</property>
+        <layout>
+          <property name="column">1</property>
+          <property name="row">1</property>
+        </layout>
       </object>
-      <packing>
-        <property name="left_attach">1</property>
-        <property name="top_attach">1</property>
-      </packing>
     </child>
     <child>
       <object class="GtkLabel" id="ca_cert_label">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
         <property name="label" translatable="yes">C_A certificate</property>
         <property name="use_underline">True</property>
         <property name="mnemonic_widget">ca_cert_button</property>
         <property name="xalign">1</property>
+        <layout>
+          <property name="column">0</property>
+          <property name="row">2</property>
+        </layout>
       </object>
-      <packing>
-        <property name="left_attach">0</property>
-        <property name="top_attach">2</property>
-      </packing>
     </child>
     <child>
-      <object class="GtkFileChooserButton" id="ca_cert_button">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
+      <object class="WsFileChooserButton" id="ca_cert_button">
         <property name="hexpand">True</property>
+        <layout>
+          <property name="column">1</property>
+          <property name="row">2</property>
+        </layout>
       </object>
-      <packing>
-        <property name="left_attach">1</property>
-        <property name="top_attach">2</property>
-      </packing>
     </child>
     <child>
       <object class="GtkCheckButton" id="ca_cert_not_required_check">
         <property name="label" translatable="yes">No CA certificate is _required</property>
-        <property name="visible">True</property>
-        <property name="can_focus">True</property>
-        <property name="receives_default">False</property>
         <property name="halign">start</property>
         <property name="hexpand">True</property>
         <property name="use_underline">True</property>
-        <property name="draw_indicator">True</property>
+        <layout>
+          <property name="column">1</property>
+          <property name="row">3</property>
+        </layout>
       </object>
-      <packing>
-        <property name="left_attach">1</property>
-        <property name="top_attach">3</property>
-      </packing>
     </child>
     <child>
       <object class="GtkLabel" id="inner_auth_label">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
         <property name="label" translatable="yes">_Inner authentication</property>
         <property name="use_underline">True</property>
         <property name="mnemonic_widget">inner_auth_combo</property>
         <property name="xalign">1</property>
+        <layout>
+          <property name="column">0</property>
+          <property name="row">4</property>
+         </layout>
       </object>
-      <packing>
-        <property name="left_attach">0</property>
-        <property name="top_attach">4</property>
-       </packing>
      </child>
     <child>
       <object class="GtkComboBox" id="inner_auth_combo">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
         <property name="hexpand">True</property>
         <property name="model">inner_auth_model</property>
+        <layout>
+          <property name="column">1</property>
+          <property name="row">4</property>
+        </layout>
         <child>
           <object class="GtkCellRendererText"/>
           <attributes>
@@ -163,26 +144,17 @@
           </attributes>
         </child>
       </object>
-      <packing>
-        <property name="left_attach">1</property>
-        <property name="top_attach">4</property>
-      </packing>
     </child>
     <child>
       <object class="GtkBox" id="inner_auth_box">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
         <property name="orientation">vertical</property>
         <property name="spacing">6</property>
-        <child>
-          <placeholder/>
-        </child>
+        <layout>
+          <property name="column">0</property>
+          <property name="row">5</property>
+          <property name="column-span">2</property>
+        </layout>
       </object>
-      <packing>
-        <property name="left_attach">0</property>
-        <property name="top_attach">5</property>
-        <property name="width">2</property>
-      </packing>
     </child>
   </template>
 </interface>
diff --git a/panels/network/wireless-security/eap-method.c b/panels/network/wireless-security/eap-method.c
index fdda35b56..26135b683 100644
--- a/panels/network/wireless-security/eap-method.c
+++ b/panels/network/wireless-security/eap-method.c
@@ -181,6 +181,7 @@ eap_method_validate_filepicker (GtkFileChooser *chooser,
 {
        g_autofree gchar *filename = NULL;
        g_autoptr(NMSetting8021x) setting = NULL;
+       g_autoptr(GFile) file = NULL;
        gboolean success = TRUE;
 
        if (item_type == TYPE_PRIVATE_KEY) {
@@ -188,8 +189,8 @@ eap_method_validate_filepicker (GtkFileChooser *chooser,
                        success = FALSE;
        }
 
-       filename = gtk_file_chooser_get_filename (chooser);
-       if (!filename) {
+       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"));
@@ -197,6 +198,7 @@ eap_method_validate_filepicker (GtkFileChooser *chooser,
                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;
@@ -358,34 +360,24 @@ out:
 }
 #endif
 
-static gboolean
-default_filter_privkey (const GtkFileFilterInfo *filter_info, gpointer user_data)
-{
-       const char *extensions[] = { ".der", ".pem", ".p12", ".key", NULL };
-
-       if (!filter_info->filename)
-               return FALSE;
-
-       if (!file_has_extension (filter_info->filename, extensions))
-               return FALSE;
-
-       return TRUE;
-}
+static const char *privkey_extensions[] = {
+       ".der", ".pem", ".p12", ".key", NULL
+};
+static const char *cert_extensions[] = {
+       ".der", ".pem", ".crt", ".cer", NULL
+};
 
-static gboolean
-default_filter_cert (const GtkFileFilterInfo *filter_info, gpointer user_data)
+static void
+add_file_extensions_to_filter (GtkFileFilter  *filter,
+                               const char    **extensions)
 {
-       const char *extensions[] = { ".der", ".pem", ".crt", ".cer", NULL };
+       int i;
 
-       if (!filter_info->filename)
-               return FALSE;
-
-       if (!file_has_extension (filter_info->filename, extensions))
-               return FALSE;
-
-       return TRUE;
+       for (i = 0; extensions[i] != NULL; i++)
+               gtk_file_filter_add_suffix (filter, extensions[i]);
 }
 
+
 GtkFileFilter *
 eap_method_default_file_chooser_filter_new (gboolean privkey)
 {
@@ -393,10 +385,10 @@ eap_method_default_file_chooser_filter_new (gboolean privkey)
 
        filter = gtk_file_filter_new ();
        if (privkey) {
-               gtk_file_filter_add_custom (filter, GTK_FILE_FILTER_FILENAME, default_filter_privkey, NULL, 
NULL);
+               add_file_extensions_to_filter (filter, privkey_extensions);
                gtk_file_filter_set_name (filter, _("DER, PEM, or PKCS#12 private keys (*.der, *.pem, *.p12, 
*.key)"));
        } else {
-               gtk_file_filter_add_custom (filter, GTK_FILE_FILTER_FILENAME, default_filter_cert, NULL, 
NULL);
+               add_file_extensions_to_filter (filter, cert_extensions);
                gtk_file_filter_set_name (filter, _("DER or PEM certificates (*.der, *.pem, *.crt, *.cer)"));
        }
        return filter;
@@ -405,10 +397,9 @@ eap_method_default_file_chooser_filter_new (gboolean privkey)
 gboolean
 eap_method_is_encrypted_private_key (const char *path)
 {
-       GtkFileFilterInfo info = { .filename = path };
        gboolean is_encrypted;
 
-       if (!default_filter_privkey (&info, NULL))
+       if (!file_has_extension (path, privkey_extensions))
                return FALSE;
 
 #if LIBNM_BUILD
@@ -425,31 +416,29 @@ eap_method_is_encrypted_private_key (const char *path)
 }
 
 void
-eap_method_ca_cert_not_required_toggled (GtkToggleButton *id_ca_cert_not_required_checkbutton, 
GtkFileChooser *id_ca_cert_chooser)
+eap_method_ca_cert_not_required_toggled (GtkCheckButton *id_ca_cert_not_required_checkbutton, GtkFileChooser 
*id_ca_cert_chooser)
 {
-       g_autofree gchar *filename = NULL;
-       g_autofree gchar *filename_old = NULL;
+       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_toggle_button_get_active (id_ca_cert_not_required_checkbutton);
+       is_not_required = gtk_check_button_get_active (id_ca_cert_not_required_checkbutton);
 
-       filename = gtk_file_chooser_get_filename (id_ca_cert_chooser);
-       filename_old = g_object_steal_data (G_OBJECT (id_ca_cert_chooser), "filename-old");
+       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_free (filename_old);
-               filename_old = g_steal_pointer (&filename);
+               g_clear_object (&file_old);
+               file_old = g_steal_pointer (&file);
        } else {
-               g_free (filename);
-               filename = g_steal_pointer (&filename_old);
+               g_clear_object (&file);
+               file = g_steal_pointer (&file_old);
        }
        gtk_widget_set_sensitive (GTK_WIDGET (id_ca_cert_chooser), !is_not_required);
-       if (filename)
-               gtk_file_chooser_set_filename (id_ca_cert_chooser, filename);
-       else
-               gtk_file_chooser_unselect_all (id_ca_cert_chooser);
-       g_object_set_data_full (G_OBJECT (id_ca_cert_chooser), "filename-old", g_steal_pointer 
(&filename_old), g_free);
+       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 */
diff --git a/panels/network/wireless-security/eap-method.h b/panels/network/wireless-security/eap-method.h
index 34b4144ac..d5a890829 100644
--- a/panels/network/wireless-security/eap-method.h
+++ b/panels/network/wireless-security/eap-method.h
@@ -93,7 +93,7 @@ gboolean eap_method_validate_filepicker (GtkFileChooser *chooser,
                                          NMSetting8021xCKFormat *out_format,
                                          GError **error);
 
-void eap_method_ca_cert_not_required_toggled (GtkToggleButton *id_ca_cert_is_not_required_checkbox,
+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,
diff --git a/panels/network/wireless-security/helpers.c b/panels/network/wireless-security/helpers.c
index ea08093de..fc8446b43 100644
--- a/panels/network/wireless-security/helpers.c
+++ b/panels/network/wireless-security/helpers.c
@@ -39,7 +39,7 @@ helper_fill_secret_entry (NMConnection *connection,
        if (setting) {
                tmp = (*func) (setting);
                if (tmp) {
-                       gtk_entry_set_text (entry, tmp);
+                       gtk_editable_set_text (GTK_EDITABLE (entry), tmp);
                }
        }
 }
diff --git a/panels/network/wireless-security/meson.build b/panels/network/wireless-security/meson.build
index f30f4eb5d..7f43efc70 100644
--- a/panels/network/wireless-security/meson.build
+++ b/panels/network/wireless-security/meson.build
@@ -14,6 +14,7 @@ nm_applet_headers = [
   'wireless-security.h',
   'ws-leap.h',
   'ws-dynamic-wep.h',
+  'ws-file-chooser-button.h',
   'ws-sae.h',
   'ws-wep-key.h',
   'ws-wpa-eap.h',
@@ -32,6 +33,7 @@ nm_applet_sources = [
   'wireless-security.c',
   'ws-leap.c',
   'ws-dynamic-wep.c',
+  'ws-file-chooser-button.c',
   'ws-sae.c',
   'ws-wep-key.c',
   'ws-wpa-eap.c',
diff --git a/panels/network/wireless-security/ws-dynamic-wep.c 
b/panels/network/wireless-security/ws-dynamic-wep.c
index 91207ef46..001c561f7 100644
--- a/panels/network/wireless-security/ws-dynamic-wep.c
+++ b/panels/network/wireless-security/ws-dynamic-wep.c
@@ -145,22 +145,22 @@ static void
 auth_combo_changed_cb (WirelessSecurityDynamicWEP *self)
 {
        EAPMethod *eap;
-       GList *children;
        GtkWidget *eap_default_field;
+       GtkWidget *child;
 
        eap = get_eap (self);
 
        /* Remove the previous method and migrate username/password across */
-       children = gtk_container_get_children (GTK_CONTAINER (self->method_box));
-       if (children != NULL) {
-               EAPMethod *old_eap = g_list_nth_data (children, 0);
+       child = gtk_widget_get_first_child (GTK_WIDGET (self->method_box));
+       if (child != NULL) {
+               EAPMethod *old_eap = EAP_METHOD (child);
                eap_method_set_username (eap, eap_method_get_username (old_eap));
                eap_method_set_password (eap, eap_method_get_password (old_eap));
                eap_method_set_show_password (eap, eap_method_get_show_password (old_eap));
-               gtk_container_remove (GTK_CONTAINER (self->method_box), GTK_WIDGET (old_eap));
+               gtk_box_remove (self->method_box, child);
        }
 
-       gtk_container_add (GTK_CONTAINER (self->method_box), g_object_ref (GTK_WIDGET (eap)));
+       gtk_box_append (self->method_box, g_object_ref (GTK_WIDGET (eap)));
        eap_default_field = eap_method_get_default_field (eap);
        if (eap_default_field)
                gtk_widget_grab_focus (eap_default_field);
diff --git a/panels/network/wireless-security/ws-dynamic-wep.ui 
b/panels/network/wireless-security/ws-dynamic-wep.ui
index a7fadffcb..85d638969 100644
--- a/panels/network/wireless-security/ws-dynamic-wep.ui
+++ b/panels/network/wireless-security/ws-dynamic-wep.ui
@@ -44,30 +44,28 @@
     </data>
   </object>
   <template class="WirelessSecurityDynamicWEP" parent="GtkGrid">
-    <property name="visible">True</property>
-    <property name="can_focus">False</property>
     <property name="column_spacing">6</property>
     <property name="row_spacing">6</property>
     <child>
       <object class="GtkLabel" id="auth_label">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
         <property name="xalign">1</property>
         <property name="label" translatable="yes">Au_thentication</property>
         <property name="use_underline">True</property>
         <property name="mnemonic_widget">auth_combo</property>
+        <layout>
+          <property name="column">0</property>
+          <property name="row">0</property>
+        </layout>
       </object>
-      <packing>
-        <property name="left_attach">0</property>
-        <property name="top_attach">0</property>
-      </packing>
     </child>
     <child>
       <object class="GtkComboBox" id="auth_combo">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
         <property name="hexpand">True</property>
         <property name="model">auth_model</property>
+        <layout>
+          <property name="column">1</property>
+          <property name="row">0</property>
+        </layout>
         <child>
           <object class="GtkCellRendererText"/>
           <attributes>
@@ -75,26 +73,17 @@
           </attributes>
         </child>
       </object>
-      <packing>
-        <property name="left_attach">1</property>
-        <property name="top_attach">0</property>
-      </packing>
     </child>
     <child>
       <object class="GtkBox" id="method_box">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
         <property name="spacing">6</property>
         <property name="orientation">vertical</property>
-        <child>
-          <placeholder/>
-        </child>
+        <layout>
+          <property name="column">0</property>
+          <property name="column-span">2</property>
+          <property name="row">1</property>
+        </layout>
       </object>
-      <packing>
-        <property name="left_attach">0</property>
-        <property name="width">2</property>
-        <property name="top_attach">1</property>
-      </packing>
     </child>
   </template>
 </interface>
diff --git a/panels/network/wireless-security/ws-file-chooser-button.c 
b/panels/network/wireless-security/ws-file-chooser-button.c
new file mode 100644
index 000000000..998df4252
--- /dev/null
+++ b/panels/network/wireless-security/ws-file-chooser-button.c
@@ -0,0 +1,268 @@
+/* cc-file-chooser-button.c
+ *
+ * Copyright 2021 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 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/>.
+ *
+ * SPDX-License-Identifier: GPL-3.0-or-later
+ */
+
+#include "ws-file-chooser-button.h"
+
+#include <glib/gi18n.h>
+
+struct _WsFileChooserButton
+{
+  GtkButton parent_instance;
+
+  GtkFileChooser *filechooser;
+  GFile *file;
+  char *title;
+};
+
+G_DEFINE_FINAL_TYPE (WsFileChooserButton, ws_file_chooser_button, GTK_TYPE_BUTTON)
+
+enum
+{
+  PROP_0,
+  PROP_FILE,
+  PROP_TITLE,
+  N_PROPS
+};
+
+static GParamSpec *properties [N_PROPS] = { NULL, };
+
+static const char *
+get_title (WsFileChooserButton *self)
+{
+  return self->title ? self->title : _("Select a file");
+}
+
+static void
+update_label (WsFileChooserButton *self)
+{
+  g_autofree gchar *label = NULL;
+
+  if (self->file)
+    label = g_file_get_basename (self->file);
+  else
+    label = g_strdup (get_title (self));
+
+  gtk_button_set_label (GTK_BUTTON (self), label);
+}
+
+static void
+on_filechooser_dialog_response_cb (GtkFileChooser      *filechooser,
+                                   gint                 response,
+                                   WsFileChooserButton *self)
+{
+  if (response == GTK_RESPONSE_ACCEPT)
+    {
+      g_autoptr(GFile) file = NULL;
+
+      file = gtk_file_chooser_get_file (filechooser);
+      ws_file_chooser_button_set_file (self, file);
+    }
+
+  gtk_widget_hide (GTK_WIDGET (filechooser));
+}
+static void
+ensure_filechooser (WsFileChooserButton *self)
+{
+  GtkNative *native;
+  GtkWidget *dialog;
+
+  if (self->filechooser)
+    return;
+
+  native = gtk_widget_get_native (GTK_WIDGET (self));
+
+  dialog = gtk_file_chooser_dialog_new (get_title (self),
+                                        GTK_WINDOW (native),
+                                        GTK_FILE_CHOOSER_ACTION_OPEN,
+                                        _("Cancel"),
+                                        GTK_RESPONSE_CANCEL,
+                                        _("Open"),
+                                        GTK_RESPONSE_ACCEPT,
+                                        NULL);
+  gtk_window_set_destroy_with_parent (GTK_WINDOW (dialog), TRUE);
+  gtk_window_set_hide_on_close (GTK_WINDOW (dialog), TRUE);
+  gtk_window_set_modal (GTK_WINDOW (dialog), TRUE);
+
+  if (self->file)
+    gtk_file_chooser_set_file (GTK_FILE_CHOOSER (dialog), self->file, NULL);
+
+  g_signal_connect (dialog, "response", G_CALLBACK (on_filechooser_dialog_response_cb), self);
+
+  self->filechooser = GTK_FILE_CHOOSER (dialog);
+}
+
+
+static void
+ws_file_chooser_button_clicked (GtkButton *button)
+{
+  WsFileChooserButton *self = WS_FILE_CHOOSER_BUTTON (button);
+  GtkNative *native = gtk_widget_get_native (GTK_WIDGET (self));
+
+  ensure_filechooser (self);
+
+  gtk_window_set_transient_for (GTK_WINDOW (self->filechooser), GTK_WINDOW (native));
+  gtk_window_present (GTK_WINDOW (self->filechooser));
+}
+
+static void
+ws_file_chooser_button_finalize (GObject *object)
+{
+  WsFileChooserButton *self = (WsFileChooserButton *)object;
+
+  g_clear_pointer (&self->title, g_free);
+  g_clear_object (&self->file);
+
+  G_OBJECT_CLASS (ws_file_chooser_button_parent_class)->finalize (object);
+}
+
+static void
+ws_file_chooser_button_get_property (GObject    *object,
+                                     guint       prop_id,
+                                     GValue     *value,
+                                     GParamSpec *pspec)
+{
+  WsFileChooserButton *self = WS_FILE_CHOOSER_BUTTON (object);
+
+  switch (prop_id)
+    {
+    case PROP_FILE:
+      g_value_set_object (value, self->file);
+      break;
+
+    case PROP_TITLE:
+      g_value_set_string (value, self->title);
+      break;
+
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+    }
+}
+
+static void
+ws_file_chooser_button_set_property (GObject      *object,
+                                     guint         prop_id,
+                                     const GValue *value,
+                                     GParamSpec   *pspec)
+{
+  WsFileChooserButton *self = WS_FILE_CHOOSER_BUTTON (object);
+
+  switch (prop_id)
+    {
+    case PROP_FILE:
+      ws_file_chooser_button_set_file (self, g_value_get_object (value));
+      break;
+
+    case PROP_TITLE:
+      ws_file_chooser_button_set_title (self, g_value_get_string (value));
+      break;
+
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+    }
+}
+
+static void
+ws_file_chooser_button_class_init (WsFileChooserButtonClass *klass)
+{
+  GObjectClass *object_class = G_OBJECT_CLASS (klass);
+  GtkButtonClass *button_class = GTK_BUTTON_CLASS (klass);
+
+  button_class->clicked = ws_file_chooser_button_clicked;
+
+  object_class->finalize = ws_file_chooser_button_finalize;
+  object_class->get_property = ws_file_chooser_button_get_property;
+  object_class->set_property = ws_file_chooser_button_set_property;
+
+  properties[PROP_FILE] = g_param_spec_object ("file", "", "",
+                                               G_TYPE_FILE,
+                                               G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | 
G_PARAM_STATIC_STRINGS);
+  properties[PROP_TITLE] = g_param_spec_string ("title", "", "", NULL,
+                                                G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | 
G_PARAM_STATIC_STRINGS);
+  g_object_class_install_properties (object_class, N_PROPS, properties);
+}
+
+static void
+ws_file_chooser_button_init (WsFileChooserButton *self)
+{
+  update_label (self);
+}
+
+GtkWidget *
+ws_file_chooser_button_new (void)
+{
+  return g_object_new (WS_TYPE_FILE_CHOOSER_BUTTON, NULL);
+}
+
+void
+ws_file_chooser_button_set_file (WsFileChooserButton *self,
+                                 GFile               *file)
+{
+  g_return_if_fail (WS_IS_FILE_CHOOSER_BUTTON (self));
+
+  if (g_set_object (&self->file, file))
+    {
+      gtk_file_chooser_set_file (self->filechooser, file, NULL);
+      update_label (self);
+
+      g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_FILE]);
+    }
+}
+
+GFile *
+ws_file_chooser_button_get_file (WsFileChooserButton *self)
+{
+  g_return_val_if_fail (WS_IS_FILE_CHOOSER_BUTTON (self), NULL);
+
+  return self->file ? g_object_ref (self->file) : NULL;
+}
+
+void
+ws_file_chooser_button_set_title (WsFileChooserButton *self,
+                                  const char          *title)
+{
+  g_autofree char *old_title = NULL;
+
+  g_return_if_fail (WS_IS_FILE_CHOOSER_BUTTON (self));
+
+  old_title = g_steal_pointer (&self->title);
+  self->title = g_strdup (title);
+
+  update_label (self);
+
+  g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_TITLE]);
+}
+
+const char *
+ws_file_chooser_button_get_title (WsFileChooserButton *self)
+{
+  g_return_val_if_fail (WS_IS_FILE_CHOOSER_BUTTON (self), NULL);
+
+  return self->title;
+}
+
+GtkFileChooser *
+ws_file_chooser_button_get_filechooser (WsFileChooserButton *self)
+{
+  g_return_val_if_fail (WS_IS_FILE_CHOOSER_BUTTON (self), NULL);
+
+  ensure_filechooser (self);
+
+  return self->filechooser;
+}
diff --git a/panels/network/wireless-security/ws-file-chooser-button.h 
b/panels/network/wireless-security/ws-file-chooser-button.h
new file mode 100644
index 000000000..db020203c
--- /dev/null
+++ b/panels/network/wireless-security/ws-file-chooser-button.h
@@ -0,0 +1,44 @@
+/* ws-file-chooser-button.h
+ *
+ * Copyright 2021 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 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/>.
+ *
+ * SPDX-License-Identifier: GPL-3.0-or-later
+ */
+
+#pragma once
+
+#include <gtk/gtk.h>
+
+G_BEGIN_DECLS
+
+#define WS_TYPE_FILE_CHOOSER_BUTTON (ws_file_chooser_button_get_type())
+G_DECLARE_FINAL_TYPE (WsFileChooserButton, ws_file_chooser_button, WS, FILE_CHOOSER_BUTTON, GtkButton)
+
+GtkWidget      *ws_file_chooser_button_new             (void);
+
+void            ws_file_chooser_button_set_file        (WsFileChooserButton *self,
+                                                        GFile               *file);
+
+GFile          *ws_file_chooser_button_get_file        (WsFileChooserButton *self);
+
+void            ws_file_chooser_button_set_title       (WsFileChooserButton *self,
+                                                        const char          *title);
+
+const char     *ws_file_chooser_button_get_title       (WsFileChooserButton *self);
+
+GtkFileChooser *ws_file_chooser_button_get_filechooser (WsFileChooserButton *self);
+
+G_END_DECLS
diff --git a/panels/network/wireless-security/ws-leap.c b/panels/network/wireless-security/ws-leap.c
index 464f92831..4fcfb5f81 100644
--- a/panels/network/wireless-security/ws-leap.c
+++ b/panels/network/wireless-security/ws-leap.c
@@ -48,7 +48,7 @@ show_toggled_cb (WirelessSecurityLEAP *self)
 {
        gboolean visible;
 
-       visible = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (self->show_password_check));
+       visible = gtk_check_button_get_active (GTK_CHECK_BUTTON (self->show_password_check));
        gtk_entry_set_visibility (self->password_entry, visible);
 }
 
@@ -60,7 +60,7 @@ validate (WirelessSecurity *security, GError **error)
        const char *text;
        gboolean ret = TRUE;
 
-       text = gtk_entry_get_text (self->username_entry);
+       text = gtk_editable_get_text (GTK_EDITABLE (self->username_entry));
        if (!text || !strlen (text)) {
                widget_set_error (GTK_WIDGET (self->username_entry));
                g_set_error_literal (error, NMA_ERROR, NMA_ERROR_GENERIC, _("missing leap-username"));
@@ -74,7 +74,7 @@ validate (WirelessSecurity *security, GError **error)
                return TRUE;
        }
 
-       text = gtk_entry_get_text (self->password_entry);
+       text = gtk_editable_get_text (GTK_EDITABLE (self->password_entry));
        if (!text || !strlen (text)) {
                widget_set_error (GTK_WIDGET (self->password_entry));
                if (ret) {
@@ -107,8 +107,8 @@ fill_connection (WirelessSecurity *security, NMConnection *connection)
        s_wireless_sec = (NMSettingWirelessSecurity *) nm_setting_wireless_security_new ();
        nm_connection_add_setting (connection, (NMSetting *) s_wireless_sec);
 
-       leap_username = gtk_entry_get_text (self->username_entry);
-       leap_password = gtk_entry_get_text (self->password_entry);
+       leap_username = gtk_editable_get_text (GTK_EDITABLE (self->username_entry));
+       leap_password = gtk_editable_get_text (GTK_EDITABLE (self->password_entry));
 
        g_object_set (s_wireless_sec,
                      NM_SETTING_WIRELESS_SECURITY_KEY_MGMT, "ieee8021x",
@@ -202,7 +202,7 @@ ws_leap_new (NMConnection *connection)
 
        g_signal_connect_swapped (self->username_entry, "changed", G_CALLBACK (changed_cb), self);
        if (wsec)
-               gtk_entry_set_text (self->username_entry, nm_setting_wireless_security_get_leap_username 
(wsec));
+               gtk_editable_set_text (GTK_EDITABLE (self->username_entry), 
nm_setting_wireless_security_get_leap_username (wsec));
 
        g_signal_connect_swapped (self->show_password_check, "toggled", G_CALLBACK (show_toggled_cb), self);
 
diff --git a/panels/network/wireless-security/ws-leap.ui b/panels/network/wireless-security/ws-leap.ui
index 3815d88dd..41e21d6e9 100644
--- a/panels/network/wireless-security/ws-leap.ui
+++ b/panels/network/wireless-security/ws-leap.ui
@@ -2,81 +2,62 @@
 <interface>
   <requires lib="gtk+" version="3.4"/>
   <template class="WirelessSecurityLEAP" parent="GtkGrid">
-    <property name="visible">True</property>
-    <property name="can_focus">False</property>
     <property name="valign">start</property>
     <property name="column_spacing">6</property>
     <property name="row_spacing">6</property>
-    <child>
-      <placeholder/>
-    </child>
     <child>
       <object class="GtkLabel" id="username_label">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
         <property name="xalign">1</property>
         <property name="label" translatable="yes">_Username</property>
         <property name="use_underline">True</property>
         <property name="mnemonic_widget">username_entry</property>
+        <layout>
+          <property name="column">0</property>
+          <property name="row">0</property>
+        </layout>
       </object>
-      <packing>
-        <property name="left_attach">0</property>
-        <property name="top_attach">0</property>
-      </packing>
     </child>
     <child>
       <object class="GtkLabel" id="password_label">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
         <property name="xalign">1</property>
         <property name="label" translatable="yes">_Password</property>
         <property name="use_underline">True</property>
         <property name="mnemonic_widget">password_entry</property>
+        <layout>
+          <property name="column">0</property>
+          <property name="row">1</property>
+        </layout>
       </object>
-      <packing>
-        <property name="left_attach">0</property>
-        <property name="top_attach">1</property>
-      </packing>
     </child>
     <child>
       <object class="GtkEntry" id="password_entry">
-        <property name="visible">True</property>
-        <property name="can_focus">True</property>
         <property name="hexpand">True</property>
         <property name="visibility">False</property>
-        <property name="activates_default">True</property>
+        <layout>
+          <property name="column">1</property>
+          <property name="row">1</property>
+        </layout>
       </object>
-      <packing>
-        <property name="left_attach">1</property>
-        <property name="top_attach">1</property>
-      </packing>
     </child>
     <child>
       <object class="GtkCheckButton" id="show_password_check">
         <property name="label" translatable="yes">Sho_w password</property>
-        <property name="visible">True</property>
-        <property name="can_focus">True</property>
         <property name="hexpand">True</property>
-        <property name="receives_default">False</property>
         <property name="use_underline">True</property>
-        <property name="draw_indicator">True</property>
+        <layout>
+          <property name="column">1</property>
+          <property name="row">2</property>
+        </layout>
       </object>
-      <packing>
-        <property name="left_attach">1</property>
-        <property name="top_attach">2</property>
-      </packing>
     </child>
     <child>
       <object class="GtkEntry" id="username_entry">
-        <property name="visible">True</property>
-        <property name="can_focus">True</property>
         <property name="hexpand">True</property>
-        <property name="activates_default">True</property>
+        <layout>
+          <property name="column">1</property>
+          <property name="row">0</property>
+        </layout>
       </object>
-      <packing>
-        <property name="left_attach">1</property>
-        <property name="top_attach">0</property>
-      </packing>
     </child>
   </template>
 </interface>
diff --git a/panels/network/wireless-security/ws-sae.c b/panels/network/wireless-security/ws-sae.c
index 89017ad6a..532067286 100644
--- a/panels/network/wireless-security/ws-sae.c
+++ b/panels/network/wireless-security/ws-sae.c
@@ -51,7 +51,7 @@ show_toggled_cb (WirelessSecuritySAE *self)
 {
   gboolean visible;
 
-  visible = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (self->show_password_check));
+  visible = gtk_check_button_get_active (GTK_CHECK_BUTTON (self->show_password_check));
   gtk_entry_set_visibility (self->password_entry, visible);
 }
 
@@ -69,7 +69,7 @@ validate (WirelessSecurity *security, GError **error)
       return TRUE;
   }
 
-  key = gtk_entry_get_text (self->password_entry);
+  key = gtk_editable_get_text (GTK_EDITABLE (self->password_entry));
 
   if (key == NULL || key[0] == '\0')
     {
@@ -113,7 +113,7 @@ fill_connection (WirelessSecurity *security, NMConnection *connection)
   s_wireless_sec = (NMSettingWirelessSecurity *) nm_setting_wireless_security_new ();
   nm_connection_add_setting (connection, (NMSetting *) s_wireless_sec);
 
-  key = gtk_entry_get_text (self->password_entry);
+  key = gtk_editable_get_text (GTK_EDITABLE (self->password_entry));
   g_object_set (s_wireless_sec, NM_SETTING_WIRELESS_SECURITY_PSK, key, NULL);
 
   /* Save PSK_FLAGS to the connection */
@@ -194,7 +194,7 @@ ws_sae_new (NMConnection *connection)
   self = g_object_new (ws_sae_get_type (), NULL);
 
   g_signal_connect_swapped (self->password_entry, "changed", G_CALLBACK (changed_cb), self);
-  gtk_entry_set_width_chars (self->password_entry, 28);
+  gtk_editable_set_width_chars (GTK_EDITABLE (self->password_entry), 28);
 
   /* Create password-storage popup menu for password entry under entry's secondary icon */
   if (connection)
diff --git a/panels/network/wireless-security/ws-sae.ui b/panels/network/wireless-security/ws-sae.ui
index d96bdc32c..028cd9fe9 100644
--- a/panels/network/wireless-security/ws-sae.ui
+++ b/panels/network/wireless-security/ws-sae.ui
@@ -3,76 +3,61 @@
 <interface domain="nm-applet">
   <requires lib="gtk+" version="3.10"/>
   <template class="WirelessSecuritySAE" parent="GtkGrid">
-    <property name="visible">True</property>
-    <property name="can_focus">False</property>
     <property name="column_spacing">6</property>
     <property name="row_spacing">6</property>
     <child>
       <object class="GtkLabel" id="password_label">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
         <property name="label" translatable="yes">_Password</property>
         <property name="use_underline">True</property>
         <property name="mnemonic_widget">password_entry</property>
         <property name="xalign">1</property>
+        <layout>
+          <property name="column">0</property>
+          <property name="row">0</property>
+        </layout>
       </object>
-      <packing>
-        <property name="left_attach">0</property>
-        <property name="top_attach">0</property>
-      </packing>
     </child>
     <child>
       <object class="GtkEntry" id="password_entry">
-        <property name="visible">True</property>
-        <property name="can_focus">True</property>
         <property name="hexpand">True</property>
         <property name="max_length">64</property>
         <property name="visibility">False</property>
-        <property name="activates_default">True</property>
+        <layout>
+          <property name="column">1</property>
+          <property name="row">0</property>
+        </layout>
       </object>
-      <packing>
-        <property name="left_attach">1</property>
-        <property name="top_attach">0</property>
-      </packing>
     </child>
     <child>
       <object class="GtkLabel" id="type_label">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
         <property name="label" translatable="yes">_Type</property>
         <property name="use_underline">True</property>
         <property name="mnemonic_widget">type_combo</property>
         <property name="xalign">1</property>
+        <layout>
+          <property name="column">0</property>
+          <property name="row">2</property>
+        </layout>
       </object>
-      <packing>
-        <property name="left_attach">0</property>
-        <property name="top_attach">2</property>
-      </packing>
     </child>
     <child>
       <object class="GtkCheckButton" id="show_password_check">
         <property name="label" translatable="yes">Sho_w password</property>
-        <property name="visible">True</property>
-        <property name="can_focus">True</property>
-        <property name="receives_default">False</property>
         <property name="hexpand">True</property>
         <property name="use_underline">True</property>
-        <property name="draw_indicator">True</property>
+        <layout>
+          <property name="column">1</property>
+          <property name="row">1</property>
+        </layout>
       </object>
-      <packing>
-        <property name="left_attach">1</property>
-        <property name="top_attach">1</property>
-      </packing>
     </child>
     <child>
       <object class="GtkComboBox" id="type_combo">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
+        <layout>
+          <property name="column">1</property>
+          <property name="row">2</property>
+        </layout>
       </object>
-      <packing>
-        <property name="left_attach">1</property>
-        <property name="top_attach">2</property>
-      </packing>
     </child>
   </template>
 </interface>
diff --git a/panels/network/wireless-security/ws-wep-key.c b/panels/network/wireless-security/ws-wep-key.c
index 006ecedae..741114fb2 100644
--- a/panels/network/wireless-security/ws-wep-key.c
+++ b/panels/network/wireless-security/ws-wep-key.c
@@ -54,7 +54,7 @@ show_toggled_cb (WirelessSecurityWEPKey *self)
 {
        gboolean visible;
 
-       visible = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (self->show_key_check));
+       visible = gtk_check_button_get_active (GTK_CHECK_BUTTON (self->show_key_check));
        gtk_entry_set_visibility (self->key_entry, visible);
 }
 
@@ -65,7 +65,7 @@ key_index_combo_changed_cb (WirelessSecurityWEPKey *self)
        int key_index;
 
        /* Save WEP key for old key index */
-       key = gtk_entry_get_text (self->key_entry);
+       key = gtk_editable_get_text (GTK_EDITABLE (self->key_entry));
        if (key)
                g_strlcpy (self->keys[self->cur_index], key, sizeof (self->keys[self->cur_index]));
        else
@@ -76,7 +76,7 @@ key_index_combo_changed_cb (WirelessSecurityWEPKey *self)
        g_return_if_fail (key_index >= 0);
 
        /* Populate entry with key from new index */
-       gtk_entry_set_text (self->key_entry, self->keys[key_index]);
+       gtk_editable_set_text (GTK_EDITABLE (self->key_entry), self->keys[key_index]);
        self->cur_index = key_index;
 
        wireless_security_notify_changed ((WirelessSecurity *) self);
@@ -108,7 +108,7 @@ validate (WirelessSecurity *security, GError **error)
                return TRUE;
        }
 
-       key = gtk_entry_get_text (self->key_entry);
+       key = gtk_editable_get_text (GTK_EDITABLE (self->key_entry));
        if (!key) {
                widget_set_error (GTK_WIDGET (self->key_entry));
                g_set_error_literal (error, NMA_ERROR, NMA_ERROR_GENERIC, _("missing wep-key"));
@@ -173,7 +173,7 @@ fill_connection (WirelessSecurity *security, NMConnection *connection)
 
        auth_alg = gtk_combo_box_get_active (self->auth_method_combo);
 
-       key = gtk_entry_get_text (self->key_entry);
+       key = gtk_editable_get_text (GTK_EDITABLE (self->key_entry));
        g_strlcpy (self->keys[self->cur_index], key, sizeof (self->keys[self->cur_index]));
 
        /* Blow away the old security setting by adding a clear one */
@@ -241,7 +241,7 @@ update_secrets (WirelessSecurityWEPKey *self, NMConnection *connection)
        }
 
        if (strlen (self->keys[self->cur_index]))
-               gtk_entry_set_text (self->key_entry, self->keys[self->cur_index]);
+               gtk_editable_set_text (GTK_EDITABLE (self->key_entry), self->keys[self->cur_index]);
 }
 
 static void
@@ -298,7 +298,7 @@ ws_wep_key_new (NMConnection *connection,
 
        self->type = type;
 
-       gtk_entry_set_width_chars (self->key_entry, 28);
+       gtk_editable_set_width_chars (GTK_EDITABLE (self->key_entry), 28);
 
        /* Create password-storage popup menu for password entry under entry's secondary icon */
        if (connection)
diff --git a/panels/network/wireless-security/ws-wep-key.ui b/panels/network/wireless-security/ws-wep-key.ui
index 7214032b6..49f525e63 100644
--- a/panels/network/wireless-security/ws-wep-key.ui
+++ b/panels/network/wireless-security/ws-wep-key.ui
@@ -36,84 +36,71 @@
     </data>
   </object>
   <template class="WirelessSecurityWEPKey" parent="GtkGrid">
-    <property name="visible">True</property>
-    <property name="can_focus">False</property>
     <property name="column_spacing">6</property>
     <property name="row_spacing">6</property>
     <child>
       <object class="GtkLabel" id="key_label">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
         <property name="xalign">1</property>
         <property name="label" translatable="yes">_Key</property>
         <property name="use_underline">True</property>
         <property name="mnemonic_widget">key_entry</property>
+        <layout>
+          <property name="column">0</property>
+          <property name="row">0</property>
+        </layout>
       </object>
-      <packing>
-        <property name="left_attach">0</property>
-        <property name="top_attach">0</property>
-      </packing>
     </child>
     <child>
       <object class="GtkEntry" id="key_entry">
-        <property name="visible">True</property>
-        <property name="can_focus">True</property>
         <property name="hexpand">True</property>
         <property name="max_length">64</property>
         <property name="visibility">False</property>
-        <property name="activates_default">True</property>
+        <layout>
+          <property name="column">1</property>
+          <property name="row">0</property>
+        </layout>
       </object>
-      <packing>
-        <property name="left_attach">1</property>
-        <property name="top_attach">0</property>
-      </packing>
     </child>
     <child>
       <object class="GtkLabel">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
         <property name="xalign">0</property>
+        <layout>
+          <property name="column">0</property>
+          <property name="row">1</property>
+        </layout>
       </object>
-      <packing>
-        <property name="left_attach">0</property>
-        <property name="top_attach">1</property>
-      </packing>
     </child>
     <child>
       <object class="GtkCheckButton" id="show_key_check">
         <property name="label" translatable="yes">Sho_w key</property>
-        <property name="visible">True</property>
-        <property name="can_focus">True</property>
         <property name="hexpand">True</property>
-        <property name="receives_default">False</property>
         <property name="use_underline">True</property>
-        <property name="draw_indicator">True</property>
+        <layout>
+          <property name="column">1</property>
+          <property name="row">1</property>
+        </layout>
       </object>
-      <packing>
-        <property name="left_attach">1</property>
-        <property name="top_attach">1</property>
-      </packing>
     </child>
     <child>
       <object class="GtkLabel" id="auth_method_label">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
         <property name="xalign">1</property>
         <property name="label" translatable="yes">Au_thentication</property>
         <property name="use_underline">True</property>
         <property name="mnemonic_widget">auth_method_combo</property>
+        <layout>
+          <property name="column">0</property>
+          <property name="row">3</property>
+        </layout>
       </object>
-      <packing>
-        <property name="left_attach">0</property>
-        <property name="top_attach">3</property>
-      </packing>
     </child>
     <child>
       <object class="GtkComboBox" id="auth_method_combo">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
         <property name="hexpand">True</property>
         <property name="model">auth_method_model</property>
+        <layout>
+          <property name="column">1</property>
+          <property name="row">3</property>
+        </layout>
         <child>
           <object class="GtkCellRendererText"/>
           <attributes>
@@ -121,31 +108,27 @@
           </attributes>
         </child>
       </object>
-      <packing>
-        <property name="left_attach">1</property>
-        <property name="top_attach">3</property>
-      </packing>
     </child>
     <child>
       <object class="GtkLabel" id="key_index_label">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
         <property name="xalign">1</property>
         <property name="label" translatable="yes">WEP inde_x</property>
         <property name="use_underline">True</property>
         <property name="mnemonic_widget">key_index_combo</property>
+        <layout>
+          <property name="column">0</property>
+          <property name="row">2</property>
+        </layout>
       </object>
-      <packing>
-        <property name="left_attach">0</property>
-        <property name="top_attach">2</property>
-      </packing>
     </child>
     <child>
       <object class="GtkComboBox" id="key_index_combo">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
         <property name="hexpand">True</property>
         <property name="model">key_index_model</property>
+        <layout>
+          <property name="column">1</property>
+          <property name="row">2</property>
+        </layout>
         <child>
           <object class="GtkCellRendererText"/>
           <attributes>
@@ -153,10 +136,6 @@
           </attributes>
         </child>
       </object>
-      <packing>
-        <property name="left_attach">1</property>
-        <property name="top_attach">2</property>
-      </packing>
     </child>
   </template>
 </interface>
diff --git a/panels/network/wireless-security/ws-wpa-eap.c b/panels/network/wireless-security/ws-wpa-eap.c
index fa8f2f2c1..662149d69 100644
--- a/panels/network/wireless-security/ws-wpa-eap.c
+++ b/panels/network/wireless-security/ws-wpa-eap.c
@@ -160,22 +160,22 @@ static void
 auth_combo_changed_cb (WirelessSecurityWPAEAP *self)
 {
        EAPMethod *eap;
-       GList *children;
        GtkWidget *eap_default_field;
+       GtkWidget *child;
 
        eap = get_eap (self);
 
        /* Remove the previous method and migrate username/password across */
-       children = gtk_container_get_children (GTK_CONTAINER (self->method_box));
-       if (children != NULL) {
-               EAPMethod *old_eap = g_list_nth_data (children, 0);
+       child = gtk_widget_get_first_child (GTK_WIDGET (self->method_box));
+       if (child != NULL) {
+               EAPMethod *old_eap = EAP_METHOD (child);
                eap_method_set_username (eap, eap_method_get_username (old_eap));
                eap_method_set_password (eap, eap_method_get_password (old_eap));
                eap_method_set_show_password (eap, eap_method_get_show_password (old_eap));
-               gtk_container_remove (GTK_CONTAINER (self->method_box), GTK_WIDGET (old_eap));
+               gtk_box_remove (self->method_box, child);
        }
 
-       gtk_container_add (GTK_CONTAINER (self->method_box), g_object_ref (GTK_WIDGET (eap)));
+       gtk_box_append (self->method_box, g_object_ref (GTK_WIDGET (eap)));
        eap_default_field = eap_method_get_default_field (eap);
        if (eap_default_field)
                gtk_widget_grab_focus (eap_default_field);
diff --git a/panels/network/wireless-security/ws-wpa-eap.ui b/panels/network/wireless-security/ws-wpa-eap.ui
index 0555aaaf9..222eba771 100644
--- a/panels/network/wireless-security/ws-wpa-eap.ui
+++ b/panels/network/wireless-security/ws-wpa-eap.ui
@@ -49,30 +49,28 @@
     </data>
   </object>
   <template class="WirelessSecurityWPAEAP" parent="GtkGrid">
-    <property name="visible">True</property>
-    <property name="can_focus">False</property>
     <property name="column_spacing">6</property>
     <property name="row_spacing">6</property>
     <child>
       <object class="GtkLabel" id="auth_label">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
         <property name="xalign">1</property>
         <property name="label" translatable="yes">Au_thentication</property>
         <property name="use_underline">True</property>
         <property name="mnemonic_widget">auth_combo</property>
+        <layout>
+          <property name="column">0</property>
+          <property name="row">0</property>
+        </layout>
       </object>
-      <packing>
-        <property name="left_attach">0</property>
-        <property name="top_attach">0</property>
-      </packing>
     </child>
     <child>
       <object class="GtkComboBox" id="auth_combo">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
         <property name="hexpand">True</property>
         <property name="model">auth_model</property>
+        <layout>
+          <property name="column">1</property>
+          <property name="row">0</property>
+        </layout>
         <child>
           <object class="GtkCellRendererText"/>
           <attributes>
@@ -80,25 +78,16 @@
           </attributes>
         </child>
       </object>
-      <packing>
-        <property name="left_attach">1</property>
-        <property name="top_attach">0</property>
-      </packing>
     </child>
     <child>
       <object class="GtkBox" id="method_box">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
         <property name="orientation">vertical</property>
-        <child>
-          <placeholder/>
-        </child>
+        <layout>
+          <property name="column">0</property>
+          <property name="column-span">2</property>
+          <property name="row">1</property>
+        </layout>
       </object>
-      <packing>
-        <property name="left_attach">0</property>
-        <property name="width">2</property>
-        <property name="top_attach">1</property>
-      </packing>
     </child>
   </template>
 </interface>
diff --git a/panels/network/wireless-security/ws-wpa-psk.c b/panels/network/wireless-security/ws-wpa-psk.c
index 978488b7e..348f11ef5 100644
--- a/panels/network/wireless-security/ws-wpa-psk.c
+++ b/panels/network/wireless-security/ws-wpa-psk.c
@@ -51,7 +51,7 @@ show_toggled_cb (WirelessSecurityWPAPSK *self)
 {
        gboolean visible;
 
-       visible = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (self->show_password_check));
+       visible = gtk_check_button_get_active (GTK_CHECK_BUTTON (self->show_password_check));
        gtk_entry_set_visibility (self->password_entry, visible);
 }
 
@@ -70,7 +70,7 @@ validate (WirelessSecurity *security, GError **error)
                return TRUE;
        }
 
-       key = gtk_entry_get_text (self->password_entry);
+       key = gtk_editable_get_text (GTK_EDITABLE (self->password_entry));
        len = key ? strlen (key) : 0;
        if ((len < 8) || (len > 64)) {
                widget_set_error (GTK_WIDGET (self->password_entry));
@@ -125,7 +125,7 @@ fill_connection (WirelessSecurity *security, NMConnection *connection)
        s_wireless_sec = (NMSettingWirelessSecurity *) nm_setting_wireless_security_new ();
        nm_connection_add_setting (connection, (NMSetting *) s_wireless_sec);
 
-       key = gtk_entry_get_text (self->password_entry);
+       key = gtk_editable_get_text (GTK_EDITABLE (self->password_entry));
        g_object_set (s_wireless_sec, NM_SETTING_WIRELESS_SECURITY_PSK, key, NULL);
 
        /* Save PSK_FLAGS to the connection */
@@ -207,7 +207,7 @@ ws_wpa_psk_new (NMConnection *connection)
        self = g_object_new (ws_wpa_psk_get_type (), NULL);
 
        g_signal_connect_swapped (self->password_entry, "changed", G_CALLBACK (changed_cb), self);
-       gtk_entry_set_width_chars (self->password_entry, 28);
+       gtk_editable_set_width_chars (GTK_EDITABLE (self->password_entry), 28);
 
        /* Create password-storage popup menu for password entry under entry's secondary icon */
        if (connection)
diff --git a/panels/network/wireless-security/ws-wpa-psk.ui b/panels/network/wireless-security/ws-wpa-psk.ui
index 203748e23..26c9415d4 100644
--- a/panels/network/wireless-security/ws-wpa-psk.ui
+++ b/panels/network/wireless-security/ws-wpa-psk.ui
@@ -2,88 +2,71 @@
 <interface>
   <requires lib="gtk+" version="3.4"/>
   <template class="WirelessSecurityWPAPSK" parent="GtkGrid">
-    <property name="visible">True</property>
-    <property name="can_focus">False</property>
     <property name="column_spacing">6</property>
     <property name="row_spacing">6</property>
     <child>
       <object class="GtkLabel" id="password_label">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
         <property name="xalign">1</property>
         <property name="label" translatable="yes">_Password</property>
         <property name="use_underline">True</property>
         <property name="mnemonic_widget">password_entry</property>
+        <layout>
+          <property name="column">0</property>
+          <property name="row">0</property>
+        </layout>
       </object>
-      <packing>
-        <property name="left_attach">0</property>
-        <property name="top_attach">0</property>
-      </packing>
     </child>
     <child>
       <object class="GtkEntry" id="password_entry">
-        <property name="visible">True</property>
-        <property name="can_focus">True</property>
         <property name="hexpand">True</property>
         <property name="max_length">64</property>
         <property name="visibility">False</property>
-        <property name="activates_default">True</property>
+        <layout>
+          <property name="column">1</property>
+          <property name="row">0</property>
+        </layout>
       </object>
-      <packing>
-        <property name="left_attach">1</property>
-        <property name="top_attach">0</property>
-      </packing>
     </child>
     <child>
       <object class="GtkLabel" id="type_label">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
         <property name="xalign">1</property>
         <property name="label" translatable="yes">_Type</property>
         <property name="use_underline">True</property>
         <property name="mnemonic_widget">type_combo</property>
+        <layout>
+          <property name="column">0</property>
+          <property name="row">2</property>
+        </layout>
       </object>
-      <packing>
-        <property name="left_attach">0</property>
-        <property name="top_attach">2</property>
-      </packing>
     </child>
     <child>
       <object class="GtkLabel">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
         <property name="xalign">0</property>
+        <layout>
+          <property name="column">0</property>
+          <property name="row">1</property>
+        </layout>
       </object>
-      <packing>
-        <property name="left_attach">0</property>
-        <property name="top_attach">1</property>
-      </packing>
     </child>
     <child>
       <object class="GtkCheckButton" id="show_password_check">
         <property name="label" translatable="yes">Sho_w password</property>
-        <property name="visible">True</property>
-        <property name="can_focus">True</property>
         <property name="hexpand">True</property>
-        <property name="receives_default">False</property>
         <property name="use_underline">True</property>
-        <property name="draw_indicator">True</property>
+        <layout>
+          <property name="column">1</property>
+          <property name="row">1</property>
+        </layout>
       </object>
-      <packing>
-        <property name="left_attach">1</property>
-        <property name="top_attach">1</property>
-      </packing>
     </child>
     <child>
       <object class="GtkComboBox" id="type_combo">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
         <property name="hexpand">True</property>
+        <layout>
+          <property name="column">1</property>
+          <property name="row">2</property>
+        </layout>
       </object>
-      <packing>
-        <property name="left_attach">1</property>
-        <property name="top_attach">2</property>
-      </packing>
     </child>
   </template>
 </interface>
diff --git a/shell/cc-panel-loader.c b/shell/cc-panel-loader.c
index 31db92748..371ccac30 100644
--- a/shell/cc-panel-loader.c
+++ b/shell/cc-panel-loader.c
@@ -45,8 +45,8 @@ extern GType cc_keyboard_panel_get_type (void);
 extern GType cc_mouse_panel_get_type (void);
 extern GType cc_multitasking_panel_get_type (void);
 #ifdef BUILD_NETWORK
-//extern GType cc_network_panel_get_type (void);
-//extern GType cc_wifi_panel_get_type (void);
+extern GType cc_network_panel_get_type (void);
+extern GType cc_wifi_panel_get_type (void);
 #endif /* BUILD_NETWORK */
 extern GType cc_notifications_panel_get_type (void);
 //extern GType cc_goa_panel_get_type (void);
@@ -78,7 +78,7 @@ extern GType cc_diagnostics_panel_get_type (void);
 /* Static init functions */
 extern void cc_diagnostics_panel_static_init_func (void);
 #ifdef BUILD_NETWORK
-//extern void cc_wifi_panel_static_init_func (void);
+extern void cc_wifi_panel_static_init_func (void);
 #endif /* BUILD_NETWORK */
 #ifdef BUILD_WACOM
 extern void cc_wacom_panel_static_init_func (void);
@@ -116,8 +116,8 @@ static CcPanelLoaderVtable default_panels[] =
   PANEL_TYPE("mouse",            cc_mouse_panel_get_type,                NULL),
   PANEL_TYPE("multitasking",     cc_multitasking_panel_get_type,         NULL),
 #ifdef BUILD_NETWORK
-  //PANEL_TYPE("network",          cc_network_panel_get_type,              NULL),
-  //PANEL_TYPE("wifi",             cc_wifi_panel_get_type,                 cc_wifi_panel_static_init_func),
+  PANEL_TYPE("network",          cc_network_panel_get_type,              NULL),
+  PANEL_TYPE("wifi",             cc_wifi_panel_get_type,                 cc_wifi_panel_static_init_func),
 #endif
   PANEL_TYPE("notifications",    cc_notifications_panel_get_type,        NULL),
   //PANEL_TYPE("online-accounts",  cc_goa_panel_get_type,                  NULL),


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]