[epiphany/wip/exalm/gtk4] WIP: Port to GTK4




commit 2fa6c0eeaa231b079c33cfdec07bd7e10053cb1e
Author: Alexander Mikhaylenko <alexm gnome org>
Date:   Mon Nov 29 12:20:58 2021 +0500

    WIP: Port to GTK4
    
    Inline a few libdazzle classes.
    
    Left out lib/widgets/ for now as that's a lot of work and I want to port enough
    of the foundation to test it first.
    
    Also left out:
    - lib/ephy-dnd.c - gtk4 dnd api is completely different, this will need a lot of changes
    - lib/ephy-gui.c - ephy_gui_get_current_event() is bad, this will need a rework everywhere
    - lib/ephy-suggestion.c - no libdazzle in gtk4
    
    FIXMEs:
    - embed/ephy-download.c
      - commented out the dialog
        - need to replace the file chooser button
        - unsure about gtk_box_pack_start() replacement
      - event time -> monotonic time
    - embed/ephy-embed.c
      - commented out nautilus floating bar
    - embed/ephy-find-toolbar.c
      - commented out gd tagged entry
      - shortcuts
    - embed/ephy-web-view.c
      - need to backport a leak fix
      - event vfuncs
    - lib/widgets/ephy-file-chooser.c
      - removed preview, need to backport
    - src/ephy-shell.c
      - large parts commented out until the rest of src/ is there
    - src/ephy-tab-view.c
      - dnd

 embed/ephy-about-handler.c                         |   67 +-
 embed/ephy-download.c                              |   14 +-
 embed/ephy-embed-shell.c                           |   30 +-
 embed/ephy-embed-shell.h                           |    6 +-
 embed/ephy-embed.c                                 |   61 +-
 embed/ephy-find-toolbar.c                          |  126 +-
 embed/ephy-find-toolbar.h                          |    4 +-
 embed/ephy-reader-handler.c                        |   10 +-
 embed/ephy-web-view.c                              |  181 +--
 embed/meson.build                                  |    5 +-
 lib/contrib/dzl-fuzzy-mutable-index.c              |  722 +++++++++++
 lib/contrib/dzl-fuzzy-mutable-index.h              |   66 +
 lib/contrib/dzl-suggestion.c                       |  547 ++++++++
 lib/contrib/dzl-suggestion.h                       |   77 ++
 lib/ephy-file-helpers.c                            |   12 +-
 lib/ephy-file-helpers.h                            |    2 +-
 lib/ephy-flatpak-utils.c                           |    2 +-
 lib/ephy-gui.c                                     |   21 +-
 lib/ephy-notification-container.c                  |   45 +-
 lib/ephy-notification-container.h                  |    4 +-
 lib/ephy-notification.c                            |   20 +-
 lib/ephy-notification.h                            |    4 +-
 lib/ephy-suggestion.c                              |    1 -
 lib/ephy-suggestion.h                              |    2 +-
 lib/meson.build                                    |    6 +-
 lib/widgets/ephy-download-widget.c                 |   31 +-
 lib/widgets/ephy-download-widget.h                 |    4 +-
 lib/widgets/ephy-downloads-popover.c               |   68 +-
 lib/widgets/ephy-downloads-progress-icon.c         |   28 +-
 lib/widgets/ephy-file-chooser.c                    |   15 +-
 lib/widgets/ephy-location-entry-old.c              | 1369 ++++++++++++++++++++
 lib/widgets/ephy-location-entry.c                  | 1217 ++---------------
 lib/widgets/ephy-location-entry.h                  |   10 +-
 lib/widgets/ephy-title-box.c                       |   55 +-
 lib/widgets/ephy-title-box.h                       |    5 +-
 lib/widgets/meson.build                            |    8 +-
 meson.build                                        |   21 +-
 org.gnome.Epiphany.json                            |   10 -
 src/bookmarks/ephy-bookmark-properties.c           |  115 +-
 src/bookmarks/ephy-bookmark-row.c                  |   10 +-
 src/bookmarks/ephy-bookmarks-popover.c             |   36 +-
 src/ephy-action-bar-end.c                          |   47 +-
 src/ephy-action-bar-start.c                        |   43 +-
 src/ephy-action-bar.c                              |    5 +-
 src/ephy-action-bar.h                              |    4 +-
 src/ephy-desktop-utils.c                           |    9 -
 src/ephy-desktop-utils.h                           |    2 -
 src/ephy-encoding-dialog.c                         |   39 +-
 src/ephy-firefox-sync-dialog.c                     |  114 +-
 src/ephy-firefox-sync-dialog.h                     |    4 +-
 src/ephy-fullscreen-box.c                          |  181 +--
 src/ephy-fullscreen-box.h                          |    2 +-
 src/ephy-header-bar.c                              |   92 +-
 src/ephy-header-bar.h                              |    4 +-
 src/ephy-history-dialog.c                          |  144 +-
 src/ephy-history-dialog.h                          |    4 +-
 src/ephy-link.c                                    |    2 +
 src/ephy-location-controller.c                     |   32 +-
 src/ephy-lockdown.c                                |   17 +-
 src/ephy-mouse-gesture-controller.c                |   13 +-
 src/ephy-page-row.c                                |   46 +-
 src/ephy-page-row.h                                |    6 +-
 src/ephy-pages-button.c                            |    2 +-
 src/ephy-pages-popover.c                           |   59 +-
 src/ephy-pages-popover.h                           |    2 +-
 src/ephy-pages-view.c                              |   16 +-
 src/ephy-session.c                                 |   42 +-
 src/ephy-shell.c                                   |   31 +-
 src/ephy-suggestion-model.c                        |    2 +-
 src/ephy-tab-view.c                                |  180 ++-
 src/ephy-tab-view.h                                |    8 +-
 src/ephy-web-extension-dialog.c                    |   95 +-
 src/ephy-web-extension-dialog.h                    |    2 +-
 src/ephy-window.c                                  |  545 ++++----
 src/ephy-window.h                                  |    7 +-
 src/meson.build                                    |   16 +-
 src/popup-commands.c                               |   13 +-
 src/preferences/ephy-data-view.c                   |  107 +-
 src/preferences/ephy-data-view.h                   |    6 +-
 src/preferences/ephy-lang-row.c                    |   10 +-
 src/preferences/ephy-lang-row.h                    |    4 +-
 src/preferences/ephy-prefs-dialog.c                |   32 +-
 src/preferences/ephy-prefs-dialog.h                |    4 +-
 src/preferences/ephy-search-engine-row.c           |   51 +-
 src/preferences/ephy-search-engine-row.h           |    6 +-
 src/preferences/passwords-view.c                   |   87 +-
 src/preferences/prefs-appearance-page.c            |  121 +-
 src/preferences/prefs-appearance-page.h            |    4 +-
 src/preferences/prefs-general-page.c               |    2 +-
 src/preferences/prefs-privacy-page.c               |    4 +-
 src/preferences/prefs-privacy-page.h               |    5 +-
 src/resources/gtk/action-bar-end.ui                |   44 +-
 src/resources/gtk/action-bar-start.ui              |   67 +-
 src/resources/gtk/action-bar.ui                    |   31 +-
 src/resources/gtk/bookmark-properties.ui           |   16 +-
 src/resources/gtk/bookmark-row.ui                  |   11 +-
 src/resources/gtk/clear-data-view.ui               |   10 +-
 src/resources/gtk/data-view.ui                     |  122 +-
 src/resources/gtk/encoding-dialog.ui               |  156 +--
 src/resources/gtk/encoding-row.ui                  |    6 +-
 src/resources/gtk/firefox-sync-dialog.ui           |  287 ++--
 src/resources/gtk/history-dialog.ui                |  187 +--
 src/resources/gtk/lang-row.ui                      |   40 +-
 src/resources/gtk/page-menu-popover.ui             |  482 ++-----
 src/resources/gtk/page-row.ui                      |  108 +-
 src/resources/gtk/pages-button.ui                  |   13 +-
 src/resources/gtk/pages-popover.ui                 |    4 +-
 src/resources/gtk/pages-view.ui                    |   37 +-
 src/resources/gtk/passwords-view.ui                |    8 +-
 src/resources/gtk/prefs-appearance-page.ui         |  105 +-
 src/resources/gtk/prefs-dialog.ui                  |   10 +-
 src/resources/gtk/prefs-general-page.ui            |   52 +-
 src/resources/gtk/prefs-lang-dialog.ui             |    2 +-
 src/resources/gtk/prefs-privacy-page.ui            |   34 +-
 src/resources/gtk/search-engine-row.ui             |   15 +-
 src/resources/gtk/synced-tabs-dialog.ui            |   15 +-
 src/resources/gtk/web-extensions-dialog.ui         |   66 +-
 src/resources/gtk/webapp-additional-urls-dialog.ui |   35 +-
 src/webextension/api/pageaction.c                  |    8 +-
 src/webextension/ephy-web-extension-manager.c      |   72 +-
 src/window-commands.c                              |  132 +-
 tests/ephy-embed-shell-test.c                      |    4 +-
 tests/ephy-location-entry-test.c                   |   18 +-
 tests/ephy-web-view-test.c                         |    6 +-
 tests/meson.build                                  |   38 +-
 125 files changed, 5207 insertions(+), 4344 deletions(-)
---
diff --git a/embed/ephy-about-handler.c b/embed/ephy-about-handler.c
index 4c794f526..e259346df 100644
--- a/embed/ephy-about-handler.c
+++ b/embed/ephy-about-handler.c
@@ -163,14 +163,26 @@ ephy_about_handler_handle_about (EphyAboutHandler       *handler,
 {
   char *data;
   char *version;
-  GtkIconInfo *icon_info;
+  g_autofree char *path = NULL;
+  GtkIconTheme *icon_theme;
+  g_autoptr (GtkIconPaintable) paintable = NULL;
 
   version = g_strdup_printf (_("Version %s"), VERSION);
 
-  icon_info = gtk_icon_theme_lookup_icon (gtk_icon_theme_get_default (),
+  icon_theme = gtk_icon_theme_get_for_display (gdk_display_get_default ());
+  paintable = gtk_icon_theme_lookup_icon (icon_theme,
                                           APPLICATION_ID,
+                                          NULL,
                                           256,
-                                          GTK_ICON_LOOKUP_FORCE_SVG);
+                                          1,
+                                          GTK_TEXT_DIR_LTR,
+                                          GTK_ICON_LOOKUP_FORCE_REGULAR);
+
+  if (paintable) {
+    g_autoptr (GFile) file = gtk_icon_paintable_get_file (paintable);
+
+    path = g_file_get_path (file);
+  }
 
   data = g_strdup_printf ("<html><head><title>%s</title>"
                           "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />"
@@ -187,7 +199,7 @@ ephy_about_handler_handle_about (EphyAboutHandler       *handler,
                           "</table>"
                           "</div></div></body></html>",
                           _("About Web"),
-                          icon_info ? gtk_icon_info_get_filename (icon_info) : "",
+                          path ? path : "",
 #if !TECH_PREVIEW
                           _("Web"),
 #else
@@ -197,8 +209,6 @@ ephy_about_handler_handle_about (EphyAboutHandler       *handler,
                           _("A simple, clean, beautiful view of the web"),
                           "WebKitGTK", webkit_get_major_version (), webkit_get_minor_version (), 
webkit_get_micro_version ());
   g_free (version);
-  if (icon_info)
-    g_object_unref (icon_info);
 
   ephy_about_handler_finish_request (request, data, -1);
 
@@ -280,8 +290,9 @@ handle_applications_finished_cb (EphyAboutHandler       *handler,
 
     g_string_append (data_str, "</table></div></body></html>");
   } else {
-    g_autoptr (GtkIconInfo) icon_info = NULL;
-    g_autofree gchar *icon = g_strconcat ("application-x-addon-symbolic", NULL);
+    GtkIconTheme *icon_theme;
+    g_autoptr (GtkIconPaintable) paintable = NULL;
+    g_autofree char *path = NULL;
 
     g_string_append_printf (data_str, "<html><head><title>%s</title>"
                             "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />"
@@ -289,10 +300,21 @@ handle_applications_finished_cb (EphyAboutHandler       *handler,
                             "</head><body class=\"applications-body\">",
                             _("Applications"));
 
-    icon_info = gtk_icon_theme_lookup_icon (gtk_icon_theme_get_default (),
-                                            icon,
+    icon_theme = gtk_icon_theme_get_for_display (gdk_display_get_default ());
+    paintable = gtk_icon_theme_lookup_icon (icon_theme,
+                                            "application-x-addon-symbolic",
+                                            NULL,
                                             128,
+                                            1,
+                                            GTK_TEXT_DIR_LTR,
                                             0);
+
+    if (paintable) {
+      g_autoptr (GFile) file = gtk_icon_paintable_get_file (paintable);
+
+      path = g_file_get_path (file);
+    }
+
     g_string_append_printf (data_str,
                             "  <div id=\"overview\" class=\"overview-empty\">\n"
                             "    <img src=\"file://%s\"/>\n"
@@ -300,7 +322,7 @@ handle_applications_finished_cb (EphyAboutHandler       *handler,
                             "    <div><p>%s</p></div>\n"
                             "  </div>\n"
                             "</body></html>\n",
-                            icon_info ? gtk_icon_info_get_filename (icon_info) : "",
+                            path ? path : "",
                             /* Displayed when opening applications without any installed web apps. */
                             _("Applications"), _("You can add your favorite website by clicking <b>Install 
Site as Web Application…</b> within the page menu."));
   }
@@ -378,13 +400,26 @@ history_service_query_urls_cb (EphyHistoryService     *history,
   list_length = g_list_length (urls);
 
   if (list_length == 0 || !success) {
-    GtkIconInfo *icon_info;
-    g_autofree gchar *icon = g_strconcat (APPLICATION_ID, "-symbolic", NULL);
+    GtkIconTheme *icon_theme;
+    g_autoptr (GtkIconPaintable) paintable = NULL;
+    g_autofree char *path = NULL;
+    g_autofree char *icon = g_strconcat (APPLICATION_ID, "-symbolic", NULL);
 
-    icon_info = gtk_icon_theme_lookup_icon (gtk_icon_theme_get_default (),
+    icon_theme = gtk_icon_theme_get_for_display (gdk_display_get_default ());
+    paintable = gtk_icon_theme_lookup_icon (icon_theme,
                                             icon,
+                                            NULL,
                                             128,
+                                            1,
+                                            GTK_TEXT_DIR_LTR,
                                             0);
+
+    if (paintable) {
+      g_autoptr (GFile) file = gtk_icon_paintable_get_file (paintable);
+
+      path = g_file_get_path (file);
+    }
+
     g_string_append_printf (data_str,
                             "  <div id=\"overview\" class=\"overview-empty\">\n"
                             "    <img src=\"file://%s\"/>\n"
@@ -392,11 +427,9 @@ history_service_query_urls_cb (EphyHistoryService     *history,
                             "    <div><p>%s</p></div>\n"
                             "  </div>\n"
                             "</body></html>\n",
-                            icon_info ? gtk_icon_info_get_filename (icon_info) : "",
+                            path ? path : "",
                             /* Displayed when opening the browser for the first time. */
                             _("Welcome to Web"), _("Start browsing and your most-visited sites will appear 
here."));
-    if (icon_info)
-      g_object_unref (icon_info);
     goto out;
   }
 
diff --git a/embed/ephy-download.c b/embed/ephy-download.c
index 3705fe677..f60c3df89 100644
--- a/embed/ephy-download.c
+++ b/embed/ephy-download.c
@@ -621,7 +621,7 @@ ephy_download_init (EphyDownload *download)
 
   download->action = EPHY_DOWNLOAD_ACTION_NONE;
 
-  download->start_time = gtk_get_current_event_time ();
+  download->start_time = g_get_monotonic_time (); // FIXME this is wrong
 
   download->show_notification = TRUE;
 }
@@ -793,6 +793,7 @@ typedef struct {
   GtkFileChooser *file_chooser;
 } SuggestedFilenameData;
 
+#if 0
 static void
 filename_suggested_dialog_cb (GtkDialog             *dialog,
                               GtkResponseType        response,
@@ -815,7 +816,7 @@ filename_suggested_dialog_cb (GtkDialog             *dialog,
     ephy_download_cancel (data->download);
   }
 
-  gtk_widget_destroy (GTK_WIDGET (dialog));
+  gtk_window_destroy (GTK_WINDOW (dialog));
 
   g_free (data->suggested_filename);
   g_free (data);
@@ -885,8 +886,6 @@ filename_suggested_cb (EphyDownload *download,
   gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (filechooser), g_settings_get_string 
(EPHY_SETTINGS_WEB, EPHY_PREFS_WEB_LAST_DOWNLOAD_DIRECTORY));
   gtk_box_pack_start (GTK_BOX (box), filechooser, FALSE, TRUE, 0);
 
-  gtk_widget_show_all (box);
-
   data = g_new0 (SuggestedFilenameData, 1);
   data->download = download;
   data->webkit_download = webkit_download;
@@ -897,6 +896,7 @@ filename_suggested_cb (EphyDownload *download,
                     G_CALLBACK (filename_suggested_dialog_cb), data);
   gtk_window_present (GTK_WINDOW (dialog));
 }
+#endif
 
 EphyDownload *
 ephy_download_new_internal (WebKitDownload *download)
@@ -946,9 +946,9 @@ ephy_download_new (WebKitDownload *download)
                            ephy_download, 0);
 
   if (!ephy_is_running_inside_sandbox () && g_settings_get_boolean (EPHY_SETTINGS_WEB, 
EPHY_PREFS_WEB_ASK_ON_DOWNLOAD)) {
-    g_signal_connect (ephy_download, "filename-suggested",
-                      G_CALLBACK (filename_suggested_cb),
-                      NULL);
+//    g_signal_connect (ephy_download, "filename-suggested",
+//                      G_CALLBACK (filename_suggested_cb),
+//                      NULL);
   }
 
   return ephy_download;
diff --git a/embed/ephy-embed-shell.c b/embed/ephy-embed-shell.c
index 189370bd8..310dc830b 100644
--- a/embed/ephy-embed-shell.c
+++ b/embed/ephy-embed-shell.c
@@ -97,7 +97,7 @@ static EphyEmbedShell *embed_shell = NULL;
 
 static void ephy_embed_shell_tabs_catalog_iface_init (EphyTabsCatalogInterface *iface);
 
-G_DEFINE_TYPE_WITH_CODE (EphyEmbedShell, ephy_embed_shell, DZL_TYPE_APPLICATION,
+G_DEFINE_TYPE_WITH_CODE (EphyEmbedShell, ephy_embed_shell, ADW_TYPE_APPLICATION,
                          G_ADD_PRIVATE (EphyEmbedShell)
                          G_IMPLEMENT_INTERFACE (EPHY_TYPE_TABS_CATALOG,
                                                 ephy_embed_shell_tabs_catalog_iface_init))
@@ -888,27 +888,6 @@ enable_itp_setting_changed_cb (GSettings      *settings,
                                                                        EPHY_PREFS_WEB_ENABLE_ITP));
 }
 
-static void
-update_system_scrollbars (EphyEmbedShell *shell)
-{
-  EphyEmbedShellPrivate *priv = ephy_embed_shell_get_instance_private (shell);
-  const char *theme_name;
-  gboolean enabled;
-
-  g_object_get (gtk_settings_get_default (),
-                "gtk-theme_name", &theme_name,
-                NULL);
-
-  /* Don't enable system scrollbars for Adwaita */
-  enabled = g_strcmp0 (theme_name, "Adwaita") &&
-            g_strcmp0 (theme_name, "Adwaita-dark") &&
-            g_strcmp0 (theme_name, "HighContrast") &&
-            g_strcmp0 (theme_name, "HighContrastInverse");
-
-  webkit_web_context_set_use_system_appearance_for_scrollbars (priv->web_context,
-                                                               enabled);
-}
-
 static void
 ephy_embed_shell_startup (GApplication *application)
 {
@@ -1001,13 +980,6 @@ ephy_embed_shell_startup (GApplication *application)
 
   g_signal_connect_object (EPHY_SETTINGS_WEB, "changed::enable-itp",
                            G_CALLBACK (enable_itp_setting_changed_cb), shell, 0);
-
-  update_system_scrollbars (shell);
-
-  g_signal_connect_swapped (gtk_settings_get_default (),
-                            "notify::gtk-theme-name",
-                            G_CALLBACK (update_system_scrollbars),
-                            shell);
 }
 
 static void
diff --git a/embed/ephy-embed-shell.h b/embed/ephy-embed-shell.h
index 9464d42d4..2815c19bd 100644
--- a/embed/ephy-embed-shell.h
+++ b/embed/ephy-embed-shell.h
@@ -21,7 +21,7 @@
 
 #pragma once
 
-#include <dazzle.h>
+#include <adwaita.h>
 #include <webkit2/webkit2.h>
 
 #include "ephy-downloads-manager.h"
@@ -38,7 +38,7 @@ typedef struct _EphyFiltersManager EphyFiltersManager;
 
 #define EPHY_TYPE_EMBED_SHELL (ephy_embed_shell_get_type ())
 
-G_DECLARE_DERIVABLE_TYPE (EphyEmbedShell, ephy_embed_shell, EPHY, EMBED_SHELL, DzlApplication)
+G_DECLARE_DERIVABLE_TYPE (EphyEmbedShell, ephy_embed_shell, EPHY, EMBED_SHELL, AdwApplication)
 
 typedef enum
 {
@@ -54,7 +54,7 @@ typedef enum
 
 struct _EphyEmbedShellClass
 {
-  DzlApplicationClass parent_class;
+  AdwApplicationClass parent_class;
 
   void    (* restored_window)  (EphyEmbedShell *shell);
 };
diff --git a/embed/ephy-embed.c b/embed/ephy-embed.c
index 3d81f8783..f1b2ac5d7 100644
--- a/embed/ephy-embed.c
+++ b/embed/ephy-embed.c
@@ -35,7 +35,7 @@
 #include "ephy-settings.h"
 #include "ephy-string.h"
 #include "ephy-web-view.h"
-#include "nautilus-floating-bar.h"
+//#include "nautilus-floating-bar.h"
 
 #include <glib/gi18n.h>
 #include <webkit2/webkit2.h>
@@ -158,13 +158,13 @@ static void
 ephy_embed_set_statusbar_label (EphyEmbed  *embed,
                                 const char *label)
 {
-  nautilus_floating_bar_set_primary_label (NAUTILUS_FLOATING_BAR (embed->floating_bar), label);
+/*  nautilus_floating_bar_set_primary_label (NAUTILUS_FLOATING_BAR (embed->floating_bar), label);
 
   if (label == NULL || label[0] == '\0') {
     gtk_widget_hide (embed->floating_bar);
     gtk_widget_set_halign (embed->floating_bar, GTK_ALIGN_START);
   } else
-    gtk_widget_show (embed->floating_bar);
+    gtk_widget_show (embed->floating_bar);*/
 }
 
 static void
@@ -245,7 +245,7 @@ ephy_embed_destroy_top_widgets (EphyEmbed *embed)
 
   for (iter = embed->destroy_on_transition_list; iter; iter = iter->next) {
     g_signal_handlers_disconnect_by_func (iter->data, remove_from_destroy_list_cb, embed);
-    gtk_widget_destroy (GTK_WIDGET (iter->data));
+    gtk_box_remove (embed->top_widgets_vbox, GTK_WIDGET (iter->data));
   }
 
   embed->destroy_on_transition_list = NULL;
@@ -310,7 +310,7 @@ load_changed_cb (WebKitWebView   *web_view,
   }
 }
 
-static void
+static gboolean
 ephy_embed_grab_focus (GtkWidget *widget)
 {
   GtkWidget *child;
@@ -318,7 +318,9 @@ ephy_embed_grab_focus (GtkWidget *widget)
   child = GTK_WIDGET (ephy_embed_get_web_view (EPHY_EMBED (widget)));
 
   if (child)
-    gtk_widget_grab_focus (child);
+    return gtk_widget_grab_focus (child);
+
+  return FALSE;
 }
 
 
@@ -685,7 +687,7 @@ ephy_embed_mapped_cb (GtkWidget *widget,
 {
   ephy_embed_maybe_load_delayed_request ((EphyEmbed *)widget);
 }
-
+/* FIXME
 static gboolean
 on_enter_notify_event (GtkWidget        *widget,
                        GdkEventCrossing *event,
@@ -705,7 +707,7 @@ on_enter_notify_event (GtkWidget        *widget,
 
   return GDK_EVENT_PROPAGATE;
 }
-
+*/
 static void
 ephy_embed_constructed (GObject *object)
 {
@@ -722,33 +724,30 @@ ephy_embed_constructed (GObject *object)
   /* Skeleton */
   embed->overlay = gtk_overlay_new ();
 
-  gtk_widget_add_events (embed->overlay,
-                         GDK_ENTER_NOTIFY_MASK |
-                         GDK_LEAVE_NOTIFY_MASK);
   gtk_widget_set_vexpand (embed->overlay, TRUE);
-  gtk_container_add (GTK_CONTAINER (embed->overlay), GTK_WIDGET (embed->web_view));
+  gtk_overlay_set_child (GTK_OVERLAY (embed->overlay), GTK_WIDGET (embed->web_view));
 
   /* Floating message popup for fullscreen mode. */
   embed->fullscreen_message_label = gtk_label_new (NULL);
   gtk_widget_set_name (embed->fullscreen_message_label, "fullscreen-popup");
   gtk_widget_set_halign (embed->fullscreen_message_label, GTK_ALIGN_CENTER);
   gtk_widget_set_valign (embed->fullscreen_message_label, GTK_ALIGN_CENTER);
-  gtk_widget_set_no_show_all (embed->fullscreen_message_label, TRUE);
+  gtk_widget_hide (embed->fullscreen_message_label);
   gtk_overlay_add_overlay (GTK_OVERLAY (embed->overlay), embed->fullscreen_message_label);
   ephy_embed_set_fullscreen_message (embed, FALSE);
 
   /* statusbar is hidden by default */
-  embed->floating_bar = nautilus_floating_bar_new ();
+/*  embed->floating_bar = nautilus_floating_bar_new ();
   gtk_widget_set_halign (embed->floating_bar, GTK_ALIGN_START);
   gtk_widget_set_valign (embed->floating_bar, GTK_ALIGN_END);
-  gtk_widget_set_no_show_all (embed->floating_bar, TRUE);
-  g_signal_connect_object (embed->overlay, "enter-notify-event", G_CALLBACK (on_enter_notify_event), embed, 
0);
+  gtk_widget_hide (embed->floating_bar);
+// FIXME  g_signal_connect_object (embed->overlay, "enter-notify-event", G_CALLBACK (on_enter_notify_event), 
embed, 0);
 
-  gtk_overlay_add_overlay (GTK_OVERLAY (embed->overlay), embed->floating_bar);
+  gtk_overlay_add_overlay (GTK_OVERLAY (embed->overlay), embed->floating_bar);*/
 
   if (embed->progress_bar_enabled) {
     embed->progress = gtk_progress_bar_new ();
-    gtk_style_context_add_class (gtk_widget_get_style_context (embed->progress), "osd");
+    gtk_widget_add_css_class (embed->progress, "osd");
     gtk_widget_set_halign (embed->progress, GTK_ALIGN_FILL);
     gtk_widget_set_valign (embed->progress, GTK_ALIGN_START);
     gtk_overlay_add_overlay (GTK_OVERLAY (embed->overlay), embed->progress);
@@ -759,22 +758,14 @@ ephy_embed_constructed (GObject *object)
                     G_CALLBACK (ephy_embed_find_toolbar_close_cb),
                     embed);
 
-  gtk_box_pack_start (GTK_BOX (embed),
-                      GTK_WIDGET (embed->find_toolbar),
-                      FALSE, TRUE, 0);
+  gtk_box_append (GTK_BOX (embed), GTK_WIDGET (embed->find_toolbar));
 
   if (embed->progress_bar_enabled)
     embed->progress_update_handler_id = g_signal_connect (embed->web_view, "notify::estimated-load-progress",
                                                           G_CALLBACK (progress_update), object);
 
-  gtk_box_pack_start (GTK_BOX (embed),
-                      GTK_WIDGET (embed->top_widgets_vbox),
-                      FALSE, TRUE, 0);
-  gtk_box_pack_start (GTK_BOX (embed), embed->overlay, FALSE, TRUE, 0);
-
-  gtk_widget_show (GTK_WIDGET (embed->top_widgets_vbox));
-  gtk_widget_show (GTK_WIDGET (embed->web_view));
-  gtk_widget_show_all (embed->overlay);
+  gtk_box_append (GTK_BOX (embed), GTK_WIDGET (embed->top_widgets_vbox));
+  gtk_box_append (GTK_BOX (embed), GTK_WIDGET (embed->overlay));
 
   g_object_connect (embed->web_view,
                     "signal::notify::title", G_CALLBACK (web_view_title_changed_cb), embed,
@@ -805,11 +796,9 @@ ephy_embed_constructed (GObject *object)
     gtk_info_bar_set_message_type (GTK_INFO_BAR (info_bar), GTK_MESSAGE_INFO);
     /* Translators: this means WebDriver control. */
     label = gtk_label_new (_("Web is being controlled by automation."));
-    gtk_box_pack_start (GTK_BOX (gtk_info_bar_get_content_area (GTK_INFO_BAR (info_bar))), label, FALSE, 
TRUE, 0);
-    gtk_widget_show (label);
+    gtk_info_bar_add_child (GTK_INFO_BAR (info_bar), label);
 
     ephy_embed_add_top_widget (embed, info_bar, EPHY_EMBED_TOP_WIDGET_POLICY_RETAIN_ON_TRANSITION);
-    gtk_widget_show (info_bar);
   }
 }
 
@@ -883,8 +872,7 @@ ephy_embed_add_top_widget (EphyEmbed                *embed,
     g_signal_connect (widget, "destroy", G_CALLBACK (remove_from_destroy_list_cb), embed);
   }
 
-  gtk_box_pack_end (embed->top_widgets_vbox,
-                    GTK_WIDGET (widget), FALSE, TRUE, 0);
+  gtk_box_prepend (embed->top_widgets_vbox, widget);
 }
 
 /**
@@ -910,8 +898,7 @@ ephy_embed_remove_top_widget (EphyEmbed *embed,
     embed->destroy_on_transition_list = list;
   }
 
-  gtk_container_remove (GTK_CONTAINER (embed->top_widgets_vbox),
-                        GTK_WIDGET (widget));
+  gtk_box_remove (embed->top_widgets_vbox, widget);
 }
 
 /**
@@ -1005,6 +992,6 @@ ephy_embed_detach_notification_container (EphyEmbed *embed)
      * notification widget, removing it from the container will destroy the
      * singleton. To prevent this, add a reference to it before removing it
      * from the container. */
-    gtk_container_remove (GTK_CONTAINER (embed->overlay), g_object_ref (GTK_WIDGET (container)));
+    gtk_overlay_remove_overlay (GTK_OVERLAY (embed->overlay), g_object_ref (GTK_WIDGET (container)));
   }
 }
diff --git a/embed/ephy-find-toolbar.c b/embed/ephy-find-toolbar.c
index 45a71b8e0..2145be3f6 100644
--- a/embed/ephy-find-toolbar.c
+++ b/embed/ephy-find-toolbar.c
@@ -23,25 +23,26 @@
 #include "ephy-find-toolbar.h"
 
 #include "ephy-debug.h"
-#include "contrib/gd-tagged-entry.h"
+//#include "contrib/gd-tagged-entry.h"
 
 #include <math.h>
 
+#include <adwaita.h>
 #include <gdk/gdkkeysyms.h>
 #include <glib/gi18n.h>
-#include <handy.h>
 #include <string.h>
 #include <webkit2/webkit2.h>
 
 struct _EphyFindToolbar {
-  GtkBin parent_instance;
+  AdwBin parent_instance;
 
   GCancellable *cancellable;
   WebKitWebView *web_view;
   WebKitFindController *controller;
   GtkWidget *search_bar;
-  GdTaggedEntry *entry;
-  GdTaggedEntryTag *entry_tag;
+  GtkWidget *entry;
+//  GdTaggedEntry *entry;
+//  GdTaggedEntryTag *entry_tag;
   GtkWidget *next;
   GtkWidget *prev;
   guint num_matches;
@@ -53,7 +54,7 @@ struct _EphyFindToolbar {
   gboolean typing_ahead;
 };
 
-G_DEFINE_TYPE (EphyFindToolbar, ephy_find_toolbar, GTK_TYPE_BIN)
+G_DEFINE_TYPE (EphyFindToolbar, ephy_find_toolbar, ADW_TYPE_BIN)
 
 enum {
   PROP_0,
@@ -88,12 +89,12 @@ static void ephy_find_toolbar_set_web_view (EphyFindToolbar *toolbar,
 
 static void
 update_search_tag (EphyFindToolbar *toolbar)
-{
+{/*
   g_autofree gchar *label = NULL;
 
   label = g_strdup_printf ("%u/%u", toolbar->current_match, toolbar->num_matches);
   gd_tagged_entry_tag_set_label (toolbar->entry_tag, label);
-  gd_tagged_entry_add_tag (toolbar->entry, toolbar->entry_tag);
+  gd_tagged_entry_add_tag (toolbar->entry, toolbar->entry_tag);*/
 }
 
 static void
@@ -141,7 +142,7 @@ clear_status (EphyFindToolbar *toolbar)
                 "primary-icon-name", "edit-find-symbolic",
                 NULL);
 
-  gd_tagged_entry_remove_tag (toolbar->entry, toolbar->entry_tag);
+//  gd_tagged_entry_remove_tag (toolbar->entry, toolbar->entry_tag);
 
   gtk_widget_set_sensitive (toolbar->prev, FALSE);
   gtk_widget_set_sensitive (toolbar->next, FALSE);
@@ -213,7 +214,7 @@ static void
 update_find_string (EphyFindToolbar *toolbar)
 {
   g_free (toolbar->find_string);
-  toolbar->find_string = g_strdup (gtk_entry_get_text (GTK_ENTRY (toolbar->entry)));
+  toolbar->find_string = g_strdup (gtk_editable_get_text (GTK_EDITABLE (toolbar->entry)));
 
   g_clear_handle_id (&toolbar->find_source_id, g_source_remove);
 
@@ -232,7 +233,7 @@ ephy_find_toolbar_activate_link (EphyFindToolbar *toolbar,
 {
   return FALSE;
 }
-
+#if 0 // FIXME
 static gboolean
 entry_key_press_event_cb (GtkEntry        *entry,
                           GdkEventKey     *event,
@@ -275,6 +276,7 @@ entry_key_press_event_cb (GtkEntry        *entry,
 
   return handled;
 }
+#endif
 
 static void
 entry_activate_cb (GtkWidget       *entry,
@@ -287,47 +289,23 @@ entry_activate_cb (GtkWidget       *entry,
   }
 }
 
-static void
+static gboolean
 ephy_find_toolbar_grab_focus (GtkWidget *widget)
 {
   EphyFindToolbar *toolbar = EPHY_FIND_TOOLBAR (widget);
 
-  gtk_widget_grab_focus (GTK_WIDGET (toolbar->entry));
-}
-
-static gboolean
-ephy_find_toolbar_draw (GtkWidget *widget,
-                        cairo_t   *cr)
-{
-  GtkStyleContext *context;
-
-  context = gtk_widget_get_style_context (widget);
-
-  gtk_style_context_save (context);
-  gtk_style_context_set_state (context, gtk_widget_get_state_flags (widget));
-
-  gtk_render_background (context, cr, 0, 0,
-                         gtk_widget_get_allocated_width (widget),
-                         gtk_widget_get_allocated_height (widget));
-
-  gtk_render_frame (context, cr, 0, 0,
-                    gtk_widget_get_allocated_width (widget),
-                    gtk_widget_get_allocated_height (widget));
-
-  gtk_style_context_restore (context);
-
-  return GTK_WIDGET_CLASS (ephy_find_toolbar_parent_class)->draw (widget, cr);
+  return gtk_widget_grab_focus (GTK_WIDGET (toolbar->entry));
 }
 
 static void
-search_entry_clear_cb (GtkEntry *entry,
-                       gpointer  user_data)
+search_entry_clear_cb (GtkEditable *entry,
+                       gpointer     user_data)
 {
-  gtk_entry_set_text (entry, "");
+  gtk_editable_set_text (entry, "");
 }
 
 static void
-search_entry_changed_cb (GtkEntry        *entry,
+search_entry_changed_cb (GtkEditable     *entry,
                          EphyFindToolbar *toolbar)
 {
   const char *str;
@@ -336,7 +314,7 @@ search_entry_changed_cb (GtkEntry        *entry,
   gboolean primary_active = FALSE;
   gboolean secondary_active = FALSE;
 
-  str = gtk_entry_get_text (entry);
+  str = gtk_editable_get_text (entry);
 
   if (str == NULL || *str == '\0') {
     primary_icon_name = "edit-find-symbolic";
@@ -363,7 +341,7 @@ ephy_find_toolbar_load_changed_cb (WebKitWebView   *web_view,
                                    EphyFindToolbar *toolbar)
 {
   if (load_event == WEBKIT_LOAD_STARTED &&
-      hdy_search_bar_get_search_mode (HDY_SEARCH_BAR (toolbar->search_bar))) {
+      gtk_search_bar_get_search_mode (GTK_SEARCH_BAR (toolbar->search_bar))) {
     ephy_find_toolbar_close (toolbar);
   }
 }
@@ -374,46 +352,49 @@ ephy_find_toolbar_init (EphyFindToolbar *toolbar)
   GtkWidget *clamp;
   GtkWidget *box;
 
-  toolbar->search_bar = hdy_search_bar_new ();
-  gtk_container_add (GTK_CONTAINER (toolbar), toolbar->search_bar);
+  toolbar->search_bar = gtk_search_bar_new ();
+  adw_bin_set_child (ADW_BIN (toolbar), toolbar->search_bar);
 
-  clamp = GTK_WIDGET (hdy_clamp_new ());
-  hdy_clamp_set_maximum_size (HDY_CLAMP (clamp), 400);
-  hdy_clamp_set_tightening_threshold (HDY_CLAMP (clamp), 300);
-  gtk_container_add (GTK_CONTAINER (toolbar->search_bar), clamp);
+  clamp = GTK_WIDGET (adw_clamp_new ());
+  gtk_widget_set_hexpand (clamp, TRUE);
+  adw_clamp_set_maximum_size (ADW_CLAMP (clamp), 400);
+  adw_clamp_set_tightening_threshold (ADW_CLAMP (clamp), 300);
+  gtk_search_bar_set_child (GTK_SEARCH_BAR (toolbar->search_bar), clamp);
 
   box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
-  gtk_style_context_add_class (gtk_widget_get_style_context (box), "linked");
-  gtk_container_add (GTK_CONTAINER (clamp), box);
+  gtk_widget_add_css_class (box, "linked");
+  adw_clamp_set_child (ADW_CLAMP (clamp), box);
 
-  toolbar->entry = gd_tagged_entry_new ();
-  toolbar->entry_tag = gd_tagged_entry_tag_new ("");
-  gd_tagged_entry_tag_set_style (toolbar->entry_tag, "search-entry-occurrences-tag");
-  gd_tagged_entry_tag_set_has_close_button (toolbar->entry_tag, FALSE);
+  // FIXME tagged entry
+  toolbar->entry = gtk_entry_new ();
+//  toolbar->entry = gd_tagged_entry_new ();
+//  toolbar->entry_tag = gd_tagged_entry_tag_new ("");
+//  gd_tagged_entry_tag_set_style (toolbar->entry_tag, "search-entry-occurrences-tag");
+//  gd_tagged_entry_tag_set_has_close_button (toolbar->entry_tag, FALSE);
 
   gtk_widget_set_hexpand (GTK_WIDGET (toolbar->entry), TRUE);
   gtk_entry_set_placeholder_text (GTK_ENTRY (toolbar->entry), _("Type to search…"));
-  gtk_container_add (GTK_CONTAINER (box), GTK_WIDGET (toolbar->entry));
+  gtk_box_append (GTK_BOX (box), GTK_WIDGET (toolbar->entry));
 
   /* Prev */
-  toolbar->prev = gtk_button_new_from_icon_name ("go-up-symbolic", GTK_ICON_SIZE_MENU);
+  toolbar->prev = gtk_button_new_from_icon_name ("go-up-symbolic");
   gtk_widget_set_tooltip_text (toolbar->prev,
                                _("Find previous occurrence of the search string"));
-  gtk_container_add (GTK_CONTAINER (box), toolbar->prev);
+  gtk_box_append (GTK_BOX (box), toolbar->prev);
   gtk_widget_set_sensitive (toolbar->prev, FALSE);
 
   /* Next */
-  toolbar->next = gtk_button_new_from_icon_name ("go-down-symbolic", GTK_ICON_SIZE_MENU);
+  toolbar->next = gtk_button_new_from_icon_name ("go-down-symbolic");
   gtk_widget_set_tooltip_text (toolbar->next,
                                _("Find next occurrence of the search string"));
-  gtk_container_add (GTK_CONTAINER (box), toolbar->next);
+  gtk_box_append (GTK_BOX (box), toolbar->next);
   gtk_widget_set_sensitive (toolbar->next, FALSE);
 
   /* connect signals */
   g_signal_connect (toolbar->entry, "icon-release",
                     G_CALLBACK (search_entry_clear_cb), toolbar);
-  g_signal_connect (toolbar->entry, "key-press-event",
-                    G_CALLBACK (entry_key_press_event_cb), toolbar);
+//  g_signal_connect (toolbar->entry, "key-press-event",
+//                    G_CALLBACK (entry_key_press_event_cb), toolbar);
   g_signal_connect_after (toolbar->entry, "changed",
                           G_CALLBACK (search_entry_changed_cb), toolbar);
   g_signal_connect (toolbar->entry, "activate",
@@ -422,14 +403,12 @@ ephy_find_toolbar_init (EphyFindToolbar *toolbar)
                             G_CALLBACK (ephy_find_toolbar_find_next), toolbar);
   g_signal_connect_swapped (toolbar->prev, "clicked",
                             G_CALLBACK (ephy_find_toolbar_find_previous), toolbar);
-  hdy_search_bar_connect_entry (HDY_SEARCH_BAR (toolbar->search_bar),
-                                GTK_ENTRY (toolbar->entry));
+  gtk_search_bar_connect_entry (GTK_SEARCH_BAR (toolbar->search_bar),
+                                GTK_EDITABLE (toolbar->entry));
 
-  search_entry_changed_cb (GTK_ENTRY (toolbar->entry), toolbar);
+  search_entry_changed_cb (GTK_EDITABLE (toolbar->entry), toolbar);
 
   toolbar->cancellable = g_cancellable_new ();
-
-  gtk_widget_show_all (GTK_WIDGET (toolbar));
 }
 
 static void
@@ -506,7 +485,6 @@ ephy_find_toolbar_class_init (EphyFindToolbarClass *klass)
   object_class->get_property = ephy_find_toolbar_get_property;
   object_class->set_property = ephy_find_toolbar_set_property;
 
-  widget_class->draw = ephy_find_toolbar_draw;
   widget_class->grab_focus = ephy_find_toolbar_grab_focus;
 
   signals[CLOSE] =
@@ -539,7 +517,7 @@ ephy_find_toolbar_new (WebKitWebView *web_view)
 const char *
 ephy_find_toolbar_get_text (EphyFindToolbar *toolbar)
 {
-  return gtk_entry_get_text (GTK_ENTRY (toolbar->entry));
+  return gtk_editable_get_text (GTK_EDITABLE (toolbar->entry));
 }
 
 static void
@@ -639,7 +617,7 @@ ephy_find_toolbar_selection_async (GObject      *source_object,
     if (exception) {
       g_warning ("Error running javascript: %s", jsc_exception_get_message (exception));
     } else if (strlen (str_value)) {
-      gtk_entry_set_text (GTK_ENTRY (toolbar->entry), str_value);
+      gtk_editable_set_text (GTK_EDITABLE (toolbar->entry), str_value);
       gtk_editable_select_region (GTK_EDITABLE (toolbar->entry), 0, -1);
     }
   }
@@ -659,15 +637,15 @@ ephy_find_toolbar_open (EphyFindToolbar *toolbar,
 
   gtk_editable_select_region (GTK_EDITABLE (toolbar->entry), 0, -1);
 
-  hdy_search_bar_set_search_mode (HDY_SEARCH_BAR (toolbar->search_bar), TRUE);
-  hdy_search_bar_set_show_close_button (HDY_SEARCH_BAR (toolbar->search_bar), TRUE);
+  gtk_search_bar_set_search_mode (GTK_SEARCH_BAR (toolbar->search_bar), TRUE);
+  gtk_search_bar_set_show_close_button (GTK_SEARCH_BAR (toolbar->search_bar), TRUE);
   gtk_widget_grab_focus (GTK_WIDGET (toolbar->entry));
 }
 
 void
 ephy_find_toolbar_close (EphyFindToolbar *toolbar)
 {
-  hdy_search_bar_set_search_mode (HDY_SEARCH_BAR (toolbar->search_bar), FALSE);
+  gtk_search_bar_set_search_mode (GTK_SEARCH_BAR (toolbar->search_bar), FALSE);
 
   if (toolbar->web_view == NULL) return;
 
@@ -677,7 +655,7 @@ ephy_find_toolbar_close (EphyFindToolbar *toolbar)
 void
 ephy_find_toolbar_request_close (EphyFindToolbar *toolbar)
 {
-  if (hdy_search_bar_get_search_mode (HDY_SEARCH_BAR (toolbar->search_bar))) {
+  if (gtk_search_bar_get_search_mode (GTK_SEARCH_BAR (toolbar->search_bar))) {
     g_signal_emit (toolbar, signals[CLOSE], 0);
   }
 }
diff --git a/embed/ephy-find-toolbar.h b/embed/ephy-find-toolbar.h
index 829c6355d..7fabe3073 100644
--- a/embed/ephy-find-toolbar.h
+++ b/embed/ephy-find-toolbar.h
@@ -21,7 +21,7 @@
 
 #pragma once
 
-#include <gtk/gtk.h>
+#include <adwaita.h>
 
 #include "ephy-web-view.h"
 
@@ -29,7 +29,7 @@ G_BEGIN_DECLS
 
 #define EPHY_TYPE_FIND_TOOLBAR (ephy_find_toolbar_get_type ())
 
-G_DECLARE_FINAL_TYPE (EphyFindToolbar, ephy_find_toolbar, EPHY, FIND_TOOLBAR, GtkBin)
+G_DECLARE_FINAL_TYPE (EphyFindToolbar, ephy_find_toolbar, EPHY, FIND_TOOLBAR, AdwBin)
 
 EphyFindToolbar *ephy_find_toolbar_new           (WebKitWebView *web_view);
 
diff --git a/embed/ephy-reader-handler.c b/embed/ephy-reader-handler.c
index 25adf90cb..98d81c5e8 100644
--- a/embed/ephy-reader-handler.c
+++ b/embed/ephy-reader-handler.c
@@ -27,9 +27,9 @@
 #include "ephy-settings.h"
 #include "ephy-web-view.h"
 
+#include <adwaita.h>
 #include <gio/gio.h>
 #include <glib/gi18n.h>
-#include <handy.h>
 #include <string.h>
 
 struct _EphyReaderHandler {
@@ -164,7 +164,7 @@ readability_js_finish_cb (GObject      *object,
   const gchar *title;
   const gchar *font_style;
   const gchar *color_scheme;
-  HdyStyleManager *style_manager;
+  AdwStyleManager *style_manager;
 
   js_result = webkit_web_view_run_javascript_finish (web_view, result, &error);
   if (!js_result) {
@@ -184,10 +184,10 @@ readability_js_finish_cb (GObject      *object,
                           g_settings_get_enum (EPHY_SETTINGS_READER,
                                                EPHY_PREFS_READER_FONT_STYLE));
 
-  style_manager = hdy_style_manager_get_default ();
+  style_manager = adw_style_manager_get_default ();
 
-  if (hdy_style_manager_get_system_supports_color_schemes (style_manager))
-    color_scheme = hdy_style_manager_get_dark (style_manager) ? "dark" : "light";
+  if (adw_style_manager_get_system_supports_color_schemes (style_manager))
+    color_scheme = adw_style_manager_get_dark (style_manager) ? "dark" : "light";
   else
     color_scheme = enum_nick (EPHY_TYPE_PREFS_READER_COLOR_SCHEME,
                               g_settings_get_enum (EPHY_SETTINGS_READER,
diff --git a/embed/ephy-web-view.c b/embed/ephy-web-view.c
index 12cd2455d..e90ce45f2 100644
--- a/embed/ephy-web-view.c
+++ b/embed/ephy-web-view.c
@@ -50,11 +50,11 @@
 #include "ephy-web-app-utils.h"
 #include "ephy-zoom.h"
 
+#include <adwaita.h>
 #include <gio/gio.h>
 #include <glib/gi18n.h>
 #include <glib/gstdio.h>
 #include <gtk/gtk.h>
-#include <handy.h>
 
 /**
  * SECTION:ephy-web-view
@@ -129,7 +129,7 @@ struct _EphyWebView {
   EphyWebViewErrorPage error_page;
 
   guint unresponsive_process_timeout_id;
-  GtkWidget *unresponsive_process_dialog;
+  GtkWindow *unresponsive_process_dialog;
 
   guint64 uid;
 };
@@ -161,17 +161,27 @@ open_response_cb (GtkFileChooser           *dialog,
                   WebKitFileChooserRequest *request)
 {
   if (response == GTK_RESPONSE_ACCEPT) {
-    GSList *file_list = gtk_file_chooser_get_filenames (dialog);
+    g_autoptr (GListModel) files = gtk_file_chooser_get_files (dialog);
     GPtrArray *file_array = g_ptr_array_new ();
+    g_autoptr (GFile) current_folder = NULL;
+    g_autofree char *current_folder_path = NULL;
+    guint i, n = g_list_model_get_n_items (files);
 
-    for (GSList *file = file_list; file; file = g_slist_next (file))
-      g_ptr_array_add (file_array, file->data);
+    for (i = 0; i < n; i++) {
+      g_autoptr (GFile) file = g_list_model_get_item (files, i);
+
+      g_ptr_array_add (file_array, file);
+    }
 
     g_ptr_array_add (file_array, NULL);
     webkit_file_chooser_request_select_files (request, (const char * const *)file_array->pdata);
-    g_slist_free_full (file_list, g_free);
     g_ptr_array_free (file_array, TRUE);
-    g_settings_set_string (EPHY_SETTINGS_WEB, EPHY_PREFS_WEB_LAST_UPLOAD_DIRECTORY, 
gtk_file_chooser_get_current_folder (GTK_FILE_CHOOSER (dialog)));
+
+    current_folder = gtk_file_chooser_get_current_folder (dialog);
+    current_folder_path  = g_file_get_path (current_folder);
+    g_settings_set_string (EPHY_SETTINGS_WEB,
+                           EPHY_PREFS_WEB_LAST_UPLOAD_DIRECTORY,
+                           current_folder_path);
   } else {
     webkit_file_chooser_request_cancel (request);
   }
@@ -184,23 +194,30 @@ static gboolean
 ephy_web_view_run_file_chooser (WebKitWebView            *web_view,
                                 WebKitFileChooserRequest *request)
 {
-  GtkWidget *toplevel = gtk_widget_get_toplevel (GTK_WIDGET (web_view));
+  GtkRoot *root = gtk_widget_get_root(GTK_WIDGET (web_view));
   GtkFileChooser *dialog;
   gboolean allows_multiple_selection = webkit_file_chooser_request_get_select_multiple (request);
   GtkFileFilter *filter = webkit_file_chooser_request_get_mime_types_filter (request);
+  g_autoptr (GFile) current_folder = NULL;
+  g_autoptr (GError) error = NULL;
 
   dialog = ephy_create_file_chooser (_("Open"),
-                                     GTK_WIDGET (toplevel),
+                                     GTK_WIDGET (root),
                                      GTK_FILE_CHOOSER_ACTION_OPEN,
                                      EPHY_FILE_FILTER_ALL);
 
   if (filter) {
-    gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (dialog), filter);
-    gtk_file_chooser_set_filter (GTK_FILE_CHOOSER (dialog), filter);
+    gtk_file_chooser_add_filter (dialog, filter);
+    gtk_file_chooser_set_filter (dialog, filter);
   }
 
-  gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (dialog), g_settings_get_string (EPHY_SETTINGS_WEB, 
EPHY_PREFS_WEB_LAST_UPLOAD_DIRECTORY));
-  gtk_file_chooser_set_select_multiple (GTK_FILE_CHOOSER (dialog), allows_multiple_selection);
+  current_folder = g_file_new_for_path (g_settings_get_string (EPHY_SETTINGS_WEB,
+                                                               EPHY_PREFS_WEB_LAST_UPLOAD_DIRECTORY));
+  gtk_file_chooser_set_current_folder (dialog, current_folder, &error);
+  if (error)
+    g_info ("Failed to set current folder to: %s", error->message);
+
+  gtk_file_chooser_set_select_multiple (dialog, allows_multiple_selection);
 
   g_signal_connect (dialog, "response",
                     G_CALLBACK (open_response_cb),
@@ -288,7 +305,7 @@ ephy_web_view_set_property (GObject      *object,
       break;
   }
 }
-
+/* FIXME the button one should be a controller, not sure about the key one
 static gboolean
 ephy_web_view_key_press_event (GtkWidget   *widget,
                                GdkEventKey *event)
@@ -310,10 +327,10 @@ static gboolean
 ephy_web_view_button_press_event (GtkWidget      *widget,
                                   GdkEventButton *event)
 {
-  /* These are the special cases WebkitWebView doesn't handle but we have an
-   * interest in handling. */
+  *//* These are the special cases WebkitWebView doesn't handle but we have an
+   * interest in handling. *//*
 
-  /* Handle typical back/forward mouse buttons. */
+  *//* Handle typical back/forward mouse buttons. *//*
   if (event->button == 8) {
     webkit_web_view_go_back (WEBKIT_WEB_VIEW (widget));
     return TRUE;
@@ -324,9 +341,18 @@ ephy_web_view_button_press_event (GtkWidget      *widget,
     return TRUE;
   }
 
-  /* Let WebKitWebView handle this. */
+  *//* Let WebKitWebView handle this. *//*
   return GTK_WIDGET_CLASS (ephy_web_view_parent_class)->button_press_event (widget, event);
 }
+*/
+
+static inline void
+remove_info_bar (GtkWidget *info_bar)
+{
+  EphyEmbed *embed = EPHY_EMBED (gtk_widget_get_ancestor (info_bar, EPHY_TYPE_EMBED));
+
+  ephy_embed_remove_top_widget (embed, info_bar);
+}
 
 static void
 untrack_info_bar (GtkWidget **tracked_info_bar)
@@ -336,7 +362,7 @@ untrack_info_bar (GtkWidget **tracked_info_bar)
 
   if (*tracked_info_bar) {
     g_object_remove_weak_pointer (G_OBJECT (*tracked_info_bar), (gpointer *)tracked_info_bar);
-    gtk_widget_destroy (*tracked_info_bar);
+    remove_info_bar (*tracked_info_bar);
     *tracked_info_bar = NULL;
   }
 }
@@ -362,7 +388,6 @@ ephy_web_view_create_form_auth_save_confirmation_info_bar (EphyWebView *web_view
                                                            const char  *username)
 {
   GtkWidget *info_bar;
-  GtkWidget *content_area;
   GtkWidget *label;
   char *message;
 
@@ -379,13 +404,11 @@ ephy_web_view_create_form_auth_save_confirmation_info_bar (EphyWebView *web_view
    */
   message = g_markup_printf_escaped (_("Do you want to save your password for “%s”?"), origin);
   gtk_label_set_markup (GTK_LABEL (label), message);
-  gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
+  gtk_label_set_wrap (GTK_LABEL (label), TRUE);
   gtk_label_set_xalign (GTK_LABEL (label), 0);
   g_free (message);
 
-  content_area = gtk_info_bar_get_content_area (GTK_INFO_BAR (info_bar));
-  gtk_container_add (GTK_CONTAINER (content_area), label);
-  gtk_widget_show (label);
+  gtk_info_bar_add_child (GTK_INFO_BAR (info_bar), label);
 
   track_info_bar (info_bar, &web_view->password_info_bar);
 
@@ -419,7 +442,7 @@ info_bar_save_request_response_cb (GtkInfoBar      *info_bar,
 {
   g_assert (data->callback);
   data->callback (response_id, data->callback_data);
-  gtk_widget_destroy (GTK_WIDGET (info_bar));
+  remove_info_bar (GTK_WIDGET (info_bar));
 }
 
 void
@@ -606,7 +629,6 @@ password_form_focused_cb (EphyEmbedShell *shell,
 {
   GtkWidget *info_bar;
   GtkWidget *label;
-  GtkWidget *content_area;
 
   if (web_view->password_form_info_bar)
     return;
@@ -617,15 +639,13 @@ password_form_focused_cb (EphyEmbedShell *shell,
 
   /* Translators: Message appears when insecure password form is focused. */
   label = gtk_label_new (_("Heads-up: this form is not secure. If you type your password, it will not be 
kept private."));
-  gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
+  gtk_label_set_wrap (GTK_LABEL (label), TRUE);
   gtk_label_set_xalign (GTK_LABEL (label), 0);
-  gtk_widget_show (label);
 
   info_bar = gtk_info_bar_new ();
   gtk_info_bar_set_message_type (GTK_INFO_BAR (info_bar), GTK_MESSAGE_WARNING);
   gtk_info_bar_set_show_close_button (GTK_INFO_BAR (info_bar), TRUE);
-  content_area = gtk_info_bar_get_content_area (GTK_INFO_BAR (info_bar));
-  gtk_container_add (GTK_CONTAINER (content_area), label);
+  gtk_info_bar_add_child (GTK_INFO_BAR (info_bar), label);
 
   g_signal_connect (info_bar, "response", G_CALLBACK (gtk_widget_hide), NULL);
 
@@ -634,7 +654,6 @@ password_form_focused_cb (EphyEmbedShell *shell,
   ephy_embed_add_top_widget (EPHY_GET_EMBED_FROM_EPHY_WEB_VIEW (web_view),
                              info_bar,
                              EPHY_EMBED_TOP_WIDGET_POLICY_DESTROY_ON_TRANSITION);
-  gtk_widget_show (info_bar);
 }
 
 static void
@@ -864,7 +883,7 @@ on_unresponsive_dialog_response (GtkDialog *dialog,
                                                                             
(GSourceFunc)unresponsive_process_timeout_cb,
                                                                             web_view,
                                                                             NULL);
-  g_clear_pointer (&web_view->unresponsive_process_dialog, gtk_widget_destroy);
+  g_clear_pointer (&web_view->unresponsive_process_dialog, gtk_window_destroy);
 }
 
 static gboolean
@@ -875,18 +894,19 @@ unresponsive_process_timeout_cb (gpointer user_data)
   if (!gtk_widget_get_mapped (GTK_WIDGET (web_view)))
     return G_SOURCE_CONTINUE;
 
-  web_view->unresponsive_process_dialog = gtk_message_dialog_new (GTK_WINDOW (gtk_widget_get_toplevel 
(GTK_WIDGET (web_view))),
-                                                                  GTK_DIALOG_MODAL | 
GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_USE_HEADER_BAR,
-                                                                  GTK_MESSAGE_QUESTION,
-                                                                  GTK_BUTTONS_NONE,
-                                                                  _("The current page '%s' is unresponsive"),
-                                                                  ephy_web_view_get_address (web_view));
+  web_view->unresponsive_process_dialog =
+    GTK_WINDOW (gtk_message_dialog_new (GTK_WINDOW (gtk_widget_get_root (GTK_WIDGET (web_view))),
+                                        GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT | 
GTK_DIALOG_USE_HEADER_BAR,
+                                        GTK_MESSAGE_QUESTION,
+                                        GTK_BUTTONS_NONE,
+                                        _("The current page '%s' is unresponsive"),
+                                        ephy_web_view_get_address (web_view)));
 
   gtk_dialog_add_button (GTK_DIALOG (web_view->unresponsive_process_dialog), _("_Wait"), GTK_RESPONSE_NO);
   gtk_dialog_add_button (GTK_DIALOG (web_view->unresponsive_process_dialog), _("_Kill"), GTK_RESPONSE_YES);
 
   g_signal_connect (web_view->unresponsive_process_dialog, "response", G_CALLBACK 
(on_unresponsive_dialog_response), web_view);
-  gtk_widget_show_all (web_view->unresponsive_process_dialog);
+  gtk_window_present (web_view->unresponsive_process_dialog);
 
   web_view->unresponsive_process_timeout_id = 0;
 
@@ -904,7 +924,7 @@ is_web_process_responsive_changed_cb (EphyWebView *web_view,
 
   if (web_view->unresponsive_process_dialog && responsive) {
     g_signal_handlers_disconnect_by_func (web_view->unresponsive_process_dialog, 
on_unresponsive_dialog_response, web_view);
-    g_clear_pointer (&web_view->unresponsive_process_dialog, gtk_widget_destroy);
+    g_clear_pointer (&web_view->unresponsive_process_dialog, gtk_window_destroy);
   }
 
   if (!responsive) {
@@ -1091,7 +1111,7 @@ decide_on_permission_request (GtkWidget             *info_bar,
   }
 
   g_object_weak_unref (G_OBJECT (info_bar), (GWeakNotify)permission_request_info_bar_destroyed_cb, data);
-  gtk_widget_destroy (info_bar);
+  remove_info_bar (info_bar);
   permission_request_data_free (data);
 }
 
@@ -1102,7 +1122,6 @@ show_permission_request_info_bar (WebKitWebView           *web_view,
 {
   PermissionRequestData *data;
   GtkWidget *info_bar;
-  GtkWidget *content_area;
   GtkWidget *label;
   char *message;
   char *origin;
@@ -1152,13 +1171,10 @@ show_permission_request_info_bar (WebKitWebView           *web_view,
 
   label = gtk_label_new (NULL);
   gtk_label_set_markup (GTK_LABEL (label), message);
-  gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
+  gtk_label_set_wrap (GTK_LABEL (label), TRUE);
   gtk_label_set_xalign (GTK_LABEL (label), 0);
 
-  content_area = gtk_info_bar_get_content_area (GTK_INFO_BAR (info_bar));
-  gtk_container_add (GTK_CONTAINER (content_area), label);
-
-  gtk_widget_show_all (info_bar);
+  gtk_info_bar_add_child (GTK_INFO_BAR (info_bar), label);
 
   data = permission_request_data_new (EPHY_WEB_VIEW (web_view), decision, origin);
 
@@ -1212,7 +1228,7 @@ decide_on_itp_permission_request (GtkWidget               *info_bar,
   }
 
   g_object_set_data (G_OBJECT (info_bar), "ephy-itp-decision", NULL);
-  gtk_widget_destroy (info_bar);
+  remove_info_bar (info_bar);
 }
 
 static void
@@ -1220,7 +1236,6 @@ ephy_web_view_show_itp_permission_info_bar (EphyWebView
                                             WebKitWebsiteDataAccessPermissionRequest *decision)
 {
   GtkWidget *info_bar;
-  GtkWidget *content_area;
   GtkWidget *box;
   GtkWidget *label;
   g_autofree char *message = NULL;
@@ -1241,21 +1256,17 @@ ephy_web_view_show_itp_permission_info_bar (EphyWebView
   markup = g_strdup_printf ("<span weight='bold'>%s</span>", message);
   label = gtk_label_new (NULL);
   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_label_set_xalign (GTK_LABEL (label), 0);
-  gtk_container_add (GTK_CONTAINER (box), label);
-  gtk_widget_show (label);
+  gtk_box_append (GTK_BOX (box), label);
 
   secondary_message = g_strdup_printf (_("This will allow “%s” to track your activity."), requesting_domain);
   label = gtk_label_new (secondary_message);
-  gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
+  gtk_label_set_wrap (GTK_LABEL (label), TRUE);
   gtk_label_set_xalign (GTK_LABEL (label), 0);
-  gtk_container_add (GTK_CONTAINER (box), label);
-  gtk_widget_show (label);
+  gtk_box_append (GTK_BOX (box), label);
 
-  content_area = gtk_info_bar_get_content_area (GTK_INFO_BAR (info_bar));
-  gtk_container_add (GTK_CONTAINER (content_area), box);
-  gtk_widget_show (box);
+  gtk_info_bar_add_child (GTK_INFO_BAR (info_bar), box);
 
   track_info_bar (info_bar, &web_view->itp_info_bar);
 
@@ -1267,7 +1278,6 @@ ephy_web_view_show_itp_permission_info_bar (EphyWebView
   ephy_embed_add_top_widget (EPHY_GET_EMBED_FROM_EPHY_WEB_VIEW (web_view),
                              info_bar,
                              EPHY_EMBED_TOP_WIDGET_POLICY_DESTROY_ON_TRANSITION);
-  gtk_widget_show (info_bar);
 }
 
 static gboolean
@@ -1503,7 +1513,7 @@ update_security_status_for_committed_load (EphyWebView *view,
 {
   EphySecurityLevel security_level = EPHY_SECURITY_LEVEL_NO_SECURITY;
   EphyEmbed *embed = NULL;
-  GtkWidget *toplevel;
+  GtkRoot *root;
   WebKitWebContext *web_context;
   WebKitSecurityManager *security_manager;
   g_autoptr (GUri) guri = NULL;
@@ -1517,8 +1527,8 @@ update_security_status_for_committed_load (EphyWebView *view,
     return;
   }
 
-  toplevel = gtk_widget_get_toplevel (GTK_WIDGET (view));
-  if (EPHY_IS_EMBED_CONTAINER (toplevel))
+  root = gtk_widget_get_root (GTK_WIDGET (view));
+  if (EPHY_IS_EMBED_CONTAINER (root))
     embed = EPHY_GET_EMBED_FROM_EPHY_WEB_VIEW (view);
   web_context = webkit_web_view_get_context (WEBKIT_WEB_VIEW (view));
   security_manager = webkit_web_context_get_security_manager (web_context);
@@ -2511,15 +2521,15 @@ close_web_view_cb (WebKitWebView *web_view,
                    gpointer       user_data)
 
 {
-  GtkWidget *widget = gtk_widget_get_toplevel (GTK_WIDGET (web_view));
+  GtkRoot *root = gtk_widget_get_root (GTK_WIDGET (web_view));
 
   LOG ("close web view");
 
-  if (EPHY_IS_EMBED_CONTAINER (widget))
-    ephy_embed_container_remove_child (EPHY_EMBED_CONTAINER (widget),
+  if (EPHY_IS_EMBED_CONTAINER (root))
+    ephy_embed_container_remove_child (EPHY_EMBED_CONTAINER (root),
                                        EPHY_GET_EMBED_FROM_EPHY_WEB_VIEW (web_view));
   else
-    gtk_widget_destroy (widget);
+    gtk_window_destroy (GTK_WINDOW (root));
 }
 
 
@@ -2579,7 +2589,7 @@ enum_nick (GType enum_type,
 static void
 reader_setting_changed_cb (EphyWebView *web_view)
 {
-  HdyStyleManager *style_manager;
+  AdwStyleManager *style_manager;
   const gchar *font_style;
   const gchar *color_scheme;
   gchar *js_snippet;
@@ -2591,10 +2601,10 @@ reader_setting_changed_cb (EphyWebView *web_view)
                           g_settings_get_enum (EPHY_SETTINGS_READER,
                                                EPHY_PREFS_READER_FONT_STYLE));
 
-  style_manager = hdy_style_manager_get_default ();
+  style_manager = adw_style_manager_get_default ();
 
-  if (hdy_style_manager_get_system_supports_color_schemes (style_manager))
-    color_scheme = hdy_style_manager_get_dark (style_manager) ? "dark" : "light";
+  if (adw_style_manager_get_system_supports_color_schemes (style_manager))
+    color_scheme = adw_style_manager_get_dark (style_manager) ? "dark" : "light";
   else
     color_scheme = enum_nick (EPHY_TYPE_PREFS_READER_COLOR_SCHEME,
                               g_settings_get_enum (EPHY_SETTINGS_READER,
@@ -3585,26 +3595,29 @@ ephy_web_view_get_security_level (EphyWebView           *view,
     *errors = view->tls_errors;
 }
 
+static void
+info_bar_response_cb (GtkInfoBar *info_bar,
+                      int         response_id,
+                      EphyEmbed  *embed)
+{
+  ephy_embed_remove_top_widget (embed, GTK_WIDGET (info_bar));
+}
+
 static void
 ephy_web_view_print_failed (EphyWebView *view,
                             GError      *error)
 {
   GtkWidget *info_bar;
   GtkWidget *label;
-  GtkContainer *content_area;
   EphyEmbed *embed = EPHY_GET_EMBED_FROM_EPHY_WEB_VIEW (view);
 
   info_bar = gtk_info_bar_new_with_buttons (_("_OK"), GTK_RESPONSE_OK, NULL);
   label = gtk_label_new (error->message);
-  content_area = GTK_CONTAINER (gtk_info_bar_get_content_area (GTK_INFO_BAR (info_bar)));
 
-  gtk_info_bar_set_message_type (GTK_INFO_BAR (info_bar), GTK_MESSAGE_ERROR);
-  gtk_container_add (content_area, label);
-  g_signal_connect (info_bar, "response",
-                    G_CALLBACK (gtk_widget_destroy), NULL);
+  gtk_info_bar_add_child (GTK_INFO_BAR (info_bar), label);
+  g_signal_connect (info_bar, "response", G_CALLBACK (info_bar_response_cb), embed);
 
   ephy_embed_add_top_widget (embed, info_bar, EPHY_EMBED_TOP_WIDGET_POLICY_RETAIN_ON_TRANSITION);
-  gtk_widget_show_all (info_bar);
 }
 
 static void
@@ -3911,7 +3924,7 @@ ephy_web_view_dispose (GObject *object)
   g_clear_object (&view->certificate);
   g_clear_object (&view->file_monitor);
   g_clear_object (&view->icon);
-  g_clear_pointer (&view->unresponsive_process_dialog, gtk_widget_destroy);
+  g_clear_pointer (&view->unresponsive_process_dialog, gtk_window_destroy);
 
   if (view->cancellable) {
     g_cancellable_cancel (view->cancellable);
@@ -4001,12 +4014,12 @@ ephy_web_view_init (EphyWebView *web_view)
                            G_CALLBACK (reader_setting_changed_cb),
                            web_view, G_CONNECT_SWAPPED);
 
-  g_signal_connect_object (hdy_style_manager_get_default (),
+  g_signal_connect_object (adw_style_manager_get_default (),
                            "notify::system-supports-color-schemes",
                            G_CALLBACK (reader_setting_changed_cb),
                            web_view, G_CONNECT_SWAPPED);
 
-  g_signal_connect_object (hdy_style_manager_get_default (),
+  g_signal_connect_object (adw_style_manager_get_default (),
                            "notify::dark",
                            G_CALLBACK (reader_setting_changed_cb),
                            web_view, G_CONNECT_SWAPPED);
@@ -4089,13 +4102,15 @@ ephy_web_view_init (EphyWebView *web_view)
   g_signal_connect_object (shell, "allow-unsafe-browsing",
                            G_CALLBACK (allow_unsafe_browsing_cb),
                            web_view, 0);
+
+  gtk_widget_set_overflow (GTK_WIDGET (web_view), GTK_OVERFLOW_HIDDEN);
 }
 
 static void
 ephy_web_view_class_init (EphyWebViewClass *klass)
 {
   GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
-  GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
+//  GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
   WebKitWebViewClass *webkit_webview_class = WEBKIT_WEB_VIEW_CLASS (klass);
 
   gobject_class->dispose = ephy_web_view_dispose;
@@ -4104,8 +4119,8 @@ ephy_web_view_class_init (EphyWebViewClass *klass)
   gobject_class->set_property = ephy_web_view_set_property;
   gobject_class->constructed = ephy_web_view_constructed;
 
-  widget_class->button_press_event = ephy_web_view_button_press_event;
-  widget_class->key_press_event = ephy_web_view_key_press_event;
+//  widget_class->button_press_event = ephy_web_view_button_press_event;
+// FIXME  widget_class->key_press_event = ephy_web_view_key_press_event;
 
   webkit_webview_class->run_file_chooser = ephy_web_view_run_file_chooser;
 
diff --git a/embed/meson.build b/embed/meson.build
index 28b95859c..7d94b9864 100644
--- a/embed/meson.build
+++ b/embed/meson.build
@@ -11,7 +11,7 @@ enums = gnome.mkenums_simple('ephy-embed-type-builtins',
 )
 
 libephyembed_sources = [
-  'contrib/gd-tagged-entry.c',
+#  'contrib/gd-tagged-entry.c',
   'ephy-about-handler.c',
   'ephy-downloads-manager.c',
   'ephy-download.c',
@@ -34,12 +34,11 @@ libephyembed_sources = [
 
 libephyembed_deps = [
   config_h,
-  libdazzle_dep,
   ephymisc_dep,
   gio_dep,
   glib_dep,
   gtk_dep,
-  libhandy_dep,
+  libadwaita_dep,
   libsecret_dep,
   libsoup_dep,
   m_dep,
diff --git a/lib/contrib/dzl-fuzzy-mutable-index.c b/lib/contrib/dzl-fuzzy-mutable-index.c
new file mode 100644
index 000000000..e5ebb38c6
--- /dev/null
+++ b/lib/contrib/dzl-fuzzy-mutable-index.c
@@ -0,0 +1,722 @@
+/* dzl-fuzzy-mutable-index.c
+ *
+ * Copyright (C) 2014-2017 Christian Hergert <christian hergert me>
+ *
+ * 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/>.
+ */
+
+#include "config.h"
+
+#include <ctype.h>
+#include <string.h>
+
+#include "dzl-fuzzy-mutable-index.h"
+
+/**
+ * SECTION:dzl-fuzzy-mutable-index
+ * @title: DzlFuzzyMutableIndex Matching
+ * @short_description: DzlFuzzyMutableIndex matching for GLib based programs.
+ *
+ * #DzlFuzzyMutableIndex provides a fulltext index that focuses around fuzzy
+ * matching words. This version of the datastructure is focused around
+ * in-memory storage. This makes mutability performance of adding or removing
+ * items from the corpus simpler.
+ *
+ * If you need mostly read-only indexes, you might consider using
+ * #DzlFuzzyIndex and #DzlFuzzyIndexBuilder which can create a disk-based file
+ * and mmap() a read-only version of the data set.
+ *
+ * It is a programming error to modify #Fuzzy while holding onto an array
+ * of #FuzzyMatch elements. The position of strings within the DzlFuzzyMutableIndexMatch
+ * may no longer be valid.
+ */
+
+G_DEFINE_BOXED_TYPE (DzlFuzzyMutableIndex, dzl_fuzzy_mutable_index,
+                     (GBoxedCopyFunc)dzl_fuzzy_mutable_index_ref,
+                     (GBoxedFreeFunc)dzl_fuzzy_mutable_index_unref)
+
+struct _DzlFuzzyMutableIndex
+{
+  volatile gint   ref_count;
+  GByteArray     *heap;
+  GArray         *id_to_text_offset;
+  GPtrArray      *id_to_value;
+  GHashTable     *char_tables;
+  GHashTable     *removed;
+  guint           in_bulk_insert : 1;
+  guint           case_sensitive : 1;
+};
+
+#pragma pack(push, 1)
+typedef struct
+{
+#ifdef G_OS_WIN32
+  guint32 id;
+  guint16 pos;
+#else
+  guint64 id : 32;
+  guint64 pos : 16;
+#endif
+} DzlFuzzyMutableIndexItem;
+#pragma pack(pop)
+
+G_STATIC_ASSERT (sizeof(DzlFuzzyMutableIndexItem) == 6);
+
+typedef struct
+{
+   DzlFuzzyMutableIndex        *fuzzy;
+   GArray      **tables;
+   gint         *state;
+   guint         n_tables;
+   gsize         max_matches;
+   const gchar  *needle;
+   GHashTable   *matches;
+} DzlFuzzyMutableIndexLookup;
+
+static gint
+dzl_fuzzy_mutable_index_item_compare (gconstpointer a,
+                                      gconstpointer b)
+{
+  gint ret;
+
+  const DzlFuzzyMutableIndexItem *fa = a;
+  const DzlFuzzyMutableIndexItem *fb = b;
+
+  if ((ret = fa->id - fb->id) == 0)
+    ret = fa->pos - fb->pos;
+
+  return ret;
+}
+
+static gint
+dzl_fuzzy_mutable_index_match_compare (gconstpointer a,
+                                       gconstpointer b)
+{
+  const DzlFuzzyMutableIndexMatch *ma = a;
+  const DzlFuzzyMutableIndexMatch *mb = b;
+
+  if (ma->score < mb->score) {
+    return 1;
+  } else if (ma->score > mb->score) {
+    return -1;
+  }
+
+  return strcmp (ma->key, mb->key);
+}
+
+DzlFuzzyMutableIndex *
+dzl_fuzzy_mutable_index_ref (DzlFuzzyMutableIndex *fuzzy)
+{
+  g_return_val_if_fail (fuzzy, NULL);
+  g_return_val_if_fail (fuzzy->ref_count > 0, NULL);
+
+  g_atomic_int_inc (&fuzzy->ref_count);
+
+  return fuzzy;
+}
+
+/**
+ * dzl_fuzzy_mutable_index_new:
+ * @case_sensitive: %TRUE if case should be preserved.
+ *
+ * Create a new #Fuzzy for fuzzy matching strings.
+ *
+ * Returns: A newly allocated #Fuzzy that should be freed with dzl_fuzzy_mutable_index_unref().
+ */
+DzlFuzzyMutableIndex *
+dzl_fuzzy_mutable_index_new (gboolean case_sensitive)
+{
+  DzlFuzzyMutableIndex *fuzzy;
+
+  fuzzy = g_slice_new0 (DzlFuzzyMutableIndex);
+  fuzzy->ref_count = 1;
+  fuzzy->heap = g_byte_array_new ();
+  fuzzy->id_to_value = g_ptr_array_new ();
+  fuzzy->id_to_text_offset = g_array_new (FALSE, FALSE, sizeof (gsize));
+  fuzzy->char_tables = g_hash_table_new_full (NULL, NULL, NULL, (GDestroyNotify)g_array_unref);
+  fuzzy->case_sensitive = case_sensitive;
+  fuzzy->removed = g_hash_table_new (g_direct_hash, g_direct_equal);
+
+  return fuzzy;
+}
+
+DzlFuzzyMutableIndex *
+dzl_fuzzy_mutable_index_new_with_free_func (gboolean       case_sensitive,
+                                            GDestroyNotify free_func)
+{
+  DzlFuzzyMutableIndex *fuzzy;
+
+  fuzzy = dzl_fuzzy_mutable_index_new (case_sensitive);
+  dzl_fuzzy_mutable_index_set_free_func (fuzzy, free_func);
+
+  return fuzzy;
+}
+
+void
+dzl_fuzzy_mutable_index_set_free_func (DzlFuzzyMutableIndex *fuzzy,
+                                       GDestroyNotify        free_func)
+{
+  g_return_if_fail (fuzzy);
+
+  g_ptr_array_set_free_func (fuzzy->id_to_value, free_func);
+}
+
+static gsize
+dzl_fuzzy_mutable_index_heap_insert (DzlFuzzyMutableIndex *fuzzy,
+                                     const gchar          *text)
+{
+  gsize ret;
+
+  g_assert (fuzzy != NULL);
+  g_assert (text != NULL);
+
+  ret = fuzzy->heap->len;
+
+  g_byte_array_append (fuzzy->heap, (guint8 *)text, strlen (text) + 1);
+
+  return ret;
+}
+
+/**
+ * dzl_fuzzy_mutable_index_begin_bulk_insert:
+ * @fuzzy: (in): A #Fuzzy.
+ *
+ * Start a bulk insertion. @fuzzy is not ready for searching until
+ * dzl_fuzzy_mutable_index_end_bulk_insert() has been called.
+ *
+ * This allows for inserting large numbers of strings and deferring
+ * the final sort until dzl_fuzzy_mutable_index_end_bulk_insert().
+ */
+void
+dzl_fuzzy_mutable_index_begin_bulk_insert (DzlFuzzyMutableIndex *fuzzy)
+{
+   g_return_if_fail (fuzzy);
+   g_return_if_fail (!fuzzy->in_bulk_insert);
+
+   fuzzy->in_bulk_insert = TRUE;
+}
+
+/**
+ * dzl_fuzzy_mutable_index_end_bulk_insert:
+ * @fuzzy: (in): A #Fuzzy.
+ *
+ * Complete a bulk insert and resort the index.
+ */
+void
+dzl_fuzzy_mutable_index_end_bulk_insert (DzlFuzzyMutableIndex *fuzzy)
+{
+   GHashTableIter iter;
+   gpointer key;
+   gpointer value;
+
+   g_return_if_fail(fuzzy);
+   g_return_if_fail(fuzzy->in_bulk_insert);
+
+   fuzzy->in_bulk_insert = FALSE;
+
+   g_hash_table_iter_init (&iter, fuzzy->char_tables);
+
+   while (g_hash_table_iter_next (&iter, &key, &value)) {
+      GArray *table = value;
+
+      g_array_sort (table, dzl_fuzzy_mutable_index_item_compare);
+   }
+}
+
+/**
+ * dzl_fuzzy_mutable_index_insert:
+ * @fuzzy: (in): A #Fuzzy.
+ * @key: (in): A UTF-8 encoded string.
+ * @value: (in): A value to associate with key.
+ *
+ * Inserts a string into the fuzzy matcher.
+ */
+void
+dzl_fuzzy_mutable_index_insert (DzlFuzzyMutableIndex *fuzzy,
+                                const gchar          *key,
+                                gpointer              value)
+{
+  const gchar *tmp;
+  gchar *downcase = NULL;
+  gsize offset;
+  guint id;
+
+  if (G_UNLIKELY (!key || !*key || (fuzzy->id_to_text_offset->len == G_MAXUINT)))
+    return;
+
+  if (!fuzzy->case_sensitive)
+    downcase = g_utf8_casefold (key, -1);
+
+  offset = dzl_fuzzy_mutable_index_heap_insert (fuzzy, key);
+  id = fuzzy->id_to_text_offset->len;
+  g_array_append_val (fuzzy->id_to_text_offset, offset);
+  g_ptr_array_add (fuzzy->id_to_value, value);
+
+  if (!fuzzy->case_sensitive)
+    key = downcase;
+
+  for (tmp = key; *tmp; tmp = g_utf8_next_char (tmp))
+    {
+      gunichar ch = g_utf8_get_char (tmp);
+      GArray *table;
+      DzlFuzzyMutableIndexItem item;
+
+      table = g_hash_table_lookup (fuzzy->char_tables, GINT_TO_POINTER (ch));
+
+      if (G_UNLIKELY (table == NULL))
+        {
+          table = g_array_new (FALSE, FALSE, sizeof (DzlFuzzyMutableIndexItem));
+          g_hash_table_insert (fuzzy->char_tables, GINT_TO_POINTER (ch), table);
+        }
+
+      item.id = id;
+      item.pos = (guint)(gsize)(tmp - key);
+
+      g_array_append_val (table, item);
+    }
+
+  if (G_UNLIKELY (!fuzzy->in_bulk_insert))
+    {
+      for (tmp = key; *tmp; tmp = g_utf8_next_char (tmp))
+        {
+          GArray *table;
+          gunichar ch;
+
+          ch = g_utf8_get_char (tmp);
+          table = g_hash_table_lookup (fuzzy->char_tables, GINT_TO_POINTER (ch));
+          g_array_sort (table, dzl_fuzzy_mutable_index_item_compare);
+        }
+    }
+
+  g_free (downcase);
+}
+
+/**
+ * dzl_fuzzy_mutable_index_unref:
+ * @fuzzy: A #Fuzzy.
+ *
+ * Decrements the reference count of fuzzy by one. When the reference count
+ * reaches zero, the structure will be freed.
+ */
+void
+dzl_fuzzy_mutable_index_unref (DzlFuzzyMutableIndex *fuzzy)
+{
+  g_return_if_fail (fuzzy);
+  g_return_if_fail (fuzzy->ref_count > 0);
+
+  if (G_UNLIKELY (g_atomic_int_dec_and_test (&fuzzy->ref_count)))
+    {
+      g_byte_array_unref (fuzzy->heap);
+      fuzzy->heap = NULL;
+
+      g_array_unref (fuzzy->id_to_text_offset);
+      fuzzy->id_to_text_offset = NULL;
+
+      g_ptr_array_unref (fuzzy->id_to_value);
+      fuzzy->id_to_value = NULL;
+
+      g_hash_table_unref (fuzzy->char_tables);
+      fuzzy->char_tables = NULL;
+
+      g_hash_table_unref (fuzzy->removed);
+      fuzzy->removed = NULL;
+
+      g_slice_free (DzlFuzzyMutableIndex, fuzzy);
+    }
+}
+
+static void
+rollback_state_to_pos (GArray *table,
+                       gint   *state,
+                       guint   id,
+                       guint   pos)
+{
+  g_assert (table != NULL);
+  g_assert (state != NULL);
+  g_assert (pos > 0);
+
+  while (*state > 0 && *state <= table->len)
+    {
+      DzlFuzzyMutableIndexItem *iter;
+
+      (*state)--;
+
+      iter = &g_array_index (table, DzlFuzzyMutableIndexItem, *state);
+
+      if (iter->id > id || (iter->id == id && *state >= pos))
+        continue;
+
+      break;
+    }
+}
+
+static gboolean
+dzl_fuzzy_mutable_index_do_match (DzlFuzzyMutableIndexLookup *lookup,
+                                  DzlFuzzyMutableIndexItem   *item,
+                                  guint                       table_index,
+                                  gint                        score)
+{
+  gboolean ret = FALSE;
+  GArray *table;
+  gint *state;
+
+  table = lookup->tables [table_index];
+  state = &lookup->state [table_index];
+
+  for (; state [0] < (gint)table->len; state [0]++)
+    {
+      DzlFuzzyMutableIndexItem *iter;
+      gpointer key;
+      gint iter_score;
+
+      iter = &g_array_index (table, DzlFuzzyMutableIndexItem, state[0]);
+
+      if ((iter->id < item->id) || ((iter->id == item->id) && (iter->pos <= item->pos)))
+        continue;
+      else if (iter->id > item->id)
+        break;
+
+      iter_score = score + (iter->pos - item->pos - 1);
+
+      if ((table_index + 1) < lookup->n_tables)
+        {
+          if (dzl_fuzzy_mutable_index_do_match (lookup, iter, table_index + 1, iter_score))
+            {
+              ret = TRUE;
+
+              /* We already found a match, but we could have a better match
+               * further in the word. We need to rollback all of our additional
+               * table state to the current position so that we can possibly
+               * advance again.
+               */
+              if ((state[0] + 1) < table->len &&
+                  g_array_index (table, DzlFuzzyMutableIndexItem, state[0] + 1).id == item->id)
+                {
+                  for (guint i = table_index + 1; i < lookup->n_tables; i++)
+                    rollback_state_to_pos (lookup->tables[i], &lookup->state[i], iter->id, iter->pos + 1);
+                }
+            }
+          continue;
+        }
+
+      key = GINT_TO_POINTER (iter->id);
+
+      if (!g_hash_table_contains (lookup->matches, key) ||
+          (iter_score < GPOINTER_TO_INT (g_hash_table_lookup (lookup->matches, key))))
+        g_hash_table_insert (lookup->matches, key, GINT_TO_POINTER (iter_score));
+
+      ret = TRUE;
+    }
+
+  return ret;
+}
+
+static inline const gchar *
+dzl_fuzzy_mutable_index_get_string (DzlFuzzyMutableIndex *fuzzy,
+                                    gint                  id)
+{
+  guint offset = g_array_index (fuzzy->id_to_text_offset, gsize, id);
+  return (const gchar *)&fuzzy->heap->data [offset];
+}
+
+/**
+ * dzl_fuzzy_mutable_index_match:
+ * @fuzzy: (in): A #Fuzzy.
+ * @needle: (in): The needle to fuzzy search for.
+ * @max_matches: (in): The max number of matches to return.
+ *
+ * DzlFuzzyMutableIndex searches within @fuzzy for strings that fuzzy match @needle.
+ * Only up to @max_matches will be returned.
+ *
+ * TODO: max_matches is not yet respected.
+ *
+ * Returns: (transfer full) (element-type DzlFuzzyMutableIndexMatch): A newly allocated
+ *   #GArray containing #FuzzyMatch elements. This should be freed when
+ *   the caller is done with it using g_array_unref().
+ *   It is a programming error to keep the structure around longer than
+ *   the @fuzzy instance.
+ */
+GArray *
+dzl_fuzzy_mutable_index_match (DzlFuzzyMutableIndex *fuzzy,
+                               const gchar          *needle,
+                               gsize                 max_matches)
+{
+  DzlFuzzyMutableIndexLookup lookup = { 0 };
+  DzlFuzzyMutableIndexMatch match;
+  DzlFuzzyMutableIndexItem *item;
+  GHashTableIter iter;
+  gpointer key;
+  gpointer value;
+  const gchar *tmp;
+  GArray *matches = NULL;
+  GArray *root;
+  gchar *downcase = NULL;
+  guint i;
+
+  g_return_val_if_fail (fuzzy, NULL);
+  g_return_val_if_fail (!fuzzy->in_bulk_insert, NULL);
+  g_return_val_if_fail (needle, NULL);
+
+  matches = g_array_new (FALSE, FALSE, sizeof (DzlFuzzyMutableIndexMatch));
+
+  if (!*needle)
+    goto cleanup;
+
+  if (!fuzzy->case_sensitive)
+    {
+      downcase = g_utf8_casefold (needle, -1);
+      needle = downcase;
+    }
+
+  lookup.fuzzy = fuzzy;
+  lookup.n_tables = g_utf8_strlen (needle, -1);
+  lookup.state = g_new0 (gint, lookup.n_tables);
+  lookup.tables = g_new0 (GArray*, lookup.n_tables);
+  lookup.needle = needle;
+  lookup.max_matches = max_matches;
+  lookup.matches = g_hash_table_new (NULL, NULL);
+
+  for (i = 0, tmp = needle; *tmp; tmp = g_utf8_next_char (tmp))
+    {
+      gunichar ch;
+      GArray *table;
+
+      ch = g_utf8_get_char (tmp);
+      table = g_hash_table_lookup (fuzzy->char_tables, GINT_TO_POINTER (ch));
+
+      if (table == NULL)
+        goto cleanup;
+
+      lookup.tables [i++] = table;
+    }
+
+  g_assert (lookup.n_tables == i);
+  g_assert (lookup.tables [0] != NULL);
+
+  root = lookup.tables [0];
+
+  if (G_LIKELY (lookup.n_tables > 1))
+    {
+      for (i = 0; i < root->len; i++)
+        {
+          item = &g_array_index (root, DzlFuzzyMutableIndexItem, i);
+
+          if (dzl_fuzzy_mutable_index_do_match (&lookup, item, 1, 0) &&
+              i + 1 < root->len &&
+              (item + 1)->id == item->id)
+            {
+              /* We found a match, but we might find another one with a higher
+               * score later on for the same item of the corpus.  We need to
+               * roll state back to the position we're starting at so that we
+               * can match all the same characters again.
+               */
+              for (guint j = 1; j < lookup.n_tables; j++)
+                rollback_state_to_pos (lookup.tables[j], &lookup.state[j], item->id, item->pos + 1);
+            }
+        }
+    }
+  else
+    {
+      guint last_id = G_MAXUINT;
+
+      for (i = 0; i < root->len; i++)
+        {
+          item = &g_array_index (root, DzlFuzzyMutableIndexItem, i);
+          match.id = GPOINTER_TO_INT (item->id);
+          if (match.id != last_id)
+            {
+              match.key = dzl_fuzzy_mutable_index_get_string (fuzzy, item->id);
+              match.value = g_ptr_array_index (fuzzy->id_to_value, item->id);
+              match.score = 1.0 / (strlen (match.key) + item->pos);
+              g_array_append_val (matches, match);
+              last_id = match.id;
+            }
+        }
+
+      goto cleanup;
+    }
+
+  g_hash_table_iter_init (&iter, lookup.matches);
+
+  while (g_hash_table_iter_next (&iter, &key, &value))
+    {
+      /* Ignore keys that have a tombstone record. */
+      if (g_hash_table_contains (fuzzy->removed, key))
+        continue;
+
+      match.id = GPOINTER_TO_INT (key);
+      match.key = dzl_fuzzy_mutable_index_get_string (fuzzy, match.id);
+      match.value = g_ptr_array_index (fuzzy->id_to_value, match.id);
+
+      /* If we got a perfect substring match, then this is 1.0, and avoid
+       * perturbing further or we risk non-contiguous (but shorter strings)
+       * matching at higher value.
+       */
+      if (value == NULL)
+        match.score = 1.0;
+      else
+        match.score = 1.0 / (strlen (match.key) + GPOINTER_TO_INT (value));
+
+      g_array_append_val (matches, match);
+    }
+
+  /*
+   * TODO: We could be more clever here when inserting into the array
+   *       only if it is a lower score than the end or < max items.
+   */
+
+  if (max_matches != 0)
+    {
+      g_array_sort (matches, dzl_fuzzy_mutable_index_match_compare);
+
+      if (max_matches && (matches->len > max_matches))
+        g_array_set_size (matches, max_matches);
+    }
+
+cleanup:
+  g_free (downcase);
+  g_free (lookup.state);
+  g_free (lookup.tables);
+  g_clear_pointer (&lookup.matches, g_hash_table_unref);
+
+  return matches;
+}
+
+gboolean
+dzl_fuzzy_mutable_index_contains (DzlFuzzyMutableIndex *fuzzy,
+                                  const gchar          *key)
+{
+  GArray *ar;
+  gboolean ret;
+
+  g_return_val_if_fail (fuzzy != NULL, FALSE);
+
+  ar = dzl_fuzzy_mutable_index_match (fuzzy, key, 1);
+  ret = (ar != NULL) && (ar->len > 0);
+  g_clear_pointer (&ar, g_array_unref);
+
+  return ret;
+}
+
+void
+dzl_fuzzy_mutable_index_remove (DzlFuzzyMutableIndex *fuzzy,
+                                const gchar          *key)
+{
+  GArray *ar;
+
+  g_return_if_fail (fuzzy != NULL);
+
+  if (!key || !*key)
+    return;
+
+  ar = dzl_fuzzy_mutable_index_match (fuzzy, key, 1);
+
+  if (ar != NULL && ar->len > 0)
+    {
+      for (guint i = 0; i < ar->len; i++)
+        {
+          const DzlFuzzyMutableIndexMatch *match = &g_array_index (ar, DzlFuzzyMutableIndexMatch, i);
+
+          if (g_strcmp0 (match->key, key) == 0)
+            g_hash_table_insert (fuzzy->removed, GINT_TO_POINTER (match->id), NULL);
+        }
+    }
+
+  g_clear_pointer (&ar, g_array_unref);
+}
+
+gchar *
+dzl_fuzzy_highlight (const gchar *str,
+                     const gchar *match,
+                     gboolean     case_sensitive)
+{
+  static const gchar *begin = "<b>";
+  static const gchar *end = "</b>";
+  GString *ret;
+  gunichar str_ch;
+  gunichar match_ch;
+  gboolean element_open = FALSE;
+
+  if (str == NULL || match == NULL)
+    return g_strdup (str);
+
+  ret = g_string_new (NULL);
+
+  for (; *str; str = g_utf8_next_char (str))
+    {
+      str_ch = g_utf8_get_char (str);
+      match_ch = g_utf8_get_char (match);
+
+      if (str_ch == '&')
+        {
+          const gchar *entity_end = strchr (str, ';');
+
+          if (entity_end != NULL)
+            {
+              gsize len = entity_end - str;
+
+              if (element_open)
+                {
+                  g_string_append (ret, end);
+                  element_open = FALSE;
+                }
+
+              g_string_append_len (ret, str, len + 1);
+              str += len;
+
+              continue;
+            }
+        }
+
+      if ((str_ch == match_ch) ||
+          (!case_sensitive && g_unichar_tolower (str_ch) == g_unichar_tolower (match_ch)))
+        {
+          if (!element_open)
+            {
+              g_string_append (ret, begin);
+              element_open = TRUE;
+            }
+
+          if (str_ch == '<')
+            g_string_append (ret, "&lt;");
+          else if (str_ch == '>')
+            g_string_append (ret, "&gt;");
+          else
+            g_string_append_unichar (ret, str_ch);
+
+          /* TODO: We could seek to the next char and append in a batch. */
+          match = g_utf8_next_char (match);
+        }
+      else
+        {
+          if (element_open)
+            {
+              g_string_append (ret, end);
+              element_open = FALSE;
+            }
+
+          if (str_ch == '<')
+            g_string_append (ret, "&lt;");
+          else if (str_ch == '>')
+            g_string_append (ret, "&gt;");
+          else
+            g_string_append_unichar (ret, str_ch);
+        }
+    }
+
+  if (element_open)
+    g_string_append (ret, end);
+
+  return g_string_free (ret, FALSE);
+}
diff --git a/lib/contrib/dzl-fuzzy-mutable-index.h b/lib/contrib/dzl-fuzzy-mutable-index.h
new file mode 100644
index 000000000..e2c092e65
--- /dev/null
+++ b/lib/contrib/dzl-fuzzy-mutable-index.h
@@ -0,0 +1,66 @@
+/* fuzzy.h
+ *
+ * Copyright (C) 2015 Christian Hergert <christian hergert me>
+ *
+ * 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/>.
+ */
+
+#ifndef DZL_FUZZY_MUTABLE_INDEX_H
+#define DZL_FUZZY_MUTABLE_INDEX_H
+
+#include <glib-object.h>
+
+G_BEGIN_DECLS
+
+#define DZL_TYPE_FUZZY_MUTABLE_INDEX (dzl_fuzzy_mutable_index_get_type())
+
+typedef struct _DzlFuzzyMutableIndex DzlFuzzyMutableIndex;
+
+typedef struct
+{
+   const gchar *key;
+   gpointer     value;
+   gfloat       score;
+   guint        id;
+} DzlFuzzyMutableIndexMatch;
+
+GType                     dzl_fuzzy_mutable_index_get_type           (void);
+DzlFuzzyMutableIndex     *dzl_fuzzy_mutable_index_new                (gboolean              case_sensitive);
+DzlFuzzyMutableIndex     *dzl_fuzzy_mutable_index_new_with_free_func (gboolean              case_sensitive,
+                                                                      GDestroyNotify        free_func);
+void                      dzl_fuzzy_mutable_index_set_free_func      (DzlFuzzyMutableIndex *fuzzy,
+                                                                      GDestroyNotify        free_func);
+void                      dzl_fuzzy_mutable_index_begin_bulk_insert  (DzlFuzzyMutableIndex *fuzzy);
+void                      dzl_fuzzy_mutable_index_end_bulk_insert    (DzlFuzzyMutableIndex *fuzzy);
+gboolean                  dzl_fuzzy_mutable_index_contains           (DzlFuzzyMutableIndex *fuzzy,
+                                                                      const gchar          *key);
+void                      dzl_fuzzy_mutable_index_insert             (DzlFuzzyMutableIndex *fuzzy,
+                                                                      const gchar          *key,
+                                                                      gpointer              value);
+GArray                   *dzl_fuzzy_mutable_index_match              (DzlFuzzyMutableIndex *fuzzy,
+                                                                      const gchar          *needle,
+                                                                      gsize                 max_matches);
+void                      dzl_fuzzy_mutable_index_remove             (DzlFuzzyMutableIndex *fuzzy,
+                                                                      const gchar          *key);
+DzlFuzzyMutableIndex     *dzl_fuzzy_mutable_index_ref                (DzlFuzzyMutableIndex *fuzzy);
+void                      dzl_fuzzy_mutable_index_unref              (DzlFuzzyMutableIndex *fuzzy);
+gchar                    *dzl_fuzzy_highlight                        (const gchar          *str,
+                                                                      const gchar          *query,
+                                                                      gboolean              case_sensitive);
+
+G_DEFINE_AUTOPTR_CLEANUP_FUNC (DzlFuzzyMutableIndex, dzl_fuzzy_mutable_index_unref)
+
+G_END_DECLS
+
+#endif /* DZL_FUZZY_MUTABLE_INDEX_H */
diff --git a/lib/contrib/dzl-suggestion.c b/lib/contrib/dzl-suggestion.c
new file mode 100644
index 000000000..100ea3cab
--- /dev/null
+++ b/lib/contrib/dzl-suggestion.c
@@ -0,0 +1,547 @@
+/* dzl-suggestion.c
+ *
+ * Copyright (C) 2017 Christian Hergert <chergert redhat com>
+ *
+ * This file is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU Lesser General Public License as published by the Free
+ * Software Foundation; either version 2.1 of the License, or (at your option)
+ * any later version.
+ *
+ * This file is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "config.h"
+
+#include "dzl-suggestion.h"
+
+typedef struct
+{
+  gchar *title;
+  gchar *subtitle;
+  gchar *id;
+
+  /* interned string */
+  const gchar *icon_name;
+  const gchar *secondary_icon_name;
+
+  GIcon *icon;
+  GIcon *secondary_icon;
+} DzlSuggestionPrivate;
+
+enum {
+  PROP_0,
+  PROP_ICON_NAME,
+  PROP_ICON,
+  PROP_SECONDARY_ICON_NAME,
+  PROP_SECONDARY_ICON,
+  PROP_ID,
+  PROP_SUBTITLE,
+  PROP_TITLE,
+  N_PROPS
+};
+
+enum {
+  REPLACE_TYPED_TEXT,
+  SUGGEST_SUFFIX,
+  N_SIGNALS
+};
+
+G_DEFINE_TYPE_WITH_PRIVATE (DzlSuggestion, dzl_suggestion, G_TYPE_OBJECT)
+
+static GParamSpec *properties [N_PROPS];
+static guint signals [N_SIGNALS];
+
+static GIcon *
+dzl_suggestion_real_get_icon (DzlSuggestion *self)
+{
+  DzlSuggestionPrivate *priv = dzl_suggestion_get_instance_private (self);
+
+  g_assert (DZL_IS_SUGGESTION (self));
+
+  if (priv->icon_name != NULL)
+    return g_icon_new_for_string (priv->icon_name, NULL);
+
+  return NULL;
+}
+
+static GIcon *
+dzl_suggestion_real_get_secondary_icon (DzlSuggestion *self)
+{
+  DzlSuggestionPrivate *priv = dzl_suggestion_get_instance_private (self);
+
+  g_assert (DZL_IS_SUGGESTION (self));
+
+  if (priv->secondary_icon_name != NULL)
+    return g_icon_new_for_string (priv->secondary_icon_name, NULL);
+
+  return NULL;
+}
+
+static void
+dzl_suggestion_finalize (GObject *object)
+{
+  DzlSuggestion *self = (DzlSuggestion *)object;
+  DzlSuggestionPrivate *priv = dzl_suggestion_get_instance_private (self);
+
+  priv->icon_name = NULL;
+
+  g_clear_pointer (&priv->title, g_free);
+  g_clear_pointer (&priv->subtitle, g_free);
+  g_clear_pointer (&priv->id, g_free);
+
+  G_OBJECT_CLASS (dzl_suggestion_parent_class)->finalize (object);
+}
+
+static void
+dzl_suggestion_get_property (GObject    *object,
+                             guint       prop_id,
+                             GValue     *value,
+                             GParamSpec *pspec)
+{
+  DzlSuggestion *self = DZL_SUGGESTION (object);
+
+  switch (prop_id)
+    {
+    case PROP_ID:
+      g_value_set_string (value, dzl_suggestion_get_id (self));
+      break;
+
+    case PROP_ICON_NAME:
+      g_value_set_static_string (value, dzl_suggestion_get_icon_name (self));
+      break;
+
+    case PROP_ICON:
+      g_value_take_object (value, dzl_suggestion_get_icon (self));
+      break;
+
+    case PROP_SECONDARY_ICON_NAME:
+      g_value_set_static_string (value, dzl_suggestion_get_secondary_icon_name (self));
+      break;
+
+    case PROP_SECONDARY_ICON:
+      g_value_take_object (value, dzl_suggestion_get_secondary_icon (self));
+      break;
+
+    case PROP_TITLE:
+      g_value_set_string (value, dzl_suggestion_get_title (self));
+      break;
+
+    case PROP_SUBTITLE:
+      g_value_set_string (value, dzl_suggestion_get_subtitle (self));
+      break;
+
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+    }
+}
+
+static void
+dzl_suggestion_set_property (GObject      *object,
+                             guint         prop_id,
+                             const GValue *value,
+                             GParamSpec   *pspec)
+{
+  DzlSuggestion *self = DZL_SUGGESTION (object);
+
+  switch (prop_id)
+    {
+    case PROP_ICON_NAME:
+      dzl_suggestion_set_icon_name (self, g_value_get_string (value));
+      break;
+
+    case PROP_SECONDARY_ICON_NAME:
+      dzl_suggestion_set_secondary_icon_name (self, g_value_get_string (value));
+      break;
+
+    case PROP_ID:
+      dzl_suggestion_set_id (self, g_value_get_string (value));
+      break;
+
+    case PROP_TITLE:
+      dzl_suggestion_set_title (self, g_value_get_string (value));
+      break;
+
+    case PROP_SUBTITLE:
+      dzl_suggestion_set_subtitle (self, g_value_get_string (value));
+      break;
+
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+    }
+}
+
+static void
+dzl_suggestion_class_init (DzlSuggestionClass *klass)
+{
+  GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+  object_class->finalize = dzl_suggestion_finalize;
+  object_class->get_property = dzl_suggestion_get_property;
+  object_class->set_property = dzl_suggestion_set_property;
+
+  klass->get_icon = dzl_suggestion_real_get_icon;
+  klass->get_secondary_icon = dzl_suggestion_real_get_secondary_icon;
+
+  properties [PROP_ID] =
+    g_param_spec_string ("id",
+                         "Id",
+                         "The suggestion identifier",
+                         NULL,
+                         (G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS));
+
+  properties [PROP_ICON] =
+    g_param_spec_object ("icon",
+                         "Icon",
+                         "The GIcon for the suggestion",
+                         G_TYPE_ICON,
+                         (G_PARAM_READABLE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS));
+
+  properties [PROP_ICON_NAME] =
+    g_param_spec_string ("icon-name",
+                         "Icon Name",
+                         "The name of the icon to display",
+                         NULL,
+                         (G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS));
+
+  properties [PROP_SECONDARY_ICON] =
+    g_param_spec_object ("secondary-icon",
+                         "Secondary Icon",
+                         "The secondary GIcon for the suggestion on the right",
+                         G_TYPE_ICON,
+                         (G_PARAM_READABLE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS));
+
+  properties [PROP_SECONDARY_ICON_NAME] =
+    g_param_spec_string ("secondary-icon-name",
+                         "Secondary Icon Name",
+                         "The name of the secondary icon to display",
+                         NULL,
+                         (G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS));
+
+  properties [PROP_TITLE] =
+    g_param_spec_string ("title",
+                         "Title",
+                         "The title of the suggestion",
+                         NULL,
+                         (G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS));
+
+  properties [PROP_SUBTITLE] =
+    g_param_spec_string ("subtitle",
+                         "Subtitle",
+                         "The subtitle of the suggestion",
+                         NULL,
+                         (G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS));
+
+  g_object_class_install_properties (object_class, N_PROPS, properties);
+
+  signals [REPLACE_TYPED_TEXT] =
+    g_signal_new ("replace-typed-text",
+                  G_TYPE_FROM_CLASS (klass),
+                  G_SIGNAL_RUN_LAST,
+                  G_STRUCT_OFFSET (DzlSuggestionClass, replace_typed_text),
+                  g_signal_accumulator_first_wins, NULL, NULL,
+                  G_TYPE_STRING, 1, G_TYPE_STRING | G_SIGNAL_TYPE_STATIC_SCOPE);
+
+  signals [SUGGEST_SUFFIX] =
+    g_signal_new ("suggest-suffix",
+                  G_TYPE_FROM_CLASS (klass),
+                  G_SIGNAL_RUN_LAST,
+                  G_STRUCT_OFFSET (DzlSuggestionClass, suggest_suffix),
+                  g_signal_accumulator_first_wins, NULL, NULL,
+                  G_TYPE_STRING, 1, G_TYPE_STRING | G_SIGNAL_TYPE_STATIC_SCOPE);
+}
+
+static void
+dzl_suggestion_init (DzlSuggestion *self)
+{
+}
+
+const gchar *
+dzl_suggestion_get_id (DzlSuggestion *self)
+{
+  DzlSuggestionPrivate *priv = dzl_suggestion_get_instance_private (self);
+
+  g_return_val_if_fail (DZL_IS_SUGGESTION (self), NULL);
+
+  return priv->id;
+}
+
+const gchar *
+dzl_suggestion_get_icon_name (DzlSuggestion *self)
+{
+  DzlSuggestionPrivate *priv = dzl_suggestion_get_instance_private (self);
+
+  g_return_val_if_fail (DZL_IS_SUGGESTION (self), NULL);
+
+  return priv->icon_name;
+}
+
+const gchar *
+dzl_suggestion_get_secondary_icon_name (DzlSuggestion *self)
+{
+  DzlSuggestionPrivate *priv = dzl_suggestion_get_instance_private (self);
+
+  g_return_val_if_fail (DZL_IS_SUGGESTION (self), NULL);
+
+  return priv->secondary_icon_name;
+}
+
+const gchar *
+dzl_suggestion_get_title (DzlSuggestion *self)
+{
+  DzlSuggestionPrivate *priv = dzl_suggestion_get_instance_private (self);
+
+  g_return_val_if_fail (DZL_IS_SUGGESTION (self), NULL);
+
+  return priv->title;
+}
+
+const gchar *
+dzl_suggestion_get_subtitle (DzlSuggestion *self)
+{
+  DzlSuggestionPrivate *priv = dzl_suggestion_get_instance_private (self);
+
+  g_return_val_if_fail (DZL_IS_SUGGESTION (self), NULL);
+
+  return priv->subtitle;
+}
+
+void
+dzl_suggestion_set_icon_name (DzlSuggestion *self,
+                              const gchar   *icon_name)
+{
+  DzlSuggestionPrivate *priv = dzl_suggestion_get_instance_private (self);
+
+  g_return_if_fail (DZL_IS_SUGGESTION (self));
+
+  icon_name = g_intern_string (icon_name);
+
+  if (priv->icon_name != icon_name)
+    {
+      priv->icon_name = icon_name;
+      g_object_notify_by_pspec (G_OBJECT (self), properties [PROP_ICON_NAME]);
+    }
+}
+
+void
+dzl_suggestion_set_secondary_icon_name (DzlSuggestion *self,
+                                        const gchar   *icon_name)
+{
+  DzlSuggestionPrivate *priv = dzl_suggestion_get_instance_private (self);
+
+  g_return_if_fail (DZL_IS_SUGGESTION (self));
+
+  icon_name = g_intern_string (icon_name);
+
+  if (priv->secondary_icon_name != icon_name)
+    {
+      priv->secondary_icon_name = icon_name;
+      g_object_notify_by_pspec (G_OBJECT (self), properties [PROP_SECONDARY_ICON_NAME]);
+    }
+}
+
+void
+dzl_suggestion_set_id (DzlSuggestion *self,
+                       const gchar   *id)
+{
+  DzlSuggestionPrivate *priv = dzl_suggestion_get_instance_private (self);
+
+  g_return_if_fail (DZL_IS_SUGGESTION (self));
+
+  if (g_strcmp0 (priv->id, id) != 0)
+    {
+      g_free (priv->id);
+      priv->id = g_strdup (id);
+      g_object_notify_by_pspec (G_OBJECT (self), properties [PROP_ID]);
+    }
+}
+
+void
+dzl_suggestion_set_title (DzlSuggestion *self,
+                          const gchar   *title)
+{
+  DzlSuggestionPrivate *priv = dzl_suggestion_get_instance_private (self);
+
+  g_return_if_fail (DZL_IS_SUGGESTION (self));
+
+  if (g_strcmp0 (priv->title, title) != 0)
+    {
+      g_free (priv->title);
+      priv->title = g_strdup (title);
+      g_object_notify_by_pspec (G_OBJECT (self), properties [PROP_TITLE]);
+    }
+}
+
+void
+dzl_suggestion_set_subtitle (DzlSuggestion *self,
+                             const gchar   *subtitle)
+{
+  DzlSuggestionPrivate *priv = dzl_suggestion_get_instance_private (self);
+
+  g_return_if_fail (DZL_IS_SUGGESTION (self));
+
+  if (g_strcmp0 (priv->subtitle, subtitle) != 0)
+    {
+      g_free (priv->subtitle);
+      priv->subtitle = g_strdup (subtitle);
+      g_object_notify_by_pspec (G_OBJECT (self), properties [PROP_SUBTITLE]);
+    }
+}
+
+/**
+ * dzl_suggestion_suggest_suffix:
+ * @self: a #DzlSuggestion
+ * @typed_text: The user entered text
+ *
+ * This function requests potential text to append to @typed_text to make it
+ * more clear to the user what they will be activating by selecting this
+ * suggestion. For example, if they start typing "gno", a potential suggested
+ * suffix might be "me.org" to create "gnome.org".
+ *
+ * Returns: (transfer full) (nullable): Suffix to append to @typed_text
+ *   or %NULL to leave it unchanged.
+ */
+gchar *
+dzl_suggestion_suggest_suffix (DzlSuggestion *self,
+                               const gchar   *typed_text)
+{
+  gchar *ret = NULL;
+
+  g_return_val_if_fail (DZL_IS_SUGGESTION (self), NULL);
+  g_return_val_if_fail (typed_text != NULL, NULL);
+
+  g_signal_emit (self, signals [SUGGEST_SUFFIX], 0, typed_text, &ret);
+
+  return ret;
+}
+
+DzlSuggestion *
+dzl_suggestion_new (void)
+{
+  return g_object_new (DZL_TYPE_SUGGESTION, NULL);
+}
+
+/**
+ * dzl_suggestion_replace_typed_text:
+ * @self: An #DzlSuggestion
+ * @typed_text: the text that was typed into the entry
+ *
+ * This function is meant to be used to replace the text in the entry with text
+ * that represents the suggestion most accurately. This happens when the user
+ * presses tab while typing a suggestion. For example, if typing "gno" in the
+ * entry, you might have a suggest_suffix of "me.org" so that the user sees
+ * "gnome.org". But the replace_typed_text might include more data such as
+ * "https://gnome.org"; as it more closely represents the suggestion.
+ *
+ * Returns: (transfer full) (nullable): The replacement text to insert into
+ *   the entry when "tab" is pressed to complete the insertion.
+ */
+gchar *
+dzl_suggestion_replace_typed_text (DzlSuggestion *self,
+                                   const gchar   *typed_text)
+{
+  gchar *ret = NULL;
+
+  g_return_val_if_fail (DZL_IS_SUGGESTION (self), NULL);
+
+  g_signal_emit (self, signals [REPLACE_TYPED_TEXT], 0, typed_text, &ret);
+
+  return ret;
+}
+
+/**
+ * dzl_suggestion_get_icon:
+ * @self: a #DzlSuggestion
+ *
+ * Gets the icon for the suggestion, if any.
+ *
+ * Returns: (transfer full) (nullable): a #GIcon or %NULL
+ *
+ * Since: 3.30
+ */
+GIcon *
+dzl_suggestion_get_icon (DzlSuggestion *self)
+{
+  g_return_val_if_fail (DZL_IS_SUGGESTION (self), NULL);
+
+  return DZL_SUGGESTION_GET_CLASS (self)->get_icon (self);
+}
+
+/**
+ * dzl_suggestion_get_icon_surface:
+ * @self: a #DzlSuggestion
+ * @widget: a widget that may contain the surface
+ *
+ * This function allows subclasses to dynamicly generate content for the
+ * suggestion such as may be required when integrating with favicons or
+ * similar.
+ *
+ * @widget is provided so that the implementation may determine scale or
+ * any other style-specific settings from the style context.
+ *
+ * Returns: (transfer full) (nullable): a #cairo_surface_t or %NULL
+ *
+ * Since: 3.30
+ */
+cairo_surface_t *
+dzl_suggestion_get_icon_surface (DzlSuggestion *self,
+                                 GtkWidget     *widget)
+{
+  g_return_val_if_fail (DZL_IS_SUGGESTION (self), NULL);
+
+  if (DZL_SUGGESTION_GET_CLASS (self)->get_icon_surface)
+    return DZL_SUGGESTION_GET_CLASS (self)->get_icon_surface (self, widget);
+
+  return NULL;
+}
+
+/**
+ * dzl_suggestion_get_secondary_icon:
+ * @self: a #DzlSuggestion
+ *
+ * Gets the secondary icon for the suggestion, if any.
+ *
+ * Returns: (transfer full) (nullable): a #GIcon or %NULL
+ *
+ * Since: 3.36
+ */
+GIcon *
+dzl_suggestion_get_secondary_icon (DzlSuggestion *self)
+{
+  g_return_val_if_fail (DZL_IS_SUGGESTION (self), NULL);
+
+  return DZL_SUGGESTION_GET_CLASS (self)->get_secondary_icon (self);
+}
+
+/**
+ * dzl_suggestion_get_secondary_icon_surface:
+ * @self: a #DzlSuggestion
+ * @widget: a widget that may contain the surface
+ *
+ * This function allows subclasses to dynamicly generate content for the
+ * suggestion such as may be required when integrating with favicons or
+ * similar.
+ *
+ * @widget is provided so that the implementation may determine scale or
+ * any other style-specific settings from the style context.
+ *
+ * Returns: (transfer full) (nullable): a #cairo_surface_t or %NULL
+ *
+ * Since: 3.36
+ */
+cairo_surface_t *
+dzl_suggestion_get_secondary_icon_surface (DzlSuggestion *self,
+                                           GtkWidget     *widget)
+{
+  g_return_val_if_fail (DZL_IS_SUGGESTION (self), NULL);
+
+  if (DZL_SUGGESTION_GET_CLASS (self)->get_secondary_icon_surface)
+    return DZL_SUGGESTION_GET_CLASS (self)->get_secondary_icon_surface (self, widget);
+
+  return NULL;
+}
diff --git a/lib/contrib/dzl-suggestion.h b/lib/contrib/dzl-suggestion.h
new file mode 100644
index 000000000..58ab47ecd
--- /dev/null
+++ b/lib/contrib/dzl-suggestion.h
@@ -0,0 +1,77 @@
+/* dzl-suggestion.h
+ *
+ * Copyright (C) 2017 Christian Hergert <chergert redhat com>
+ *
+ * This file is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU Lesser General Public License as published by the Free
+ * Software Foundation; either version 2.1 of the License, or (at your option)
+ * any later version.
+ *
+ * This file is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+
+#ifndef DZL_SUGGESTION_H
+#define DZL_SUGGESTION_H
+
+#include <gtk/gtk.h>
+
+G_BEGIN_DECLS
+
+#define DZL_TYPE_SUGGESTION (dzl_suggestion_get_type())
+
+G_DECLARE_DERIVABLE_TYPE (DzlSuggestion, dzl_suggestion, DZL, SUGGESTION, GObject)
+
+struct _DzlSuggestionClass
+{
+  GObjectClass parent_class;
+
+  gchar           *(*suggest_suffix)     (DzlSuggestion *self,
+                                          const gchar   *typed_text);
+  gchar           *(*replace_typed_text) (DzlSuggestion *self,
+                                          const gchar   *typed_text);
+  GIcon           *(*get_icon)           (DzlSuggestion *self);
+  cairo_surface_t *(*get_icon_surface)   (DzlSuggestion *self,
+                                          GtkWidget     *widget);
+  GIcon           *(*get_secondary_icon) (DzlSuggestion *self);
+  cairo_surface_t *(*get_secondary_icon_surface)   (DzlSuggestion *self,
+                                                    GtkWidget     *widget);
+};
+
+DzlSuggestion   *dzl_suggestion_new                (void);
+const gchar     *dzl_suggestion_get_id             (DzlSuggestion *self);
+void             dzl_suggestion_set_id             (DzlSuggestion *self,
+                                                    const gchar   *id);
+const gchar     *dzl_suggestion_get_icon_name      (DzlSuggestion *self);
+void             dzl_suggestion_set_icon_name      (DzlSuggestion *self,
+                                                    const gchar   *icon_name);
+const gchar     *dzl_suggestion_get_title          (DzlSuggestion *self);
+void             dzl_suggestion_set_title          (DzlSuggestion *self,
+                                                    const gchar   *title);
+const gchar     *dzl_suggestion_get_subtitle       (DzlSuggestion *self);
+void             dzl_suggestion_set_subtitle       (DzlSuggestion *self,
+                                                    const gchar   *subtitle);
+gchar           *dzl_suggestion_suggest_suffix     (DzlSuggestion *self,
+                                                    const gchar   *typed_text);
+gchar           *dzl_suggestion_replace_typed_text (DzlSuggestion *self,
+                                                    const gchar   *typed_text);
+GIcon           *dzl_suggestion_get_icon           (DzlSuggestion *self);
+cairo_surface_t *dzl_suggestion_get_icon_surface   (DzlSuggestion *self,
+                                                    GtkWidget     *widget);
+const gchar     *dzl_suggestion_get_secondary_icon_name (DzlSuggestion *self);
+void             dzl_suggestion_set_secondary_icon_name (DzlSuggestion *self,
+                                                         const gchar   *icon_name);
+
+GIcon           *dzl_suggestion_get_secondary_icon (DzlSuggestion *self);
+cairo_surface_t *dzl_suggestion_get_secondary_icon_surface (DzlSuggestion *self,
+                                                            GtkWidget     *widget);
+
+G_END_DECLS
+
+#endif /* DZL_SUGGESTION_H */
diff --git a/lib/ephy-file-helpers.c b/lib/ephy-file-helpers.c
index d1ad88e26..0a3101ae1 100644
--- a/lib/ephy-file-helpers.c
+++ b/lib/ephy-file-helpers.c
@@ -548,7 +548,6 @@ launch_application (GAppInfo *app,
   g_autoptr (GdkAppLaunchContext) context = NULL;
   g_autoptr (GError) error = NULL;
   GdkDisplay *display;
-  GdkScreen *screen;
   gboolean res;
 
   /* This is impossible to implement inside sandbox. Higher layers must
@@ -557,10 +556,8 @@ launch_application (GAppInfo *app,
   g_assert (!ephy_is_running_inside_sandbox ());
 
   display = gdk_display_get_default ();
-  screen = gdk_screen_get_default ();
 
   context = gdk_display_get_app_launch_context (display);
-  gdk_app_launch_context_set_screen (context, screen);
   gdk_app_launch_context_set_timestamp (context, user_time);
 
   res = g_app_info_launch (app, files,
@@ -665,7 +662,7 @@ static gboolean
 open_in_default_handler (const char                   *uri,
                          const char                   *mime_type,
                          guint32                       timestamp,
-                         GdkScreen                    *screen,
+                         GdkDisplay                   *display,
                          EphyFileHelpersNotFlatpakTag  tag)
 {
   g_autoptr (GdkAppLaunchContext) context = NULL;
@@ -679,8 +676,7 @@ open_in_default_handler (const char                   *uri,
   g_assert (tag == EPHY_FILE_HELPERS_I_UNDERSTAND_I_MUST_NOT_USE_THIS_FUNCTION_UNDER_FLATPAK);
   g_assert (!ephy_is_running_inside_sandbox ());
 
-  context = gdk_display_get_app_launch_context (screen ? gdk_screen_get_display (screen) : 
gdk_display_get_default ());
-  gdk_app_launch_context_set_screen (context, screen);
+  context = gdk_display_get_app_launch_context (display ? display : gdk_display_get_default ());
   gdk_app_launch_context_set_timestamp (context, timestamp);
 
   appinfo = g_app_info_get_default_for_type (mime_type, TRUE);
@@ -703,10 +699,10 @@ open_in_default_handler (const char                   *uri,
 gboolean
 ephy_file_open_uri_in_default_browser (const char                   *uri,
                                        guint32                       user_time,
-                                       GdkScreen                    *screen,
+                                       GdkDisplay                   *display,
                                        EphyFileHelpersNotFlatpakTag  tag)
 {
-  return open_in_default_handler (uri, "x-scheme-handler/http", user_time, screen, tag);
+  return open_in_default_handler (uri, "x-scheme-handler/http", user_time, display, tag);
 }
 
 /**
diff --git a/lib/ephy-file-helpers.h b/lib/ephy-file-helpers.h
index c09d145c8..1a9eb3b25 100644
--- a/lib/ephy-file-helpers.h
+++ b/lib/ephy-file-helpers.h
@@ -82,7 +82,7 @@ gboolean           ephy_file_launch_desktop_file            (const char
                                                              EphyFileHelpersNotFlatpakTag  tag);
 gboolean           ephy_file_open_uri_in_default_browser    (const char                   *uri,
                                                              guint32                       user_time,
-                                                             GdkScreen                    *screen,
+                                                             GdkDisplay                   *screen,
                                                              EphyFileHelpersNotFlatpakTag  tag);
 gboolean           ephy_file_browse_to                      (GFile                        *file,
                                                              guint32                       user_time);
diff --git a/lib/ephy-flatpak-utils.c b/lib/ephy-flatpak-utils.c
index 6fc9a5dec..82bc94ffb 100644
--- a/lib/ephy-flatpak-utils.c
+++ b/lib/ephy-flatpak-utils.c
@@ -29,7 +29,7 @@
 #include <gio/gio.h>
 #include <gio/gunixfdlist.h>
 #if USE_LIBPORTAL
-#include <libportal/portal-gtk3.h>
+#include <libportal/portal-gtk4.h>
 #endif
 #include <string.h>
 #include <sys/stat.h>
diff --git a/lib/ephy-gui.c b/lib/ephy-gui.c
index c342b23a0..12c5cce22 100644
--- a/lib/ephy-gui.c
+++ b/lib/ephy-gui.c
@@ -53,7 +53,6 @@ void
 ephy_gui_help (GtkWidget  *parent,
                const char *page)
 {
-  GError *error = NULL;
   char *url;
 
   if (page)
@@ -61,27 +60,12 @@ ephy_gui_help (GtkWidget  *parent,
   else
     url = g_strdup ("help:epiphany");
 
-  gtk_show_uri_on_window (GTK_WINDOW (parent), url, gtk_get_current_event_time (), &error);
-
-  if (error != NULL) {
-    GtkWidget *dialog;
-
-    dialog = gtk_message_dialog_new (GTK_WINDOW (parent),
-                                     GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
-                                     GTK_MESSAGE_ERROR,
-                                     GTK_BUTTONS_OK,
-                                     _("Could not display help: %s"),
-                                     error->message);
-    g_error_free (error);
-
-    g_signal_connect (dialog, "response",
-                      G_CALLBACK (gtk_widget_destroy), NULL);
-    gtk_widget_show (dialog);
-  }
+  gtk_show_uri (GTK_WINDOW (parent), url, GDK_CURRENT_TIME);
 
   g_free (url);
 }
 
+#if 0
 void
 ephy_gui_get_current_event (GdkEventType *otype,
                             guint        *ostate,
@@ -119,3 +103,4 @@ ephy_gui_get_current_event (GdkEventType *otype,
   if (obutton)
     *obutton = button;
 }
+#endif
diff --git a/lib/ephy-notification-container.c b/lib/ephy-notification-container.c
index f0f31e736..8a02322f2 100644
--- a/lib/ephy-notification-container.c
+++ b/lib/ephy-notification-container.c
@@ -23,13 +23,13 @@
 #include "ephy-notification-container.h"
 
 struct _EphyNotificationContainer {
-  GtkBin parent_instance;
+  AdwBin parent_instance;
 
   GtkWidget *revealer;
   GtkWidget *box;
 };
 
-G_DEFINE_TYPE (EphyNotificationContainer, ephy_notification_container, GTK_TYPE_BIN);
+G_DEFINE_TYPE (EphyNotificationContainer, ephy_notification_container, ADW_TYPE_BIN);
 
 static EphyNotificationContainer *notification_container = NULL;
 
@@ -46,10 +46,12 @@ ephy_notification_container_init (EphyNotificationContainer *self)
   gtk_widget_set_valign (GTK_WIDGET (self), GTK_ALIGN_START);
 
   self->revealer = gtk_revealer_new ();
-  gtk_container_add (GTK_CONTAINER (self), self->revealer);
+  adw_bin_set_child (ADW_BIN (self), self->revealer);
 
   self->box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 6);
-  gtk_container_add (GTK_CONTAINER (self->revealer), self->box);
+  gtk_revealer_set_child (GTK_REVEALER (self->revealer), self->box);
+
+  gtk_widget_hide (GTK_WIDGET (self));
 }
 
 static void
@@ -67,28 +69,13 @@ ephy_notification_container_get_default (void)
                        NULL);
 }
 
-static guint
-get_num_children (EphyNotificationContainer *self)
-{
-  GList *children;
-  guint retval;
-
-  g_assert (EPHY_IS_NOTIFICATION_CONTAINER (self));
-
-  children = gtk_container_get_children (GTK_CONTAINER (self->box));
-  retval = g_list_length (children);
-  g_list_free (children);
-
-  return retval;
-}
-
 static void
 notification_close_cb (EphyNotification          *notification,
                        EphyNotificationContainer *self)
 {
-  gtk_container_remove (GTK_CONTAINER (self->box), GTK_WIDGET (notification));
+  gtk_box_remove (GTK_BOX (self->box), GTK_WIDGET (notification));
 
-  if (get_num_children (self) == 0) {
+  if (!gtk_widget_get_first_child (self->box)) {
     gtk_widget_hide (GTK_WIDGET (self));
     gtk_revealer_set_reveal_child (GTK_REVEALER (self->revealer), FALSE);
   }
@@ -98,24 +85,24 @@ void
 ephy_notification_container_add_notification (EphyNotificationContainer *self,
                                               GtkWidget                 *notification)
 {
-  g_autoptr (GList) children = NULL;
-  GList *list;
+  GtkWidget *child;
 
   g_assert (EPHY_IS_NOTIFICATION_CONTAINER (self));
   g_assert (GTK_IS_WIDGET (notification));
 
-  children = gtk_container_get_children (GTK_CONTAINER (self->box));
-  for (list = children; list && list->data; list = list->next) {
-    EphyNotification *child_notification = EPHY_NOTIFICATION (children->data);
+  for (child = gtk_widget_get_first_child (self->box);
+       child;
+       child = gtk_widget_get_next_sibling (child)) {
+    EphyNotification *child_notification = EPHY_NOTIFICATION (child);
 
     if (ephy_notification_is_duplicate (child_notification, EPHY_NOTIFICATION (notification))) {
-      gtk_widget_destroy (notification);
+      gtk_box_remove (GTK_BOX (self->box), notification);
       return;
     }
   }
 
-  gtk_container_add (GTK_CONTAINER (self->box), notification);
-  gtk_widget_show_all (GTK_WIDGET (self));
+  gtk_box_append (GTK_BOX (self->box), notification);
+  gtk_widget_show (GTK_WIDGET (self));
   gtk_revealer_set_reveal_child (GTK_REVEALER (self->revealer), TRUE);
 
   g_signal_connect (notification, "close", G_CALLBACK (notification_close_cb), self);
diff --git a/lib/ephy-notification-container.h b/lib/ephy-notification-container.h
index 4444f83b7..df5fcdb36 100644
--- a/lib/ephy-notification-container.h
+++ b/lib/ephy-notification-container.h
@@ -20,13 +20,13 @@
 
 #pragma once
 
-#include <gtk/gtk.h>
+#include <adwaita.h>
 
 G_BEGIN_DECLS
 
 #define EPHY_TYPE_NOTIFICATION_CONTAINER (ephy_notification_container_get_type ())
 
-G_DECLARE_FINAL_TYPE (EphyNotificationContainer, ephy_notification_container, EPHY, NOTIFICATION_CONTAINER, 
GtkBin)
+G_DECLARE_FINAL_TYPE (EphyNotificationContainer, ephy_notification_container, EPHY, NOTIFICATION_CONTAINER, 
AdwBin)
 
 EphyNotificationContainer *ephy_notification_container_get_default      (void);
 
diff --git a/lib/ephy-notification.c b/lib/ephy-notification.c
index 43746bab3..b7d68f7ba 100644
--- a/lib/ephy-notification.c
+++ b/lib/ephy-notification.c
@@ -24,7 +24,7 @@
 #include "ephy-notification-container.h"
 
 struct _EphyNotification {
-  GtkBin parent_instance;
+  AdwBin parent_instance;
 
   GtkWidget *grid;
 
@@ -49,7 +49,7 @@ enum {
 
 static guint signals[LAST_SIGNAL];
 
-G_DEFINE_TYPE (EphyNotification, ephy_notification, GTK_TYPE_BIN);
+G_DEFINE_TYPE (EphyNotification, ephy_notification, ADW_TYPE_BIN);
 
 static void
 ephy_notification_constructed (GObject *object)
@@ -125,27 +125,24 @@ close_button_clicked_cb (GtkButton        *button,
 static void
 ephy_notification_init (EphyNotification *self)
 {
-  GtkWidget *image;
-  GtkStyleContext *context;
+  gtk_widget_add_css_class (GTK_WIDGET (self), "app-notification");
 
   self->grid = gtk_grid_new ();
-  context = gtk_widget_get_style_context (self->grid);
-  gtk_style_context_add_class (context, "app-notification");
-  gtk_container_add (GTK_CONTAINER (self), self->grid);
+  adw_bin_set_child (ADW_BIN (self), self->grid);
 
   self->head = gtk_label_new (NULL);
-  gtk_label_set_line_wrap (GTK_LABEL (self->head), TRUE);
+  gtk_label_set_wrap (GTK_LABEL (self->head), TRUE);
   gtk_label_set_xalign (GTK_LABEL (self->head), 0);
   gtk_widget_set_hexpand (self->head, TRUE);
   gtk_grid_attach (GTK_GRID (self->grid), self->head, 0, 0, 1, 1);
 
   self->body = gtk_label_new (NULL);
-  gtk_label_set_line_wrap (GTK_LABEL (self->body), TRUE);
+  gtk_label_set_wrap (GTK_LABEL (self->body), TRUE);
   gtk_label_set_xalign (GTK_LABEL (self->body), 0);
   gtk_widget_set_hexpand (self->body, TRUE);
   gtk_grid_attach (GTK_GRID (self->grid), self->body, 0, 1, 1, 1);
 
-  self->close_button = gtk_button_new ();
+  self->close_button = gtk_button_new_from_icon_name ("window-close-symbolic");
   gtk_widget_set_focus_on_click (self->close_button, FALSE);
   gtk_widget_set_margin_top (self->close_button, 6);
   gtk_widget_set_margin_bottom (self->close_button, 6);
@@ -154,9 +151,6 @@ ephy_notification_init (EphyNotification *self)
   gtk_style_context_add_class (gtk_widget_get_style_context (self->close_button), "flat");
   gtk_grid_attach (GTK_GRID (self->grid), self->close_button, 1, 0, 1, 2);
 
-  image = gtk_image_new_from_icon_name ("window-close-symbolic", GTK_ICON_SIZE_BUTTON);
-  gtk_button_set_image (GTK_BUTTON (self->close_button), image);
-
   g_signal_connect (self->close_button,
                     "clicked",
                     G_CALLBACK (close_button_clicked_cb),
diff --git a/lib/ephy-notification.h b/lib/ephy-notification.h
index d3226cb68..5947cbcad 100644
--- a/lib/ephy-notification.h
+++ b/lib/ephy-notification.h
@@ -21,13 +21,13 @@
 #pragma once
 
 #include <glib-object.h>
-#include <gtk/gtk.h>
+#include <adwaita.h>
 
 G_BEGIN_DECLS
 
 #define EPHY_TYPE_NOTIFICATION (ephy_notification_get_type ())
 
-G_DECLARE_FINAL_TYPE (EphyNotification, ephy_notification, EPHY, NOTIFICATION, GtkBin)
+G_DECLARE_FINAL_TYPE (EphyNotification, ephy_notification, EPHY, NOTIFICATION, AdwBin)
 
 EphyNotification *ephy_notification_new  (const char *head,
                                           const char *body);
diff --git a/lib/ephy-suggestion.c b/lib/ephy-suggestion.c
index 7ab80dcf7..d35795f80 100644
--- a/lib/ephy-suggestion.c
+++ b/lib/ephy-suggestion.c
@@ -22,7 +22,6 @@
 
 #include "ephy-uri-helpers.h"
 
-#include <dazzle.h>
 #include <glib.h>
 
 struct _EphySuggestion {
diff --git a/lib/ephy-suggestion.h b/lib/ephy-suggestion.h
index bfd270c7c..af6b1e23c 100644
--- a/lib/ephy-suggestion.h
+++ b/lib/ephy-suggestion.h
@@ -19,7 +19,7 @@
 
 #pragma once
 
-#include <dazzle.h>
+#include "dzl-suggestion.h"
 
 G_BEGIN_DECLS
 
diff --git a/lib/meson.build b/lib/meson.build
index 894589a1a..dfa6c3e3b 100644
--- a/lib/meson.build
+++ b/lib/meson.build
@@ -10,9 +10,11 @@ enums = gnome.mkenums_simple('ephy-lib-type-builtins',
 )
 
 libephymisc_sources = [
+  'contrib/dzl-fuzzy-mutable-index.c',
+  'contrib/dzl-suggestion.c',
   'contrib/gnome-languages.c',
   'ephy-debug.c',
-  'ephy-dnd.c',
+#  'ephy-dnd.c',
   'ephy-favicon-helpers.c',
   'ephy-file-helpers.c',
   'ephy-flatpak-utils.c',
@@ -59,7 +61,7 @@ libephymisc_deps = [
   gsettings_desktop_schemas,
   gtk_dep,
   json_glib_dep,
-  libdazzle_dep,
+  libadwaita_dep,
   libsecret_dep,
   libsoup_dep,
   libxml_dep,
diff --git a/lib/widgets/ephy-download-widget.c b/lib/widgets/ephy-download-widget.c
index b81c567a8..e7e484a1f 100644
--- a/lib/widgets/ephy-download-widget.c
+++ b/lib/widgets/ephy-download-widget.c
@@ -30,7 +30,7 @@
 #include <webkit2/webkit2.h>
 
 struct _EphyDownloadWidget {
-  GtkEventBox parent_instance;
+  AdwBin parent_instance;
 
   EphyDownload *download;
 
@@ -41,7 +41,7 @@ struct _EphyDownloadWidget {
   GtkWidget *action_button;
 };
 
-G_DEFINE_TYPE (EphyDownloadWidget, ephy_download_widget, GTK_TYPE_EVENT_BOX)
+G_DEFINE_TYPE (EphyDownloadWidget, ephy_download_widget, ADW_TYPE_BIN)
 
 enum {
   PROP_0,
@@ -135,7 +135,7 @@ update_download_icon (EphyDownloadWidget *widget)
   } else
     icon = g_icon_new_for_string ("package-x-generic-symbolic", NULL);
 
-  gtk_image_set_from_gicon (GTK_IMAGE (widget->icon), icon, GTK_ICON_SIZE_MENU);
+  gtk_image_set_from_gicon (GTK_IMAGE (widget->icon), icon);
 }
 
 static void
@@ -211,9 +211,8 @@ download_finished_cb (EphyDownload       *download,
 {
   gtk_widget_hide (widget->progress);
   update_status_label (widget, _("Finished"));
-  gtk_image_set_from_icon_name (GTK_IMAGE (gtk_button_get_image (GTK_BUTTON (widget->action_button))),
-                                "folder-open-symbolic",
-                                GTK_ICON_SIZE_MENU);
+  gtk_button_set_icon_name (GTK_BUTTON (widget->action_button),
+                            "folder-open-symbolic");
 }
 
 static void
@@ -237,9 +236,8 @@ download_failed_cb (EphyDownload       *download,
 
   error_msg = g_strdup_printf (_("Error downloading: %s"), error->message);
   update_status_label (widget, error_msg);
-  gtk_image_set_from_icon_name (GTK_IMAGE (gtk_button_get_image (GTK_BUTTON (widget->action_button))),
-                                "list-remove-symbolic",
-                                GTK_ICON_SIZE_MENU);
+  gtk_button_set_icon_name (GTK_BUTTON (widget->action_button),
+                            "list-remove-symbolic");
 }
 
 static void
@@ -273,7 +271,7 @@ widget_action_button_clicked_cb (EphyDownloadWidget *widget)
   } else {
     ephy_download_do_download_action (widget->download,
                                       EPHY_DOWNLOAD_ACTION_BROWSE_TO,
-                                      gtk_get_current_event_time ());
+                                      GDK_CURRENT_TIME);
   }
 }
 
@@ -285,6 +283,7 @@ download_destination_changed_cb (WebKitDownload     *download,
   update_download_destination (widget);
 }
 
+/*
 static void
 download_drag_data_get (GtkWidget        *widget,
                         GdkDragContext   *context,
@@ -302,6 +301,7 @@ download_drag_data_get (GtkWidget        *widget,
   gtk_selection_data_set_uris (selection_data, uris);
   g_free (uris[0]);
 }
+*/
 
 static void
 ephy_download_widget_get_property (GObject    *object,
@@ -383,7 +383,7 @@ ephy_download_widget_constructed (GObject *object)
   gtk_widget_set_margin_end (GTK_WIDGET (grid), 12);
   gtk_widget_set_margin_top (GTK_WIDGET (grid), 12);
   gtk_widget_set_margin_bottom (GTK_WIDGET (grid), 12);
-  gtk_container_add (GTK_CONTAINER (widget), grid);
+  adw_bin_set_child (ADW_BIN (widget), grid);
 
   widget->icon = gtk_image_new ();
   gtk_widget_set_margin_end (widget->icon, 4);
@@ -437,7 +437,7 @@ ephy_download_widget_constructed (GObject *object)
     action_icon_name = "list-remove-symbolic";
   else
     action_icon_name = "window-close-symbolic";
-  widget->action_button = gtk_button_new_from_icon_name (action_icon_name, GTK_ICON_SIZE_MENU);
+  widget->action_button = gtk_button_new_from_icon_name (action_icon_name);
   g_signal_connect_swapped (widget->action_button, "clicked",
                             G_CALLBACK (widget_action_button_clicked_cb),
                             widget);
@@ -446,7 +446,6 @@ ephy_download_widget_constructed (GObject *object)
   gtk_style_context_add_class (gtk_widget_get_style_context (widget->action_button),
                                "circular");
   gtk_grid_attach (GTK_GRID (grid), widget->action_button, 3, 0, 1, 3);
-  gtk_widget_show (widget->action_button);
 
   download = ephy_download_get_webkit_download (widget->download);
   g_signal_connect (download, "notify::estimated-progress",
@@ -468,9 +467,9 @@ ephy_download_widget_constructed (GObject *object)
                     G_CALLBACK (download_content_type_changed_cb),
                     widget);
 
-  gtk_drag_source_set (GTK_WIDGET (widget), GDK_BUTTON1_MASK, NULL, 0, GDK_ACTION_COPY);
-  gtk_drag_source_add_uri_targets (GTK_WIDGET (widget));
-  g_signal_connect_object (widget, "drag-data-get", G_CALLBACK (download_drag_data_get), download, 0);
+//  gtk_drag_source_set (GTK_WIDGET (widget), GDK_BUTTON1_MASK, NULL, 0, GDK_ACTION_COPY);
+//  gtk_drag_source_add_uri_targets (GTK_WIDGET (widget));
+//  g_signal_connect_object (widget, "drag-data-get", G_CALLBACK (download_drag_data_get), download, 0);
 }
 
 static void
diff --git a/lib/widgets/ephy-download-widget.h b/lib/widgets/ephy-download-widget.h
index f36bd053a..72f5369b1 100644
--- a/lib/widgets/ephy-download-widget.h
+++ b/lib/widgets/ephy-download-widget.h
@@ -20,14 +20,14 @@
 
 #pragma once
 
-#include <glib-object.h>
+#include <adwaita.h>
 #include "ephy-download.h"
 
 G_BEGIN_DECLS
 
 #define EPHY_TYPE_DOWNLOAD_WIDGET ephy_download_widget_get_type()
 
-G_DECLARE_FINAL_TYPE (EphyDownloadWidget, ephy_download_widget, EPHY, DOWNLOAD_WIDGET, GtkEventBox)
+G_DECLARE_FINAL_TYPE (EphyDownloadWidget, ephy_download_widget, EPHY, DOWNLOAD_WIDGET, AdwBin)
 
 GtkWidget     *ephy_download_widget_new          (EphyDownload *ephy_download);
 
diff --git a/lib/widgets/ephy-downloads-popover.c b/lib/widgets/ephy-downloads-popover.c
index c91857671..4016237fb 100644
--- a/lib/widgets/ephy-downloads-popover.c
+++ b/lib/widgets/ephy-downloads-popover.c
@@ -45,14 +45,14 @@ download_box_row_activated_cb (EphyDownloadsPopover *popover,
   EphyDownloadWidget *widget;
   EphyDownload *download;
 
-  widget = EPHY_DOWNLOAD_WIDGET (gtk_bin_get_child (GTK_BIN (row)));
+  widget = EPHY_DOWNLOAD_WIDGET (gtk_list_box_row_get_child (GTK_LIST_BOX_ROW (row)));
   download = ephy_download_widget_get_download (widget);
   if (!ephy_download_succeeded (download))
     return;
 
   ephy_download_do_download_action (download,
                                     EPHY_DOWNLOAD_ACTION_OPEN,
-                                    gtk_get_current_event_time ());
+                                    GDK_CURRENT_TIME);
 }
 
 static void
@@ -78,7 +78,6 @@ download_added_cb (EphyDownloadsPopover *popover,
 
   row = gtk_list_box_row_new ();
   gtk_list_box_prepend (GTK_LIST_BOX (popover->downloads_box), row);
-  gtk_widget_show (row);
 
   widget = ephy_download_widget_new (download);
   g_signal_connect_object (download, "completed",
@@ -87,41 +86,38 @@ download_added_cb (EphyDownloadsPopover *popover,
   g_signal_connect_object (download, "error",
                            G_CALLBACK (download_failed_cb),
                            popover, G_CONNECT_SWAPPED);
-  gtk_container_add (GTK_CONTAINER (row), widget);
-  gtk_widget_show (widget);
+  gtk_list_box_row_set_child (GTK_LIST_BOX_ROW (row), widget);
 }
 
 static void
 download_removed_cb (EphyDownloadsPopover *popover,
                      EphyDownload         *download)
 {
-  g_autoptr (GList) children = NULL;
-  GList *l;
   EphyDownloadsManager *manager;
+  int i = 0;
 
-  children = gtk_container_get_children (GTK_CONTAINER (popover->downloads_box));
-
-  /* Hide the popover before removing the last download widget so it "crumples"
-   * more smoothly */
-  if (g_list_length (children) == 1)
-    gtk_widget_hide (GTK_WIDGET (popover));
-
-  for (l = children; l; l = g_list_next (l)) {
+  while (TRUE) {
+    GtkListBoxRow *row;
     GtkWidget *widget;
 
-    if (!GTK_IS_LIST_BOX_ROW (l->data))
-      continue;
+    row = gtk_list_box_get_row_at_index (GTK_LIST_BOX (popover->downloads_box), i++);
 
-    widget = gtk_bin_get_child (GTK_BIN (l->data));
+    if (!row)
+      break;
+
+    widget = gtk_list_box_row_get_child (row);
     if (!EPHY_IS_DOWNLOAD_WIDGET (widget))
       continue;
 
     if (ephy_download_widget_get_download (EPHY_DOWNLOAD_WIDGET (widget)) == download) {
-      gtk_widget_destroy (l->data);
+      gtk_list_box_remove (GTK_LIST_BOX (popover->downloads_box), GTK_WIDGET (row));
       break;
     }
   }
 
+  if (i == 1)
+    gtk_popover_popdown (GTK_POPOVER (popover));
+
   manager = ephy_embed_shell_get_downloads_manager (ephy_embed_shell_get_default ());
   gtk_widget_set_sensitive (popover->clear_button, !ephy_downloads_manager_has_active_downloads (manager));
 }
@@ -129,31 +125,23 @@ download_removed_cb (EphyDownloadsPopover *popover,
 static void
 clear_button_clicked_cb (EphyDownloadsPopover *popover)
 {
-  g_autoptr (GList) children = NULL;
-  GList *l;
   EphyDownloadsManager *manager;
+  GtkListBoxRow *row;
 
   gtk_widget_hide (GTK_WIDGET (popover));
 
   manager = ephy_embed_shell_get_downloads_manager (ephy_embed_shell_get_default ());
   g_signal_handlers_block_by_func (manager, download_removed_cb, popover);
 
-  children = gtk_container_get_children (GTK_CONTAINER (popover->downloads_box));
-  for (l = children; l; l = g_list_next (l)) {
+  while ((row = gtk_list_box_get_row_at_index (GTK_LIST_BOX (popover->downloads_box), 0))) {
     GtkWidget *widget;
     EphyDownload *download;
 
-    if (!GTK_IS_LIST_BOX_ROW (l->data))
-      continue;
-
-    widget = gtk_bin_get_child (GTK_BIN (l->data));
-    if (!EPHY_IS_DOWNLOAD_WIDGET (widget))
-      continue;
-
+    widget = gtk_list_box_row_get_child (row);
     download = ephy_download_widget_get_download (EPHY_DOWNLOAD_WIDGET (widget));
     if (!ephy_download_is_active (download)) {
       ephy_downloads_manager_remove_download (manager, download);
-      gtk_widget_destroy (l->data);
+      gtk_list_box_remove (GTK_LIST_BOX (popover->downloads_box), GTK_WIDGET (row));
     }
   }
   gtk_widget_set_sensitive (popover->clear_button, FALSE);
@@ -176,7 +164,7 @@ ephy_downloads_popover_init (EphyDownloadsPopover *popover)
 
   vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
 
-  scrolled_window = gtk_scrolled_window_new (NULL, NULL);
+  scrolled_window = gtk_scrolled_window_new ();
   gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
                                   GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
   gtk_scrolled_window_set_min_content_height (GTK_SCROLLED_WINDOW (scrolled_window),
@@ -190,8 +178,7 @@ ephy_downloads_popover_init (EphyDownloadsPopover *popover)
   gtk_list_box_set_selection_mode (GTK_LIST_BOX (popover->downloads_box), GTK_SELECTION_NONE);
   gtk_style_context_add_class (gtk_widget_get_style_context (popover->downloads_box),
                                "background");
-  gtk_container_add (GTK_CONTAINER (scrolled_window), popover->downloads_box);
-  gtk_widget_show (popover->downloads_box);
+  gtk_scrolled_window_set_child (GTK_SCROLLED_WINDOW (scrolled_window), popover->downloads_box);
 
   downloads = ephy_downloads_manager_get_downloads (manager);
   for (l = downloads; l != NULL; l = g_list_next (l)) {
@@ -208,11 +195,9 @@ ephy_downloads_popover_init (EphyDownloadsPopover *popover)
 
     row = gtk_list_box_row_new ();
     gtk_list_box_prepend (GTK_LIST_BOX (popover->downloads_box), row);
-    gtk_widget_show (row);
 
     widget = ephy_download_widget_new (download);
-    gtk_container_add (GTK_CONTAINER (row), widget);
-    gtk_widget_show (widget);
+    gtk_list_box_row_set_child (GTK_LIST_BOX_ROW (row), widget);
   }
 
   g_signal_connect_object (manager, "download-added",
@@ -222,8 +207,7 @@ ephy_downloads_popover_init (EphyDownloadsPopover *popover)
                            G_CALLBACK (download_removed_cb),
                            popover, G_CONNECT_SWAPPED);
 
-  gtk_box_pack_start (GTK_BOX (vbox), scrolled_window, FALSE, TRUE, 0);
-  gtk_widget_show (scrolled_window);
+  gtk_box_append (GTK_BOX (vbox), scrolled_window);
 
   popover->clear_button = gtk_button_new_with_mnemonic (_("_Clear All"));
   gtk_widget_set_sensitive (popover->clear_button, !ephy_downloads_manager_has_active_downloads (manager));
@@ -235,11 +219,9 @@ ephy_downloads_popover_init (EphyDownloadsPopover *popover)
   gtk_widget_set_margin_end (popover->clear_button, 12);
   gtk_widget_set_margin_top (popover->clear_button, 12);
   gtk_widget_set_margin_bottom (popover->clear_button, 12);
-  gtk_box_pack_start (GTK_BOX (vbox), popover->clear_button, FALSE, TRUE, 0);
-  gtk_widget_show (popover->clear_button);
+  gtk_box_append (GTK_BOX (vbox), popover->clear_button);
 
-  gtk_container_add (GTK_CONTAINER (popover), vbox);
-  gtk_widget_show (vbox);
+  gtk_popover_set_child (GTK_POPOVER (popover), vbox);
 }
 
 GtkWidget *
diff --git a/lib/widgets/ephy-downloads-progress-icon.c b/lib/widgets/ephy-downloads-progress-icon.c
index 3a2eb1b8e..82fc347e7 100644
--- a/lib/widgets/ephy-downloads-progress-icon.c
+++ b/lib/widgets/ephy-downloads-progress-icon.c
@@ -30,24 +30,23 @@ struct _EphyDownloadsProgressIcon {
 
 G_DEFINE_TYPE (EphyDownloadsProgressIcon, ephy_downloads_progress_icon, GTK_TYPE_DRAWING_AREA)
 
-static gboolean
-ephy_downloads_progress_icon_draw (GtkWidget *widget,
-                                   cairo_t   *cr)
+static void
+ephy_downloads_progress_icon_draw (GtkDrawingArea *area,
+                                   cairo_t        *cr,
+                                   int             width,
+                                   int             height,
+                                   gpointer        user_data)
 {
-  gint width, height;
   EphyDownloadsManager *manager;
   GtkStyleContext *style_context;
   GdkRGBA color;
   gdouble progress;
 
-  width = gtk_widget_get_allocated_width (widget);
-  height = gtk_widget_get_allocated_height (widget);
-
   manager = ephy_embed_shell_get_downloads_manager (ephy_embed_shell_get_default ());
   progress = ephy_downloads_manager_get_estimated_progress (manager);
 
-  style_context = gtk_widget_get_style_context (widget);
-  gtk_style_context_get_color (style_context, gtk_widget_get_state_flags (widget), &color);
+  style_context = gtk_widget_get_style_context (GTK_WIDGET (area));
+  gtk_style_context_get_color (style_context, &color);
   color.alpha *= progress == 1 ? 1 : 0.2;
 
   gdk_cairo_set_source_rgba (cr, &color);
@@ -68,22 +67,23 @@ ephy_downloads_progress_icon_draw (GtkWidget *widget,
     cairo_rectangle (cr, 0, 0, width, height * progress);
     cairo_fill (cr);
   }
-
-  return TRUE;
 }
 
 static void
 ephy_downloads_progress_icon_class_init (EphyDownloadsProgressIconClass *klass)
 {
-  GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
-
-  widget_class->draw = ephy_downloads_progress_icon_draw;
 }
 
 static void
 ephy_downloads_progress_icon_init (EphyDownloadsProgressIcon *icon)
 {
   g_object_set (icon, "width-request", 16, "height-request", 16, NULL);
+
+  gtk_drawing_area_set_content_width (GTK_DRAWING_AREA (icon), 16);
+  gtk_drawing_area_set_content_height (GTK_DRAWING_AREA (icon), 16);
+  gtk_drawing_area_set_draw_func (GTK_DRAWING_AREA (icon),
+                                  ephy_downloads_progress_icon_draw,
+                                  NULL, NULL);
 }
 
 GtkWidget *
diff --git a/lib/widgets/ephy-file-chooser.c b/lib/widgets/ephy-file-chooser.c
index 1b6dd213c..1ce5f8592 100644
--- a/lib/widgets/ephy-file-chooser.c
+++ b/lib/widgets/ephy-file-chooser.c
@@ -98,27 +98,28 @@ ephy_create_file_chooser (const char            *title,
                           GtkFileChooserAction   action,
                           EphyFileFilterDefault  default_filter)
 {
-  GtkWidget *toplevel_window = gtk_widget_get_toplevel (parent);
+  GtkRoot *root = gtk_widget_get_root (parent);
   GtkFileChooser *dialog;
   GtkFileFilter *filter[EPHY_FILE_FILTER_LAST];
-  g_autofree char *downloads_dir = NULL;
+  g_autofree char *downloads_dir_path = NULL;
+  g_autoptr (GFile) downloads_dir = NULL;
 
-  g_assert (GTK_IS_WINDOW (toplevel_window));
+  g_assert (GTK_IS_WINDOW (root));
   g_assert (default_filter >= 0 && default_filter <= EPHY_FILE_FILTER_LAST);
 
   dialog = GTK_FILE_CHOOSER (gtk_file_chooser_native_new (title,
-                                                          GTK_WINDOW (toplevel_window),
+                                                          GTK_WINDOW (root),
                                                           action,
                                                           NULL,
                                                           _("_Cancel")));
   gtk_native_dialog_set_modal (GTK_NATIVE_DIALOG (dialog), TRUE);
 
-  downloads_dir = ephy_file_get_downloads_dir ();
+  downloads_dir_path = ephy_file_get_downloads_dir ();
+  downloads_dir = g_file_new_for_path (downloads_dir_path);
   gtk_file_chooser_add_shortcut_folder (dialog, downloads_dir, NULL);
 
   if (action == GTK_FILE_CHOOSER_ACTION_OPEN ||
-      action == GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER ||
-      action == GTK_FILE_CHOOSER_ACTION_CREATE_FOLDER) {
+      action == GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER) {
     gtk_file_chooser_native_set_accept_label (GTK_FILE_CHOOSER_NATIVE (dialog), _("_Open"));
   } else if (action == GTK_FILE_CHOOSER_ACTION_SAVE) {
     gtk_file_chooser_native_set_accept_label (GTK_FILE_CHOOSER_NATIVE (dialog), _("_Save"));
diff --git a/lib/widgets/ephy-location-entry-old.c b/lib/widgets/ephy-location-entry-old.c
new file mode 100644
index 000000000..0983b8e2c
--- /dev/null
+++ b/lib/widgets/ephy-location-entry-old.c
@@ -0,0 +1,1369 @@
+/* -*- Mode: C; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/*
+ *  Copyright © 2002  Ricardo Fernández Pascual
+ *  Copyright © 2003, 2004  Marco Pesenti Gritti
+ *  Copyright © 2003, 2004, 2005  Christian Persch
+ *  Copyright © 2008  Xan López
+ *  Copyright © 2016  Igalia S.L.
+ *
+ *  This file is part of Epiphany.
+ *
+ *  Epiphany 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.
+ *
+ *  Epiphany 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 Epiphany.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "config.h"
+#include "ephy-location-entry.h"
+
+#include "ephy-widgets-type-builtins.h"
+#include "ephy-about-handler.h"
+#include "ephy-debug.h"
+#include "ephy-embed-shell.h"
+#include "ephy-gui.h"
+#include "ephy-lib-type-builtins.h"
+#include "ephy-settings.h"
+#include "ephy-signal-accumulator.h"
+#include "ephy-suggestion.h"
+#include "ephy-title-widget.h"
+#include "ephy-uri-helpers.h"
+
+#include <dazzle.h>
+#include <gdk/gdkkeysyms.h>
+#include <glib/gi18n.h>
+#include <gtk/gtk.h>
+#include <string.h>
+#include <webkit2/webkit2.h>
+
+/**
+ * SECTION:ephy-location-entry
+ * @short_description: A location entry widget
+ * @see_also: #GtkEntry
+ *
+ * #EphyLocationEntry implements the location bar in the main Epiphany window.
+ */
+
+struct _EphyLocationEntry {
+  GtkBin parent_instance;
+
+  GtkWidget *overlay;
+  GtkWidget *url_entry;
+  GtkWidget *page_action_box;
+  GtkWidget *bookmark_icon;
+  GtkWidget *bookmark_button;
+  GtkWidget *reader_mode_icon;
+  GtkWidget *reader_mode_button;
+
+  GBinding *paste_binding;
+
+  GtkPopover *add_bookmark_popover;
+  GtkCssProvider *css_provider;
+
+  gboolean reader_mode_active;
+  gboolean button_release_is_blocked;
+
+  char *saved_text;
+  char *jump_tab;
+
+  guint hash;
+
+  guint allocation_width;
+
+  guint dns_prefetch_handle_id;
+
+  guint user_changed : 1;
+  guint can_redo : 1;
+  guint block_update : 1;
+  guint original_address : 1;
+
+  EphySecurityLevel security_level;
+  EphyAdaptiveMode adaptive_mode;
+  EphyBookmarkIconState icon_state;
+};
+
+static gboolean ephy_location_entry_reset_internal (EphyLocationEntry *,
+                                                    gboolean);
+
+enum {
+  PROP_0,
+  PROP_ADDRESS,
+  PROP_SECURITY_LEVEL,
+  LAST_PROP
+};
+
+enum signalsEnum {
+  USER_CHANGED,
+  BOOKMARK_CLICKED,
+  GET_LOCATION,
+  GET_TITLE,
+  LAST_SIGNAL
+};
+static gint signals[LAST_SIGNAL] = { 0 };
+
+static void ephy_location_entry_title_widget_interface_init (EphyTitleWidgetInterface *iface);
+static void schedule_dns_prefetch (EphyLocationEntry *entry,
+                                   const gchar       *url);
+
+G_DEFINE_TYPE_WITH_CODE (EphyLocationEntry, ephy_location_entry, GTK_TYPE_BIN,
+                         G_IMPLEMENT_INTERFACE (EPHY_TYPE_TITLE_WIDGET,
+                                                ephy_location_entry_title_widget_interface_init))
+static gboolean
+entry_button_release (GtkWidget *widget,
+                      GdkEvent  *event,
+                      gpointer   user_data)
+{
+  EphyLocationEntry *entry = EPHY_LOCATION_ENTRY (user_data);
+
+  if (((GdkEventButton *)event)->button != GDK_BUTTON_PRIMARY)
+    return GDK_EVENT_PROPAGATE;
+
+  gtk_editable_select_region (GTK_EDITABLE (entry->url_entry), 0, -1);
+
+  g_signal_handlers_block_by_func (widget, G_CALLBACK (entry_button_release), entry);
+  entry->button_release_is_blocked = TRUE;
+
+  return GDK_EVENT_STOP;
+}
+
+static void
+update_entry_style (EphyLocationEntry *self)
+{
+  PangoAttrList *attrs;
+  PangoAttribute *color_normal;
+  PangoAttribute *color_dimmed;
+  PangoAttribute *scaled;
+  g_autoptr (GUri) uri = NULL;
+  const char *text = gtk_entry_get_text (GTK_ENTRY (self->url_entry));
+  const char *host;
+  const char *base_domain;
+  char *sub_string;
+
+  attrs = pango_attr_list_new ();
+
+  if (self->adaptive_mode == EPHY_ADAPTIVE_MODE_NARROW) {
+    scaled = pango_attr_scale_new (PANGO_SCALE_SMALL);
+    pango_attr_list_insert (attrs, scaled);
+  }
+
+  if (gtk_widget_has_focus (self->url_entry))
+    goto out;
+
+  uri = g_uri_parse (text, G_URI_FLAGS_NONE, NULL);
+  if (!uri)
+    goto out;
+
+  host = g_uri_get_host (uri);
+  if (!host || strlen (host) == 0)
+    goto out;
+
+  base_domain = soup_tld_get_base_domain (host, NULL);
+  if (!base_domain)
+    goto out;
+
+  sub_string = strstr (text, base_domain);
+  if (!sub_string)
+    goto out;
+
+  /* Complete text is dimmed */
+  color_dimmed = pango_attr_foreground_alpha_new (32768);
+  pango_attr_list_insert (attrs, color_dimmed);
+
+  /* Base domain with normal style */
+  color_normal = pango_attr_foreground_alpha_new (65535);
+  color_normal->start_index = sub_string - text;
+  color_normal->end_index = color_normal->start_index + strlen (base_domain);
+  pango_attr_list_insert (attrs, color_normal);
+
+out:
+  gtk_entry_set_attributes (GTK_ENTRY (self->url_entry), attrs);
+  pango_attr_list_unref (attrs);
+}
+
+static gboolean
+entry_focus_in_event (GtkWidget *widget,
+                      GdkEvent  *event,
+                      gpointer   user_data)
+{
+  EphyLocationEntry *self = EPHY_LOCATION_ENTRY (user_data);
+
+  update_entry_style (self);
+  return GDK_EVENT_PROPAGATE;
+}
+
+static gboolean
+entry_focus_out_event (GtkWidget *widget,
+                       GdkEvent  *event,
+                       gpointer   user_data)
+{
+  EphyLocationEntry *entry = EPHY_LOCATION_ENTRY (user_data);
+
+  update_entry_style (entry);
+
+  if (((GdkEventButton *)event)->button != GDK_BUTTON_PRIMARY)
+    return GDK_EVENT_PROPAGATE;
+
+  /* Unselect. */
+  gtk_editable_select_region (GTK_EDITABLE (entry->url_entry), 0, 0);
+
+  if (entry->button_release_is_blocked) {
+    g_signal_handlers_unblock_by_func (widget, G_CALLBACK (entry_button_release), entry);
+    entry->button_release_is_blocked = FALSE;
+  }
+
+  return GDK_EVENT_PROPAGATE;
+}
+
+static void
+editable_changed_cb (GtkEditable       *editable,
+                     EphyLocationEntry *entry);
+
+static void
+ephy_location_entry_activate (EphyLocationEntry *entry)
+{
+  g_signal_emit_by_name (entry->url_entry, "activate");
+}
+
+static void
+update_address_state (EphyLocationEntry *entry)
+{
+  const char *text;
+
+  text = gtk_entry_get_text (GTK_ENTRY (entry->url_entry));
+  entry->original_address = text != NULL &&
+                            g_str_hash (text) == entry->hash;
+}
+
+static void
+ephy_location_entry_title_widget_set_address (EphyTitleWidget *widget,
+                                              const char      *address)
+{
+  EphyLocationEntry *entry = EPHY_LOCATION_ENTRY (widget);
+  GtkClipboard *clipboard;
+  const char *text;
+  g_autofree char *effective_text = NULL;
+  g_autofree char *selection = NULL;
+  int start, end;
+  const char *final_text;
+
+  g_assert (widget);
+
+  /* Setting a new text will clear the clipboard. This makes it impossible
+   * to copy&paste from the location entry of one tab into another tab, see
+   * bug #155824. So we save the selection iff the clipboard was owned by
+   * the location entry.
+   */
+  if (gtk_widget_get_realized (GTK_WIDGET (entry))) {
+    clipboard = gtk_widget_get_clipboard (GTK_WIDGET (entry->url_entry),
+                                          GDK_SELECTION_PRIMARY);
+    g_assert (clipboard != NULL);
+
+    if (gtk_clipboard_get_owner (clipboard) == G_OBJECT (entry->url_entry) &&
+        gtk_editable_get_selection_bounds (GTK_EDITABLE (entry->url_entry),
+                                           &start, &end)) {
+      selection = gtk_editable_get_chars (GTK_EDITABLE (entry->url_entry),
+                                          start, end);
+    }
+  }
+
+  if (address != NULL) {
+    if (g_str_has_prefix (address, EPHY_ABOUT_SCHEME))
+      effective_text = g_strdup_printf ("about:%s",
+                                        address + strlen (EPHY_ABOUT_SCHEME) + 1);
+    text = address;
+  } else {
+    text = "";
+  }
+
+  final_text = effective_text ? effective_text : text;
+
+  /* First record the new hash, then update the entry text */
+  entry->hash = g_str_hash (final_text);
+
+  entry->block_update = TRUE;
+  g_signal_handlers_block_by_func (entry->url_entry, G_CALLBACK (editable_changed_cb), entry);
+  gtk_entry_set_text (GTK_ENTRY (entry->url_entry), final_text);
+  update_entry_style (entry);
+  g_signal_handlers_unblock_by_func (entry->url_entry, G_CALLBACK (editable_changed_cb), entry);
+
+  dzl_suggestion_entry_hide_suggestions (DZL_SUGGESTION_ENTRY (entry->url_entry));
+  entry->block_update = FALSE;
+
+  /* We need to call update_address_state() here, as the 'changed' signal
+   * may not get called if the user has typed in the exact correct url */
+  update_address_state (entry);
+
+  /* Now restore the selection.
+   * Note that it's not owned by the entry anymore!
+   */
+  if (selection != NULL) {
+    gtk_clipboard_set_text (gtk_clipboard_get (GDK_SELECTION_PRIMARY),
+                            selection, strlen (selection));
+  }
+}
+
+static EphySecurityLevel
+ephy_location_entry_title_widget_get_security_level (EphyTitleWidget *widget)
+{
+  EphyLocationEntry *entry = EPHY_LOCATION_ENTRY (widget);
+
+  g_assert (entry);
+
+  return entry->security_level;
+}
+
+static void
+ephy_location_entry_title_widget_set_security_level (EphyTitleWidget  *widget,
+                                                     EphySecurityLevel security_level)
+
+{
+  EphyLocationEntry *entry = EPHY_LOCATION_ENTRY (widget);
+  const char *icon_name;
+
+  g_assert (entry);
+
+  if (!entry->reader_mode_active) {
+    icon_name = ephy_security_level_to_icon_name (security_level);
+    gtk_entry_set_icon_from_icon_name (GTK_ENTRY (entry->url_entry),
+                                       GTK_ENTRY_ICON_PRIMARY,
+                                       icon_name);
+  } else {
+    gtk_entry_set_icon_from_icon_name (GTK_ENTRY (entry->url_entry),
+                                       GTK_ENTRY_ICON_PRIMARY,
+                                       NULL);
+  }
+
+  entry->security_level = security_level;
+}
+
+static void
+ephy_location_entry_finalize (GObject *object)
+{
+  EphyLocationEntry *entry = EPHY_LOCATION_ENTRY (object);
+
+  g_free (entry->saved_text);
+  g_clear_pointer (&entry->jump_tab, g_free);
+
+  G_OBJECT_CLASS (ephy_location_entry_parent_class)->finalize (object);
+}
+
+static void
+ephy_location_entry_do_copy_clipboard (GtkEntry *entry)
+{
+  g_autofree char *text = NULL;
+  gint start;
+  gint end;
+
+  if (!gtk_editable_get_selection_bounds (GTK_EDITABLE (entry), &start, &end))
+    return;
+
+  text = gtk_editable_get_chars (GTK_EDITABLE (entry), start, end);
+
+  if (start == 0) {
+    g_autofree char *tmp = text;
+    text = ephy_uri_normalize (tmp);
+  }
+
+  gtk_clipboard_set_text (gtk_widget_get_clipboard (GTK_WIDGET (entry),
+                                                    GDK_SELECTION_CLIPBOARD),
+                          text, -1);
+}
+
+static void
+ephy_location_entry_copy_clipboard (GtkEntry *entry,
+                                    gpointer  user_data)
+{
+  ephy_location_entry_do_copy_clipboard (entry);
+
+  g_signal_stop_emission_by_name (entry, "copy-clipboard");
+}
+
+static void
+ephy_location_entry_cut_clipboard (GtkEntry *entry)
+{
+  if (!gtk_editable_get_editable (GTK_EDITABLE (entry))) {
+    gtk_widget_error_bell (GTK_WIDGET (entry));
+    return;
+  }
+
+  ephy_location_entry_do_copy_clipboard (entry);
+  gtk_editable_delete_selection (GTK_EDITABLE (entry));
+
+  g_signal_stop_emission_by_name (entry, "cut-clipboard");
+}
+
+static void
+ephy_location_entry_title_widget_interface_init (EphyTitleWidgetInterface *iface)
+{
+  iface->get_address = ephy_location_entry_title_widget_get_address;
+  iface->set_address = ephy_location_entry_title_widget_set_address;
+  iface->get_security_level = ephy_location_entry_title_widget_get_security_level;
+  iface->set_security_level = ephy_location_entry_title_widget_set_security_level;
+}
+
+static void
+ephy_location_entry_dispose (GObject *object)
+{
+  EphyLocationEntry *entry = EPHY_LOCATION_ENTRY (object);
+
+  g_clear_object (&entry->css_provider);
+
+  G_OBJECT_CLASS (ephy_location_entry_parent_class)->dispose (object);
+}
+
+static void
+editable_changed_cb (GtkEditable       *editable,
+                     EphyLocationEntry *entry)
+{
+  update_address_state (entry);
+
+  if (entry->block_update == TRUE)
+    return;
+  else {
+    entry->user_changed = TRUE;
+    entry->can_redo = FALSE;
+  }
+
+  g_clear_pointer (&entry->jump_tab, g_free);
+
+  g_signal_emit (entry, signals[USER_CHANGED], 0);
+}
+
+static gboolean
+entry_key_press_cb (GtkEntry          *entry,
+                    GdkEventKey       *event,
+                    EphyLocationEntry *location_entry)
+{
+  guint state = event->state & gtk_accelerator_get_default_mod_mask ();
+
+
+  if (event->keyval == GDK_KEY_Escape && state == 0) {
+    ephy_location_entry_reset_internal (location_entry, FALSE);
+  }
+
+  if (event->keyval == GDK_KEY_l && state == GDK_CONTROL_MASK) {
+    /* Make sure the location is activated on CTRL+l even when the
+     * completion popup is shown and have an active keyboard grab.
+     */
+    ephy_location_entry_focus (location_entry);
+  }
+
+  if (event->keyval == GDK_KEY_Return ||
+      event->keyval == GDK_KEY_KP_Enter ||
+      event->keyval == GDK_KEY_ISO_Enter) {
+    if (location_entry->jump_tab) {
+      g_signal_handlers_block_by_func (location_entry->url_entry, G_CALLBACK (editable_changed_cb), 
location_entry);
+      gtk_entry_set_text (GTK_ENTRY (location_entry->url_entry), location_entry->jump_tab);
+      g_signal_handlers_unblock_by_func (location_entry->url_entry, G_CALLBACK (editable_changed_cb), 
location_entry);
+      g_clear_pointer (&location_entry->jump_tab, g_free);
+    } else {
+      g_autofree gchar *text = g_strdup (gtk_entry_get_text (GTK_ENTRY (location_entry->url_entry)));
+      gchar *url = g_strstrip (text);
+      g_autofree gchar *new_url = NULL;
+
+      gtk_entry_set_text (GTK_ENTRY (entry), location_entry->jump_tab ? location_entry->jump_tab : text);
+
+      if (strlen (url) > 5 && g_str_has_prefix (url, "http:") && url[5] != '/')
+        new_url = g_strdup_printf ("http://%s";, url + 5);
+      else if (strlen (url) > 6 && g_str_has_prefix (url, "https:") && url[6] != '/')
+        new_url = g_strdup_printf ("https://%s";, url + 6);
+
+      if (new_url) {
+        g_signal_handlers_block_by_func (location_entry->url_entry, G_CALLBACK (editable_changed_cb), 
location_entry);
+        gtk_entry_set_text (GTK_ENTRY (location_entry->url_entry), new_url);
+        g_signal_handlers_unblock_by_func (location_entry->url_entry, G_CALLBACK (editable_changed_cb), 
location_entry);
+      }
+
+      if (state == GDK_CONTROL_MASK) {
+        /* Remove control mask to prevent opening address in a new window */
+        event->state &= ~GDK_CONTROL_MASK;
+
+        if (!g_utf8_strchr (url, -1, ' ') && !g_utf8_strchr (url, -1, '.')) {
+          g_autofree gchar *new_url = g_strdup_printf ("www.%s.com", url);
+
+          g_signal_handlers_block_by_func (location_entry->url_entry, G_CALLBACK (editable_changed_cb), 
location_entry);
+          gtk_entry_set_text (GTK_ENTRY (location_entry->url_entry), new_url);
+          g_signal_handlers_unblock_by_func (location_entry->url_entry, G_CALLBACK (editable_changed_cb), 
location_entry);
+        }
+      }
+    }
+
+    ephy_location_entry_activate (location_entry);
+
+    return GDK_EVENT_STOP;
+  }
+
+  return GDK_EVENT_PROPAGATE;
+}
+
+static void
+entry_clear_activate_cb (GtkMenuItem       *item,
+                         EphyLocationEntry *entry)
+{
+  entry->block_update = TRUE;
+  g_signal_handlers_block_by_func (entry->url_entry, G_CALLBACK (editable_changed_cb), entry);
+  gtk_entry_set_text (GTK_ENTRY (entry->url_entry), "");
+  g_signal_handlers_unblock_by_func (entry->url_entry, G_CALLBACK (editable_changed_cb), entry);
+  entry->block_update = FALSE;
+  entry->user_changed = TRUE;
+}
+
+static void
+paste_received (GtkClipboard      *clipboard,
+                const gchar       *text,
+                EphyLocationEntry *entry)
+{
+  if (text) {
+    g_signal_handlers_block_by_func (entry->url_entry, G_CALLBACK (editable_changed_cb), entry);
+    gtk_entry_set_text (GTK_ENTRY (entry->url_entry), text);
+    ephy_location_entry_activate (entry);
+    g_signal_handlers_unblock_by_func (entry->url_entry, G_CALLBACK (editable_changed_cb), entry);
+  }
+}
+
+static void
+entry_paste_and_go_activate_cb (GtkMenuItem       *item,
+                                EphyLocationEntry *entry)
+{
+  GtkClipboard *clipboard;
+
+  clipboard = gtk_clipboard_get_default (gdk_display_get_default ());
+  gtk_clipboard_request_text (clipboard,
+                              (GtkClipboardTextReceivedFunc)paste_received,
+                              entry);
+}
+
+static void
+entry_redo_activate_cb (GtkMenuItem       *item,
+                        EphyLocationEntry *entry)
+{
+  ephy_location_entry_undo_reset (entry);
+}
+
+static void
+entry_undo_activate_cb (GtkMenuItem       *item,
+                        EphyLocationEntry *entry)
+{
+  ephy_location_entry_reset_internal (entry, FALSE);
+}
+
+/* The build should fail here each time when upgrading to a new major version
+ * of GTK+, so that we don't forget to update this domain.
+ */
+#if GTK_MAJOR_VERSION == 3
+#define GTK_GETTEXT_DOMAIN "gtk30"
+#endif
+
+static void
+entry_populate_popup_cb (GtkEntry          *entry,
+                         GtkMenu           *menu,
+                         EphyLocationEntry *lentry)
+{
+  GtkWidget *clear_menuitem;
+  GtkWidget *undo_menuitem;
+  GtkWidget *redo_menuitem;
+  GtkWidget *paste_and_go_menuitem;
+  GtkWidget *separator;
+  GtkWidget *paste_menuitem = NULL;
+  GList *children, *item;
+  int pos = 0, sep = 0;
+  gboolean is_editable;
+
+  /* Translators: the mnemonic shouldn't conflict with any of the
+   * standard items in the GtkEntry context menu (Cut, Copy, Paste, Delete,
+   * Select All, Input Methods and Insert Unicode control character.)
+   */
+  clear_menuitem = gtk_menu_item_new_with_mnemonic (_("Cl_ear"));
+  g_signal_connect (clear_menuitem, "activate",
+                    G_CALLBACK (entry_clear_activate_cb), lentry);
+  is_editable = gtk_editable_get_editable (GTK_EDITABLE (entry));
+  gtk_widget_set_sensitive (clear_menuitem, is_editable);
+  gtk_widget_show (clear_menuitem);
+
+  /* search for the 2nd separator (the one after Select All) in the context
+   * menu, and insert this menu item before it.
+   * It's a bit of a hack, but there seems to be no better way to do it :/
+   */
+  children = gtk_container_get_children (GTK_CONTAINER (menu));
+  for (item = children; item != NULL && sep < 2; item = item->next, pos++) {
+    if (GTK_IS_SEPARATOR_MENU_ITEM (item->data))
+      sep++;
+  }
+  g_list_free (children);
+
+  gtk_menu_shell_insert (GTK_MENU_SHELL (menu), clear_menuitem, pos - 1);
+
+  paste_and_go_menuitem = gtk_menu_item_new_with_mnemonic (_("Paste and _Go"));
+
+  /* Search for the Paste menu item and insert right after it. */
+  children = gtk_container_get_children (GTK_CONTAINER (menu));
+  for (item = children, pos = 0; item != NULL; item = item->next, pos++) {
+    if (g_strcmp0 (gtk_menu_item_get_label (item->data), g_dgettext (GTK_GETTEXT_DOMAIN, "_Paste")) == 0) {
+      paste_menuitem = item->data;
+      break;
+    }
+  }
+  g_assert (paste_menuitem != NULL);
+  g_list_free (children);
+
+  g_signal_connect (paste_and_go_menuitem, "activate",
+                    G_CALLBACK (entry_paste_and_go_activate_cb), lentry);
+  lentry->paste_binding = g_object_bind_property (paste_menuitem, "sensitive",
+                                                  paste_and_go_menuitem, "sensitive",
+                                                  G_BINDING_SYNC_CREATE);
+  gtk_widget_show (paste_and_go_menuitem);
+  gtk_menu_shell_insert (GTK_MENU_SHELL (menu), paste_and_go_menuitem, pos + 1);
+
+  undo_menuitem = gtk_menu_item_new_with_mnemonic (_("_Undo"));
+  gtk_widget_set_sensitive (undo_menuitem, lentry->user_changed);
+  g_signal_connect (undo_menuitem, "activate",
+                    G_CALLBACK (entry_undo_activate_cb), lentry);
+  gtk_widget_show (undo_menuitem);
+  gtk_menu_shell_insert (GTK_MENU_SHELL (menu), undo_menuitem, 0);
+
+  redo_menuitem = gtk_menu_item_new_with_mnemonic (_("_Redo"));
+  gtk_widget_set_sensitive (redo_menuitem, lentry->can_redo);
+  g_signal_connect (redo_menuitem, "activate",
+                    G_CALLBACK (entry_redo_activate_cb), lentry);
+  gtk_widget_show (redo_menuitem);
+  gtk_menu_shell_insert (GTK_MENU_SHELL (menu), redo_menuitem, 1);
+
+  separator = gtk_separator_menu_item_new ();
+  gtk_widget_show (separator);
+  gtk_menu_shell_insert (GTK_MENU_SHELL (menu), separator, 2);
+}
+
+static gboolean
+icon_button_icon_press_event_cb (GtkWidget            *widget,
+                                 GtkEntryIconPosition  position,
+                                 GdkEventButton       *event,
+                                 EphyLocationEntry    *entry)
+{
+  if (((event->type == GDK_BUTTON_PRESS &&
+        event->button == 1) ||
+       (event->type == GDK_TOUCH_BEGIN))) {
+    if (position == GTK_ENTRY_ICON_PRIMARY) {
+      GdkRectangle lock_position;
+      gtk_entry_get_icon_area (GTK_ENTRY (entry->url_entry), GTK_ENTRY_ICON_PRIMARY, &lock_position);
+      g_signal_emit_by_name (entry, "lock-clicked", &lock_position);
+    } else {
+      g_signal_emit (entry, signals[BOOKMARK_CLICKED], 0);
+    }
+    return TRUE;
+  }
+
+  return FALSE;
+}
+
+static void
+bookmark_icon_button_clicked_cb (GtkButton         *button,
+                                 EphyLocationEntry *lentry)
+{
+  g_signal_emit (lentry, signals[BOOKMARK_CLICKED], 0);
+}
+
+static GtkBorder
+get_progress_margin (EphyLocationEntry *entry)
+{
+  g_autoptr (GtkWidgetPath) path = NULL;
+  g_autoptr (GtkStyleContext) context = NULL;
+  GtkBorder margin;
+  gint pos;
+
+  path = gtk_widget_path_copy (gtk_widget_get_path (entry->url_entry));
+
+  pos = gtk_widget_path_append_type (path, GTK_TYPE_WIDGET);
+  gtk_widget_path_iter_set_object_name (path, pos, "progress");
+
+  context = gtk_style_context_new ();
+  gtk_style_context_set_path (context, path);
+
+  gtk_style_context_get_margin (context, gtk_style_context_get_state (context), &margin);
+
+  return margin;
+}
+
+static GtkBorder
+get_padding (EphyLocationEntry *entry)
+{
+  g_autoptr (GtkWidgetPath) path = NULL;
+  g_autoptr (GtkStyleContext) context = NULL;
+  GtkBorder padding;
+
+  path = gtk_widget_path_copy (gtk_widget_get_path (entry->url_entry));
+
+  /* Create a new context here, since the existing one has extra css loaded */
+  context = gtk_style_context_new ();
+  gtk_style_context_set_path (context, path);
+
+  gtk_style_context_get_padding (context, gtk_style_context_get_state (context), &padding);
+
+  return padding;
+}
+
+static void
+button_box_size_allocated_cb (GtkWidget    *widget,
+                              GdkRectangle *allocation,
+                              gpointer      user_data)
+{
+  EphyLocationEntry *lentry = EPHY_LOCATION_ENTRY (user_data);
+  g_autofree gchar *css = NULL;
+  GtkBorder margin, padding;
+
+  if (lentry->allocation_width == (guint)allocation->width)
+    return;
+
+  lentry->allocation_width = allocation->width;
+
+  margin = get_progress_margin (lentry);
+  padding = get_padding (lentry);
+
+  /* We are using the CSS provider here to solve UI displaying issues:
+   *  - padding-right is used to prevent text below the icons on the right side
+   *    of the entry (removing the icon button box width (allocation width).
+   *  - progress margin-right is used to allow progress bar below icons on the
+   *    right side.
+   *
+   * FIXME: Loading CSS during size_allocate is ILLEGAL and BROKEN.
+   */
+  css = g_strdup_printf (".url_entry:dir(ltr) { padding-right: %dpx; }" \
+                         ".url_entry:dir(rtl) { padding-left: %dpx; }" \
+                         ".url_entry:dir(ltr) progress { margin-right: %dpx; }" \
+                         ".url_entry:dir(rtl) progress { margin-left: %dpx; }",
+                         lentry->allocation_width,
+                         lentry->allocation_width,
+                         margin.right + padding.right - lentry->allocation_width,
+                         margin.left + padding.left - lentry->allocation_width);
+  gtk_css_provider_load_from_data (lentry->css_provider, css, -1, NULL);
+}
+
+static gboolean
+event_button_press_event_cb (GtkWidget *widget,
+                             GdkEvent  *event,
+                             gpointer   user_data)
+{
+  return GDK_EVENT_STOP;
+}
+
+static void
+ephy_location_entry_suggestion_activated (DzlSuggestionEntry *entry,
+                                          DzlSuggestion      *arg1,
+                                          gpointer            user_data)
+{
+  EphyLocationEntry *lentry = EPHY_LOCATION_ENTRY (user_data);
+  DzlSuggestion *suggestion = dzl_suggestion_entry_get_suggestion (entry);
+  const gchar *text = ephy_suggestion_get_uri (EPHY_SUGGESTION (suggestion));
+
+  g_signal_handlers_block_by_func (entry, G_CALLBACK (editable_changed_cb), user_data);
+  gtk_entry_set_text (GTK_ENTRY (entry), lentry->jump_tab ? lentry->jump_tab : text);
+  g_clear_pointer (&lentry->jump_tab, g_free);
+  g_signal_handlers_unblock_by_func (entry, G_CALLBACK (editable_changed_cb), user_data);
+
+  g_signal_stop_emission_by_name (entry, "suggestion-activated");
+
+  dzl_suggestion_entry_hide_suggestions (entry);
+
+  /* Now trigger the load.... */
+  ephy_location_entry_activate (EPHY_LOCATION_ENTRY (lentry));
+}
+
+static void
+suggestion_selected (DzlSuggestionEntry *entry,
+                     DzlSuggestion      *suggestion,
+                     gpointer            user_data)
+{
+  EphyLocationEntry *lentry = EPHY_LOCATION_ENTRY (user_data);
+  const gchar *uri = dzl_suggestion_get_id (suggestion);
+
+  g_signal_handlers_block_by_func (entry, G_CALLBACK (editable_changed_cb), user_data);
+  g_clear_pointer (&lentry->jump_tab, g_free);
+
+  if (g_str_has_prefix (uri, "ephy-tab://")) {
+    lentry->jump_tab = g_strdup (uri);
+    gtk_entry_set_text (GTK_ENTRY (entry), dzl_suggestion_get_subtitle (suggestion));
+  } else {
+    gtk_entry_set_text (GTK_ENTRY (entry), uri);
+  }
+  gtk_editable_set_position (GTK_EDITABLE (entry), -1);
+  g_signal_handlers_unblock_by_func (entry, G_CALLBACK (editable_changed_cb), user_data);
+
+  schedule_dns_prefetch (lentry, uri);
+}
+
+static void
+handle_forward_tab_key (GtkWidget *widget,
+                        gpointer   user_data)
+{
+  EphyLocationEntry *entry = EPHY_LOCATION_ENTRY (user_data);
+  GtkWidget *popover;
+
+  popover = dzl_suggestion_entry_get_popover (DZL_SUGGESTION_ENTRY (entry->url_entry));
+  if (gtk_widget_is_visible (popover)) {
+    g_signal_emit_by_name (entry->url_entry, "move-suggestion", 1, G_TYPE_INT, 1, G_TYPE_NONE);
+  } else {
+    gtk_widget_child_focus (gtk_widget_get_toplevel (GTK_WIDGET (entry)), GTK_DIR_TAB_FORWARD);
+  }
+}
+
+static void
+handle_backward_tab_key (GtkWidget *widget,
+                         gpointer   user_data)
+{
+  EphyLocationEntry *entry = EPHY_LOCATION_ENTRY (user_data);
+  GtkWidget *popover;
+
+  popover = dzl_suggestion_entry_get_popover (DZL_SUGGESTION_ENTRY (entry->url_entry));
+  if (gtk_widget_is_visible (popover)) {
+    g_signal_emit_by_name (entry->url_entry, "move-suggestion", -1, G_TYPE_INT, 1, G_TYPE_NONE);
+  } else {
+    gtk_widget_child_focus (gtk_widget_get_toplevel (GTK_WIDGET (entry)), GTK_DIR_TAB_BACKWARD);
+  }
+}
+
+static void
+position_func (DzlSuggestionEntry *self,
+               GdkRectangle       *area,
+               gboolean           *is_absolute,
+               gpointer            user_data)
+{
+  GtkStyleContext *style_context;
+  GtkAllocation alloc;
+  GtkStateFlags state;
+  GtkBorder margin;
+
+  g_assert (DZL_IS_SUGGESTION_ENTRY (self));
+  g_assert (area != NULL);
+  g_assert (is_absolute != NULL);
+
+  *is_absolute = FALSE;
+
+  gtk_widget_get_allocation (GTK_WIDGET (self), &alloc);
+
+  area->y += alloc.height;
+  area->y += 6;
+  area->height = 300;
+
+  /* Adjust for bottom margin */
+  style_context = gtk_widget_get_style_context (GTK_WIDGET (self));
+  state = gtk_style_context_get_state (style_context);
+  gtk_style_context_get_margin (style_context, state, &margin);
+
+  area->y -= margin.bottom;
+  area->x += margin.left;
+  area->width -= margin.left + margin.right;
+}
+
+static void
+update_reader_icon (EphyLocationEntry *entry)
+{
+  GtkIconTheme *theme;
+  const gchar *name;
+
+  theme = gtk_icon_theme_get_default ();
+
+  if (gtk_icon_theme_has_icon (theme, "view-reader-symbolic"))
+    name = "view-reader-symbolic";
+  else
+    name = "ephy-reader-mode-symbolic";
+
+  gtk_image_set_from_icon_name (GTK_IMAGE (entry->reader_mode_icon),
+                                name, GTK_ICON_SIZE_MENU);
+}
+
+static void
+ephy_location_entry_construct_contents (EphyLocationEntry *entry)
+{
+  GtkWidget *event;
+  GtkWidget *box;
+  GtkStyleContext *context;
+  DzlShortcutController *controller;
+
+  LOG ("EphyLocationEntry constructing contents %p", entry);
+
+  /* Overlay */
+  entry->overlay = gtk_overlay_new ();
+  gtk_widget_show (GTK_WIDGET (entry->overlay));
+  gtk_container_add (GTK_CONTAINER (entry), entry->overlay);
+
+  /* URL entry */
+  entry->url_entry = dzl_suggestion_entry_new ();
+  dzl_suggestion_entry_set_compact (DZL_SUGGESTION_ENTRY (entry->url_entry), TRUE);
+  dzl_suggestion_entry_set_position_func (DZL_SUGGESTION_ENTRY (entry->url_entry), position_func, NULL, 
NULL);
+  gtk_entry_set_icon_tooltip_text (GTK_ENTRY (entry->url_entry), GTK_ENTRY_ICON_PRIMARY, _("Show website 
security status and permissions"));
+  gtk_entry_set_width_chars (GTK_ENTRY (entry->url_entry), 0);
+  gtk_entry_set_placeholder_text (GTK_ENTRY (entry->url_entry), _("Search for websites, bookmarks, and open 
tabs"));
+
+  /* Add special widget css provider */
+  context = gtk_widget_get_style_context (GTK_WIDGET (entry->url_entry));
+  entry->css_provider = gtk_css_provider_new ();
+  gtk_style_context_add_provider (context, GTK_STYLE_PROVIDER (entry->css_provider), 
GTK_STYLE_PROVIDER_PRIORITY_USER);
+
+  gtk_style_context_add_class (gtk_widget_get_style_context (GTK_WIDGET (entry->url_entry)), "url_entry");
+  g_signal_connect (G_OBJECT (entry->url_entry), "copy-clipboard", G_CALLBACK 
(ephy_location_entry_copy_clipboard), NULL);
+  g_signal_connect (G_OBJECT (entry->url_entry), "cut-clipboard", G_CALLBACK 
(ephy_location_entry_cut_clipboard), NULL);
+  g_signal_connect (G_OBJECT (entry->url_entry), "changed", G_CALLBACK (editable_changed_cb), entry);
+  g_signal_connect (G_OBJECT (entry->url_entry), "suggestion-selected", G_CALLBACK (suggestion_selected), 
entry);
+  gtk_widget_show (GTK_WIDGET (entry->url_entry));
+  gtk_container_add (GTK_CONTAINER (entry->overlay), GTK_WIDGET (entry->url_entry));
+
+  /* Event box */
+  event = gtk_event_box_new ();
+  gtk_widget_set_halign (event, GTK_ALIGN_END);
+  gtk_widget_show (event);
+  g_signal_connect (G_OBJECT (event), "button-press-event", G_CALLBACK (event_button_press_event_cb), entry);
+  gtk_overlay_add_overlay (GTK_OVERLAY (entry->overlay), event);
+
+  /* Button Box */
+  box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
+  gtk_container_add (GTK_CONTAINER (event), box);
+  g_signal_connect (G_OBJECT (box), "size-allocate", G_CALLBACK (button_box_size_allocated_cb), entry);
+  gtk_widget_set_valign (box, GTK_ALIGN_CENTER);
+  gtk_widget_set_halign (box, GTK_ALIGN_END);
+  gtk_widget_show (box);
+
+  /* Page action box */
+  entry->page_action_box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
+  gtk_box_pack_start (GTK_BOX (box), entry->page_action_box, FALSE, TRUE, 0);
+
+  context = gtk_widget_get_style_context (box);
+  gtk_style_context_add_class (context, "entry_icon_box");
+
+  /* Reader Mode */
+  entry->reader_mode_button = gtk_button_new_from_icon_name (NULL, GTK_ICON_SIZE_MENU);
+  gtk_widget_set_tooltip_text (entry->reader_mode_button, _("Toggle reader mode"));
+  entry->reader_mode_icon = gtk_button_get_image (GTK_BUTTON (entry->reader_mode_button));
+  gtk_box_pack_start (GTK_BOX (box), entry->reader_mode_button, FALSE, TRUE, 0);
+
+  context = gtk_widget_get_style_context (entry->reader_mode_icon);
+  gtk_style_context_add_class (context, "entry_icon");
+
+  update_reader_icon (entry);
+  g_signal_connect_object (gtk_settings_get_default (), "notify::gtk-icon-theme-name",
+                           G_CALLBACK (update_reader_icon), entry, G_CONNECT_SWAPPED);
+
+  /* Bookmark */
+  entry->bookmark_button = gtk_button_new_from_icon_name ("non-starred-symbolic", GTK_ICON_SIZE_MENU);
+  gtk_widget_set_tooltip_text (entry->bookmark_button, _("Bookmark this page"));
+  entry->bookmark_icon = gtk_button_get_image (GTK_BUTTON (entry->bookmark_button));
+  g_signal_connect (G_OBJECT (entry->bookmark_button), "clicked", G_CALLBACK 
(bookmark_icon_button_clicked_cb), entry);
+  gtk_box_pack_start (GTK_BOX (box), entry->bookmark_button, FALSE, TRUE, 0);
+
+  context = gtk_widget_get_style_context (entry->bookmark_icon);
+  gtk_style_context_add_class (context, "entry_icon");
+
+  g_settings_bind (EPHY_SETTINGS_LOCKDOWN,
+                   EPHY_PREFS_LOCKDOWN_BOOKMARK_EDITING,
+                   entry->bookmark_button,
+                   "visible",
+                   G_SETTINGS_BIND_GET | G_SETTINGS_BIND_INVERT_BOOLEAN);
+
+  g_object_connect (entry->url_entry,
+                    "signal::icon-press", G_CALLBACK (icon_button_icon_press_event_cb), entry,
+                    "signal::populate-popup", G_CALLBACK (entry_populate_popup_cb), entry,
+                    "signal::key-press-event", G_CALLBACK (entry_key_press_cb), entry,
+                    NULL);
+
+  g_signal_connect (entry->url_entry, "suggestion-activated",
+                    G_CALLBACK (ephy_location_entry_suggestion_activated), entry);
+
+  g_signal_connect (entry->url_entry, "button-release-event", G_CALLBACK (entry_button_release), entry);
+  g_signal_connect (entry->url_entry, "focus-in-event", G_CALLBACK (entry_focus_in_event), entry);
+  g_signal_connect (entry->url_entry, "focus-out-event", G_CALLBACK (entry_focus_out_event), entry);
+
+  controller = dzl_shortcut_controller_find (entry->url_entry);
+  dzl_shortcut_controller_add_command_callback (controller,
+                                                "org.gnome.Epiphany.complete-url-forward",
+                                                "Tab",
+                                                DZL_SHORTCUT_PHASE_DISPATCH,
+                                                handle_forward_tab_key,
+                                                entry,
+                                                NULL);
+
+  dzl_shortcut_controller_add_command_callback (controller,
+                                                "org.gnome.Epiphany.complete-url-backward",
+                                                "ISO_Left_Tab",
+                                                DZL_SHORTCUT_PHASE_DISPATCH,
+                                                handle_backward_tab_key,
+                                                entry,
+                                                NULL);
+}
+
+static void
+ephy_location_entry_init (EphyLocationEntry *le)
+{
+  LOG ("EphyLocationEntry initialising %p", le);
+
+  le->user_changed = FALSE;
+  le->block_update = FALSE;
+  le->button_release_is_blocked = FALSE;
+  le->saved_text = NULL;
+
+  ephy_location_entry_construct_contents (le);
+}
+
+GtkWidget *
+ephy_location_entry_new (void)
+{
+  return GTK_WIDGET (g_object_new (EPHY_TYPE_LOCATION_ENTRY, NULL));
+}
+
+typedef struct {
+  GUri *uri;
+  EphyLocationEntry *entry;
+} PrefetchHelper;
+
+static void
+free_prefetch_helper (PrefetchHelper *helper)
+{
+  g_uri_unref (helper->uri);
+  g_object_unref (helper->entry);
+  g_free (helper);
+}
+
+static gboolean
+do_dns_prefetch (PrefetchHelper *helper)
+{
+  EphyEmbedShell *shell = ephy_embed_shell_get_default ();
+
+  if (helper->uri)
+    webkit_web_context_prefetch_dns (ephy_embed_shell_get_web_context (shell), g_uri_get_host (helper->uri));
+
+  helper->entry->dns_prefetch_handle_id = 0;
+
+  return G_SOURCE_REMOVE;
+}
+
+/*
+ * Note: As we do not have access to WebKitNetworkProxyMode, and because
+ * Epiphany does not ever change it, we are just checking system default proxy.
+ */
+static void
+proxy_resolver_ready_cb (GObject      *object,
+                         GAsyncResult *result,
+                         gpointer      user_data)
+{
+  PrefetchHelper *helper = user_data;
+  GProxyResolver *resolver = G_PROXY_RESOLVER (object);
+  g_autoptr (GError) error = NULL;
+  g_auto (GStrv) proxies = NULL;
+
+  proxies = g_proxy_resolver_lookup_finish (resolver, result, &error);
+  if (error != NULL) {
+    free_prefetch_helper (helper);
+    return;
+  }
+
+  if (proxies != NULL && (g_strv_length (proxies) > 1 || g_strcmp0 (proxies[0], "direct://") != 0)) {
+    free_prefetch_helper (helper);
+    return;
+  }
+
+  g_clear_handle_id (&helper->entry->dns_prefetch_handle_id, g_source_remove);
+  helper->entry->dns_prefetch_handle_id =
+    g_timeout_add_full (G_PRIORITY_DEFAULT,
+                        250,
+                        (GSourceFunc)do_dns_prefetch,
+                        helper,
+                        (GDestroyNotify)free_prefetch_helper);
+  g_source_set_name_by_id (helper->entry->dns_prefetch_handle_id, "[epiphany] do_dns_prefetch");
+}
+
+static void
+schedule_dns_prefetch (EphyLocationEntry *entry,
+                       const gchar       *url)
+{
+  GProxyResolver *resolver = g_proxy_resolver_get_default ();
+  PrefetchHelper *helper;
+  g_autoptr (GUri) uri = NULL;
+
+  if (resolver == NULL)
+    return;
+
+  uri = g_uri_parse (url, G_URI_FLAGS_NONE, NULL);
+  if (!uri || !g_uri_get_host (uri))
+    return;
+
+  helper = g_new0 (PrefetchHelper, 1);
+  helper->entry = g_object_ref (entry);
+  helper->uri = g_steal_pointer (&uri);
+
+  g_proxy_resolver_lookup_async (resolver, url, NULL, proxy_resolver_ready_cb, helper);
+}
+
+/**
+ * ephy_location_entry_get_can_undo:
+ * @entry: an #EphyLocationEntry widget
+ *
+ * Wheter @entry can restore the displayed user modified text to the unmodified
+ * previous text.
+ *
+ * Return value: TRUE or FALSE indicating if the text can be restored
+ *
+ **/
+gboolean
+ephy_location_entry_get_can_undo (EphyLocationEntry *entry)
+{
+  return entry->user_changed;
+}
+
+/**
+ * ephy_location_entry_get_can_redo:
+ * @entry: an #EphyLocationEntry widget
+ *
+ * Wheter @entry can restore the displayed text to the user modified version
+ * before the undo.
+ *
+ * Return value: TRUE or FALSE indicating if the text can be restored
+ *
+ **/
+gboolean
+ephy_location_entry_get_can_redo (EphyLocationEntry *entry)
+{
+  return entry->can_redo;
+}
+
+static gboolean
+ephy_location_entry_reset_internal (EphyLocationEntry *entry,
+                                    gboolean           notify)
+{
+  const char *text, *old_text;
+  g_autofree char *url = NULL;
+  gboolean retval;
+
+  g_signal_emit (entry, signals[GET_LOCATION], 0, &url);
+  text = url != NULL ? url : "";
+  old_text = gtk_entry_get_text (GTK_ENTRY (entry->url_entry));
+  old_text = old_text != NULL ? old_text : "";
+
+  g_free (entry->saved_text);
+  entry->saved_text = g_strdup (old_text);
+  entry->can_redo = TRUE;
+
+  retval = g_str_hash (text) != g_str_hash (old_text);
+
+  ephy_title_widget_set_address (EPHY_TITLE_WIDGET (entry), text);
+
+  if (notify) {
+    g_signal_emit (entry, signals[USER_CHANGED], 0);
+  }
+
+  entry->user_changed = FALSE;
+
+  return retval;
+}
+
+/**
+ * ephy_location_entry_undo_reset:
+ * @entry: an #EphyLocationEntry widget
+ *
+ * Undo a previous ephy_location_entry_reset.
+ *
+ **/
+void
+ephy_location_entry_undo_reset (EphyLocationEntry *entry)
+{
+  g_signal_handlers_block_by_func (entry->url_entry, G_CALLBACK (editable_changed_cb), entry);
+  gtk_entry_set_text (GTK_ENTRY (entry->url_entry), entry->saved_text);
+  g_signal_handlers_unblock_by_func (entry->url_entry, G_CALLBACK (editable_changed_cb), entry);
+  entry->can_redo = FALSE;
+  entry->user_changed = TRUE;
+}
+
+/**
+ * ephy_location_entry_reset:
+ * @entry: an #EphyLocationEntry widget
+ *
+ * Restore the @entry to the text corresponding to the current location, this
+ * does not fire the user_changed signal. This is called each time the user
+ * presses Escape while the location entry is selected.
+ *
+ * Return value: TRUE on success, FALSE otherwise
+ *
+ **/
+gboolean
+ephy_location_entry_reset (EphyLocationEntry *entry)
+{
+  return ephy_location_entry_reset_internal (entry, FALSE);
+}
+
+/**
+ * ephy_location_entry_focus:
+ * @entry: an #EphyLocationEntry widget
+ *
+ * Set focus on @entry and select the text whithin. This is called when the
+ * user hits Control+L.
+ *
+ **/
+void
+ephy_location_entry_focus (EphyLocationEntry *entry)
+{
+  gtk_widget_grab_focus (GTK_WIDGET (entry->url_entry));
+}
+
+void
+ephy_location_entry_set_bookmark_icon_state (EphyLocationEntry     *self,
+                                             EphyBookmarkIconState  state)
+{
+  GtkStyleContext *context;
+
+  self->icon_state = state;
+
+  g_assert (EPHY_IS_LOCATION_ENTRY (self));
+
+  context = gtk_widget_get_style_context (GTK_WIDGET (self->bookmark_icon));
+
+  if (self->adaptive_mode == EPHY_ADAPTIVE_MODE_NARROW)
+    state = EPHY_BOOKMARK_ICON_HIDDEN;
+
+  switch (state) {
+    case EPHY_BOOKMARK_ICON_HIDDEN:
+      gtk_widget_set_visible (self->bookmark_button, FALSE);
+      gtk_style_context_remove_class (context, "starred");
+      gtk_style_context_remove_class (context, "non-starred");
+      break;
+    case EPHY_BOOKMARK_ICON_EMPTY:
+      gtk_widget_set_visible (self->bookmark_button, TRUE);
+      gtk_image_set_from_icon_name (GTK_IMAGE (self->bookmark_icon),
+                                    "non-starred-symbolic",
+                                    GTK_ICON_SIZE_MENU);
+      gtk_style_context_remove_class (context, "starred");
+      gtk_style_context_add_class (context, "non-starred");
+      break;
+    case EPHY_BOOKMARK_ICON_BOOKMARKED:
+      gtk_widget_set_visible (self->bookmark_button, TRUE);
+      gtk_image_set_from_icon_name (GTK_IMAGE (self->bookmark_icon),
+                                    "starred-symbolic",
+                                    GTK_ICON_SIZE_MENU);
+      gtk_style_context_remove_class (context, "non-starred");
+      gtk_style_context_add_class (context, "starred");
+      break;
+    default:
+      g_assert_not_reached ();
+  }
+}
+
+/**
+ * ephy_location_entry_set_lock_tooltip:
+ * @entry: an #EphyLocationEntry widget
+ * @tooltip: the text to be set in the tooltip for the lock icon
+ *
+ * Set the text to be displayed when hovering the lock icon of @entry.
+ *
+ **/
+void
+ephy_location_entry_set_lock_tooltip (EphyLocationEntry *entry,
+                                      const char        *tooltip)
+{
+  gtk_entry_set_icon_tooltip_text (GTK_ENTRY (entry->url_entry),
+                                   GTK_ENTRY_ICON_PRIMARY,
+                                   tooltip);
+}
+
+void
+ephy_location_entry_set_add_bookmark_popover (EphyLocationEntry *entry,
+                                              GtkPopover        *popover)
+{
+  g_assert (EPHY_IS_LOCATION_ENTRY (entry));
+  g_assert (GTK_IS_POPOVER (popover));
+
+  entry->add_bookmark_popover = popover;
+}
+
+GtkPopover *
+ephy_location_entry_get_add_bookmark_popover (EphyLocationEntry *entry)
+{
+  return entry->add_bookmark_popover;
+}
+
+GtkWidget *
+ephy_location_entry_get_entry (EphyLocationEntry *entry)
+{
+  return GTK_WIDGET (entry->url_entry);
+}
+
+GtkWidget *
+ephy_location_entry_get_bookmark_widget (EphyLocationEntry *entry)
+{
+  return entry->bookmark_button;
+}
+
+GtkWidget *
+ephy_location_entry_get_reader_mode_widget (EphyLocationEntry *entry)
+{
+  return entry->reader_mode_button;
+}
+
+void
+ephy_location_entry_set_reader_mode_visible (EphyLocationEntry *entry,
+                                             gboolean           visible)
+{
+  gtk_widget_set_visible (entry->reader_mode_button, visible);
+}
+
+void
+ephy_location_entry_set_reader_mode_state (EphyLocationEntry *entry,
+                                           gboolean           active)
+{
+  if (active)
+    gtk_style_context_add_class (gtk_widget_get_style_context (entry->reader_mode_icon), "selected");
+  else
+    gtk_style_context_remove_class (gtk_widget_get_style_context (entry->reader_mode_icon), "selected");
+
+  entry->reader_mode_active = active;
+}
+
+gboolean
+ephy_location_entry_get_reader_mode_state (EphyLocationEntry *entry)
+{
+  return entry->reader_mode_active;
+}
+
+void
+ephy_location_entry_set_adaptive_mode (EphyLocationEntry *entry,
+                                       EphyAdaptiveMode   adaptive_mode)
+{
+  if (adaptive_mode == EPHY_ADAPTIVE_MODE_NARROW)
+    dzl_suggestion_entry_set_position_func (DZL_SUGGESTION_ENTRY (entry->url_entry), 
dzl_suggestion_entry_window_position_func, NULL, NULL);
+  else
+    dzl_suggestion_entry_set_position_func (DZL_SUGGESTION_ENTRY (entry->url_entry), position_func, NULL, 
NULL);
+
+  entry->adaptive_mode = adaptive_mode;
+
+  update_entry_style (entry);
+
+  ephy_location_entry_set_bookmark_icon_state (entry, entry->icon_state);
+}
+
+void
+ephy_location_entry_page_action_add (EphyLocationEntry *entry,
+                                     GtkWidget         *action)
+{
+  gtk_box_pack_end (GTK_BOX (entry->page_action_box), action, FALSE, TRUE, 0);
+
+  gtk_widget_show (entry->page_action_box);
+}
+
+static void
+clear_page_actions (GtkWidget *child,
+                    gpointer   user_data)
+{
+  EphyLocationEntry *entry = EPHY_LOCATION_ENTRY (user_data);
+
+  gtk_container_remove (GTK_CONTAINER (entry->page_action_box), child);
+}
+
+void
+ephy_location_entry_page_action_clear (EphyLocationEntry *entry)
+{
+  gtk_container_foreach (GTK_CONTAINER (entry->page_action_box), clear_page_actions, entry);
+
+  gtk_widget_hide (entry->page_action_box);
+}
diff --git a/lib/widgets/ephy-location-entry.c b/lib/widgets/ephy-location-entry.c
index cb626f351..7b820db97 100644
--- a/lib/widgets/ephy-location-entry.c
+++ b/lib/widgets/ephy-location-entry.c
@@ -37,7 +37,6 @@
 #include "ephy-title-widget.h"
 #include "ephy-uri-helpers.h"
 
-#include <dazzle.h>
 #include <gdk/gdkkeysyms.h>
 #include <glib/gi18n.h>
 #include <gtk/gtk.h>
@@ -53,43 +52,13 @@
  */
 
 struct _EphyLocationEntry {
-  GtkBin parent_instance;
+  AdwBin parent_instance;
 
-  GtkWidget *overlay;
-  GtkWidget *url_entry;
-  GtkWidget *page_action_box;
-  GtkWidget *bookmark_icon;
-  GtkWidget *bookmark_button;
-  GtkWidget *reader_mode_icon;
-  GtkWidget *reader_mode_button;
+  GtkWidget *text;
+  GtkWidget *progress;
 
-  GBinding *paste_binding;
-
-  GtkPopover *add_bookmark_popover;
-  GtkCssProvider *css_provider;
-
-  gboolean reader_mode_active;
-  gboolean button_release_is_blocked;
-
-  char *saved_text;
-  char *jump_tab;
-
-  guint hash;
-
-  guint allocation_width;
   guint progress_timeout;
   gdouble progress_fraction;
-
-  guint dns_prefetch_handle_id;
-
-  guint user_changed : 1;
-  guint can_redo : 1;
-  guint block_update : 1;
-  guint original_address : 1;
-
-  EphySecurityLevel security_level;
-  EphyAdaptiveMode adaptive_mode;
-  EphyBookmarkIconState icon_state;
 };
 
 static gboolean ephy_location_entry_reset_internal (EphyLocationEntry *,
@@ -111,249 +80,41 @@ enum signalsEnum {
 };
 static gint signals[LAST_SIGNAL] = { 0 };
 
+static void ephy_location_entry_editable_init (GtkEditableInterface *iface);
 static void ephy_location_entry_title_widget_interface_init (EphyTitleWidgetInterface *iface);
-static void schedule_dns_prefetch (EphyLocationEntry *entry,
-                                   const gchar       *url);
+//static void schedule_dns_prefetch (EphyLocationEntry *self,
+//                                   const gchar       *url);
 
-G_DEFINE_TYPE_WITH_CODE (EphyLocationEntry, ephy_location_entry, GTK_TYPE_BIN,
+G_DEFINE_TYPE_WITH_CODE (EphyLocationEntry, ephy_location_entry, ADW_TYPE_BIN,
+                         G_IMPLEMENT_INTERFACE (GTK_TYPE_EDITABLE,
+                                                ephy_location_entry_editable_init)
                          G_IMPLEMENT_INTERFACE (EPHY_TYPE_TITLE_WIDGET,
                                                 ephy_location_entry_title_widget_interface_init))
-static gboolean
-entry_button_release (GtkWidget *widget,
-                      GdkEvent  *event,
-                      gpointer   user_data)
-{
-  EphyLocationEntry *entry = EPHY_LOCATION_ENTRY (user_data);
-
-  if (((GdkEventButton *)event)->button != GDK_BUTTON_PRIMARY)
-    return GDK_EVENT_PROPAGATE;
-
-  gtk_editable_select_region (GTK_EDITABLE (entry->url_entry), 0, -1);
-
-  g_signal_handlers_block_by_func (widget, G_CALLBACK (entry_button_release), entry);
-  entry->button_release_is_blocked = TRUE;
-
-  return GDK_EVENT_STOP;
-}
-
-static void
-update_entry_style (EphyLocationEntry *self)
-{
-  PangoAttrList *attrs;
-  PangoAttribute *color_normal;
-  PangoAttribute *color_dimmed;
-  PangoAttribute *scaled;
-  g_autoptr (GUri) uri = NULL;
-  const char *text = gtk_entry_get_text (GTK_ENTRY (self->url_entry));
-  const char *host;
-  const char *base_domain;
-  char *sub_string;
-
-  attrs = pango_attr_list_new ();
-
-  if (self->adaptive_mode == EPHY_ADAPTIVE_MODE_NARROW) {
-    scaled = pango_attr_scale_new (PANGO_SCALE_SMALL);
-    pango_attr_list_insert (attrs, scaled);
-  }
-
-  if (gtk_widget_has_focus (self->url_entry))
-    goto out;
-
-  uri = g_uri_parse (text, G_URI_FLAGS_NONE, NULL);
-  if (!uri)
-    goto out;
-
-  host = g_uri_get_host (uri);
-  if (!host || strlen (host) == 0)
-    goto out;
-
-  base_domain = soup_tld_get_base_domain (host, NULL);
-  if (!base_domain)
-    goto out;
-
-  sub_string = strstr (text, base_domain);
-  if (!sub_string)
-    goto out;
-
-  /* Complete text is dimmed */
-  color_dimmed = pango_attr_foreground_alpha_new (32768);
-  pango_attr_list_insert (attrs, color_dimmed);
-
-  /* Base domain with normal style */
-  color_normal = pango_attr_foreground_alpha_new (65535);
-  color_normal->start_index = sub_string - text;
-  color_normal->end_index = color_normal->start_index + strlen (base_domain);
-  pango_attr_list_insert (attrs, color_normal);
-
-out:
-  gtk_entry_set_attributes (GTK_ENTRY (self->url_entry), attrs);
-  pango_attr_list_unref (attrs);
-}
-
-static gboolean
-entry_focus_in_event (GtkWidget *widget,
-                      GdkEvent  *event,
-                      gpointer   user_data)
-{
-  EphyLocationEntry *self = EPHY_LOCATION_ENTRY (user_data);
-
-  update_entry_style (self);
-  return GDK_EVENT_PROPAGATE;
-}
-
-static gboolean
-entry_focus_out_event (GtkWidget *widget,
-                       GdkEvent  *event,
-                       gpointer   user_data)
-{
-  EphyLocationEntry *entry = EPHY_LOCATION_ENTRY (user_data);
-
-  update_entry_style (entry);
-
-  if (((GdkEventButton *)event)->button != GDK_BUTTON_PRIMARY)
-    return GDK_EVENT_PROPAGATE;
-
-  /* Unselect. */
-  gtk_editable_select_region (GTK_EDITABLE (entry->url_entry), 0, 0);
-
-  if (entry->button_release_is_blocked) {
-    g_signal_handlers_unblock_by_func (widget, G_CALLBACK (entry_button_release), entry);
-    entry->button_release_is_blocked = FALSE;
-  }
-
-  return GDK_EVENT_PROPAGATE;
-}
-
-static void
-editable_changed_cb (GtkEditable       *editable,
-                     EphyLocationEntry *entry);
-
-static void
-ephy_location_entry_activate (EphyLocationEntry *entry)
-{
-  g_signal_emit_by_name (entry->url_entry, "activate");
-}
-
-static void
-update_address_state (EphyLocationEntry *entry)
-{
-  const char *text;
-
-  text = gtk_entry_get_text (GTK_ENTRY (entry->url_entry));
-  entry->original_address = text != NULL &&
-                            g_str_hash (text) == entry->hash;
-}
 
 static const char *
 ephy_location_entry_title_widget_get_address (EphyTitleWidget *widget)
 {
-  EphyLocationEntry *entry = EPHY_LOCATION_ENTRY (widget);
-
-  g_assert (entry);
-
-  return gtk_entry_get_text (GTK_ENTRY (entry->url_entry));
+  return gtk_editable_get_text (GTK_EDITABLE (widget));
 }
 
 static void
 ephy_location_entry_title_widget_set_address (EphyTitleWidget *widget,
                                               const char      *address)
 {
-  EphyLocationEntry *entry = EPHY_LOCATION_ENTRY (widget);
-  GtkClipboard *clipboard;
-  const char *text;
-  g_autofree char *effective_text = NULL;
-  g_autofree char *selection = NULL;
-  int start, end;
-  const char *final_text;
-
-  g_assert (widget);
-
-  /* Setting a new text will clear the clipboard. This makes it impossible
-   * to copy&paste from the location entry of one tab into another tab, see
-   * bug #155824. So we save the selection iff the clipboard was owned by
-   * the location entry.
-   */
-  if (gtk_widget_get_realized (GTK_WIDGET (entry))) {
-    clipboard = gtk_widget_get_clipboard (GTK_WIDGET (entry->url_entry),
-                                          GDK_SELECTION_PRIMARY);
-    g_assert (clipboard != NULL);
-
-    if (gtk_clipboard_get_owner (clipboard) == G_OBJECT (entry->url_entry) &&
-        gtk_editable_get_selection_bounds (GTK_EDITABLE (entry->url_entry),
-                                           &start, &end)) {
-      selection = gtk_editable_get_chars (GTK_EDITABLE (entry->url_entry),
-                                          start, end);
-    }
-  }
-
-  if (address != NULL) {
-    if (g_str_has_prefix (address, EPHY_ABOUT_SCHEME))
-      effective_text = g_strdup_printf ("about:%s",
-                                        address + strlen (EPHY_ABOUT_SCHEME) + 1);
-    text = address;
-  } else {
-    text = "";
-  }
-
-  final_text = effective_text ? effective_text : text;
-
-  /* First record the new hash, then update the entry text */
-  entry->hash = g_str_hash (final_text);
-
-  entry->block_update = TRUE;
-  g_signal_handlers_block_by_func (entry->url_entry, G_CALLBACK (editable_changed_cb), entry);
-  gtk_entry_set_text (GTK_ENTRY (entry->url_entry), final_text);
-  update_entry_style (entry);
-  g_signal_handlers_unblock_by_func (entry->url_entry, G_CALLBACK (editable_changed_cb), entry);
-
-  dzl_suggestion_entry_hide_suggestions (DZL_SUGGESTION_ENTRY (entry->url_entry));
-  entry->block_update = FALSE;
-
-  /* We need to call update_address_state() here, as the 'changed' signal
-   * may not get called if the user has typed in the exact correct url */
-  update_address_state (entry);
-
-  /* Now restore the selection.
-   * Note that it's not owned by the entry anymore!
-   */
-  if (selection != NULL) {
-    gtk_clipboard_set_text (gtk_clipboard_get (GDK_SELECTION_PRIMARY),
-                            selection, strlen (selection));
-  }
+  // TODO
+  gtk_editable_set_text (GTK_EDITABLE (widget), address ? address : "");
 }
 
 static EphySecurityLevel
 ephy_location_entry_title_widget_get_security_level (EphyTitleWidget *widget)
 {
-  EphyLocationEntry *entry = EPHY_LOCATION_ENTRY (widget);
-
-  g_assert (entry);
-
-  return entry->security_level;
+  return 0;
 }
 
 static void
 ephy_location_entry_title_widget_set_security_level (EphyTitleWidget  *widget,
                                                      EphySecurityLevel security_level)
-
 {
-  EphyLocationEntry *entry = EPHY_LOCATION_ENTRY (widget);
-  const char *icon_name;
-
-  g_assert (entry);
-
-  if (!entry->reader_mode_active) {
-    icon_name = ephy_security_level_to_icon_name (security_level);
-    gtk_entry_set_icon_from_icon_name (GTK_ENTRY (entry->url_entry),
-                                       GTK_ENTRY_ICON_PRIMARY,
-                                       icon_name);
-  } else {
-    gtk_entry_set_icon_from_icon_name (GTK_ENTRY (entry->url_entry),
-                                       GTK_ENTRY_ICON_PRIMARY,
-                                       NULL);
-  }
-
-  entry->security_level = security_level;
 }
 
 static void
@@ -362,15 +123,26 @@ ephy_location_entry_set_property (GObject      *object,
                                   const GValue *value,
                                   GParamSpec   *pspec)
 {
-  EphyLocationEntry *entry = EPHY_LOCATION_ENTRY (object);
+  EphyLocationEntry *self = EPHY_LOCATION_ENTRY (object);
+
+  if (gtk_editable_delegate_set_property (object, prop_id, value, pspec))
+    {
+      if (prop_id == LAST_PROP + GTK_EDITABLE_PROP_EDITABLE)
+        {
+          gtk_accessible_update_property (GTK_ACCESSIBLE (self),
+                                          GTK_ACCESSIBLE_PROPERTY_READ_ONLY, !g_value_get_boolean (value),
+                                          -1);
+        }
+      return;
+    }
 
   switch (prop_id) {
     case PROP_ADDRESS:
-      ephy_title_widget_set_address (EPHY_TITLE_WIDGET (entry),
+      ephy_title_widget_set_address (EPHY_TITLE_WIDGET (self),
                                      g_value_get_string (value));
       break;
     case PROP_SECURITY_LEVEL:
-      ephy_title_widget_set_security_level (EPHY_TITLE_WIDGET (entry),
+      ephy_title_widget_set_security_level (EPHY_TITLE_WIDGET (self),
                                             g_value_get_enum (value));
       break;
     default:
@@ -384,14 +156,17 @@ ephy_location_entry_get_property (GObject    *object,
                                   GValue     *value,
                                   GParamSpec *pspec)
 {
-  EphyLocationEntry *entry = EPHY_LOCATION_ENTRY (object);
+  EphyLocationEntry *self = EPHY_LOCATION_ENTRY (object);
+
+  if (gtk_editable_delegate_get_property (object, prop_id, value, pspec))
+    return;
 
   switch (prop_id) {
     case PROP_ADDRESS:
-      g_value_set_string (value, ephy_title_widget_get_address (EPHY_TITLE_WIDGET (entry)));
+      g_value_set_string (value, ephy_title_widget_get_address (EPHY_TITLE_WIDGET (self)));
       break;
     case PROP_SECURITY_LEVEL:
-      g_value_set_enum (value, ephy_title_widget_get_security_level (EPHY_TITLE_WIDGET (entry)));
+      g_value_set_enum (value, ephy_title_widget_get_security_level (EPHY_TITLE_WIDGET (self)));
       break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
@@ -399,103 +174,44 @@ ephy_location_entry_get_property (GObject    *object,
 }
 
 static void
-ephy_location_entry_constructed (GObject *object)
-{
-  EphyLocationEntry *entry = EPHY_LOCATION_ENTRY (object);
-
-  G_OBJECT_CLASS (ephy_location_entry_parent_class)->constructed (object);
-
-  gtk_entry_set_input_hints (GTK_ENTRY (entry->url_entry), GTK_INPUT_HINT_NO_EMOJI);
-}
-
-static void
-ephy_location_entry_finalize (GObject *object)
-{
-  EphyLocationEntry *entry = EPHY_LOCATION_ENTRY (object);
-
-  g_free (entry->saved_text);
-  g_clear_pointer (&entry->jump_tab, g_free);
-
-  G_OBJECT_CLASS (ephy_location_entry_parent_class)->finalize (object);
-}
-
-static void
-ephy_location_entry_get_preferred_height (GtkWidget *widget,
-                                          gint      *minimum_height,
-                                          gint      *natural_height)
-{
-  EphyLocationEntry *entry = EPHY_LOCATION_ENTRY (widget);
-
-  gtk_widget_get_preferred_height (entry->url_entry, minimum_height, natural_height);
-}
-
-static void
-ephy_location_entry_do_copy_clipboard (GtkEntry *entry)
-{
-  g_autofree char *text = NULL;
-  gint start;
-  gint end;
-
-  if (!gtk_editable_get_selection_bounds (GTK_EDITABLE (entry), &start, &end))
-    return;
-
-  text = gtk_editable_get_chars (GTK_EDITABLE (entry), start, end);
-
-  if (start == 0) {
-    g_autofree char *tmp = text;
-    text = ephy_uri_normalize (tmp);
-  }
-
-  gtk_clipboard_set_text (gtk_widget_get_clipboard (GTK_WIDGET (entry),
-                                                    GDK_SELECTION_CLIPBOARD),
-                          text, -1);
-}
-
-static void
-ephy_location_entry_copy_clipboard (GtkEntry *entry,
-                                    gpointer  user_data)
+ephy_location_entry_title_widget_interface_init (EphyTitleWidgetInterface *iface)
 {
-  ephy_location_entry_do_copy_clipboard (entry);
-
-  g_signal_stop_emission_by_name (entry, "copy-clipboard");
+  iface->get_address = ephy_location_entry_title_widget_get_address;
+  iface->set_address = ephy_location_entry_title_widget_set_address;
+  iface->get_security_level = ephy_location_entry_title_widget_get_security_level;
+  iface->set_security_level = ephy_location_entry_title_widget_set_security_level;
 }
 
-static void
-ephy_location_entry_cut_clipboard (GtkEntry *entry)
+static GtkEditable *
+gtk_password_entry_get_delegate (GtkEditable *editable)
 {
-  if (!gtk_editable_get_editable (GTK_EDITABLE (entry))) {
-    gtk_widget_error_bell (GTK_WIDGET (entry));
-    return;
-  }
-
-  ephy_location_entry_do_copy_clipboard (entry);
-  gtk_editable_delete_selection (GTK_EDITABLE (entry));
+  EphyLocationEntry *self = EPHY_LOCATION_ENTRY (editable);
 
-  g_signal_stop_emission_by_name (entry, "cut-clipboard");
+  return GTK_EDITABLE (self->text);
 }
 
 static void
-ephy_location_entry_title_widget_interface_init (EphyTitleWidgetInterface *iface)
+ephy_location_entry_editable_init (GtkEditableInterface *iface)
 {
-  iface->get_address = ephy_location_entry_title_widget_get_address;
-  iface->set_address = ephy_location_entry_title_widget_set_address;
-  iface->get_security_level = ephy_location_entry_title_widget_get_security_level;
-  iface->set_security_level = ephy_location_entry_title_widget_set_security_level;
+  iface->get_delegate = gtk_password_entry_get_delegate;
 }
 
 static void
 ephy_location_entry_dispose (GObject *object)
 {
-  EphyLocationEntry *entry = EPHY_LOCATION_ENTRY (object);
+  EphyLocationEntry *self = EPHY_LOCATION_ENTRY (object);
 
-  g_clear_handle_id (&entry->progress_timeout, g_source_remove);
+  g_clear_handle_id (&self->progress_timeout, g_source_remove);
 
-  g_clear_object (&entry->css_provider);
+  if (self->text)
+    gtk_editable_finish_delegate (GTK_EDITABLE (self));
+
+  g_clear_pointer (&self->text, gtk_widget_unparent);
+  g_clear_pointer (&self->progress, gtk_widget_unparent);
 
   G_OBJECT_CLASS (ephy_location_entry_parent_class)->dispose (object);
 }
 
-
 static void
 ephy_location_entry_class_init (EphyLocationEntryClass *klass)
 {
@@ -504,15 +220,13 @@ ephy_location_entry_class_init (EphyLocationEntryClass *klass)
 
   object_class->get_property = ephy_location_entry_get_property;
   object_class->set_property = ephy_location_entry_set_property;
-  object_class->constructed = ephy_location_entry_constructed;
-  object_class->finalize = ephy_location_entry_finalize;
   object_class->dispose = ephy_location_entry_dispose;
 
-  widget_class->get_preferred_height = ephy_location_entry_get_preferred_height;
-
   g_object_class_override_property (object_class, PROP_ADDRESS, "address");
   g_object_class_override_property (object_class, PROP_SECURITY_LEVEL, "security-level");
 
+  gtk_editable_install_properties (object_class, LAST_PROP);
+
   /**
    * EphyLocationEntry::user-changed:
    * @entry: the object on which the signal is emitted
@@ -576,617 +290,30 @@ ephy_location_entry_class_init (EphyLocationEntryClass *klass)
                                      G_TYPE_STRING,
                                      0,
                                      G_TYPE_NONE);
-}
-
-static void
-editable_changed_cb (GtkEditable       *editable,
-                     EphyLocationEntry *entry)
-{
-  update_address_state (entry);
-
-  if (entry->block_update == TRUE)
-    return;
-  else {
-    entry->user_changed = TRUE;
-    entry->can_redo = FALSE;
-  }
-
-  g_clear_pointer (&entry->jump_tab, g_free);
-
-  g_signal_emit (entry, signals[USER_CHANGED], 0);
-}
-
-static gboolean
-entry_key_press_cb (GtkEntry          *entry,
-                    GdkEventKey       *event,
-                    EphyLocationEntry *location_entry)
-{
-  guint state = event->state & gtk_accelerator_get_default_mod_mask ();
-
-
-  if (event->keyval == GDK_KEY_Escape && state == 0) {
-    ephy_location_entry_reset_internal (location_entry, FALSE);
-  }
-
-  if (event->keyval == GDK_KEY_l && state == GDK_CONTROL_MASK) {
-    /* Make sure the location is activated on CTRL+l even when the
-     * completion popup is shown and have an active keyboard grab.
-     */
-    ephy_location_entry_focus (location_entry);
-  }
-
-  if (event->keyval == GDK_KEY_Return ||
-      event->keyval == GDK_KEY_KP_Enter ||
-      event->keyval == GDK_KEY_ISO_Enter) {
-    if (location_entry->jump_tab) {
-      g_signal_handlers_block_by_func (location_entry->url_entry, G_CALLBACK (editable_changed_cb), 
location_entry);
-      gtk_entry_set_text (GTK_ENTRY (location_entry->url_entry), location_entry->jump_tab);
-      g_signal_handlers_unblock_by_func (location_entry->url_entry, G_CALLBACK (editable_changed_cb), 
location_entry);
-      g_clear_pointer (&location_entry->jump_tab, g_free);
-    } else {
-      g_autofree gchar *text = g_strdup (gtk_entry_get_text (GTK_ENTRY (location_entry->url_entry)));
-      gchar *url = g_strstrip (text);
-      g_autofree gchar *new_url = NULL;
-
-      gtk_entry_set_text (GTK_ENTRY (entry), location_entry->jump_tab ? location_entry->jump_tab : text);
-
-      if (strlen (url) > 5 && g_str_has_prefix (url, "http:") && url[5] != '/')
-        new_url = g_strdup_printf ("http://%s";, url + 5);
-      else if (strlen (url) > 6 && g_str_has_prefix (url, "https:") && url[6] != '/')
-        new_url = g_strdup_printf ("https://%s";, url + 6);
-
-      if (new_url) {
-        g_signal_handlers_block_by_func (location_entry->url_entry, G_CALLBACK (editable_changed_cb), 
location_entry);
-        gtk_entry_set_text (GTK_ENTRY (location_entry->url_entry), new_url);
-        g_signal_handlers_unblock_by_func (location_entry->url_entry, G_CALLBACK (editable_changed_cb), 
location_entry);
-      }
-
-      if (state == GDK_CONTROL_MASK) {
-        /* Remove control mask to prevent opening address in a new window */
-        event->state &= ~GDK_CONTROL_MASK;
-
-        if (!g_utf8_strchr (url, -1, ' ') && !g_utf8_strchr (url, -1, '.')) {
-          g_autofree gchar *new_url = g_strdup_printf ("www.%s.com", url);
-
-          g_signal_handlers_block_by_func (location_entry->url_entry, G_CALLBACK (editable_changed_cb), 
location_entry);
-          gtk_entry_set_text (GTK_ENTRY (location_entry->url_entry), new_url);
-          g_signal_handlers_unblock_by_func (location_entry->url_entry, G_CALLBACK (editable_changed_cb), 
location_entry);
-        }
-      }
-    }
-
-    ephy_location_entry_activate (location_entry);
 
-    return GDK_EVENT_STOP;
-  }
-
-  return GDK_EVENT_PROPAGATE;
+  gtk_widget_class_set_layout_manager_type (widget_class, GTK_TYPE_BIN_LAYOUT);
+  gtk_widget_class_set_css_name (widget_class, "entry");
 }
 
 static void
-entry_clear_activate_cb (GtkMenuItem       *item,
-                         EphyLocationEntry *entry)
+ephy_location_entry_init (EphyLocationEntry *self)
 {
-  entry->block_update = TRUE;
-  g_signal_handlers_block_by_func (entry->url_entry, G_CALLBACK (editable_changed_cb), entry);
-  gtk_entry_set_text (GTK_ENTRY (entry->url_entry), "");
-  g_signal_handlers_unblock_by_func (entry->url_entry, G_CALLBACK (editable_changed_cb), entry);
-  entry->block_update = FALSE;
-  entry->user_changed = TRUE;
-}
+  self->text = gtk_text_new ();
+  gtk_text_set_placeholder_text (GTK_TEXT (self->text),
+                                 _("Search for websites, bookmarks, and open tabs"));
+  gtk_text_set_input_hints (GTK_TEXT (self->text), GTK_INPUT_HINT_NO_EMOJI);
+  gtk_widget_set_parent (self->text, GTK_WIDGET (self));
 
-static void
-paste_received (GtkClipboard      *clipboard,
-                const gchar       *text,
-                EphyLocationEntry *entry)
-{
-  if (text) {
-    g_signal_handlers_block_by_func (entry->url_entry, G_CALLBACK (editable_changed_cb), entry);
-    gtk_entry_set_text (GTK_ENTRY (entry->url_entry), text);
-    ephy_location_entry_activate (entry);
-    g_signal_handlers_unblock_by_func (entry->url_entry, G_CALLBACK (editable_changed_cb), entry);
-  }
-}
-
-static void
-entry_paste_and_go_activate_cb (GtkMenuItem       *item,
-                                EphyLocationEntry *entry)
-{
-  GtkClipboard *clipboard;
+  self->progress =  g_object_new (GTK_TYPE_PROGRESS_BAR,
+                                  "css-name", "progress",
+                                  NULL);
+  gtk_widget_set_can_target (self->progress, FALSE);
+  gtk_widget_set_valign (self->progress, GTK_ALIGN_END);
+  gtk_widget_set_parent (self->progress, GTK_WIDGET (self));
 
-  clipboard = gtk_clipboard_get_default (gdk_display_get_default ());
-  gtk_clipboard_request_text (clipboard,
-                              (GtkClipboardTextReceivedFunc)paste_received,
-                              entry);
-}
+  gtk_editable_init_delegate (GTK_EDITABLE (self));
 
-static void
-entry_redo_activate_cb (GtkMenuItem       *item,
-                        EphyLocationEntry *entry)
-{
-  ephy_location_entry_undo_reset (entry);
-}
-
-static void
-entry_undo_activate_cb (GtkMenuItem       *item,
-                        EphyLocationEntry *entry)
-{
-  ephy_location_entry_reset_internal (entry, FALSE);
-}
-
-/* The build should fail here each time when upgrading to a new major version
- * of GTK+, so that we don't forget to update this domain.
- */
-#if GTK_MAJOR_VERSION == 3
-#define GTK_GETTEXT_DOMAIN "gtk30"
-#endif
-
-static void
-entry_populate_popup_cb (GtkEntry          *entry,
-                         GtkMenu           *menu,
-                         EphyLocationEntry *lentry)
-{
-  GtkWidget *clear_menuitem;
-  GtkWidget *undo_menuitem;
-  GtkWidget *redo_menuitem;
-  GtkWidget *paste_and_go_menuitem;
-  GtkWidget *separator;
-  GtkWidget *paste_menuitem = NULL;
-  GList *children, *item;
-  int pos = 0, sep = 0;
-  gboolean is_editable;
-
-  /* Translators: the mnemonic shouldn't conflict with any of the
-   * standard items in the GtkEntry context menu (Cut, Copy, Paste, Delete,
-   * Select All, Input Methods and Insert Unicode control character.)
-   */
-  clear_menuitem = gtk_menu_item_new_with_mnemonic (_("Cl_ear"));
-  g_signal_connect (clear_menuitem, "activate",
-                    G_CALLBACK (entry_clear_activate_cb), lentry);
-  is_editable = gtk_editable_get_editable (GTK_EDITABLE (entry));
-  gtk_widget_set_sensitive (clear_menuitem, is_editable);
-  gtk_widget_show (clear_menuitem);
-
-  /* search for the 2nd separator (the one after Select All) in the context
-   * menu, and insert this menu item before it.
-   * It's a bit of a hack, but there seems to be no better way to do it :/
-   */
-  children = gtk_container_get_children (GTK_CONTAINER (menu));
-  for (item = children; item != NULL && sep < 2; item = item->next, pos++) {
-    if (GTK_IS_SEPARATOR_MENU_ITEM (item->data))
-      sep++;
-  }
-  g_list_free (children);
-
-  gtk_menu_shell_insert (GTK_MENU_SHELL (menu), clear_menuitem, pos - 1);
-
-  paste_and_go_menuitem = gtk_menu_item_new_with_mnemonic (_("Paste and _Go"));
-
-  /* Search for the Paste menu item and insert right after it. */
-  children = gtk_container_get_children (GTK_CONTAINER (menu));
-  for (item = children, pos = 0; item != NULL; item = item->next, pos++) {
-    if (g_strcmp0 (gtk_menu_item_get_label (item->data), g_dgettext (GTK_GETTEXT_DOMAIN, "_Paste")) == 0) {
-      paste_menuitem = item->data;
-      break;
-    }
-  }
-  g_assert (paste_menuitem != NULL);
-  g_list_free (children);
-
-  g_signal_connect (paste_and_go_menuitem, "activate",
-                    G_CALLBACK (entry_paste_and_go_activate_cb), lentry);
-  lentry->paste_binding = g_object_bind_property (paste_menuitem, "sensitive",
-                                                  paste_and_go_menuitem, "sensitive",
-                                                  G_BINDING_SYNC_CREATE);
-  gtk_widget_show (paste_and_go_menuitem);
-  gtk_menu_shell_insert (GTK_MENU_SHELL (menu), paste_and_go_menuitem, pos + 1);
-
-  undo_menuitem = gtk_menu_item_new_with_mnemonic (_("_Undo"));
-  gtk_widget_set_sensitive (undo_menuitem, lentry->user_changed);
-  g_signal_connect (undo_menuitem, "activate",
-                    G_CALLBACK (entry_undo_activate_cb), lentry);
-  gtk_widget_show (undo_menuitem);
-  gtk_menu_shell_insert (GTK_MENU_SHELL (menu), undo_menuitem, 0);
-
-  redo_menuitem = gtk_menu_item_new_with_mnemonic (_("_Redo"));
-  gtk_widget_set_sensitive (redo_menuitem, lentry->can_redo);
-  g_signal_connect (redo_menuitem, "activate",
-                    G_CALLBACK (entry_redo_activate_cb), lentry);
-  gtk_widget_show (redo_menuitem);
-  gtk_menu_shell_insert (GTK_MENU_SHELL (menu), redo_menuitem, 1);
-
-  separator = gtk_separator_menu_item_new ();
-  gtk_widget_show (separator);
-  gtk_menu_shell_insert (GTK_MENU_SHELL (menu), separator, 2);
-}
-
-static gboolean
-icon_button_icon_press_event_cb (GtkWidget            *widget,
-                                 GtkEntryIconPosition  position,
-                                 GdkEventButton       *event,
-                                 EphyLocationEntry    *entry)
-{
-  if (((event->type == GDK_BUTTON_PRESS &&
-        event->button == 1) ||
-       (event->type == GDK_TOUCH_BEGIN))) {
-    if (position == GTK_ENTRY_ICON_PRIMARY) {
-      GdkRectangle lock_position;
-      gtk_entry_get_icon_area (GTK_ENTRY (entry->url_entry), GTK_ENTRY_ICON_PRIMARY, &lock_position);
-      g_signal_emit_by_name (entry, "lock-clicked", &lock_position);
-    } else {
-      g_signal_emit (entry, signals[BOOKMARK_CLICKED], 0);
-    }
-    return TRUE;
-  }
-
-  return FALSE;
-}
-
-static void
-bookmark_icon_button_clicked_cb (GtkButton         *button,
-                                 EphyLocationEntry *lentry)
-{
-  g_signal_emit (lentry, signals[BOOKMARK_CLICKED], 0);
-}
-
-static GtkBorder
-get_progress_margin (EphyLocationEntry *entry)
-{
-  g_autoptr (GtkWidgetPath) path = NULL;
-  g_autoptr (GtkStyleContext) context = NULL;
-  GtkBorder margin;
-  gint pos;
-
-  path = gtk_widget_path_copy (gtk_widget_get_path (entry->url_entry));
-
-  pos = gtk_widget_path_append_type (path, GTK_TYPE_WIDGET);
-  gtk_widget_path_iter_set_object_name (path, pos, "progress");
-
-  context = gtk_style_context_new ();
-  gtk_style_context_set_path (context, path);
-
-  gtk_style_context_get_margin (context, gtk_style_context_get_state (context), &margin);
-
-  return margin;
-}
-
-static GtkBorder
-get_padding (EphyLocationEntry *entry)
-{
-  g_autoptr (GtkWidgetPath) path = NULL;
-  g_autoptr (GtkStyleContext) context = NULL;
-  GtkBorder padding;
-
-  path = gtk_widget_path_copy (gtk_widget_get_path (entry->url_entry));
-
-  /* Create a new context here, since the existing one has extra css loaded */
-  context = gtk_style_context_new ();
-  gtk_style_context_set_path (context, path);
-
-  gtk_style_context_get_padding (context, gtk_style_context_get_state (context), &padding);
-
-  return padding;
-}
-
-static void
-button_box_size_allocated_cb (GtkWidget    *widget,
-                              GdkRectangle *allocation,
-                              gpointer      user_data)
-{
-  EphyLocationEntry *lentry = EPHY_LOCATION_ENTRY (user_data);
-  g_autofree gchar *css = NULL;
-  GtkBorder margin, padding;
-
-  if (lentry->allocation_width == (guint)allocation->width)
-    return;
-
-  lentry->allocation_width = allocation->width;
-
-  margin = get_progress_margin (lentry);
-  padding = get_padding (lentry);
-
-  /* We are using the CSS provider here to solve UI displaying issues:
-   *  - padding-right is used to prevent text below the icons on the right side
-   *    of the entry (removing the icon button box width (allocation width).
-   *  - progress margin-right is used to allow progress bar below icons on the
-   *    right side.
-   *
-   * FIXME: Loading CSS during size_allocate is ILLEGAL and BROKEN.
-   */
-  css = g_strdup_printf (".url_entry:dir(ltr) { padding-right: %dpx; }" \
-                         ".url_entry:dir(rtl) { padding-left: %dpx; }" \
-                         ".url_entry:dir(ltr) progress { margin-right: %dpx; }" \
-                         ".url_entry:dir(rtl) progress { margin-left: %dpx; }",
-                         lentry->allocation_width,
-                         lentry->allocation_width,
-                         margin.right + padding.right - lentry->allocation_width,
-                         margin.left + padding.left - lentry->allocation_width);
-  gtk_css_provider_load_from_data (lentry->css_provider, css, -1, NULL);
-}
-
-static gboolean
-event_button_press_event_cb (GtkWidget *widget,
-                             GdkEvent  *event,
-                             gpointer   user_data)
-{
-  return GDK_EVENT_STOP;
-}
-
-static void
-ephy_location_entry_suggestion_activated (DzlSuggestionEntry *entry,
-                                          DzlSuggestion      *arg1,
-                                          gpointer            user_data)
-{
-  EphyLocationEntry *lentry = EPHY_LOCATION_ENTRY (user_data);
-  DzlSuggestion *suggestion = dzl_suggestion_entry_get_suggestion (entry);
-  const gchar *text = ephy_suggestion_get_uri (EPHY_SUGGESTION (suggestion));
-
-  g_signal_handlers_block_by_func (entry, G_CALLBACK (editable_changed_cb), user_data);
-  gtk_entry_set_text (GTK_ENTRY (entry), lentry->jump_tab ? lentry->jump_tab : text);
-  g_clear_pointer (&lentry->jump_tab, g_free);
-  g_signal_handlers_unblock_by_func (entry, G_CALLBACK (editable_changed_cb), user_data);
-
-  g_signal_stop_emission_by_name (entry, "suggestion-activated");
-
-  dzl_suggestion_entry_hide_suggestions (entry);
-
-  /* Now trigger the load.... */
-  ephy_location_entry_activate (EPHY_LOCATION_ENTRY (lentry));
-}
-
-static void
-suggestion_selected (DzlSuggestionEntry *entry,
-                     DzlSuggestion      *suggestion,
-                     gpointer            user_data)
-{
-  EphyLocationEntry *lentry = EPHY_LOCATION_ENTRY (user_data);
-  const gchar *uri = dzl_suggestion_get_id (suggestion);
-
-  g_signal_handlers_block_by_func (entry, G_CALLBACK (editable_changed_cb), user_data);
-  g_clear_pointer (&lentry->jump_tab, g_free);
-
-  if (g_str_has_prefix (uri, "ephy-tab://")) {
-    lentry->jump_tab = g_strdup (uri);
-    gtk_entry_set_text (GTK_ENTRY (entry), dzl_suggestion_get_subtitle (suggestion));
-  } else {
-    gtk_entry_set_text (GTK_ENTRY (entry), uri);
-  }
-  gtk_editable_set_position (GTK_EDITABLE (entry), -1);
-  g_signal_handlers_unblock_by_func (entry, G_CALLBACK (editable_changed_cb), user_data);
-
-  schedule_dns_prefetch (lentry, uri);
-}
-
-static void
-enter_notify_cb (GtkWidget *widget,
-                 GdkEvent  *event,
-                 gpointer   user_data)
-{
-  gtk_widget_set_state_flags (widget, GTK_STATE_FLAG_PRELIGHT, FALSE);
-}
-
-static void
-leave_notify_cb (GtkWidget *widget,
-                 GdkEvent  *event,
-                 gpointer   user_data)
-{
-  gtk_widget_unset_state_flags (widget, GTK_STATE_FLAG_PRELIGHT);
-}
-
-static void
-handle_forward_tab_key (GtkWidget *widget,
-                        gpointer   user_data)
-{
-  EphyLocationEntry *entry = EPHY_LOCATION_ENTRY (user_data);
-  GtkWidget *popover;
-
-  popover = dzl_suggestion_entry_get_popover (DZL_SUGGESTION_ENTRY (entry->url_entry));
-  if (gtk_widget_is_visible (popover)) {
-    g_signal_emit_by_name (entry->url_entry, "move-suggestion", 1, G_TYPE_INT, 1, G_TYPE_NONE);
-  } else {
-    gtk_widget_child_focus (gtk_widget_get_toplevel (GTK_WIDGET (entry)), GTK_DIR_TAB_FORWARD);
-  }
-}
-
-static void
-handle_backward_tab_key (GtkWidget *widget,
-                         gpointer   user_data)
-{
-  EphyLocationEntry *entry = EPHY_LOCATION_ENTRY (user_data);
-  GtkWidget *popover;
-
-  popover = dzl_suggestion_entry_get_popover (DZL_SUGGESTION_ENTRY (entry->url_entry));
-  if (gtk_widget_is_visible (popover)) {
-    g_signal_emit_by_name (entry->url_entry, "move-suggestion", -1, G_TYPE_INT, 1, G_TYPE_NONE);
-  } else {
-    gtk_widget_child_focus (gtk_widget_get_toplevel (GTK_WIDGET (entry)), GTK_DIR_TAB_BACKWARD);
-  }
-}
-
-static void
-position_func (DzlSuggestionEntry *self,
-               GdkRectangle       *area,
-               gboolean           *is_absolute,
-               gpointer            user_data)
-{
-  GtkStyleContext *style_context;
-  GtkAllocation alloc;
-  GtkStateFlags state;
-  GtkBorder margin;
-
-  g_assert (DZL_IS_SUGGESTION_ENTRY (self));
-  g_assert (area != NULL);
-  g_assert (is_absolute != NULL);
-
-  *is_absolute = FALSE;
-
-  gtk_widget_get_allocation (GTK_WIDGET (self), &alloc);
-
-  area->y += alloc.height;
-  area->y += 6;
-  area->height = 300;
-
-  /* Adjust for bottom margin */
-  style_context = gtk_widget_get_style_context (GTK_WIDGET (self));
-  state = gtk_style_context_get_state (style_context);
-  gtk_style_context_get_margin (style_context, state, &margin);
-
-  area->y -= margin.bottom;
-  area->x += margin.left;
-  area->width -= margin.left + margin.right;
-}
-
-static void
-update_reader_icon (EphyLocationEntry *entry)
-{
-  GtkIconTheme *theme;
-  const gchar *name;
-
-  theme = gtk_icon_theme_get_default ();
-
-  if (gtk_icon_theme_has_icon (theme, "view-reader-symbolic"))
-    name = "view-reader-symbolic";
-  else
-    name = "ephy-reader-mode-symbolic";
-
-  gtk_image_set_from_icon_name (GTK_IMAGE (entry->reader_mode_icon),
-                                name, GTK_ICON_SIZE_MENU);
-}
-
-static void
-ephy_location_entry_construct_contents (EphyLocationEntry *entry)
-{
-  GtkWidget *event;
-  GtkWidget *box;
-  GtkStyleContext *context;
-  DzlShortcutController *controller;
-
-  LOG ("EphyLocationEntry constructing contents %p", entry);
-
-  /* Overlay */
-  entry->overlay = gtk_overlay_new ();
-  gtk_widget_show (GTK_WIDGET (entry->overlay));
-  gtk_container_add (GTK_CONTAINER (entry), entry->overlay);
-
-  /* URL entry */
-  entry->url_entry = dzl_suggestion_entry_new ();
-  dzl_suggestion_entry_set_compact (DZL_SUGGESTION_ENTRY (entry->url_entry), TRUE);
-  dzl_suggestion_entry_set_position_func (DZL_SUGGESTION_ENTRY (entry->url_entry), position_func, NULL, 
NULL);
-  gtk_entry_set_icon_tooltip_text (GTK_ENTRY (entry->url_entry), GTK_ENTRY_ICON_PRIMARY, _("Show website 
security status and permissions"));
-  gtk_entry_set_width_chars (GTK_ENTRY (entry->url_entry), 0);
-  gtk_entry_set_placeholder_text (GTK_ENTRY (entry->url_entry), _("Search for websites, bookmarks, and open 
tabs"));
-
-  /* Add special widget css provider */
-  context = gtk_widget_get_style_context (GTK_WIDGET (entry->url_entry));
-  entry->css_provider = gtk_css_provider_new ();
-  gtk_style_context_add_provider (context, GTK_STYLE_PROVIDER (entry->css_provider), 
GTK_STYLE_PROVIDER_PRIORITY_USER);
-
-  gtk_style_context_add_class (gtk_widget_get_style_context (GTK_WIDGET (entry->url_entry)), "url_entry");
-  g_signal_connect (G_OBJECT (entry->url_entry), "copy-clipboard", G_CALLBACK 
(ephy_location_entry_copy_clipboard), NULL);
-  g_signal_connect (G_OBJECT (entry->url_entry), "cut-clipboard", G_CALLBACK 
(ephy_location_entry_cut_clipboard), NULL);
-  g_signal_connect (G_OBJECT (entry->url_entry), "changed", G_CALLBACK (editable_changed_cb), entry);
-  g_signal_connect (G_OBJECT (entry->url_entry), "suggestion-selected", G_CALLBACK (suggestion_selected), 
entry);
-  gtk_widget_show (GTK_WIDGET (entry->url_entry));
-  gtk_container_add (GTK_CONTAINER (entry->overlay), GTK_WIDGET (entry->url_entry));
-
-  /* Custom hover state. FIXME: Remove this for GTK4 */
-  gtk_widget_add_events (GTK_WIDGET (entry->url_entry), GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK);
-  g_signal_connect (G_OBJECT (entry->url_entry), "enter-notify-event", G_CALLBACK (enter_notify_cb), entry);
-  g_signal_connect (G_OBJECT (entry->url_entry), "leave-notify-event", G_CALLBACK (leave_notify_cb), entry);
-
-  /* Event box */
-  event = gtk_event_box_new ();
-  gtk_widget_set_halign (event, GTK_ALIGN_END);
-  gtk_widget_show (event);
-  g_signal_connect (G_OBJECT (event), "button-press-event", G_CALLBACK (event_button_press_event_cb), entry);
-  gtk_overlay_add_overlay (GTK_OVERLAY (entry->overlay), event);
-
-  /* Button Box */
-  box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
-  gtk_container_add (GTK_CONTAINER (event), box);
-  g_signal_connect (G_OBJECT (box), "size-allocate", G_CALLBACK (button_box_size_allocated_cb), entry);
-  gtk_widget_set_valign (box, GTK_ALIGN_CENTER);
-  gtk_widget_set_halign (box, GTK_ALIGN_END);
-  gtk_widget_show (box);
-
-  /* Page action box */
-  entry->page_action_box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
-  gtk_box_pack_start (GTK_BOX (box), entry->page_action_box, FALSE, TRUE, 0);
-
-  context = gtk_widget_get_style_context (box);
-  gtk_style_context_add_class (context, "entry_icon_box");
-
-  /* Reader Mode */
-  entry->reader_mode_button = gtk_button_new_from_icon_name (NULL, GTK_ICON_SIZE_MENU);
-  gtk_widget_set_tooltip_text (entry->reader_mode_button, _("Toggle reader mode"));
-  entry->reader_mode_icon = gtk_button_get_image (GTK_BUTTON (entry->reader_mode_button));
-  gtk_box_pack_start (GTK_BOX (box), entry->reader_mode_button, FALSE, TRUE, 0);
-
-  context = gtk_widget_get_style_context (entry->reader_mode_icon);
-  gtk_style_context_add_class (context, "entry_icon");
-
-  update_reader_icon (entry);
-  g_signal_connect_object (gtk_settings_get_default (), "notify::gtk-icon-theme-name",
-                           G_CALLBACK (update_reader_icon), entry, G_CONNECT_SWAPPED);
-
-  /* Bookmark */
-  entry->bookmark_button = gtk_button_new_from_icon_name ("non-starred-symbolic", GTK_ICON_SIZE_MENU);
-  gtk_widget_set_tooltip_text (entry->bookmark_button, _("Bookmark this page"));
-  entry->bookmark_icon = gtk_button_get_image (GTK_BUTTON (entry->bookmark_button));
-  g_signal_connect (G_OBJECT (entry->bookmark_button), "clicked", G_CALLBACK 
(bookmark_icon_button_clicked_cb), entry);
-  gtk_box_pack_start (GTK_BOX (box), entry->bookmark_button, FALSE, TRUE, 0);
-
-  context = gtk_widget_get_style_context (entry->bookmark_icon);
-  gtk_style_context_add_class (context, "entry_icon");
-
-  g_settings_bind (EPHY_SETTINGS_LOCKDOWN,
-                   EPHY_PREFS_LOCKDOWN_BOOKMARK_EDITING,
-                   entry->bookmark_button,
-                   "visible",
-                   G_SETTINGS_BIND_GET | G_SETTINGS_BIND_INVERT_BOOLEAN);
-
-  g_object_connect (entry->url_entry,
-                    "signal::icon-press", G_CALLBACK (icon_button_icon_press_event_cb), entry,
-                    "signal::populate-popup", G_CALLBACK (entry_populate_popup_cb), entry,
-                    "signal::key-press-event", G_CALLBACK (entry_key_press_cb), entry,
-                    NULL);
-
-  g_signal_connect (entry->url_entry, "suggestion-activated",
-                    G_CALLBACK (ephy_location_entry_suggestion_activated), entry);
-
-  g_signal_connect (entry->url_entry, "button-release-event", G_CALLBACK (entry_button_release), entry);
-  g_signal_connect (entry->url_entry, "focus-in-event", G_CALLBACK (entry_focus_in_event), entry);
-  g_signal_connect (entry->url_entry, "focus-out-event", G_CALLBACK (entry_focus_out_event), entry);
-
-  controller = dzl_shortcut_controller_find (entry->url_entry);
-  dzl_shortcut_controller_add_command_callback (controller,
-                                                "org.gnome.Epiphany.complete-url-forward",
-                                                "Tab",
-                                                DZL_SHORTCUT_PHASE_DISPATCH,
-                                                handle_forward_tab_key,
-                                                entry,
-                                                NULL);
-
-  dzl_shortcut_controller_add_command_callback (controller,
-                                                "org.gnome.Epiphany.complete-url-backward",
-                                                "ISO_Left_Tab",
-                                                DZL_SHORTCUT_PHASE_DISPATCH,
-                                                handle_backward_tab_key,
-                                                entry,
-                                                NULL);
-}
-
-static void
-ephy_location_entry_init (EphyLocationEntry *le)
-{
-  LOG ("EphyLocationEntry initialising %p", le);
-
-  le->user_changed = FALSE;
-  le->block_update = FALSE;
-  le->button_release_is_blocked = FALSE;
-  le->saved_text = NULL;
-
-  ephy_location_entry_construct_contents (le);
+  gtk_editable_set_max_width_chars (GTK_EDITABLE (self), 200);
 }
 
 GtkWidget *
@@ -1195,6 +322,7 @@ ephy_location_entry_new (void)
   return GTK_WIDGET (g_object_new (EPHY_TYPE_LOCATION_ENTRY, NULL));
 }
 
+#if 0
 typedef struct {
   GUri *uri;
   EphyLocationEntry *entry;
@@ -1257,7 +385,7 @@ proxy_resolver_ready_cb (GObject      *object,
 }
 
 static void
-schedule_dns_prefetch (EphyLocationEntry *entry,
+schedule_dns_prefetch (EphyLocationEntry *self,
                        const gchar       *url)
 {
   GProxyResolver *resolver = g_proxy_resolver_get_default ();
@@ -1272,11 +400,12 @@ schedule_dns_prefetch (EphyLocationEntry *entry,
     return;
 
   helper = g_new0 (PrefetchHelper, 1);
-  helper->entry = g_object_ref (entry);
+  helper->entry = g_object_ref (self);
   helper->uri = g_steal_pointer (&uri);
 
   g_proxy_resolver_lookup_async (resolver, url, NULL, proxy_resolver_ready_cb, helper);
 }
+#endif
 
 /**
  * ephy_location_entry_get_can_undo:
@@ -1289,9 +418,9 @@ schedule_dns_prefetch (EphyLocationEntry *entry,
  *
  **/
 gboolean
-ephy_location_entry_get_can_undo (EphyLocationEntry *entry)
+ephy_location_entry_get_can_undo (EphyLocationEntry *self)
 {
-  return entry->user_changed;
+  return FALSE;
 }
 
 /**
@@ -1305,39 +434,15 @@ ephy_location_entry_get_can_undo (EphyLocationEntry *entry)
  *
  **/
 gboolean
-ephy_location_entry_get_can_redo (EphyLocationEntry *entry)
+ephy_location_entry_get_can_redo (EphyLocationEntry *self)
 {
-  return entry->can_redo;
+  return FALSE;
 }
 
 static gboolean
-ephy_location_entry_reset_internal (EphyLocationEntry *entry,
+ephy_location_entry_reset_internal (EphyLocationEntry *self,
                                     gboolean           notify)
 {
-  const char *text, *old_text;
-  g_autofree char *url = NULL;
-  gboolean retval;
-
-  g_signal_emit (entry, signals[GET_LOCATION], 0, &url);
-  text = url != NULL ? url : "";
-  old_text = gtk_entry_get_text (GTK_ENTRY (entry->url_entry));
-  old_text = old_text != NULL ? old_text : "";
-
-  g_free (entry->saved_text);
-  entry->saved_text = g_strdup (old_text);
-  entry->can_redo = TRUE;
-
-  retval = g_str_hash (text) != g_str_hash (old_text);
-
-  ephy_title_widget_set_address (EPHY_TITLE_WIDGET (entry), text);
-
-  if (notify) {
-    g_signal_emit (entry, signals[USER_CHANGED], 0);
-  }
-
-  entry->user_changed = FALSE;
-
-  return retval;
 }
 
 /**
@@ -1348,13 +453,8 @@ ephy_location_entry_reset_internal (EphyLocationEntry *entry,
  *
  **/
 void
-ephy_location_entry_undo_reset (EphyLocationEntry *entry)
+ephy_location_entry_undo_reset (EphyLocationEntry *self)
 {
-  g_signal_handlers_block_by_func (entry->url_entry, G_CALLBACK (editable_changed_cb), entry);
-  gtk_entry_set_text (GTK_ENTRY (entry->url_entry), entry->saved_text);
-  g_signal_handlers_unblock_by_func (entry->url_entry, G_CALLBACK (editable_changed_cb), entry);
-  entry->can_redo = FALSE;
-  entry->user_changed = TRUE;
 }
 
 /**
@@ -1369,65 +469,29 @@ ephy_location_entry_undo_reset (EphyLocationEntry *entry)
  *
  **/
 gboolean
-ephy_location_entry_reset (EphyLocationEntry *entry)
+ephy_location_entry_reset (EphyLocationEntry *self)
 {
-  return ephy_location_entry_reset_internal (entry, FALSE);
+  return FALSE;
 }
 
 /**
  * ephy_location_entry_focus:
- * @entry: an #EphyLocationEntry widget
+ * @self: an #EphyLocationEntry widget
  *
- * Set focus on @entry and select the text whithin. This is called when the
+ * Set focus on @self and select the text whithin. This is called when the
  * user hits Control+L.
  *
  **/
 void
-ephy_location_entry_focus (EphyLocationEntry *entry)
+ephy_location_entry_focus (EphyLocationEntry *self)
 {
-  gtk_widget_grab_focus (GTK_WIDGET (entry->url_entry));
+  gtk_widget_grab_focus (self->text);
 }
 
 void
 ephy_location_entry_set_bookmark_icon_state (EphyLocationEntry     *self,
                                              EphyBookmarkIconState  state)
 {
-  GtkStyleContext *context;
-
-  self->icon_state = state;
-
-  g_assert (EPHY_IS_LOCATION_ENTRY (self));
-
-  context = gtk_widget_get_style_context (GTK_WIDGET (self->bookmark_icon));
-
-  if (self->adaptive_mode == EPHY_ADAPTIVE_MODE_NARROW)
-    state = EPHY_BOOKMARK_ICON_HIDDEN;
-
-  switch (state) {
-    case EPHY_BOOKMARK_ICON_HIDDEN:
-      gtk_widget_set_visible (self->bookmark_button, FALSE);
-      gtk_style_context_remove_class (context, "starred");
-      gtk_style_context_remove_class (context, "non-starred");
-      break;
-    case EPHY_BOOKMARK_ICON_EMPTY:
-      gtk_widget_set_visible (self->bookmark_button, TRUE);
-      gtk_image_set_from_icon_name (GTK_IMAGE (self->bookmark_icon),
-                                    "non-starred-symbolic",
-                                    GTK_ICON_SIZE_MENU);
-      gtk_style_context_remove_class (context, "starred");
-      gtk_style_context_add_class (context, "non-starred");
-      break;
-    case EPHY_BOOKMARK_ICON_BOOKMARKED:
-      gtk_widget_set_visible (self->bookmark_button, TRUE);
-      gtk_image_set_from_icon_name (GTK_IMAGE (self->bookmark_icon),
-                                    "starred-symbolic",
-                                    GTK_ICON_SIZE_MENU);
-      gtk_style_context_remove_class (context, "non-starred");
-      gtk_style_context_add_class (context, "starred");
-      break;
-    default:
-      g_assert_not_reached ();
-  }
 }
 
 /**
@@ -1439,81 +503,61 @@ ephy_location_entry_set_bookmark_icon_state (EphyLocationEntry     *self,
  *
  **/
 void
-ephy_location_entry_set_lock_tooltip (EphyLocationEntry *entry,
+ephy_location_entry_set_lock_tooltip (EphyLocationEntry *self,
                                       const char        *tooltip)
 {
-  gtk_entry_set_icon_tooltip_text (GTK_ENTRY (entry->url_entry),
-                                   GTK_ENTRY_ICON_PRIMARY,
-                                   tooltip);
 }
 
 void
-ephy_location_entry_set_add_bookmark_popover (EphyLocationEntry *entry,
+ephy_location_entry_set_add_bookmark_popover (EphyLocationEntry *self,
                                               GtkPopover        *popover)
 {
-  g_assert (EPHY_IS_LOCATION_ENTRY (entry));
-  g_assert (GTK_IS_POPOVER (popover));
-
-  entry->add_bookmark_popover = popover;
 }
 
 GtkPopover *
-ephy_location_entry_get_add_bookmark_popover (EphyLocationEntry *entry)
-{
-  return entry->add_bookmark_popover;
-}
-
-GtkWidget *
-ephy_location_entry_get_entry (EphyLocationEntry *entry)
+ephy_location_entry_get_add_bookmark_popover (EphyLocationEntry *self)
 {
-  return GTK_WIDGET (entry->url_entry);
+  return NULL;
 }
 
 GtkWidget *
-ephy_location_entry_get_bookmark_widget (EphyLocationEntry *entry)
+ephy_location_entry_get_bookmark_widget (EphyLocationEntry *self)
 {
-  return entry->bookmark_button;
+  return NULL;
 }
 
 GtkWidget *
-ephy_location_entry_get_reader_mode_widget (EphyLocationEntry *entry)
+ephy_location_entry_get_reader_mode_widget (EphyLocationEntry *self)
 {
-  return entry->reader_mode_button;
+  return NULL;
 }
 
 void
-ephy_location_entry_set_reader_mode_visible (EphyLocationEntry *entry,
+ephy_location_entry_set_reader_mode_visible (EphyLocationEntry *self,
                                              gboolean           visible)
 {
-  gtk_widget_set_visible (entry->reader_mode_button, visible);
 }
 
 void
-ephy_location_entry_set_reader_mode_state (EphyLocationEntry *entry,
+ephy_location_entry_set_reader_mode_state (EphyLocationEntry *self,
                                            gboolean           active)
 {
-  if (active)
-    gtk_style_context_add_class (gtk_widget_get_style_context (entry->reader_mode_icon), "selected");
-  else
-    gtk_style_context_remove_class (gtk_widget_get_style_context (entry->reader_mode_icon), "selected");
-
-  entry->reader_mode_active = active;
 }
 
 gboolean
-ephy_location_entry_get_reader_mode_state (EphyLocationEntry *entry)
+ephy_location_entry_get_reader_mode_state (EphyLocationEntry *self)
 {
-  return entry->reader_mode_active;
+  return FALSE;
 }
 
 static gboolean
 progress_hide (gpointer user_data)
 {
-  EphyLocationEntry *entry = EPHY_LOCATION_ENTRY (user_data);
+  EphyLocationEntry *self = EPHY_LOCATION_ENTRY (user_data);
 
-  gtk_entry_set_progress_fraction (GTK_ENTRY (entry->url_entry), 0);
+  gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (self->progress), 0);
 
-  g_clear_handle_id (&entry->progress_timeout, g_source_remove);
+  g_clear_handle_id (&self->progress_timeout, g_source_remove);
 
   return G_SOURCE_REMOVE;
 }
@@ -1521,93 +565,80 @@ progress_hide (gpointer user_data)
 static gboolean
 ephy_location_entry_set_fraction_internal (gpointer user_data)
 {
-  EphyLocationEntry *entry = EPHY_LOCATION_ENTRY (user_data);
+  EphyLocationEntry *self = EPHY_LOCATION_ENTRY (user_data);
   gint ms;
   gdouble progress;
   gdouble current;
 
-  entry->progress_timeout = 0;
-  current = gtk_entry_get_progress_fraction (GTK_ENTRY (entry->url_entry));
+  self->progress_timeout = 0;
+  current = gtk_progress_bar_get_fraction (GTK_PROGRESS_BAR (self->progress));
 
-  if ((entry->progress_fraction - current) > 0.5 || entry->progress_fraction == 1.0)
+  if ((self->progress_fraction - current) > 0.5 || self->progress_fraction == 1.0)
     ms = 10;
   else
     ms = 25;
 
   progress = current + 0.025;
-  if (progress < entry->progress_fraction) {
-    gtk_entry_set_progress_fraction (GTK_ENTRY (entry->url_entry), progress);
-    entry->progress_timeout = g_timeout_add (ms, ephy_location_entry_set_fraction_internal, entry);
+  if (progress < self->progress_fraction) {
+    gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (self->progress), progress);
+    self->progress_timeout = g_timeout_add (ms, ephy_location_entry_set_fraction_internal, self);
   } else {
-    gtk_entry_set_progress_fraction (GTK_ENTRY (entry->url_entry), entry->progress_fraction);
-    if (entry->progress_fraction == 1.0)
-      entry->progress_timeout = g_timeout_add (500, progress_hide, entry);
+    gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (self->progress), self->progress_fraction);
+    if (self->progress_fraction == 1.0)
+      self->progress_timeout = g_timeout_add (500, progress_hide, self);
   }
 
   return G_SOURCE_REMOVE;
 }
 
 void
-ephy_location_entry_set_progress (EphyLocationEntry *entry,
+ephy_location_entry_set_progress (EphyLocationEntry *self,
                                   gdouble            fraction,
                                   gboolean           loading)
 {
   gdouble current_progress;
 
-  g_clear_handle_id (&entry->progress_timeout, g_source_remove);
+  g_clear_handle_id (&self->progress_timeout, g_source_remove);
 
   if (!loading) {
     /* Setting progress to 0 when it is already 0 can actually cause the
      * progress bar to be shown. Yikes....
      */
-    current_progress = gtk_entry_get_progress_fraction (GTK_ENTRY (entry->url_entry));
+    current_progress = gtk_progress_bar_get_fraction (GTK_PROGRESS_BAR (self->progress));
     if (current_progress != 0.0)
-      gtk_entry_set_progress_fraction (GTK_ENTRY (entry->url_entry), 0.0);
+      gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (self->progress), 0.0);
     return;
   }
 
-  entry->progress_fraction = fraction;
-  ephy_location_entry_set_fraction_internal (entry);
+  self->progress_fraction = fraction;
+  ephy_location_entry_set_fraction_internal (self);
 }
 
 void
-ephy_location_entry_set_adaptive_mode (EphyLocationEntry *entry,
+ephy_location_entry_set_adaptive_mode (EphyLocationEntry *self,
                                        EphyAdaptiveMode   adaptive_mode)
 {
-  if (adaptive_mode == EPHY_ADAPTIVE_MODE_NARROW)
-    dzl_suggestion_entry_set_position_func (DZL_SUGGESTION_ENTRY (entry->url_entry), 
dzl_suggestion_entry_window_position_func, NULL, NULL);
-  else
-    dzl_suggestion_entry_set_position_func (DZL_SUGGESTION_ENTRY (entry->url_entry), position_func, NULL, 
NULL);
-
-  entry->adaptive_mode = adaptive_mode;
-
-  update_entry_style (entry);
-
-  ephy_location_entry_set_bookmark_icon_state (entry, entry->icon_state);
 }
 
 void
-ephy_location_entry_page_action_add (EphyLocationEntry *entry,
+ephy_location_entry_page_action_add (EphyLocationEntry *self,
                                      GtkWidget         *action)
 {
-  gtk_box_pack_end (GTK_BOX (entry->page_action_box), action, FALSE, TRUE, 0);
-
-  gtk_widget_show (entry->page_action_box);
 }
 
 static void
 clear_page_actions (GtkWidget *child,
                     gpointer   user_data)
 {
-  EphyLocationEntry *entry = EPHY_LOCATION_ENTRY (user_data);
-
-  gtk_container_remove (GTK_CONTAINER (entry->page_action_box), child);
 }
 
 void
-ephy_location_entry_page_action_clear (EphyLocationEntry *entry)
+ephy_location_entry_page_action_clear (EphyLocationEntry *self)
 {
-  gtk_container_foreach (GTK_CONTAINER (entry->page_action_box), clear_page_actions, entry);
+}
 
-  gtk_widget_hide (entry->page_action_box);
+void
+ephy_location_bar_grab_focus_without_selecting (EphyLocationEntry *entry)
+{
 }
+
diff --git a/lib/widgets/ephy-location-entry.h b/lib/widgets/ephy-location-entry.h
index a344128c7..fd73b5567 100644
--- a/lib/widgets/ephy-location-entry.h
+++ b/lib/widgets/ephy-location-entry.h
@@ -23,7 +23,7 @@
 
 #pragma once
 
-#include <gtk/gtk.h>
+#include <adwaita.h>
 
 #include "ephy-adaptive-mode.h"
 #include "ephy-bookmark-states.h"
@@ -33,7 +33,7 @@ G_BEGIN_DECLS
 
 #define EPHY_TYPE_LOCATION_ENTRY (ephy_location_entry_get_type())
 
-G_DECLARE_FINAL_TYPE (EphyLocationEntry, ephy_location_entry, EPHY, LOCATION_ENTRY, GtkBin)
+G_DECLARE_FINAL_TYPE (EphyLocationEntry, ephy_location_entry, EPHY, LOCATION_ENTRY, AdwBin)
 
 
 GtkWidget      *ephy_location_entry_new                        (void);
@@ -59,8 +59,6 @@ void            ephy_location_entry_set_add_bookmark_popover   (EphyLocationEntr
 
 GtkPopover     *ephy_location_entry_get_add_bookmark_popover   (EphyLocationEntry *entry);
 
-GtkWidget      *ephy_location_entry_get_entry                  (EphyLocationEntry *entry);
-
 GtkWidget      *ephy_location_entry_get_bookmark_widget        (EphyLocationEntry *entry);
 
 GtkWidget      *ephy_location_entry_get_reader_mode_widget     (EphyLocationEntry *entry);
@@ -82,6 +80,8 @@ void            ephy_location_entry_page_action_add            (EphyLocationEntr
 void            ephy_location_entry_page_action_clear          (EphyLocationEntry *entry);
 
 void            ephy_location_entry_set_adaptive_mode          (EphyLocationEntry *entry,
-                                                                EphyAdaptiveMode   adpative_mode);
+                                                                EphyAdaptiveMode   adaptive_mode);
+
+void            ephy_location_bar_grab_focus_without_selecting (EphyLocationEntry *entry);
 
 G_END_DECLS
diff --git a/lib/widgets/ephy-title-box.c b/lib/widgets/ephy-title-box.c
index 8eecbfc5e..5a2fb0044 100644
--- a/lib/widgets/ephy-title-box.c
+++ b/lib/widgets/ephy-title-box.c
@@ -33,7 +33,7 @@ enum {
 };
 
 struct _EphyTitleBox {
-  GtkEventBox parent_instance;
+  AdwBin parent_instance;
 
   GtkWidget *lock_image;
   GtkWidget *title;
@@ -44,78 +44,67 @@ struct _EphyTitleBox {
 
 static void ephy_title_box_title_widget_interface_init (EphyTitleWidgetInterface *iface);
 
-G_DEFINE_TYPE_WITH_CODE (EphyTitleBox, ephy_title_box, GTK_TYPE_EVENT_BOX,
+G_DEFINE_TYPE_WITH_CODE (EphyTitleBox, ephy_title_box, ADW_TYPE_BIN,
                          G_IMPLEMENT_INTERFACE (EPHY_TYPE_TITLE_WIDGET,
                                                 ephy_title_box_title_widget_interface_init))
 
-static gboolean
-ephy_title_box_button_press_event (GtkWidget      *widget,
-                                   GdkEventButton *event)
+static void
+lock_pressed_cb (GtkGesture   *gesture,
+                 int           n_click,
+                 double        x,
+                 double        y,
+                 EphyTitleBox *title_box)
 {
-  EphyTitleBox *title_box = EPHY_TITLE_BOX (widget);
   GtkAllocation lock_allocation;
 
-  if (event->button != GDK_BUTTON_PRIMARY)
-    return GDK_EVENT_PROPAGATE;
-
   gtk_widget_get_allocation (title_box->lock_image, &lock_allocation);
 
-  if (event->x >= lock_allocation.x &&
-      event->x < lock_allocation.x + lock_allocation.width &&
-      event->y >= lock_allocation.y &&
-      event->y < lock_allocation.y + lock_allocation.height) {
-    g_signal_emit_by_name (title_box, "lock-clicked", (GdkRectangle *)&lock_allocation);
-    return GDK_EVENT_STOP;
-  }
+  g_signal_emit_by_name (title_box, "lock-clicked", (GdkRectangle *)&lock_allocation);
 
-  return GDK_EVENT_PROPAGATE;
+  gtk_gesture_set_state (gesture, GTK_EVENT_SEQUENCE_CLAIMED);
 }
 
 static void
 ephy_title_box_constructed (GObject *object)
 {
   EphyTitleBox *title_box = EPHY_TITLE_BOX (object);
-  GtkStyleContext *context;
   GtkWidget *vbox;
   GtkWidget *hbox;
+  GtkGesture *gesture;
 
   G_OBJECT_CLASS (ephy_title_box_parent_class)->constructed (object);
 
   vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
   gtk_widget_set_valign (vbox, GTK_ALIGN_CENTER);
-  gtk_container_add (GTK_CONTAINER (title_box), vbox);
+  adw_bin_set_child (ADW_BIN (title_box), vbox);
 
   title_box->title = gtk_label_new (NULL);
-  context = gtk_widget_get_style_context (title_box->title);
-  gtk_style_context_add_class (context, "title");
-  gtk_label_set_line_wrap (GTK_LABEL (title_box->title), FALSE);
+  gtk_widget_add_css_class (title_box->title, "title");
   gtk_label_set_single_line_mode (GTK_LABEL (title_box->title), TRUE);
   gtk_label_set_ellipsize (GTK_LABEL (title_box->title), PANGO_ELLIPSIZE_END);
   gtk_label_set_text (GTK_LABEL (title_box->title), g_get_application_name ());
-  gtk_box_pack_start (GTK_BOX (vbox), title_box->title, FALSE, TRUE, 0);
+  gtk_box_append (GTK_BOX (vbox), title_box->title);
 
   hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 4);
-  context = gtk_widget_get_style_context (hbox);
-  gtk_style_context_add_class (context, "subtitle");
+  gtk_widget_add_css_class (hbox, "subtitle");
   gtk_widget_set_halign (hbox, GTK_ALIGN_CENTER);
   gtk_widget_set_valign (hbox, GTK_ALIGN_BASELINE);
-  gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
+  gtk_box_append (GTK_BOX (vbox), hbox);
 
   title_box->lock_image = gtk_image_new ();
-  g_object_set (title_box->lock_image, "icon-size", GTK_ICON_SIZE_MENU, NULL);
   gtk_widget_set_valign (title_box->lock_image, GTK_ALIGN_BASELINE);
-  gtk_box_pack_start (GTK_BOX (hbox), title_box->lock_image, FALSE, TRUE, 0);
+  gtk_box_append (GTK_BOX (hbox), title_box->lock_image);
 
   title_box->subtitle = gtk_label_new (NULL);
   gtk_widget_set_valign (title_box->subtitle, GTK_ALIGN_BASELINE);
-  gtk_label_set_line_wrap (GTK_LABEL (title_box->subtitle), FALSE);
   gtk_label_set_single_line_mode (GTK_LABEL (title_box->subtitle), TRUE);
   gtk_label_set_ellipsize (GTK_LABEL (title_box->subtitle), PANGO_ELLIPSIZE_END);
   gtk_label_set_selectable (GTK_LABEL (title_box->subtitle), TRUE);
-  gtk_box_pack_start (GTK_BOX (hbox), title_box->subtitle, FALSE, TRUE, 0);
+  gtk_box_append (GTK_BOX (hbox), title_box->subtitle);
 
-  gtk_widget_add_events (GTK_WIDGET (title_box), GDK_BUTTON_PRESS_MASK);
-  gtk_widget_show_all (GTK_WIDGET (title_box));
+  gesture = gtk_gesture_click_new ();
+  g_signal_connect (gesture, "pressed", G_CALLBACK (lock_pressed_cb), title_box);
+  gtk_widget_add_controller (title_box->lock_image, GTK_EVENT_CONTROLLER (gesture));
 }
 
 static const char *
@@ -223,12 +212,10 @@ static void
 ephy_title_box_class_init (EphyTitleBoxClass *klass)
 {
   GObjectClass *object_class = G_OBJECT_CLASS (klass);
-  GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
 
   object_class->constructed = ephy_title_box_constructed;
   object_class->get_property = ephy_title_box_get_property;
   object_class->set_property = ephy_title_box_set_property;
-  widget_class->button_press_event = ephy_title_box_button_press_event;
 
   g_object_class_override_property (object_class, PROP_ADDRESS, "address");
   g_object_class_override_property (object_class, PROP_SECURITY_LEVEL, "security-level");
diff --git a/lib/widgets/ephy-title-box.h b/lib/widgets/ephy-title-box.h
index be6ab7c4e..5c5e8b1d9 100644
--- a/lib/widgets/ephy-title-box.h
+++ b/lib/widgets/ephy-title-box.h
@@ -21,8 +21,7 @@
 
 #pragma once
 
-#include <gtk/gtk.h>
-#include <webkit2/webkit2.h>
+#include <adwaita.h>
 
 #include "ephy-security-levels.h"
 
@@ -30,7 +29,7 @@ G_BEGIN_DECLS
 
 #define EPHY_TYPE_TITLE_BOX (ephy_title_box_get_type ())
 
-G_DECLARE_FINAL_TYPE (EphyTitleBox, ephy_title_box, EPHY, TITLE_BOX, GtkEventBox)
+G_DECLARE_FINAL_TYPE (EphyTitleBox, ephy_title_box, EPHY, TITLE_BOX, AdwBin)
 
 EphyTitleBox       *ephy_title_box_new                  (void);
 
diff --git a/lib/widgets/meson.build b/lib/widgets/meson.build
index 453bc2d7f..fd7fa427d 100644
--- a/lib/widgets/meson.build
+++ b/lib/widgets/meson.build
@@ -7,28 +7,26 @@ enums = gnome.mkenums_simple('ephy-widgets-type-builtins',
 )
 
 libephywidgets_sources = [
-  'contrib/nautilus-floating-bar.c',
-  'ephy-certificate-dialog.c',
+#  'contrib/nautilus-floating-bar.c',
+#  'ephy-certificate-dialog.c',
   'ephy-downloads-popover.c',
   'ephy-downloads-progress-icon.c',
   'ephy-download-widget.c',
   'ephy-file-chooser.c',
   'ephy-location-entry.c',
-  'ephy-security-popover.c',
+#  'ephy-security-popover.c',
   'ephy-title-box.c',
   'ephy-title-widget.c',
   enums
 ]
 
 libephywidgets_deps = [
-  libdazzle_dep,
   ephymisc_dep,
   gcr_dep,
   gdk_pixbuf_dep,
   gio_dep,
   glib_dep,
   gtk_dep,
-  libdazzle_dep,
   libsoup_dep,
   webkit2gtk_dep,
 ]
diff --git a/meson.build b/meson.build
index 0b9f862b2..dd9bc4ca4 100644
--- a/meson.build
+++ b/meson.build
@@ -73,7 +73,7 @@ conf.set_quoted('GSB_API_KEY', gsb_api_key)
 conf.set10('ENABLE_GSB', gsb_api_key != '')
 
 glib_requirement = '>= 2.67.1'
-gtk_requirement = '>= 3.24.0'
+gtk_requirement = '>= 4.5.0'
 nettle_requirement = '>= 3.4'
 webkitgtk_requirement = '>= 2.33.2'
 
@@ -84,29 +84,22 @@ gio_dep = dependency('gio-2.0', version: glib_requirement)
 gio_unix_dep = dependency('gio-unix-2.0', version: glib_requirement)
 glib_dep = dependency('glib-2.0', version: glib_requirement)
 gsettings_desktop_schemas = dependency('gsettings-desktop-schemas')
-gtk_dep = dependency('gtk+-3.0', version: gtk_requirement)
-gtk_unix_print_dep = dependency('gtk+-unix-print-3.0', version: gtk_requirement)
+gtk_dep = dependency('gtk4', version: gtk_requirement)
+gtk_unix_print_dep = dependency('gtk4-unix-print', version: gtk_requirement)
 hogweed_dep = dependency('hogweed', version: nettle_requirement)
 iso_codes_dep = dependency('iso-codes', version: '>= 0.35')
 json_glib_dep = dependency('json-glib-1.0', version: '>= 1.6')
 libarchive_dep = dependency('libarchive')
-libdazzle_dep = dependency('libdazzle-1.0', version: '>= 3.37.1')
-libhandy_dep = dependency('libhandy-1', version: '>= 1.5.0')
+libadwaita_dep = dependency('libadwaita-1', version: '>= 1.0.0')
 libsecret_dep = dependency('libsecret-1', version: '>= 0.19.0')
 libxml_dep = dependency('libxml-2.0', version: '>= 2.6.12')
 nettle_dep = dependency('nettle', version: nettle_requirement)
 portal_dep = dependency('libportal', version: '>= 0.0.2', required: get_option('libportal'))
 sqlite3_dep = dependency('sqlite3', version: '>= 3.22')
 
-if get_option('soup2').enabled()
-  libsoup_dep = dependency('libsoup-2.4', version: '>= 2.48.0')
-  webkit2gtk_dep = dependency('webkit2gtk-4.0', version: webkitgtk_requirement)
-  webkit2gtk_web_extension_dep = dependency('webkit2gtk-web-extension-4.0', version: webkitgtk_requirement)
-else
-  libsoup_dep = dependency('libsoup-3.0', version: '>= 2.99.4')
-  webkit2gtk_dep = dependency('webkit2gtk-4.1', version: webkitgtk_requirement)
-  webkit2gtk_web_extension_dep = dependency('webkit2gtk-web-extension-4.1', version: webkitgtk_requirement)
-endif
+libsoup_dep = dependency('libsoup-3.0', version: '>= 2.99.4')
+webkit2gtk_dep = dependency('webkit2gtk-5.0', version: webkitgtk_requirement)
+webkit2gtk_web_extension_dep = dependency('webkit2gtk-web-extension-5.0', version: webkitgtk_requirement)
 
 conf.set10('USE_LIBPORTAL', portal_dep.found())
 
diff --git a/org.gnome.Epiphany.json b/org.gnome.Epiphany.json
index c46badcac..9d9ce2914 100644
--- a/org.gnome.Epiphany.json
+++ b/org.gnome.Epiphany.json
@@ -90,16 +90,6 @@
                 }
             ]
         },
-        {
-            "name" : "libdazzle",
-            "buildsystem" : "meson",
-            "sources" : [
-                {
-                    "type" : "git",
-                    "url" : "https://gitlab.gnome.org/GNOME/libdazzle.git";
-                }
-            ]
-        },
         {
             "name" : "libportal",
             "buildsystem" : "meson",
diff --git a/src/bookmarks/ephy-bookmark-properties.c b/src/bookmarks/ephy-bookmark-properties.c
index 67c7dd3bb..6d3eefcbd 100644
--- a/src/bookmarks/ephy-bookmark-properties.c
+++ b/src/bookmarks/ephy-bookmark-properties.c
@@ -80,8 +80,8 @@ flow_box_sort_func (GtkFlowBoxChild *child1,
   g_assert (GTK_IS_FLOW_BOX_CHILD (child1));
   g_assert (GTK_IS_FLOW_BOX_CHILD (child2));
 
-  box1 = gtk_bin_get_child (GTK_BIN (child1));
-  box2 = gtk_bin_get_child (GTK_BIN (child2));
+  box1 = gtk_flow_box_child_get_child (GTK_FLOW_BOX_CHILD (child1));
+  box2 = gtk_flow_box_child_get_child (GTK_FLOW_BOX_CHILD (child2));
 
   label1 = g_object_get_data (G_OBJECT (box1), "label");
   label2 = g_object_get_data (G_OBJECT (box2), "label");
@@ -95,15 +95,14 @@ flow_box_sort_func (GtkFlowBoxChild *child1,
 static void
 update_tags_scrollbar (EphyBookmarkProperties *self)
 {
-  g_autoptr (GList) children = NULL;
-  gint n_tags;
+  gboolean show_scrollbar;
 
-  children = gtk_container_get_children (GTK_CONTAINER (self->tags_box));
-  n_tags = g_list_length (children);
+  /* We only allow showing scrollbar if we have 4 or more tags. */
+  show_scrollbar = !!gtk_flow_box_get_child_at_index (GTK_FLOW_BOX (self->tags_box), 3);
 
   g_object_set (self->tags_scrolled_window,
                 "vscrollbar-policy",
-                (n_tags > 3) ? GTK_POLICY_AUTOMATIC : GTK_POLICY_NEVER,
+                show_scrollbar ? GTK_POLICY_AUTOMATIC : GTK_POLICY_NEVER,
                 NULL);
 }
 
@@ -112,7 +111,6 @@ ephy_bookmark_properties_tags_box_child_activated_cb (EphyBookmarkProperties *se
                                                       GtkFlowBoxChild        *child,
                                                       GtkFlowBox             *flow_box)
 {
-  GtkStyleContext *context;
   GtkWidget *box;
   GtkWidget *label;
 
@@ -120,18 +118,17 @@ ephy_bookmark_properties_tags_box_child_activated_cb (EphyBookmarkProperties *se
   g_assert (GTK_IS_FLOW_BOX_CHILD (child));
   g_assert (GTK_IS_FLOW_BOX (flow_box));
 
-  box = gtk_bin_get_child (GTK_BIN (child));
+  box = gtk_flow_box_child_get_child (GTK_FLOW_BOX_CHILD (child));
   label = g_object_get_data (G_OBJECT (box), "label");
 
-  context = gtk_widget_get_style_context (GTK_WIDGET (child));
-  if (gtk_style_context_has_class (context, "bookmark-tag-widget-selected")) {
+  if (gtk_widget_has_css_class (GTK_WIDGET (child), "bookmark-tag-widget-selected")) {
     ephy_bookmark_remove_tag (self->bookmark,
                               gtk_label_get_text (GTK_LABEL (label)));
-    gtk_style_context_remove_class (context, "bookmark-tag-widget-selected");
+    gtk_widget_remove_css_class (GTK_WIDGET (child), "bookmark-tag-widget-selected");
   } else {
     ephy_bookmark_add_tag (self->bookmark,
                            gtk_label_get_text (GTK_LABEL (label)));
-    gtk_style_context_add_class (context, "bookmark-tag-widget-selected");
+    gtk_widget_add_css_class (GTK_WIDGET (child), "bookmark-tag-widget-selected");
   }
 }
 
@@ -153,7 +150,7 @@ ephy_bookmark_properties_tag_widget_button_clicked_cb (EphyBookmarkProperties *s
   ephy_bookmarks_manager_delete_tag (self->manager, gtk_label_get_text (label));
 
   flow_box_child = gtk_widget_get_parent (box);
-  gtk_widget_destroy (flow_box_child);
+  gtk_flow_box_remove (GTK_FLOW_BOX (self->tags_box), flow_box_child);
   update_tags_scrollbar (self);
 }
 
@@ -165,7 +162,6 @@ ephy_bookmark_properties_create_tag_widget (EphyBookmarkProperties *self,
   GtkWidget *widget;
   GtkWidget *box;
   GtkWidget *label;
-  GtkStyleContext *context;
   gboolean default_tag;
   const char *label_text;
 
@@ -178,11 +174,10 @@ ephy_bookmark_properties_create_tag_widget (EphyBookmarkProperties *self,
   if (default_tag) {
     GtkWidget *image;
 
-    image = gtk_image_new_from_icon_name ("emblem-favorite-symbolic",
-                                          GTK_ICON_SIZE_BUTTON);
+    image = gtk_image_new_from_icon_name ("emblem-favorite-symbolic");
     gtk_widget_set_margin_bottom (image, 8);
     gtk_widget_set_margin_top (image, 8);
-    gtk_box_pack_start (GTK_BOX (box), image, FALSE, TRUE, 0);
+    gtk_box_append (GTK_BOX (box), image);
   }
 
   label_text = default_tag ? EPHY_BOOKMARKS_FAVORITES_TAG : tag;
@@ -190,18 +185,15 @@ ephy_bookmark_properties_create_tag_widget (EphyBookmarkProperties *self,
   gtk_widget_set_hexpand (label, TRUE);
   gtk_label_set_xalign (GTK_LABEL (label), 0);
   gtk_label_set_ellipsize (GTK_LABEL (label), PANGO_ELLIPSIZE_END);
-  gtk_box_pack_start (GTK_BOX (box), label, FALSE, TRUE, 0);
+  gtk_box_append (GTK_BOX (box), label);
 
   if (!default_tag) {
     GtkWidget *button;
 
-    button = gtk_button_new ();
-    gtk_button_set_image (GTK_BUTTON (button),
-                          gtk_image_new_from_icon_name ("window-close-symbolic",
-                                                        GTK_ICON_SIZE_MENU));
+    button = gtk_button_new_from_icon_name ("window-close-symbolic");
     gtk_widget_set_valign (button, GTK_ALIGN_CENTER);
-    gtk_style_context_add_class (gtk_widget_get_style_context (button), "flat");
-    gtk_box_pack_start (GTK_BOX (box), button, FALSE, TRUE, 0);
+    gtk_widget_add_css_class (button, "flat");
+    gtk_box_append (GTK_BOX (box), button);
     g_signal_connect_object (button, "clicked",
                              G_CALLBACK (ephy_bookmark_properties_tag_widget_button_clicked_cb),
                              self,
@@ -210,30 +202,22 @@ ephy_bookmark_properties_create_tag_widget (EphyBookmarkProperties *self,
 
   g_object_set_data (G_OBJECT (box), "label", label);
 
-  gtk_container_add (GTK_CONTAINER (widget), box);
+  gtk_flow_box_child_set_child (GTK_FLOW_BOX_CHILD (widget), box);
 
-  context = gtk_widget_get_style_context (widget);
-  gtk_style_context_add_class (context, "bookmark-tag-widget");
+  gtk_widget_add_css_class (widget, "bookmark-tag-widget");
   if (selected)
-    gtk_style_context_add_class (context, "bookmark-tag-widget-selected");
-
-  gtk_widget_show_all (widget);
+    gtk_widget_add_css_class (widget, "bookmark-tag-widget-selected");
 
   return widget;
 }
 
 static void
-ephy_bookmark_properties_actions_add_tag (GSimpleAction *action,
-                                          GVariant      *value,
-                                          gpointer       user_data)
+ephy_bookmark_properties_actions_add_tag (EphyBookmarkProperties *self)
 {
-  EphyBookmarkProperties *self = user_data;
   GtkEntryBuffer *buffer;
   GtkWidget *widget;
   const char *text;
 
-  g_assert (EPHY_IS_BOOKMARK_PROPERTIES (self));
-
   buffer = gtk_entry_get_buffer (GTK_ENTRY (self->add_tag_entry));
   text = gtk_entry_buffer_get_text (buffer);
 
@@ -249,26 +233,20 @@ ephy_bookmark_properties_actions_add_tag (GSimpleAction *action,
   update_tags_scrollbar (self);
 
   /* Empty entry and disable button's action until new text is inserted */
-  gtk_entry_set_text (GTK_ENTRY (self->add_tag_entry), "");
-  g_simple_action_set_enabled (G_SIMPLE_ACTION (action), FALSE);
+  gtk_editable_set_text (GTK_EDITABLE (self->add_tag_entry), "");
+    gtk_widget_action_set_enabled (GTK_WIDGET (self), "bookmark-properties.add-tag", FALSE);
 
   gtk_widget_grab_focus (GTK_WIDGET (self->add_tag_entry));
 }
 
 static void
-ephy_bookmark_properties_actions_remove_bookmark (GSimpleAction *action,
-                                                  GVariant      *value,
-                                                  gpointer       user_data)
+ephy_bookmark_properties_actions_remove_bookmark (EphyBookmarkProperties *self)
 {
-  EphyBookmarkProperties *self = user_data;
-
-  g_assert (EPHY_IS_BOOKMARK_PROPERTIES (self));
-
   self->bookmark_is_removed = TRUE;
   ephy_bookmarks_manager_remove_bookmark (self->manager, self->bookmark);
 
   if (self->type == EPHY_BOOKMARK_PROPERTIES_TYPE_DIALOG)
-    gtk_widget_destroy (self->parent);
+    gtk_window_destroy (GTK_WINDOW (self->parent));
 }
 
 static void
@@ -276,20 +254,16 @@ ephy_bookmark_properties_buffer_text_changed_cb (EphyBookmarkProperties *self,
                                                  GParamSpec             *pspec,
                                                  GtkEntryBuffer         *buffer)
 {
-  GActionGroup *group;
-  GAction *action;
   const char *text;
 
   g_assert (EPHY_IS_BOOKMARK_PROPERTIES (self));
   g_assert (GTK_IS_ENTRY_BUFFER (buffer));
 
-  group = gtk_widget_get_action_group (GTK_WIDGET (self), "bookmark-properties");
-  action = g_action_map_lookup_action (G_ACTION_MAP (group), "add-tag");
   text = gtk_entry_buffer_get_text (buffer);
   if (ephy_bookmarks_manager_tag_exists (self->manager, text) || g_strcmp0 (text, "") == 0)
-    g_simple_action_set_enabled (G_SIMPLE_ACTION (action), FALSE);
+    gtk_widget_action_set_enabled (GTK_WIDGET (self), "bookmark-properties.add-tag", FALSE);
   else
-    g_simple_action_set_enabled (G_SIMPLE_ACTION (action), TRUE);
+    gtk_widget_action_set_enabled (GTK_WIDGET (self), "bookmark-properties.add-tag", TRUE);
 }
 
 static void
@@ -379,15 +353,15 @@ ephy_bookmark_properties_constructed (GObject *object)
 
   /* Set appearance based on type */
   if (self->type == EPHY_BOOKMARK_PROPERTIES_TYPE_DIALOG) {
-    gtk_container_remove (GTK_CONTAINER (self), self->popover_bookmark_label);
+    gtk_box_remove (GTK_BOX (self), self->popover_bookmark_label);
   } else if (self->type == EPHY_BOOKMARK_PROPERTIES_TYPE_POPOVER) {
-    gtk_container_remove (GTK_CONTAINER (self), self->address_label);
-    gtk_container_remove (GTK_CONTAINER (self), self->address_entry);
+    gtk_box_remove (GTK_BOX (self), self->address_label);
+    gtk_box_remove (GTK_BOX (self), self->address_entry);
   }
 
   /* Set text for name entry */
-  gtk_entry_set_text (GTK_ENTRY (self->name_entry),
-                      ephy_bookmark_get_title (self->bookmark));
+  gtk_editable_set_text (GTK_EDITABLE (self->name_entry),
+                         ephy_bookmark_get_title (self->bookmark));
 
   g_object_bind_property (GTK_ENTRY (self->name_entry), "text",
                           self->bookmark, "title",
@@ -399,7 +373,7 @@ ephy_bookmark_properties_constructed (GObject *object)
 
     address = ephy_bookmark_get_url (self->bookmark);
     decoded_address = ephy_uri_decode (address);
-    gtk_entry_set_text (GTK_ENTRY (self->address_entry), decoded_address);
+    gtk_editable_set_text (GTK_EDITABLE (self->address_entry), decoded_address);
 
     g_object_bind_property (GTK_ENTRY (self->address_entry), "text",
                             self->bookmark, "bmkUri",
@@ -431,7 +405,6 @@ ephy_bookmark_properties_constructed (GObject *object)
                            G_CALLBACK (ephy_bookmark_properties_tags_box_child_activated_cb),
                            self,
                            G_CONNECT_SWAPPED);
-  gtk_widget_show_all (self->tags_box);
 }
 
 static void
@@ -494,19 +467,16 @@ ephy_bookmark_properties_class_init (EphyBookmarkPropertiesClass *klass)
   gtk_widget_class_bind_template_child (widget_class, EphyBookmarkProperties, tags_scrolled_window);
   gtk_widget_class_bind_template_child (widget_class, EphyBookmarkProperties, add_tag_entry);
   gtk_widget_class_bind_template_child (widget_class, EphyBookmarkProperties, add_tag_button);
-}
 
-static const GActionEntry entries[] = {
-  { "add-tag", ephy_bookmark_properties_actions_add_tag },
-  { "remove-bookmark", ephy_bookmark_properties_actions_remove_bookmark }
-};
+  gtk_widget_class_install_action (widget_class, "bookmark-properties.add-tag",
+                                   NULL, (GtkWidgetActionActivateFunc) 
ephy_bookmark_properties_actions_add_tag);
+  gtk_widget_class_install_action (widget_class, "bookmark-properties.remove-bookmark",
+                                   NULL, (GtkWidgetActionActivateFunc) 
ephy_bookmark_properties_actions_remove_bookmark);
+}
 
 static void
 ephy_bookmark_properties_init (EphyBookmarkProperties *self)
 {
-  g_autoptr (GSimpleActionGroup) group = NULL;
-  GAction *action;
-
   gtk_widget_init_template (GTK_WIDGET (self));
 
   self->manager = ephy_shell_get_bookmarks_manager (ephy_shell_get_default ());
@@ -535,16 +505,9 @@ ephy_bookmark_properties_init (EphyBookmarkProperties *self)
                               (GtkFlowBoxSortFunc)flow_box_sort_func,
                               NULL, NULL);
 
-  group = g_simple_action_group_new ();
-  g_action_map_add_action_entries (G_ACTION_MAP (group), entries,
-                                   G_N_ELEMENTS (entries), self);
-  gtk_widget_insert_action_group (GTK_WIDGET (self), "bookmark-properties",
-                                  G_ACTION_GROUP (group));
-
   /* Disable the "add-tag" action until text is inserted in the corresponding
    * entry */
-  action = g_action_map_lookup_action (G_ACTION_MAP (group), "add-tag");
-  g_simple_action_set_enabled (G_SIMPLE_ACTION (action), FALSE);
+  gtk_widget_action_set_enabled (GTK_WIDGET (self), "bookmark-properties.add-tag", FALSE);
 
   g_signal_connect_object (gtk_entry_get_buffer (GTK_ENTRY (self->add_tag_entry)),
                            "notify::text",
diff --git a/src/bookmarks/ephy-bookmark-row.c b/src/bookmarks/ephy-bookmark-row.c
index 5caef810c..df99630c7 100644
--- a/src/bookmarks/ephy-bookmark-row.c
+++ b/src/bookmarks/ephy-bookmark-row.c
@@ -60,7 +60,7 @@ ephy_bookmark_row_button_clicked_cb (EphyBookmarkRow *row,
 
   dialog = g_object_new (GTK_TYPE_DIALOG,
                          "title", _("Bookmark Properties"),
-                         "transient-for", GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (row))),
+                         "transient-for", GTK_WINDOW (gtk_widget_get_root (GTK_WIDGET (row))),
                          "use-header-bar", TRUE,
                          "modal", TRUE,
                          NULL);
@@ -70,12 +70,12 @@ ephy_bookmark_row_button_clicked_cb (EphyBookmarkRow *row,
   grid = ephy_bookmark_properties_new (ephy_bookmark_row_get_bookmark (row),
                                        EPHY_BOOKMARK_PROPERTIES_TYPE_DIALOG,
                                        dialog);
-  gtk_window_set_default (GTK_WINDOW (dialog),
-                          ephy_bookmark_properties_get_add_tag_button (EPHY_BOOKMARK_PROPERTIES (grid)));
+  gtk_window_set_default_widget (GTK_WINDOW (dialog),
+                                 ephy_bookmark_properties_get_add_tag_button (EPHY_BOOKMARK_PROPERTIES 
(grid)));
 
-  gtk_container_add (GTK_CONTAINER (content_area), grid);
+  gtk_box_append (GTK_BOX (content_area), grid);
 
-  gtk_widget_show (dialog);
+  gtk_window_present (GTK_WINDOW (dialog));
 }
 
 static void
diff --git a/src/bookmarks/ephy-bookmarks-popover.c b/src/bookmarks/ephy-bookmarks-popover.c
index 65ebccb80..e00957e35 100644
--- a/src/bookmarks/ephy-bookmarks-popover.c
+++ b/src/bookmarks/ephy-bookmarks-popover.c
@@ -104,7 +104,7 @@ ephy_bookmarks_popover_bookmark_tag_added_cb (EphyBookmarksPopover *self,
     GtkWidget *row;
 
     row = create_bookmark_row (bookmark, self);
-    gtk_container_add (GTK_CONTAINER (self->tag_detail_list_box), row);
+    gtk_list_box_append (GTK_LIST_BOX (self->tag_detail_list_box), row);
   }
 
   exists = FALSE;
@@ -123,7 +123,7 @@ ephy_bookmarks_popover_bookmark_tag_added_cb (EphyBookmarksPopover *self,
 
   if (!exists) {
     tag_row = create_tag_row (tag);
-    gtk_container_add (GTK_CONTAINER (self->tags_list_box), tag_row);
+    gtk_list_box_append (GTK_LIST_BOX (self->tags_list_box), tag_row);
   }
 }
 
@@ -164,7 +164,7 @@ ephy_bookmarks_popover_bookmark_tag_removed_cb (EphyBookmarksPopover *self,
 
     if (!exists) {
       row = create_bookmark_row (bookmark, self);
-      gtk_container_add (GTK_CONTAINER (self->tags_list_box), row);
+      gtk_list_box_append (GTK_LIST_BOX (self->tags_list_box), row);
     }
   }
 
@@ -193,7 +193,7 @@ ephy_bookmarks_popover_bookmark_tag_removed_cb (EphyBookmarksPopover *self,
     for (l = children; l != NULL; l = l->next) {
       title = g_object_get_data (G_OBJECT (l->data), "title");
       if (g_strcmp0 (title, tag) == 0)
-        gtk_container_remove (GTK_CONTAINER (self->tags_list_box), GTK_WIDGET (l->data));
+        gtk_list_box_remove (GTK_LIST_BOX (self->tags_list_box), GTK_WIDGET (l->data));
     }
     g_list_free (children);
   }
@@ -237,20 +237,19 @@ create_tag_row (const char *tag)
   box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6);
 
   if (g_strcmp0 (tag, EPHY_BOOKMARKS_FAVORITES_TAG) == 0) {
-    image = gtk_image_new_from_icon_name ("emblem-favorite-symbolic", GTK_ICON_SIZE_MENU);
+    image = gtk_image_new_from_icon_name ("emblem-favorite-symbolic");
   } else {
-    image = gtk_image_new_from_icon_name ("ephy-bookmark-tag-symbolic", GTK_ICON_SIZE_MENU);
+    image = gtk_image_new_from_icon_name ("ephy-bookmark-tag-symbolic");
   }
   label = gtk_label_new (tag);
 
   gtk_widget_set_hexpand (label, TRUE);
   gtk_label_set_ellipsize (GTK_LABEL (label), PANGO_ELLIPSIZE_END);
 
-  gtk_box_pack_start (GTK_BOX (box), image, FALSE, TRUE, 0);
-  gtk_box_pack_start (GTK_BOX (box), label, FALSE, TRUE, 0);
+  gtk_box_append (GTK_BOX (box), image);
+  gtk_box_append (GTK_BOX (box), label);
 
-  gtk_container_add (GTK_CONTAINER (row), box);
-  gtk_widget_show_all (row);
+  gtk_list_box_row_set_child (GTK_LIST_BOX_ROW (row), box);
 
   return row;
 }
@@ -268,7 +267,7 @@ ephy_bookmarks_popover_bookmark_added_cb (EphyBookmarksPopover *self,
 
   if (g_sequence_is_empty (ephy_bookmark_get_tags (bookmark))) {
     row = create_bookmark_row (bookmark, self);
-    gtk_container_add (GTK_CONTAINER (self->tags_list_box), row);
+    gtk_list_box_append (GTK_LIST_BOX (self->tags_list_box), row);
   }
 
   if (strcmp (gtk_stack_get_visible_child_name (GTK_STACK (self->toplevel_stack)), "empty-state") == 0)
@@ -315,7 +314,7 @@ ephy_bookmarks_popover_tag_created_cb (EphyBookmarksPopover *self,
   g_assert (EPHY_IS_BOOKMARKS_MANAGER (manager));
 
   tag_row = create_tag_row (tag);
-  gtk_container_add (GTK_CONTAINER (self->tags_list_box), tag_row);
+  gtk_list_box_append (GTK_LIST_BOX (self->tags_list_box), tag_row);
 }
 
 static void
@@ -330,8 +329,8 @@ ephy_bookmarks_popover_tag_deleted_cb (EphyBookmarksPopover *self,
   g_assert (EPHY_IS_BOOKMARKS_MANAGER (manager));
 
   row = gtk_list_box_get_row_at_index (GTK_LIST_BOX (self->tags_list_box), position);
-  gtk_container_remove (GTK_CONTAINER (self->tags_list_box),
-                        GTK_WIDGET (row));
+  gtk_list_box_remove (GTK_LIST_BOX (self->tags_list_box),
+                       GTK_WIDGET (row));
 
   if (g_strcmp0 (gtk_stack_get_visible_child_name (GTK_STACK (self->toplevel_stack)), "tag_detail") == 0 &&
       g_strcmp0 (self->tag_detail_tag, tag) == 0) {
@@ -389,7 +388,7 @@ ephy_bookmarks_popover_actions_tag_detail_back (GSimpleAction *action,
 
   children = gtk_container_get_children (GTK_CONTAINER (self->tag_detail_list_box));
   for (GList *l = children; l != NULL; l = l->next)
-    gtk_container_remove (GTK_CONTAINER (self->tag_detail_list_box), l->data);
+    gtk_list_box_remove (GTK_LIST_BOX (self->tag_detail_list_box), l->data);
   g_list_free (children);
 }
 
@@ -408,7 +407,7 @@ ephy_bookmarks_popover_show_tag_detail (EphyBookmarksPopover *self,
     GtkWidget *row;
 
     row = create_bookmark_row (bookmark, self);
-    gtk_container_add (GTK_CONTAINER (self->tag_detail_list_box), row);
+    gtk_list_box_append (GTK_LIST_BOX (self->tag_detail_list_box), row);
   }
 
   gtk_label_set_label (GTK_LABEL (self->tag_detail_label), tag);
@@ -551,7 +550,7 @@ ephy_bookmarks_popover_init (EphyBookmarksPopover *self)
 
     if (!ephy_bookmarks_manager_has_bookmarks_with_tag (self->manager, tag)) {
       tag_row = create_tag_row (tag);
-      gtk_container_add (GTK_CONTAINER (self->tags_list_box), tag_row);
+      gtk_list_box_append (GTK_LIST_BOX (self->tags_list_box), tag_row);
     }
   }
 
@@ -563,8 +562,7 @@ ephy_bookmarks_popover_init (EphyBookmarksPopover *self)
     GtkWidget *bookmark_row;
 
     bookmark_row = create_bookmark_row (bookmark, self);
-    gtk_widget_show_all (bookmark_row);
-    gtk_container_add (GTK_CONTAINER (self->tags_list_box), bookmark_row);
+    gtk_list_box_append (GTK_LIST_BOX (self->tags_list_box), bookmark_row);
   }
 
   g_signal_connect_object (self->manager, "bookmark-added",
diff --git a/src/ephy-action-bar-end.c b/src/ephy-action-bar-end.c
index 0104fb336..436eb0a45 100644
--- a/src/ephy-action-bar-end.c
+++ b/src/ephy-action-bar-end.c
@@ -20,11 +20,10 @@
  */
 
 #include "ephy-action-bar-end.h"
-#include "ephy-add-bookmark-popover.h"
+//#include "ephy-add-bookmark-popover.h"
 #include "ephy-desktop-utils.h"
 #include "ephy-downloads-popover.h"
 #include "ephy-downloads-progress-icon.h"
-#include "ephy-location-entry.h"
 #include "ephy-shell.h"
 #include "ephy-window.h"
 
@@ -36,7 +35,6 @@ struct _EphyActionBarEnd {
   GtkBox parent_instance;
 
   GtkWidget *bookmark_button;
-  GtkWidget *bookmark_image;
   GtkWidget *bookmarks_button;
   GtkWidget *downloads_revealer;
   GtkWidget *downloads_button;
@@ -50,7 +48,7 @@ struct _EphyActionBarEnd {
 
 G_DEFINE_TYPE (EphyActionBarEnd, ephy_action_bar_end, GTK_TYPE_BOX)
 
-static void begin_complete_theatrics (EphyActionBarEnd *self);
+//static void begin_complete_theatrics (EphyActionBarEnd *self);
 
 static void
 remove_downloads_button_attention_style (EphyActionBarEnd *self)
@@ -91,6 +89,7 @@ download_added_cb (EphyDownloadsManager *manager,
                    EphyDownload         *download,
                    EphyActionBarEnd     *action_bar_end)
 {
+#if 0
   GtkAllocation rect;
   DzlBoxTheatric *theatric;
 
@@ -128,8 +127,10 @@ download_added_cb (EphyDownloadsManager *manager,
                              "alpha", 0.0,
                              NULL);
   }
+#endif
 }
 
+#if 0
 static gboolean
 begin_complete_theatrics_from_main (gpointer user_data)
 {
@@ -188,14 +189,15 @@ begin_complete_theatrics (EphyActionBarEnd *self)
                            "alpha", 0.0,
                            NULL);
 }
+#endif
 
 static void
 download_completed_cb (EphyDownloadsManager *manager,
                        EphyDownload         *download,
                        EphyActionBarEnd     *action_bar_end)
 {
-  if (gtk_widget_get_mapped (GTK_WIDGET (action_bar_end)))
-    begin_complete_theatrics (action_bar_end);
+//  if (gtk_widget_get_mapped (GTK_WIDGET (action_bar_end)))
+//    begin_complete_theatrics (action_bar_end);
 }
 
 static void
@@ -235,9 +237,6 @@ ephy_action_bar_end_class_init (EphyActionBarEndClass *klass)
   gtk_widget_class_bind_template_child (widget_class,
                                         EphyActionBarEnd,
                                         bookmark_button);
-  gtk_widget_class_bind_template_child (widget_class,
-                                        EphyActionBarEnd,
-                                        bookmark_image);
   gtk_widget_class_bind_template_child (widget_class,
                                         EphyActionBarEnd,
                                         bookmarks_button);
@@ -261,12 +260,12 @@ ephy_action_bar_end_class_init (EphyActionBarEndClass *klass)
 static void
 add_bookmark_button_clicked_cb (EphyActionBarEnd *action_bar_end)
 {
-  GtkWidget *window = gtk_widget_get_toplevel (GTK_WIDGET (action_bar_end->bookmark_button));
-  GtkWidget *popover = ephy_add_bookmark_popover_new (GTK_WIDGET (action_bar_end->bookmark_button), window);
+//  GtkRoot *window = gtk_widget_get_root (GTK_WIDGET (action_bar_end->bookmark_button));
+//  GtkWidget *popover = ephy_add_bookmark_popover_new (GTK_WIDGET (action_bar_end->bookmark_button), 
window);
 
-  g_signal_connect_object (popover, "update-state", G_CALLBACK (ephy_window_sync_bookmark_state), 
action_bar_end, G_CONNECT_SWAPPED);
+//  g_signal_connect_object (popover, "update-state", G_CALLBACK (ephy_window_sync_bookmark_state), 
action_bar_end, G_CONNECT_SWAPPED);
 
-  ephy_add_bookmark_popover_show (EPHY_ADD_BOOKMARK_POPOVER (popover));
+//  ephy_add_bookmark_popover_show (EPHY_ADD_BOOKMARK_POPOVER (popover));
 }
 
 static void
@@ -292,14 +291,10 @@ ephy_action_bar_end_init (EphyActionBarEnd *action_bar_end)
   }
 
   if (is_desktop_pantheon ()) {
-    gtk_button_set_image (GTK_BUTTON (action_bar_end->bookmarks_button),
-                          gtk_image_new_from_icon_name ("user-bookmarks",
-                                                        GTK_ICON_SIZE_LARGE_TOOLBAR));
+    gtk_menu_button_set_icon_name (GTK_MENU_BUTTON (action_bar_end->bookmarks_button),
+                                   "user-bookmarks");
     gtk_image_set_from_icon_name (GTK_IMAGE (action_bar_end->downloads_icon),
-                                  "browser-download",
-                                  GTK_ICON_SIZE_LARGE_TOOLBAR);
-    gtk_style_context_add_class (gtk_widget_get_style_context (action_bar_end->downloads_button),
-                                 "flat");
+                                  "browser-download");
   }
 
   g_signal_connect_object (downloads_manager, "download-added",
@@ -367,7 +362,7 @@ void
 ephy_action_bar_end_add_browser_action (EphyActionBarEnd *action_bar_end,
                                         GtkWidget        *action)
 {
-  gtk_container_add (GTK_CONTAINER (action_bar_end->browser_action_box), action);
+  gtk_box_append (GTK_BOX (action_bar_end->browser_action_box), action);
 }
 
 void
@@ -390,15 +385,13 @@ ephy_action_bar_end_set_bookmark_icon_state (EphyActionBarEnd      *action_bar_e
       break;
     case EPHY_BOOKMARK_ICON_EMPTY:
       gtk_widget_set_visible (action_bar_end->bookmark_button, TRUE);
-      gtk_image_set_from_icon_name (GTK_IMAGE (action_bar_end->bookmark_image),
-                                    "non-starred-symbolic",
-                                    GTK_ICON_SIZE_BUTTON);
+      gtk_button_set_icon_name (GTK_BUTTON (action_bar_end->bookmark_button),
+                                "non-starred-symbolic");
       break;
     case EPHY_BOOKMARK_ICON_BOOKMARKED:
       gtk_widget_set_visible (action_bar_end->bookmark_button, TRUE);
-      gtk_image_set_from_icon_name (GTK_IMAGE (action_bar_end->bookmark_image),
-                                    "starred-symbolic",
-                                    GTK_ICON_SIZE_BUTTON);
+      gtk_button_set_icon_name (GTK_BUTTON (action_bar_end->bookmark_button),
+                                "starred-symbolic");
       break;
     default:
       g_assert_not_reached ();
diff --git a/src/ephy-action-bar-start.c b/src/ephy-action-bar-start.c
index 913700590..2fd4dabe6 100644
--- a/src/ephy-action-bar-start.c
+++ b/src/ephy-action-bar-start.c
@@ -43,7 +43,6 @@ struct _EphyActionBarStart {
   GtkWidget *navigation_back;
   GtkWidget *navigation_forward;
   GtkWidget *combined_stop_reload_button;
-  GtkWidget *combined_stop_reload_image;
   GtkWidget *homepage_button;
   GtkWidget *new_tab_button;
   GtkWidget *placeholder;
@@ -63,6 +62,7 @@ typedef enum {
   WEBKIT_HISTORY_FORWARD
 } WebKitHistoryType;
 
+#if 0
 typedef struct {
   GtkWidget *button;
   EphyWindow *window;
@@ -465,6 +465,7 @@ navigation_leave_notify_event_cb (GtkButton *button,
 
   return GDK_EVENT_PROPAGATE;
 }
+#endif
 
 static void
 homepage_url_changed (GSettings  *settings,
@@ -515,7 +516,7 @@ ephy_action_bar_start_constructed (GObject *object)
   G_OBJECT_CLASS (ephy_action_bar_start_parent_class)->constructed (object);
 
   gtk_widget_init_template (GTK_WIDGET (action_bar_start));
-
+#if 0
   /* Back */
   g_signal_connect (action_bar_start->navigation_back, "button-press-event",
                     G_CALLBACK (navigation_button_press_event_cb), action_bar_start);
@@ -531,7 +532,7 @@ ephy_action_bar_start_constructed (GObject *object)
                     G_CALLBACK (navigation_button_release_event_cb), action_bar_start);
   g_signal_connect (action_bar_start->navigation_forward, "leave-notify-event",
                     G_CALLBACK (navigation_leave_notify_event_cb), action_bar_start);
-
+#endif
   /* Combined_stop_reload */
   gtk_widget_set_tooltip_text (action_bar_start->combined_stop_reload_button, _(REFRESH_BUTTON_TOOLTIP));
 
@@ -547,25 +548,22 @@ ephy_action_bar_start_constructed (GObject *object)
   } else {
     gtk_widget_set_visible (action_bar_start->homepage_button, FALSE);
   }
-  g_signal_connect (action_bar_start->homepage_button, "button-release-event",
-                    G_CALLBACK (homepage_button_release_event_cb), action_bar_start);
+//  g_signal_connect (action_bar_start->homepage_button, "button-release-event",
+//                    G_CALLBACK (homepage_button_release_event_cb), action_bar_start);
 
   /* New Tab Button */
   update_new_tab_button_visibility (action_bar_start);
 
-  g_signal_connect (action_bar_start->new_tab_button, "button-release-event",
-                    G_CALLBACK (new_tab_button_release_event_cb), action_bar_start);
+//  g_signal_connect (action_bar_start->new_tab_button, "button-release-event",
+//                    G_CALLBACK (new_tab_button_release_event_cb), action_bar_start);
 
   if (is_desktop_pantheon ()) {
-    gtk_button_set_image (GTK_BUTTON (action_bar_start->navigation_back),
-                          gtk_image_new_from_icon_name ("go-previous-symbolic",
-                                                        get_icon_size ()));
-    gtk_button_set_image (GTK_BUTTON (action_bar_start->navigation_forward),
-                          gtk_image_new_from_icon_name ("go-next-symbolic",
-                                                        get_icon_size ()));
-    gtk_button_set_image (GTK_BUTTON (action_bar_start->homepage_button),
-                          gtk_image_new_from_icon_name ("go-home-symbolic",
-                                                        get_icon_size ()));
+    gtk_button_set_icon_name (GTK_BUTTON (action_bar_start->navigation_back),
+                              "go-previous-symbolic");
+    gtk_button_set_icon_name (GTK_BUTTON (action_bar_start->navigation_forward),
+                              "go-next-symbolic");
+    gtk_button_set_icon_name (GTK_BUTTON (action_bar_start->homepage_button),
+                              "go-home-symbolic");
   }
 
   if (ephy_profile_dir_is_web_application ()) {
@@ -599,9 +597,6 @@ ephy_action_bar_start_class_init (EphyActionBarStartClass *klass)
   gtk_widget_class_bind_template_child (widget_class,
                                         EphyActionBarStart,
                                         combined_stop_reload_button);
-  gtk_widget_class_bind_template_child (widget_class,
-                                        EphyActionBarStart,
-                                        combined_stop_reload_image);
   gtk_widget_class_bind_template_child (widget_class,
                                         EphyActionBarStart,
                                         homepage_button);
@@ -636,16 +631,14 @@ ephy_action_bar_start_change_combined_stop_reload_state (EphyActionBarStart *act
                                                          gboolean            loading)
 {
   if (loading) {
-    gtk_image_set_from_icon_name (GTK_IMAGE (action_bar_start->combined_stop_reload_image),
-                                  "process-stop-symbolic",
-                                  get_icon_size ());
+    gtk_button_set_icon_name (GTK_BUTTON (action_bar_start->combined_stop_reload_button),
+                              "process-stop-symbolic");
     /* Translators: tooltip for the stop button */
     gtk_widget_set_tooltip_text (action_bar_start->combined_stop_reload_button,
                                  _("Stop loading the current page"));
   } else {
-    gtk_image_set_from_icon_name (GTK_IMAGE (action_bar_start->combined_stop_reload_image),
-                                  "view-refresh-symbolic",
-                                  get_icon_size ());
+    gtk_button_set_icon_name (GTK_BUTTON (action_bar_start->combined_stop_reload_button),
+                              "view-refresh-symbolic");
     gtk_widget_set_tooltip_text (action_bar_start->combined_stop_reload_button,
                                  _(REFRESH_BUTTON_TOOLTIP));
   }
diff --git a/src/ephy-action-bar.c b/src/ephy-action-bar.c
index 0245b6dc5..a381a8756 100644
--- a/src/ephy-action-bar.c
+++ b/src/ephy-action-bar.c
@@ -21,7 +21,6 @@
 
 #include "ephy-action-bar.h"
 #include "ephy-add-bookmark-popover.h"
-#include "ephy-location-entry.h"
 #include "ephy-pages-button.h"
 #include "ephy-settings.h"
 #include "ephy-shell.h"
@@ -37,7 +36,7 @@ enum {
 static GParamSpec *object_properties[N_PROPERTIES] = { NULL, };
 
 struct _EphyActionBar {
-  GtkBin parent_instance;
+  AdwBin parent_instance;
 
   EphyWindow *window;
   GtkRevealer *revealer;
@@ -49,7 +48,7 @@ struct _EphyActionBar {
   gboolean can_reveal;
 };
 
-G_DEFINE_TYPE (EphyActionBar, ephy_action_bar, GTK_TYPE_BIN)
+G_DEFINE_TYPE (EphyActionBar, ephy_action_bar, ADW_TYPE_BIN)
 
 static void
 sync_chromes_visibility (EphyActionBar *action_bar)
diff --git a/src/ephy-action-bar.h b/src/ephy-action-bar.h
index bf0309b4a..b261fd1f2 100644
--- a/src/ephy-action-bar.h
+++ b/src/ephy-action-bar.h
@@ -21,7 +21,7 @@
 
 #pragma once
 
-#include <gtk/gtk.h>
+#include <adwaita.h>
 
 #include "ephy-action-bar-end.h"
 #include "ephy-action-bar-start.h"
@@ -32,7 +32,7 @@ G_BEGIN_DECLS
 
 #define EPHY_TYPE_ACTION_BAR (ephy_action_bar_get_type ())
 
-G_DECLARE_FINAL_TYPE (EphyActionBar, ephy_action_bar, EPHY, ACTION_BAR, GtkBin);
+G_DECLARE_FINAL_TYPE (EphyActionBar, ephy_action_bar, EPHY, ACTION_BAR, AdwBin);
 
 EphyActionBar      *ephy_action_bar_new                  (EphyWindow *window);
 EphyActionBarStart *ephy_action_bar_get_action_bar_start (EphyActionBar *action_bar);
diff --git a/src/ephy-desktop-utils.c b/src/ephy-desktop-utils.c
index 732f72ac2..d7e043a6d 100644
--- a/src/ephy-desktop-utils.c
+++ b/src/ephy-desktop-utils.c
@@ -46,15 +46,6 @@ is_desktop_gnome (void)
   return strstr (xdg_current_desktop, "GNOME") != NULL;
 }
 
-GtkIconSize
-get_icon_size (void)
-{
-  if (is_desktop_pantheon ())
-    return GTK_ICON_SIZE_LARGE_TOOLBAR;
-
-  return GTK_ICON_SIZE_BUTTON;
-}
-
 const char *
 ephy_get_fallback_favicon_name (const char      *uri,
                                 EphyFaviconType  type)
diff --git a/src/ephy-desktop-utils.h b/src/ephy-desktop-utils.h
index c162f3f5a..f30134aac 100644
--- a/src/ephy-desktop-utils.h
+++ b/src/ephy-desktop-utils.h
@@ -33,8 +33,6 @@ typedef enum {
 gboolean is_desktop_pantheon (void);
 gboolean is_desktop_gnome (void);
 
-GtkIconSize get_icon_size (void);
-
 const char *ephy_get_fallback_favicon_name (const char *title, EphyFaviconType type);
 
 G_END_DECLS
diff --git a/src/ephy-encoding-dialog.c b/src/ephy-encoding-dialog.c
index 862d13aed..02d40e1d7 100644
--- a/src/ephy-encoding-dialog.c
+++ b/src/ephy-encoding-dialog.c
@@ -77,30 +77,30 @@ select_encoding_row (GtkListBox   *list_box,
                      EphyEncoding *encoding)
 {
   const char *target_encoding;
-  GList *rows, *r;
+  GtkListBoxRow *row;
+  int i;
 
   target_encoding = ephy_encoding_get_encoding (encoding);
-  rows = gtk_container_get_children (GTK_CONTAINER (list_box));
 
-  for (r = rows; r != NULL; r = r->next) {
+  i = 0;
+  while ((row = gtk_list_box_get_row_at_index (list_box, i++))) {
     EphyEncodingRow *ephy_encoding_row;
     EphyEncoding *ephy_encoding;
     const char *encoding_string = NULL;
 
-    ephy_encoding_row = EPHY_ENCODING_ROW (gtk_bin_get_child (GTK_BIN (r->data)));
+    ephy_encoding_row = EPHY_ENCODING_ROW (gtk_list_box_row_get_child (row));
     ephy_encoding = ephy_encoding_row_get_encoding (ephy_encoding_row);
     encoding_string = ephy_encoding_get_encoding (ephy_encoding);
 
     if (g_strcmp0 (encoding_string, target_encoding) == 0) {
       ephy_encoding_row_set_selected (ephy_encoding_row, TRUE);
 
-      gtk_list_box_select_row (list_box, GTK_LIST_BOX_ROW (r->data));
+      gtk_list_box_select_row (list_box, row);
       /* TODO scroll to row */
 
       break;
     }
   }
-  g_list_free (rows);
 }
 
 static void
@@ -217,25 +217,20 @@ ephy_encoding_dialog_response_cb (GtkWidget          *widget,
                                   int                 response,
                                   EphyEncodingDialog *dialog)
 {
-  gtk_widget_destroy (GTK_WIDGET (dialog));
-}
-
-static void
-clean_selected_row (gpointer row,
-                    gpointer null_pointer)
-{
-  EphyEncodingRow *ephy_encoding_row;
-  ephy_encoding_row = EPHY_ENCODING_ROW (gtk_bin_get_child (GTK_BIN (row)));
-  ephy_encoding_row_set_selected (ephy_encoding_row, FALSE);
+  gtk_window_destroy (GTK_WINDOW (dialog));
 }
 
 static void
 clean_selected_list_box (GtkListBox *list_box)
 {
-  GList *rows;
-  rows = gtk_container_get_children (GTK_CONTAINER (list_box));
-  g_list_foreach (rows, (GFunc)clean_selected_row, NULL);
-  g_list_free (rows);
+  GtkListBoxRow *row;
+  int i = 0;
+
+  while ((row = gtk_list_box_get_row_at_index (list_box, i++))) {
+    EphyEncodingRow *ephy_encoding_row =
+      EPHY_ENCODING_ROW (gtk_list_box_row_get_child (GTK_LIST_BOX_ROW (row)));
+    ephy_encoding_row_set_selected (ephy_encoding_row, FALSE);
+  }
 }
 
 static void
@@ -260,7 +255,7 @@ row_activated_cb (GtkListBox         *box,
 
   dialog->update_view_tag = TRUE;
 
-  ephy_encoding_row = EPHY_ENCODING_ROW (gtk_bin_get_child (GTK_BIN (row)));
+  ephy_encoding_row = EPHY_ENCODING_ROW (gtk_list_box_row_get_child (row));
   ephy_encoding = ephy_encoding_row_get_encoding (ephy_encoding_row);
   selected_encoding = ephy_encoding_get_encoding (ephy_encoding);
 
@@ -328,7 +323,7 @@ static void
 add_list_item (EphyEncoding *encoding,
                GtkListBox   *list_box)
 {
-  gtk_container_add (GTK_CONTAINER (list_box), GTK_WIDGET (ephy_encoding_row_new (encoding)));
+  gtk_list_box_append (GTK_LIST_BOX (list_box), GTK_WIDGET (ephy_encoding_row_new (encoding)));
 }
 
 static int
diff --git a/src/ephy-firefox-sync-dialog.c b/src/ephy-firefox-sync-dialog.c
index 870ac997e..a753ca59f 100644
--- a/src/ephy-firefox-sync-dialog.c
+++ b/src/ephy-firefox-sync-dialog.c
@@ -35,8 +35,40 @@
 
 #define FXA_IFRAME_URL "https://accounts.firefox.com/signin?service=sync&context=fx_desktop_v3";
 
+#define EPHY_TYPE_SYNC_FREQUENCY (ephy_sync_frequency_get_type ())
+
+G_DECLARE_FINAL_TYPE (EphySyncFrequency, ephy_sync_frequency, EPHY, SYNC_FREQUENCY, GObject);
+
+struct _EphySyncFrequency
+{
+  GObject parent_instance;
+  guint frequency;
+};
+
+G_DEFINE_FINAL_TYPE (EphySyncFrequency, ephy_sync_frequency, G_TYPE_OBJECT)
+
+static void
+ephy_sync_frequency_class_init (EphySyncFrequencyClass *klass)
+{
+}
+
+static void
+ephy_sync_frequency_init (EphySyncFrequency *self)
+{
+}
+
+static EphySyncFrequency *
+ephy_sync_frequency_new (guint frequency)
+{
+  EphySyncFrequency *self = g_object_new (EPHY_TYPE_SYNC_FREQUENCY, NULL);
+
+  self->frequency = frequency;
+
+  return self;
+}
+
 struct _EphyFirefoxSyncDialog {
-  HdyWindow parent_instance;
+  GtkWindow parent_instance;
 
   GtkWidget *sync_page_group;
   GtkWidget *sync_firefox_iframe_box;
@@ -61,7 +93,7 @@ struct _EphyFirefoxSyncDialog {
   WebKitUserScript *fxa_script;
 };
 
-G_DEFINE_TYPE (EphyFirefoxSyncDialog, ephy_firefox_sync_dialog, HDY_TYPE_WINDOW)
+G_DEFINE_TYPE (EphyFirefoxSyncDialog, ephy_firefox_sync_dialog, GTK_TYPE_WINDOW)
 
 static const guint sync_frequency_minutes[] = { 5, 15, 30, 60 };
 
@@ -107,7 +139,7 @@ sync_set_last_sync_time (EphyFirefoxSyncDialog *sync_dialog)
      */
     char *text = g_strdup_printf (_("Last synchronized: %s"), time);
 
-    hdy_action_row_set_subtitle (HDY_ACTION_ROW (sync_dialog->sync_firefox_account_row), text);
+    adw_action_row_set_subtitle (ADW_ACTION_ROW (sync_dialog->sync_firefox_account_row), text);
 
     g_free (text);
     g_free (time);
@@ -162,7 +194,7 @@ sync_secrets_store_finished_cb (EphySyncService       *service,
   g_assert (EPHY_IS_FIREFOX_SYNC_DIALOG (sync_dialog));
 
   if (!error) {
-    hdy_preferences_row_set_title (HDY_PREFERENCES_ROW (sync_dialog->sync_firefox_account_row),
+    adw_preferences_row_set_title (ADW_PREFERENCES_ROW (sync_dialog->sync_firefox_account_row),
                                    ephy_sync_utils_get_sync_user ());
     gtk_widget_hide (sync_dialog->sync_page_group);
     gtk_widget_show (sync_dialog->sync_firefox_account_group);
@@ -406,7 +438,7 @@ sync_open_webmail_clicked_cb (WebKitUserContentManager *manager,
   EphyShell *shell;
   EphyEmbed *embed;
   GtkWindow *window;
-  GtkWidget *prefs_dialog;
+  GtkRoot *prefs_dialog;
   char *url;
 
   url = jsc_value_to_string (webkit_javascript_result_get_js_value (result));
@@ -419,8 +451,8 @@ sync_open_webmail_clicked_cb (WebKitUserContentManager *manager,
     ephy_web_view_load_url (ephy_embed_get_web_view (embed), url);
 
     /* Close the preferences dialog. */
-    prefs_dialog = gtk_widget_get_toplevel (GTK_WIDGET (sync_page));
-    gtk_widget_destroy (GTK_WIDGET (prefs_dialog));
+    prefs_dialog = gtk_widget_get_root (GTK_WIDGET (sync_page));
+    gtk_window_destroy (GTK_WINDOW (prefs_dialog));
 
     g_free (url);
   }
@@ -488,11 +520,9 @@ sync_setup_firefox_iframe (EphyFirefoxSyncDialog *sync_dialog)
     gtk_widget_set_visible (GTK_WIDGET (sync_dialog->fxa_web_view), TRUE);
     frame = gtk_frame_new (NULL);
     gtk_widget_set_visible (frame, TRUE);
-    gtk_container_add (GTK_CONTAINER (frame),
-                       GTK_WIDGET (sync_dialog->fxa_web_view));
-    gtk_box_pack_start (GTK_BOX (sync_dialog->sync_firefox_iframe_box),
-                        frame,
-                        FALSE, TRUE, 0);
+    gtk_frame_set_child (GTK_FRAME (frame),
+                        GTK_WIDGET (sync_dialog->fxa_web_view));
+    gtk_box_append (GTK_BOX (sync_dialog->sync_firefox_iframe_box), frame);
 
     g_object_unref (sync_context);
   }
@@ -514,7 +544,7 @@ on_sync_sign_out_button_clicked (GtkWidget             *button,
   gtk_widget_hide (sync_dialog->sync_firefox_account_group);
   gtk_widget_hide (sync_dialog->sync_options_group);
   gtk_widget_show (sync_dialog->sync_page_group);
-  hdy_action_row_set_subtitle (HDY_ACTION_ROW (sync_dialog->sync_firefox_account_row), NULL);
+  adw_action_row_set_subtitle (ADW_ACTION_ROW (sync_dialog->sync_firefox_account_row), NULL);
 }
 
 static void
@@ -531,6 +561,7 @@ static void
 on_sync_synced_tabs_button_clicked (GtkWidget             *button,
                                     EphyFirefoxSyncDialog *sync_dialog)
 {
+/*
   EphyOpenTabsManager *manager;
   SyncedTabsDialog *synced_tabs_dialog;
 
@@ -538,7 +569,8 @@ on_sync_synced_tabs_button_clicked (GtkWidget             *button,
   synced_tabs_dialog = synced_tabs_dialog_new (manager);
   gtk_window_set_transient_for (GTK_WINDOW (synced_tabs_dialog), GTK_WINDOW (sync_dialog));
   gtk_window_set_modal (GTK_WINDOW (synced_tabs_dialog), TRUE);
-  gtk_window_present_with_time (GTK_WINDOW (synced_tabs_dialog), gtk_get_current_event_time ());
+  gtk_window_present (GTK_WINDOW (synced_tabs_dialog));
+*/
 }
 
 static void
@@ -558,10 +590,10 @@ on_sync_device_name_save_button_clicked (GtkWidget             *button,
   EphySyncService *service = ephy_shell_get_sync_service (ephy_shell_get_default ());
   const char *text;
 
-  text = gtk_entry_get_text (GTK_ENTRY (sync_dialog->sync_device_name_entry));
+  text = gtk_editable_get_text (GTK_EDITABLE (sync_dialog->sync_device_name_entry));
   if (!g_strcmp0 (text, "")) {
     char *name = ephy_sync_utils_get_device_name ();
-    gtk_entry_set_text (GTK_ENTRY (sync_dialog->sync_device_name_entry), name);
+    gtk_editable_set_text (GTK_EDITABLE (sync_dialog->sync_device_name_entry), name);
     g_free (name);
   } else {
     ephy_sync_service_update_device_name (service, text);
@@ -580,7 +612,7 @@ on_sync_device_name_cancel_button_clicked (GtkWidget             *button,
   char *name;
 
   name = ephy_sync_utils_get_device_name ();
-  gtk_entry_set_text (GTK_ENTRY (sync_dialog->sync_device_name_entry), name);
+  gtk_editable_set_text (GTK_EDITABLE (sync_dialog->sync_device_name_entry), name);
 
   gtk_widget_set_sensitive (GTK_WIDGET (sync_dialog->sync_device_name_entry), FALSE);
   gtk_widget_set_visible (GTK_WIDGET (sync_dialog->sync_device_name_change_button), TRUE);
@@ -590,6 +622,12 @@ on_sync_device_name_cancel_button_clicked (GtkWidget             *button,
   g_free (name);
 }
 
+static gchar *
+get_sync_frequency_minutes_name (EphySyncFrequency *value)
+{
+  return g_strdup_printf ("%u min", value->frequency); // FIXME not translatable
+}
+
 static void
 prefs_sync_page_finalize (GObject *object)
 {
@@ -642,6 +680,7 @@ ephy_firefox_sync_dialog_class_init (EphyFirefoxSyncDialogClass *klass)
   gtk_widget_class_bind_template_callback (widget_class, on_sync_device_name_change_button_clicked);
   gtk_widget_class_bind_template_callback (widget_class, on_sync_device_name_save_button_clicked);
   gtk_widget_class_bind_template_callback (widget_class, on_sync_device_name_cancel_button_clicked);
+  gtk_widget_class_bind_template_callback (widget_class, get_sync_frequency_minutes_name);
 }
 
 static gboolean
@@ -651,11 +690,11 @@ sync_frequency_get_mapping (GValue   *value,
 {
   uint minutes = g_variant_get_uint32 (variant);
 
-  for (gint i = 0; i < (gint)G_N_ELEMENTS (sync_frequency_minutes); i++) {
+  for (guint i = 0; i < (guint)G_N_ELEMENTS (sync_frequency_minutes); i++) {
     if (sync_frequency_minutes[i] != minutes)
       continue;
 
-    g_value_set_int (value, i);
+    g_value_set_uint (value, i);
 
     return TRUE;
   }
@@ -668,9 +707,9 @@ sync_frequency_set_mapping (const GValue       *value,
                             const GVariantType *expected_type,
                             gpointer            user_data)
 {
-  gint i = g_value_get_int (value);
+  guint i = g_value_get_uint (value);
 
-  if (i >= (gint)G_N_ELEMENTS (sync_frequency_minutes))
+  if (i >= (guint)G_N_ELEMENTS (sync_frequency_minutes))
     return NULL;
 
   return g_variant_new_uint32 (sync_frequency_minutes[i]);
@@ -679,29 +718,19 @@ sync_frequency_set_mapping (const GValue       *value,
 static GListModel *
 create_sync_frequency_minutes_model ()
 {
-  GListStore *list_store = g_list_store_new (HDY_TYPE_VALUE_OBJECT);
-  HdyValueObject *obj;
-  g_auto (GValue) value = G_VALUE_INIT;
+  GListStore *list_store = g_list_store_new (EPHY_TYPE_SYNC_FREQUENCY);
   guint i;
 
-  g_value_init (&value, G_TYPE_UINT);
-
   for (i = 0; i < G_N_ELEMENTS (sync_frequency_minutes); i++) {
-    g_value_set_uint (&value, sync_frequency_minutes[i]);
-    obj = hdy_value_object_new (&value);
-    g_list_store_insert (list_store, i, obj);
-    g_clear_object (&obj);
+    g_autoptr (EphySyncFrequency) frequency =
+      ephy_sync_frequency_new (sync_frequency_minutes[i]);
+
+    g_list_store_insert (list_store, i, frequency);
   }
 
   return G_LIST_MODEL (list_store);
 }
 
-static gchar *
-get_sync_frequency_minutes_name (HdyValueObject *value)
-{
-  return g_strdup_printf ("%u min", g_value_get_uint (hdy_value_object_get_value (value)));
-}
-
 void
 ephy_firefox_sync_dialog_setup (EphyFirefoxSyncDialog *sync_dialog)
 {
@@ -711,7 +740,7 @@ ephy_firefox_sync_dialog_setup (EphyFirefoxSyncDialog *sync_dialog)
   char *name = ephy_sync_utils_get_device_name ();
   g_autoptr (GListModel) sync_frequency_minutes_model = create_sync_frequency_minutes_model ();
 
-  gtk_entry_set_text (GTK_ENTRY (sync_dialog->sync_device_name_entry), name);
+  gtk_editable_set_text (GTK_EDITABLE (sync_dialog->sync_device_name_entry), name);
 
   if (!user) {
     sync_setup_firefox_iframe (sync_dialog);
@@ -719,7 +748,7 @@ ephy_firefox_sync_dialog_setup (EphyFirefoxSyncDialog *sync_dialog)
     gtk_widget_hide (sync_dialog->sync_options_group);
   } else {
     sync_set_last_sync_time (sync_dialog);
-    hdy_preferences_row_set_title (HDY_PREFERENCES_ROW (sync_dialog->sync_firefox_account_row), user);
+    adw_preferences_row_set_title (ADW_PREFERENCES_ROW (sync_dialog->sync_firefox_account_row), user);
     gtk_widget_hide (sync_dialog->sync_page_group);
   }
 
@@ -744,15 +773,12 @@ ephy_firefox_sync_dialog_setup (EphyFirefoxSyncDialog *sync_dialog)
                    "active",
                    G_SETTINGS_BIND_DEFAULT);
 
-  hdy_combo_row_bind_name_model (HDY_COMBO_ROW (sync_dialog->sync_frequency_row),
-                                 sync_frequency_minutes_model,
-                                 (HdyComboRowGetNameFunc)get_sync_frequency_minutes_name,
-                                 NULL,
-                                 NULL);
+  adw_combo_row_set_model (ADW_COMBO_ROW (sync_dialog->sync_frequency_row),
+                           sync_frequency_minutes_model);
   g_settings_bind_with_mapping (sync_settings,
                                 EPHY_PREFS_SYNC_FREQUENCY,
                                 sync_dialog->sync_frequency_row,
-                                "selected-index",
+                                "selected",
                                 G_SETTINGS_BIND_DEFAULT,
                                 sync_frequency_get_mapping,
                                 sync_frequency_set_mapping,
diff --git a/src/ephy-firefox-sync-dialog.h b/src/ephy-firefox-sync-dialog.h
index 9e20ed484..72d473702 100644
--- a/src/ephy-firefox-sync-dialog.h
+++ b/src/ephy-firefox-sync-dialog.h
@@ -21,13 +21,13 @@
 #pragma once
 
 #include <glib-object.h>
-#include <handy.h>
+#include <adwaita.h>
 
 G_BEGIN_DECLS
 
 #define EPHY_TYPE_FIREFOX_SYNC_DIALOG (ephy_firefox_sync_dialog_get_type ())
 
-G_DECLARE_FINAL_TYPE (EphyFirefoxSyncDialog, ephy_firefox_sync_dialog, EPHY, FIREFOX_SYNC_DIALOG, HdyWindow)
+G_DECLARE_FINAL_TYPE (EphyFirefoxSyncDialog, ephy_firefox_sync_dialog, EPHY, FIREFOX_SYNC_DIALOG, GtkWindow)
 
 GtkWidget *ephy_firefox_sync_dialog_new ();
 
diff --git a/src/ephy-fullscreen-box.c b/src/ephy-fullscreen-box.c
index 5ace6fa49..c27cdf092 100644
--- a/src/ephy-fullscreen-box.c
+++ b/src/ephy-fullscreen-box.c
@@ -21,17 +21,15 @@
 #include "config.h"
 #include "ephy-fullscreen-box.h"
 
-#include <handy.h>
+#include <adwaita.h>
 
 #define FULLSCREEN_HIDE_DELAY 300
 #define SHOW_HEADERBAR_DISTANCE_PX 5
 
 struct _EphyFullscreenBox {
-  GtkEventBox parent_instance;
+  GtkWidget parent_instance;
 
-  HdyFlap *flap;
-  GtkEventController *controller;
-  GtkGesture *gesture;
+  AdwFlap *flap;
 
   gboolean fullscreen;
   gboolean autohide;
@@ -45,7 +43,7 @@ struct _EphyFullscreenBox {
 
 static void ephy_fullscreen_box_buildable_init (GtkBuildableIface *iface);
 
-G_DEFINE_TYPE_WITH_CODE (EphyFullscreenBox, ephy_fullscreen_box, GTK_TYPE_EVENT_BOX,
+G_DEFINE_TYPE_WITH_CODE (EphyFullscreenBox, ephy_fullscreen_box, GTK_TYPE_WIDGET,
                          G_IMPLEMENT_INTERFACE (GTK_TYPE_BUILDABLE,
                                                 ephy_fullscreen_box_buildable_init))
 
@@ -66,7 +64,7 @@ show_ui (EphyFullscreenBox *self)
 {
   g_clear_handle_id (&self->timeout_id, g_source_remove);
 
-  hdy_flap_set_reveal_flap (self->flap, TRUE);
+  adw_flap_set_reveal_flap (self->flap, TRUE);
 }
 
 static void
@@ -77,7 +75,7 @@ hide_ui (EphyFullscreenBox *self)
   if (!self->fullscreen)
     return;
 
-  hdy_flap_set_reveal_flap (self->flap, FALSE);
+  adw_flap_set_reveal_flap (self->flap, FALSE);
   gtk_widget_grab_focus (GTK_WIDGET (self->flap));
 }
 
@@ -94,7 +92,7 @@ hide_timeout_cb (EphyFullscreenBox *self)
 static void
 start_hide_timeout (EphyFullscreenBox *self)
 {
-  if (!hdy_flap_get_reveal_flap (self->flap))
+  if (!adw_flap_get_reveal_flap (self->flap))
     return;
 
   if (self->timeout_id)
@@ -119,12 +117,9 @@ is_descendant_of (GtkWidget *widget,
 
   parent = widget;
 
-  while (parent && parent != target && !GTK_IS_POPOVER (parent))
+  while (parent && parent != target)
     parent = gtk_widget_get_parent (parent);
 
-  if (GTK_IS_POPOVER (parent))
-    return is_descendant_of (gtk_popover_get_relative_to (GTK_POPOVER (parent)), target);
-
   return parent == target;
 }
 
@@ -133,8 +128,8 @@ get_titlebar_area_height (EphyFullscreenBox *self)
 {
   gdouble height;
 
-  height = gtk_widget_get_allocated_height (hdy_flap_get_flap (self->flap));
-  height *= hdy_flap_get_reveal_progress (self->flap);
+  height = gtk_widget_get_allocated_height (adw_flap_get_flap (self->flap));
+  height *= adw_flap_get_reveal_progress (self->flap);
   height = MAX (height, SHOW_HEADERBAR_DISTANCE_PX);
 
   return height;
@@ -154,7 +149,7 @@ update (EphyFullscreenBox *self,
   }
 
   if (self->last_focus && is_descendant_of (self->last_focus,
-                                            hdy_flap_get_flap (self->flap)))
+                                            adw_flap_get_flap (self->flap)))
     show_ui (self);
   else if (hide_immediately)
     hide_ui (self);
@@ -178,12 +173,6 @@ enter_cb (EphyFullscreenBox *self,
           double             x,
           double             y)
 {
-  g_autoptr (GdkEvent) event = gtk_get_current_event ();
-
-  if (event->crossing.window != gtk_widget_get_window (GTK_WIDGET (self)) ||
-      event->crossing.detail == GDK_NOTIFY_INFERIOR)
-    return;
-
   motion_cb (self, x, y);
 }
 
@@ -191,9 +180,10 @@ static void
 press_cb (EphyFullscreenBox *self,
           int                n_press,
           double             x,
-          double             y)
+          double             y,
+          GtkGesture        *gesture)
 {
-  gtk_gesture_set_state (self->gesture, GTK_EVENT_SEQUENCE_DENIED);
+  gtk_gesture_set_state (gesture, GTK_EVENT_SEQUENCE_DENIED);
 
   self->is_touch = TRUE;
 
@@ -217,72 +207,38 @@ notify_reveal_cb (EphyFullscreenBox *self)
 }
 
 static void
-ephy_fullscreen_box_hierarchy_changed (GtkWidget *widget,
-                                       GtkWidget *previous_toplevel)
+ephy_fullscreen_box_root (GtkWidget *widget)
 {
   EphyFullscreenBox *self = EPHY_FULLSCREEN_BOX (widget);
-  GtkWidget *toplevel;
+  GtkRoot *root;
 
-  if (previous_toplevel && GTK_IS_WINDOW (previous_toplevel))
-    g_signal_handlers_disconnect_by_func (previous_toplevel, set_focus_cb, widget);
+  GTK_WIDGET_CLASS (ephy_fullscreen_box_parent_class)->root (widget);
 
-  toplevel = gtk_widget_get_toplevel (widget);
+  root = gtk_widget_get_root (widget);
 
-  if (toplevel && GTK_IS_WINDOW (toplevel)) {
-    g_signal_connect_object (toplevel, "set-focus",
-                             G_CALLBACK (set_focus_cb), widget,
-                             G_CONNECT_SWAPPED);
+  if (root && GTK_IS_WINDOW (root)) {
+//    g_signal_connect_object (root, "set-focus",
+//                             G_CALLBACK (set_focus_cb), widget,
+//                             G_CONNECT_SWAPPED);
 
-    set_focus_cb (self, gtk_window_get_focus (GTK_WINDOW (toplevel)));
+    set_focus_cb (self, gtk_window_get_focus (GTK_WINDOW (root)));
   } else {
     set_focus_cb (self, NULL);
   }
 }
 
 static void
-ephy_fullscreen_box_add (GtkContainer *container,
-                         GtkWidget    *widget)
-{
-  EphyFullscreenBox *self = EPHY_FULLSCREEN_BOX (container);
-
-  if (!self->flap)
-    GTK_CONTAINER_CLASS (ephy_fullscreen_box_parent_class)->add (container, widget);
-  else
-    gtk_container_add (GTK_CONTAINER (self->flap), widget);
-}
-
-static void
-ephy_fullscreen_box_remove (GtkContainer *container,
-                            GtkWidget    *widget)
+ephy_fullscreen_box_unroot (GtkWidget *widget)
 {
-  EphyFullscreenBox *self = EPHY_FULLSCREEN_BOX (container);
+  EphyFullscreenBox *self = EPHY_FULLSCREEN_BOX (widget);
+  GtkRoot *root = gtk_widget_get_root (widget);
 
-  if (widget == GTK_WIDGET (self->flap)) {
-    GTK_CONTAINER_CLASS (ephy_fullscreen_box_parent_class)->remove (container, widget);
-    self->flap = NULL;
-  } else {
-    gtk_container_remove (GTK_CONTAINER (self->flap), widget);
-  }
-}
+  if (root && GTK_IS_WINDOW (root))
+    g_signal_handlers_disconnect_by_func (root, set_focus_cb, widget);
 
-static void
-ephy_fullscreen_box_forall (GtkContainer *container,
-                            gboolean      include_internals,
-                            GtkCallback   callback,
-                            gpointer      callback_data)
-{
-  EphyFullscreenBox *self = EPHY_FULLSCREEN_BOX (container);
+  set_focus_cb (self, NULL);
 
-  if (include_internals) {
-    GTK_CONTAINER_CLASS (ephy_fullscreen_box_parent_class)->forall (container,
-                                                                    include_internals,
-                                                                    callback,
-                                                                    callback_data);
-  } else {
-    gtk_container_foreach (GTK_CONTAINER (self->flap),
-                           callback,
-                           callback_data);
-  }
+  GTK_WIDGET_CLASS (ephy_fullscreen_box_parent_class)->unroot (widget);
 }
 
 static void
@@ -311,7 +267,7 @@ ephy_fullscreen_box_get_property (GObject    *object,
       break;
 
     case PROP_REVEALED:
-      g_value_set_boolean (value, hdy_flap_get_reveal_flap (self->flap));
+      g_value_set_boolean (value, adw_flap_get_reveal_flap (self->flap));
       break;
 
     default:
@@ -354,8 +310,7 @@ ephy_fullscreen_box_dispose (GObject *object)
 {
   EphyFullscreenBox *self = EPHY_FULLSCREEN_BOX (object);
 
-  g_clear_object (&self->controller);
-  g_clear_object (&self->gesture);
+  g_clear_pointer ((GtkWidget **) &self->flap, gtk_widget_unparent);
 
   G_OBJECT_CLASS (ephy_fullscreen_box_parent_class)->dispose (object);
 }
@@ -365,17 +320,13 @@ ephy_fullscreen_box_class_init (EphyFullscreenBoxClass *klass)
 {
   GObjectClass *object_class = G_OBJECT_CLASS (klass);
   GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
-  GtkContainerClass *container_class = GTK_CONTAINER_CLASS (klass);
 
   object_class->get_property = ephy_fullscreen_box_get_property;
   object_class->set_property = ephy_fullscreen_box_set_property;
   object_class->dispose = ephy_fullscreen_box_dispose;
 
-  widget_class->hierarchy_changed = ephy_fullscreen_box_hierarchy_changed;
-
-  container_class->add = ephy_fullscreen_box_add;
-  container_class->remove = ephy_fullscreen_box_remove;
-  container_class->forall = ephy_fullscreen_box_forall;
+  widget_class->root = ephy_fullscreen_box_root;
+  widget_class->unroot = ephy_fullscreen_box_unroot;
 
   props[PROP_FULLSCREEN] =
     g_param_spec_boolean ("fullscreen",
@@ -415,47 +366,49 @@ ephy_fullscreen_box_class_init (EphyFullscreenBoxClass *klass)
   g_object_class_install_properties (object_class, LAST_PROP, props);
 
   gtk_widget_class_set_css_name (widget_class, "fullscreenbox");
+  gtk_widget_class_set_layout_manager_type (widget_class, GTK_TYPE_BIN_LAYOUT);
 }
 
 static void
 ephy_fullscreen_box_init (EphyFullscreenBox *self)
 {
-  HdyFlap *flap;
+  AdwFlap *flap;
+  GtkEventController *controller;
+  GtkGesture *gesture;
 
   self->autohide = TRUE;
 
-  gtk_widget_add_events (GTK_WIDGET (self), GDK_ALL_EVENTS_MASK);
-
-  flap = HDY_FLAP (hdy_flap_new ());
+  flap = ADW_FLAP (adw_flap_new ());
   gtk_orientable_set_orientation (GTK_ORIENTABLE (flap), GTK_ORIENTATION_VERTICAL);
-  hdy_flap_set_flap_position (flap, GTK_PACK_START);
-  hdy_flap_set_fold_policy (flap, HDY_FLAP_FOLD_POLICY_NEVER);
-  hdy_flap_set_locked (flap, TRUE);
-  hdy_flap_set_modal (flap, FALSE);
-  hdy_flap_set_swipe_to_open (flap, FALSE);
-  hdy_flap_set_swipe_to_close (flap, FALSE);
-  hdy_flap_set_transition_type (flap, HDY_FLAP_TRANSITION_TYPE_OVER);
-  gtk_widget_show (GTK_WIDGET (flap));
+  adw_flap_set_flap_position (flap, GTK_PACK_START);
+  adw_flap_set_fold_policy (flap, ADW_FLAP_FOLD_POLICY_NEVER);
+  adw_flap_set_locked (flap, TRUE);
+  adw_flap_set_modal (flap, FALSE);
+  adw_flap_set_swipe_to_open (flap, FALSE);
+  adw_flap_set_swipe_to_close (flap, FALSE);
+  adw_flap_set_transition_type (flap, ADW_FLAP_TRANSITION_TYPE_OVER);
 
   g_signal_connect_object (flap, "notify::reveal-flap",
                            G_CALLBACK (notify_reveal_cb), self, G_CONNECT_SWAPPED);
 
-  gtk_container_add (GTK_CONTAINER (self), GTK_WIDGET (flap));
+  gtk_widget_set_parent (GTK_WIDGET (flap), GTK_WIDGET (self));
   self->flap = flap;
 
-  self->controller = gtk_event_controller_motion_new (GTK_WIDGET (self));
-  gtk_event_controller_set_propagation_phase (self->controller, GTK_PHASE_CAPTURE);
-  g_signal_connect_object (self->controller, "enter",
+  controller = gtk_event_controller_motion_new ();
+  gtk_event_controller_set_propagation_phase (controller, GTK_PHASE_CAPTURE);
+  g_signal_connect_object (controller, "enter",
                            G_CALLBACK (enter_cb), self, G_CONNECT_SWAPPED);
-  g_signal_connect_object (self->controller, "motion",
+  g_signal_connect_object (controller, "motion",
                            G_CALLBACK (motion_cb), self, G_CONNECT_SWAPPED);
+  gtk_widget_add_controller (GTK_WIDGET (self), controller);
 
-  self->gesture = gtk_gesture_multi_press_new (GTK_WIDGET (self));
-  gtk_event_controller_set_propagation_phase (GTK_EVENT_CONTROLLER (self->gesture),
+  gesture = gtk_gesture_click_new ();
+  gtk_event_controller_set_propagation_phase (GTK_EVENT_CONTROLLER (gesture),
                                               GTK_PHASE_CAPTURE);
-  gtk_gesture_single_set_touch_only (GTK_GESTURE_SINGLE (self->gesture), TRUE);
-  g_signal_connect_object (self->gesture, "pressed",
+  gtk_gesture_single_set_touch_only (GTK_GESTURE_SINGLE (gesture), TRUE);
+  g_signal_connect_object (gesture, "pressed",
                            G_CALLBACK (press_cb), self, G_CONNECT_SWAPPED);
+  gtk_widget_add_controller (GTK_WIDGET (self), GTK_EVENT_CONTROLLER (gesture));
 }
 
 static void
@@ -509,10 +462,10 @@ ephy_fullscreen_box_set_fullscreen (EphyFullscreenBox *self,
     return;
 
   if (fullscreen) {
-    hdy_flap_set_fold_policy (self->flap, HDY_FLAP_FOLD_POLICY_ALWAYS);
+    adw_flap_set_fold_policy (self->flap, ADW_FLAP_FOLD_POLICY_ALWAYS);
     update (self, FALSE);
   } else {
-    hdy_flap_set_fold_policy (self->flap, HDY_FLAP_FOLD_POLICY_NEVER);
+    adw_flap_set_fold_policy (self->flap, ADW_FLAP_FOLD_POLICY_NEVER);
     show_ui (self);
   }
 
@@ -556,7 +509,7 @@ ephy_fullscreen_box_get_titlebar (EphyFullscreenBox *self)
 {
   g_return_val_if_fail (EPHY_IS_FULLSCREEN_BOX (self), NULL);
 
-  return hdy_flap_get_flap (self->flap);
+  return adw_flap_get_flap (self->flap);
 }
 
 void
@@ -564,12 +517,12 @@ ephy_fullscreen_box_set_titlebar (EphyFullscreenBox *self,
                                   GtkWidget         *titlebar)
 {
   g_return_if_fail (EPHY_IS_FULLSCREEN_BOX (self));
-  g_return_if_fail (GTK_IS_WIDGET (titlebar) || titlebar == NULL);
+  g_return_if_fail (titlebar == NULL || GTK_IS_WIDGET (titlebar));
 
-  if (hdy_flap_get_flap (self->flap) == titlebar)
+  if (adw_flap_get_flap (self->flap) == titlebar)
     return;
 
-  hdy_flap_set_flap (self->flap, titlebar);
+  adw_flap_set_flap (self->flap, titlebar);
 
   g_object_notify_by_pspec (G_OBJECT (self), props[PROP_TITLEBAR]);
 }
@@ -579,7 +532,7 @@ ephy_fullscreen_box_get_content (EphyFullscreenBox *self)
 {
   g_return_val_if_fail (EPHY_IS_FULLSCREEN_BOX (self), NULL);
 
-  return hdy_flap_get_content (self->flap);
+  return adw_flap_get_content (self->flap);
 }
 
 void
@@ -587,12 +540,12 @@ ephy_fullscreen_box_set_content (EphyFullscreenBox *self,
                                  GtkWidget         *content)
 {
   g_return_if_fail (EPHY_IS_FULLSCREEN_BOX (self));
-  g_return_if_fail (GTK_IS_WIDGET (content) || content == NULL);
+  g_return_if_fail (content == NULL || GTK_IS_WIDGET (content));
 
-  if (hdy_flap_get_content (self->flap) == content)
+  if (adw_flap_get_content (self->flap) == content)
     return;
 
-  hdy_flap_set_content (self->flap, content);
+  adw_flap_set_content (self->flap, content);
 
   g_object_notify_by_pspec (G_OBJECT (self), props[PROP_CONTENT]);
 }
diff --git a/src/ephy-fullscreen-box.h b/src/ephy-fullscreen-box.h
index ce85c8e42..fec2f31e2 100644
--- a/src/ephy-fullscreen-box.h
+++ b/src/ephy-fullscreen-box.h
@@ -26,7 +26,7 @@ G_BEGIN_DECLS
 
 #define EPHY_TYPE_FULLSCREEN_BOX (ephy_fullscreen_box_get_type())
 
-G_DECLARE_FINAL_TYPE (EphyFullscreenBox, ephy_fullscreen_box, EPHY, FULLSCREEN_BOX, GtkEventBox)
+G_DECLARE_FINAL_TYPE (EphyFullscreenBox, ephy_fullscreen_box, EPHY, FULLSCREEN_BOX, GtkWidget)
 
 EphyFullscreenBox *ephy_fullscreen_box_new            (void);
 
diff --git a/src/ephy-header-bar.c b/src/ephy-header-bar.c
index 285288189..31c1dc068 100644
--- a/src/ephy-header-bar.c
+++ b/src/ephy-header-bar.c
@@ -35,8 +35,8 @@
 #include "ephy-title-widget.h"
 #include "ephy-type-builtins.h"
 
+#include <adwaita.h>
 #include <glib/gi18n.h>
-#include <handy.h>
 
 #define POPOVER_HIDE_DELAY 300
 
@@ -52,7 +52,7 @@ static GParamSpec *object_properties[N_PROPERTIES] = { NULL, };
 static const char *REFRESH_BUTTON_TOOLTIP = N_("Reload the current page");
 
 struct _EphyHeaderBar {
-  GtkBin parent_instance;
+  AdwBin parent_instance;
 
   GtkWidget *header_bar;
   EphyWindow *window;
@@ -65,13 +65,12 @@ struct _EphyHeaderBar {
   GtkWidget *zoom_level_label;
   GtkWidget *restore_button;
   GtkWidget *combined_stop_reload_button;
-  GtkWidget *combined_stop_reload_image;
   GtkWidget *page_menu_popover;
 
   guint popover_hide_timeout_id;
 };
 
-G_DEFINE_TYPE (EphyHeaderBar, ephy_header_bar, GTK_TYPE_BIN)
+G_DEFINE_TYPE (EphyHeaderBar, ephy_header_bar, ADW_TYPE_BIN)
 
 static void
 ephy_header_bar_set_property (GObject      *object,
@@ -125,7 +124,7 @@ sync_chromes_visibility (EphyHeaderBar *header_bar)
 static gboolean
 hide_timeout_cb (EphyHeaderBar *header_bar)
 {
-  gtk_popover_popdown (GTK_POPOVER (header_bar->page_menu_popover));
+  gtk_menu_button_popdown (GTK_MENU_BUTTON (header_bar->page_menu_button));
 
   header_bar->popover_hide_timeout_id = 0;
 
@@ -137,9 +136,9 @@ fullscreen_changed_cb (EphyHeaderBar *header_bar)
 {
   gboolean fullscreen;
 
-  g_object_get (header_bar->window, "fullscreen", &fullscreen, NULL);
+  g_object_get (header_bar->window, "fullscreened", &fullscreen, NULL);
 
-  gtk_header_bar_set_show_close_button (GTK_HEADER_BAR (header_bar->header_bar), !fullscreen);
+  gtk_header_bar_set_show_title_buttons (GTK_HEADER_BAR (header_bar->header_bar), !fullscreen);
   gtk_widget_set_visible (header_bar->restore_button, fullscreen);
 
   if (fullscreen) {
@@ -150,6 +149,7 @@ fullscreen_changed_cb (EphyHeaderBar *header_bar)
   }
 }
 
+#if 0
 static void
 add_bookmark_button_clicked_cb (EphyLocationEntry *entry,
                                 gpointer          *user_data)
@@ -158,7 +158,7 @@ add_bookmark_button_clicked_cb (EphyLocationEntry *entry,
   GActionGroup *action_group;
   GAction *action;
 
-  action_group = gtk_widget_get_action_group (GTK_WIDGET (header_bar->window), "win");
+  action_group = ephy_window_get_action_group (header_bar->window, "win");
   action = g_action_map_lookup_action (G_ACTION_MAP (action_group), "bookmark-page");
 
   g_action_activate (action, NULL);
@@ -171,11 +171,12 @@ restore_button_clicked_cb (GtkButton     *button,
   GActionGroup *action_group;
   GAction *action;
 
-  action_group = gtk_widget_get_action_group (GTK_WIDGET (header_bar->window), "win");
+  action_group = ephy_window_get_action_group (header_bar->window, "win");
   action = g_action_map_lookup_action (G_ACTION_MAP (action_group), "fullscreen");
 
   g_action_activate (action, NULL);
 }
+#endif
 
 static void
 update_revealer_visibility (GtkRevealer *revealer)
@@ -200,26 +201,23 @@ ephy_header_bar_constructed (GObject *object)
   g_signal_connect_object (header_bar->window, "notify::chrome",
                            G_CALLBACK (sync_chromes_visibility), header_bar,
                            G_CONNECT_SWAPPED);
-  g_signal_connect_object (header_bar->window, "notify::fullscreen",
+  g_signal_connect_object (header_bar->window, "notify::fullscreened",
                            G_CALLBACK (fullscreen_changed_cb), header_bar,
                            G_CONNECT_SWAPPED);
 
   /* Header bar */
   header_bar->header_bar = gtk_header_bar_new ();
-  gtk_header_bar_set_show_close_button (GTK_HEADER_BAR (header_bar->header_bar), TRUE);
-  gtk_widget_show (header_bar->header_bar);
-  gtk_container_add (GTK_CONTAINER (header_bar), header_bar->header_bar);
+  adw_bin_set_child (ADW_BIN (header_bar), header_bar->header_bar);
 
   /* Start action elements */
   header_bar->action_bar_start = ephy_action_bar_start_new ();
-  gtk_widget_show (GTK_WIDGET (header_bar->action_bar_start));
   header_bar->start_revealer = GTK_REVEALER (gtk_revealer_new ());
   g_signal_connect (header_bar->start_revealer, "notify::child-revealed",
                     G_CALLBACK (update_revealer_visibility), NULL);
   g_signal_connect (header_bar->start_revealer, "notify::reveal-child",
                     G_CALLBACK (update_revealer_visibility), NULL);
   gtk_revealer_set_transition_type (GTK_REVEALER (header_bar->start_revealer), 
GTK_REVEALER_TRANSITION_TYPE_SLIDE_RIGHT);
-  gtk_container_add (GTK_CONTAINER (header_bar->start_revealer), GTK_WIDGET (header_bar->action_bar_start));
+  gtk_revealer_set_child (GTK_REVEALER (header_bar->start_revealer), GTK_WIDGET 
(header_bar->action_bar_start));
 
   gtk_header_bar_pack_start (GTK_HEADER_BAR (header_bar->header_bar),
                              GTK_WIDGET (header_bar->start_revealer));
@@ -229,14 +227,11 @@ ephy_header_bar_constructed (GObject *object)
   /* Title widget (location entry or title box) */
   if (ephy_embed_shell_get_mode (embed_shell) == EPHY_EMBED_SHELL_MODE_APPLICATION)
     header_bar->title_widget = EPHY_TITLE_WIDGET (ephy_title_box_new ());
-  else {
+  else
     header_bar->title_widget = EPHY_TITLE_WIDGET (ephy_location_entry_new ());
-  }
 
-  event_box = gtk_event_box_new ();
-  gtk_widget_add_events (event_box, GDK_ALL_EVENTS_MASK);
-  gtk_widget_show (event_box);
-  gtk_header_bar_set_custom_title (GTK_HEADER_BAR (header_bar->header_bar), event_box);
+  event_box = adw_bin_new ();
+  gtk_header_bar_set_title_widget (GTK_HEADER_BAR (header_bar->header_bar), event_box);
   gtk_widget_set_name (event_box, "title-box-container");
 
   if (is_desktop_pantheon ()) {
@@ -245,22 +240,20 @@ ephy_header_bar_constructed (GObject *object)
     gtk_widget_set_margin_start (GTK_WIDGET (header_bar->title_widget), 6);
     gtk_widget_set_margin_end (GTK_WIDGET (header_bar->title_widget), 6);
 
-    gtk_container_add (GTK_CONTAINER (event_box), GTK_WIDGET (header_bar->title_widget));
+    adw_bin_set_child (ADW_BIN (event_box), GTK_WIDGET (header_bar->title_widget));
   } else {
     GtkWidget *clamp;
 
-    clamp = hdy_clamp_new ();
+    clamp = adw_clamp_new ();
     gtk_widget_set_hexpand (GTK_WIDGET (clamp), TRUE);
-    gtk_widget_show (clamp);
-    hdy_clamp_set_maximum_size (HDY_CLAMP (clamp), 860);
-    hdy_clamp_set_tightening_threshold (HDY_CLAMP (clamp), 560);
-    gtk_container_add (GTK_CONTAINER (clamp), GTK_WIDGET (header_bar->title_widget));
+    adw_clamp_set_maximum_size (ADW_CLAMP (clamp), 860);
+    adw_clamp_set_tightening_threshold (ADW_CLAMP (clamp), 560);
+    adw_clamp_set_child (ADW_CLAMP (clamp), GTK_WIDGET (header_bar->title_widget));
 
-    gtk_container_add (GTK_CONTAINER (event_box), clamp);
+    adw_bin_set_child (ADW_BIN (event_box), clamp);
   }
 
-  gtk_widget_show (GTK_WIDGET (header_bar->title_widget));
-
+#if 0
   if (EPHY_IS_LOCATION_ENTRY (header_bar->title_widget)) {
     EphyLocationEntry *lentry = EPHY_LOCATION_ENTRY (header_bar->title_widget);
     GtkWidget *popover = ephy_add_bookmark_popover_new (ephy_location_entry_get_bookmark_widget (lentry), 
GTK_WIDGET (header_bar->window));
@@ -274,25 +267,25 @@ ephy_header_bar_constructed (GObject *object)
                              header_bar,
                              0);
   }
+#endif
 
   /* Fullscreen restore button */
-  header_bar->restore_button = gtk_button_new_from_icon_name ("view-restore-symbolic",
-                                                              GTK_ICON_SIZE_BUTTON);
-  g_signal_connect_object (header_bar->restore_button, "clicked",
-                           G_CALLBACK (restore_button_clicked_cb),
-                           header_bar, 0);
+  header_bar->restore_button = gtk_button_new_from_icon_name ("view-restore-symbolic");
+  gtk_widget_hide (header_bar->restore_button);
+//  g_signal_connect_object (header_bar->restore_button, "clicked",
+//                           G_CALLBACK (restore_button_clicked_cb),
+//                           header_bar, 0);
   gtk_header_bar_pack_end (GTK_HEADER_BAR (header_bar->header_bar),
                            GTK_WIDGET (header_bar->restore_button));
 
   /* Page Menu */
   button = gtk_menu_button_new ();
   header_bar->page_menu_button = button;
-  gtk_button_set_image (GTK_BUTTON (button),
-                        gtk_image_new_from_icon_name ("open-menu-symbolic", GTK_ICON_SIZE_BUTTON));
-  g_type_ensure (G_TYPE_THEMED_ICON);
+  gtk_menu_button_set_icon_name (GTK_MENU_BUTTON (button), "open-menu-symbolic");
   builder = gtk_builder_new_from_resource ("/org/gnome/epiphany/gtk/page-menu-popover.ui");
   header_bar->page_menu_popover = GTK_WIDGET (gtk_builder_get_object (builder, "page-menu-popover"));
   header_bar->zoom_level_label = GTK_WIDGET (gtk_builder_get_object (builder, "zoom-level"));
+#if 0
   if (ephy_embed_shell_get_mode (embed_shell) == EPHY_EMBED_SHELL_MODE_APPLICATION) {
     gtk_widget_destroy (GTK_WIDGET (gtk_builder_get_object (builder, "new-window-separator")));
     gtk_widget_destroy (GTK_WIDGET (gtk_builder_get_object (builder, "new-window-button")));
@@ -321,19 +314,17 @@ ephy_header_bar_constructed (GObject *object)
     gtk_widget_destroy (GTK_WIDGET (gtk_builder_get_object (builder, "run-in-background-separator")));
     gtk_widget_destroy (GTK_WIDGET (gtk_builder_get_object (builder, "run-in-background-button")));
   }
+#endif
 
   header_bar->combined_stop_reload_button = GTK_WIDGET (gtk_builder_get_object (builder, 
"combined_stop_reload_button"));
-  header_bar->combined_stop_reload_image = GTK_WIDGET (gtk_builder_get_object (builder, 
"combined_stop_reload_image"));
   gtk_widget_set_tooltip_text (header_bar->combined_stop_reload_button, _(REFRESH_BUTTON_TOOLTIP));
 
   if (is_desktop_pantheon ()) {
-    gtk_widget_destroy (GTK_WIDGET (gtk_builder_get_object (builder, "about-button")));
+//    gtk_widget_destroy (GTK_WIDGET (gtk_builder_get_object (builder, "about-button")));
 
-    gtk_button_set_image (GTK_BUTTON (button),
-                          gtk_image_new_from_icon_name ("open-menu",
-                                                        GTK_ICON_SIZE_LARGE_TOOLBAR));
+    gtk_button_set_icon_name (GTK_BUTTON (button), "open-menu");
   }
-  g_settings_bind (EPHY_SETTINGS_WEB, EPHY_PREFS_WEB_ENABLE_WEBEXTENSIONS, gtk_builder_get_object (builder, 
"extensions-button"), "visible", G_SETTINGS_BIND_DEFAULT);
+//  g_settings_bind (EPHY_SETTINGS_WEB, EPHY_PREFS_WEB_ENABLE_WEBEXTENSIONS, gtk_builder_get_object 
(builder, "extensions-button"), "visible", G_SETTINGS_BIND_DEFAULT);
 
   gtk_menu_button_set_popover (GTK_MENU_BUTTON (button), header_bar->page_menu_popover);
   g_object_unref (builder);
@@ -342,14 +333,13 @@ ephy_header_bar_constructed (GObject *object)
 
   /* End action elements */
   header_bar->action_bar_end = ephy_action_bar_end_new ();
-  gtk_widget_show (GTK_WIDGET (header_bar->action_bar_end));
   header_bar->end_revealer = GTK_REVEALER (gtk_revealer_new ());
   g_signal_connect (header_bar->end_revealer, "notify::child-revealed",
                     G_CALLBACK (update_revealer_visibility), NULL);
   g_signal_connect (header_bar->end_revealer, "notify::reveal-child",
                     G_CALLBACK (update_revealer_visibility), NULL);
   gtk_revealer_set_transition_type (GTK_REVEALER (header_bar->end_revealer), 
GTK_REVEALER_TRANSITION_TYPE_SLIDE_LEFT);
-  gtk_container_add (GTK_CONTAINER (header_bar->end_revealer), GTK_WIDGET (header_bar->action_bar_end));
+  gtk_revealer_set_child (GTK_REVEALER (header_bar->end_revealer), GTK_WIDGET (header_bar->action_bar_end));
 
   gtk_header_bar_pack_end (GTK_HEADER_BAR (header_bar->header_bar),
                            GTK_WIDGET (header_bar->end_revealer));
@@ -477,16 +467,14 @@ ephy_header_bar_start_change_combined_stop_reload_state (EphyHeaderBar *header_b
                                                          gboolean       loading)
 {
   if (loading) {
-    gtk_image_set_from_icon_name (GTK_IMAGE (header_bar->combined_stop_reload_image),
-                                  "process-stop-symbolic",
-                                  get_icon_size ());
+    gtk_button_set_icon_name (GTK_BUTTON (header_bar->combined_stop_reload_button),
+                              "process-stop-symbolic");
     /* Translators: tooltip for the stop button */
     gtk_widget_set_tooltip_text (header_bar->combined_stop_reload_button,
                                  _("Stop loading the current page"));
   } else {
-    gtk_image_set_from_icon_name (GTK_IMAGE (header_bar->combined_stop_reload_image),
-                                  "view-refresh-symbolic",
-                                  get_icon_size ());
+    gtk_button_set_icon_name (GTK_BUTTON (header_bar->combined_stop_reload_button),
+                              "view-refresh-symbolic");
     gtk_widget_set_tooltip_text (header_bar->combined_stop_reload_button,
                                  _(REFRESH_BUTTON_TOOLTIP));
   }
diff --git a/src/ephy-header-bar.h b/src/ephy-header-bar.h
index f066de16d..c3eff87f1 100644
--- a/src/ephy-header-bar.h
+++ b/src/ephy-header-bar.h
@@ -20,7 +20,7 @@
 
 #pragma once
 
-#include <gtk/gtk.h>
+#include <adwaita.h>
 
 #include "ephy-action-bar-end.h"
 #include "ephy-action-bar-start.h"
@@ -32,7 +32,7 @@ G_BEGIN_DECLS
 
 #define EPHY_TYPE_HEADER_BAR (ephy_header_bar_get_type())
 
-G_DECLARE_FINAL_TYPE (EphyHeaderBar, ephy_header_bar, EPHY, HEADER_BAR, GtkBin)
+G_DECLARE_FINAL_TYPE (EphyHeaderBar, ephy_header_bar, EPHY, HEADER_BAR, AdwBin)
 
 GtkWidget          *ephy_header_bar_new                            (EphyWindow    *window);
 EphyTitleWidget    *ephy_header_bar_get_title_widget               (EphyHeaderBar *header_bar);
diff --git a/src/ephy-history-dialog.c b/src/ephy-history-dialog.c
index 89a279fb7..638ff80c2 100644
--- a/src/ephy-history-dialog.c
+++ b/src/ephy-history-dialog.c
@@ -35,17 +35,17 @@
 #include "ephy-time-helpers.h"
 #include "ephy-window.h"
 
+#include <adwaita.h>
 #include <ctype.h>
 #include <gtk/gtk.h>
 #include <glib/gi18n.h>
-#include <handy.h>
 #include <string.h>
 #include <time.h>
 
 #define NUM_FETCH_LIMIT 15
 
 struct _EphyHistoryDialog {
-  HdyWindow parent_instance;
+  AdwWindow parent_instance;
 
   EphySnapshotService *snapshot_service;
   EphyHistoryService *history_service;
@@ -88,7 +88,7 @@ struct _EphyHistoryDialog {
   gboolean has_search_results;
 };
 
-G_DEFINE_TYPE (EphyHistoryDialog, ephy_history_dialog, HDY_TYPE_WINDOW)
+G_DEFINE_TYPE (EphyHistoryDialog, ephy_history_dialog, ADW_TYPE_WINDOW)
 
 enum {
   PROP_0,
@@ -195,18 +195,22 @@ static void
 set_selection_active (EphyHistoryDialog *self,
                       gboolean           selection_active)
 {
-  g_autoptr (GList) rows = gtk_container_get_children (GTK_CONTAINER (self->listbox));
-  GList *iter = NULL;
+  int i = 0;
 
   self->selection_active = selection_active;
 
-  for (iter = rows; iter != NULL; iter = g_list_next (iter)) {
-    GObject *row = iter->data;
-    GtkWidget *check_button = GTK_WIDGET (g_object_get_data (row, "check-button"));
-    GtkWidget *separator = GTK_WIDGET (g_object_get_data (row, "separator"));
+  while (TRUE) {
+    GtkListBoxRow *row = gtk_list_box_get_row_at_index (GTK_LIST_BOX (self->listbox), i++);
+    GtkWidget *check_button, *separator;
+
+    if (!row)
+      break;
+
+    check_button = g_object_get_data (G_OBJECT (row), "check-button");
+    separator = g_object_get_data (G_OBJECT (row), "separator");
 
     /* Uncheck all rows when toggling selection mode */
-    gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button), FALSE);
+    gtk_check_button_set_active (GTK_CHECK_BUTTON (check_button), FALSE);
 
     /* Show/Hide row selection widgets (check_button + separator) */
     gtk_widget_set_visible (check_button, selection_active);
@@ -244,8 +248,8 @@ set_is_selection_empty (EphyHistoryDialog *self,
 static EphyHistoryURL *
 get_url_from_row (GtkListBoxRow *row)
 {
-  return ephy_history_url_new (hdy_action_row_get_subtitle (HDY_ACTION_ROW (row)),
-                               hdy_preferences_row_get_title (HDY_PREFERENCES_ROW (row)),
+  return ephy_history_url_new (adw_action_row_get_subtitle (ADW_ACTION_ROW (row)),
+                               adw_preferences_row_get_title (ADW_PREFERENCES_ROW (row)),
                                0,
                                0,
                                0);
@@ -254,15 +258,10 @@ get_url_from_row (GtkListBoxRow *row)
 static void
 clear_listbox (GtkWidget *listbox)
 {
-  GList *children, *iter;
-
-  children = gtk_container_get_children (GTK_CONTAINER (listbox));
+  GtkListBoxRow *row;
 
-  for (iter = children; iter; iter = g_list_next (iter)) {
-    gtk_widget_destroy (GTK_WIDGET (iter->data));
-  }
-
-  g_list_free (children);
+  while ((row = gtk_list_box_get_row_at_index (GTK_LIST_BOX (listbox), 0)))
+    gtk_list_box_remove (GTK_LIST_BOX (listbox), GTK_WIDGET (row));
 }
 
 static void
@@ -289,7 +288,7 @@ on_find_urls_cb (gpointer service,
 static GList *
 substrings_filter (EphyHistoryDialog *self)
 {
-  const gchar *search_text = gtk_entry_get_text (GTK_ENTRY (self->search_entry));
+  const gchar *search_text = gtk_editable_get_text (GTK_EDITABLE (self->search_entry));
   char **tokens, **p;
   GList *substrings = NULL;
 
@@ -345,15 +344,19 @@ filter_now (EphyHistoryDialog *self)
 static GList *
 get_checked_rows (EphyHistoryDialog *self)
 {
-  g_autoptr (GList) rows_list = gtk_container_get_children (GTK_CONTAINER (self->listbox));
   GList *checked_rows = NULL;
-  GList *iter = NULL;
+  int i = 0;
 
-  for (iter = rows_list; iter != NULL; iter = g_list_next (iter)) {
-    GObject *row = iter->data;
-    GtkCheckButton *check_button = GTK_CHECK_BUTTON (g_object_get_data (row, "check-button"));
+  while (TRUE) {
+    GtkListBoxRow *row = gtk_list_box_get_row_at_index (GTK_LIST_BOX (self->listbox), i++);
+    GtkCheckButton *check_button;
 
-    if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (check_button)))
+    if (!row)
+      break;
+
+    check_button = g_object_get_data (G_OBJECT (row), "check-button");
+
+    if (gtk_check_button_get_active (check_button))
       checked_rows = g_list_prepend (checked_rows, row);
   }
 
@@ -410,7 +413,7 @@ row_copy_url_button_clicked (GtkWidget *button,
   g_autoptr (EphyHistoryURL) url = get_url_from_row (row);
 
   if (url)
-    gtk_clipboard_set_text (gtk_widget_get_clipboard (GTK_WIDGET (button), GDK_SELECTION_CLIPBOARD), 
url->url, -1);
+    gdk_clipboard_set_text (gtk_widget_get_clipboard (GTK_WIDGET (button)), url->url);
 }
 
 static void
@@ -433,11 +436,15 @@ create_row (EphyHistoryDialog *self,
   GtkWidget *separator;
   GtkWidget *check_button;
   GtkWidget *copy_url_button;
+  g_autofree char *escaped_markup = g_markup_escape_text (url->url, -1);
 
   /* Row */
-  row = hdy_action_row_new ();
-  hdy_preferences_row_set_title (HDY_PREFERENCES_ROW (row), url->title);
-  hdy_action_row_set_subtitle (HDY_ACTION_ROW (row), url->url);
+  row = adw_action_row_new ();
+  adw_action_row_set_title_lines (ADW_ACTION_ROW (row), 1);
+  adw_action_row_set_subtitle_lines (ADW_ACTION_ROW (row), 1);
+  adw_action_row_set_subtitle (ADW_ACTION_ROW (row), escaped_markup);
+  adw_preferences_row_set_title (ADW_PREFERENCES_ROW (row), url->title);
+  adw_action_row_set_subtitle (ADW_ACTION_ROW (row), escaped_markup);
   gtk_list_box_row_set_activatable (GTK_LIST_BOX_ROW (row), TRUE);
   gtk_widget_set_tooltip_text (row, url->url);
 
@@ -460,20 +467,18 @@ create_row (EphyHistoryDialog *self,
   g_signal_connect (check_button, "toggled", G_CALLBACK (row_check_button_toggled), self);
 
   /* Copy URL button */
-  copy_url_button = gtk_button_new_from_icon_name ("edit-copy-symbolic", GTK_ICON_SIZE_BUTTON);
+  copy_url_button = gtk_button_new_from_icon_name ("edit-copy-symbolic");
   gtk_widget_set_valign (copy_url_button, GTK_ALIGN_CENTER);
   gtk_widget_set_tooltip_text (copy_url_button, _("Copy URL"));
   g_signal_connect (copy_url_button, "clicked", G_CALLBACK (row_copy_url_button_clicked), row);
 
-  hdy_action_row_add_prefix (HDY_ACTION_ROW (row), check_button);
-  hdy_action_row_add_prefix (HDY_ACTION_ROW (row), separator);
-  gtk_container_add (GTK_CONTAINER (row), date);
-  gtk_container_add (GTK_CONTAINER (row), copy_url_button);
+  adw_action_row_add_prefix (ADW_ACTION_ROW (row), separator);
+  adw_action_row_add_prefix (ADW_ACTION_ROW (row), check_button);
+  adw_action_row_add_suffix (ADW_ACTION_ROW (row), date);
+  adw_action_row_add_suffix (ADW_ACTION_ROW (row), copy_url_button);
 
   gtk_widget_set_sensitive (check_button, ephy_embed_shell_get_mode (shell) != 
EPHY_EMBED_SHELL_MODE_INCOGNITO);
 
-  gtk_widget_show_all (row);
-
   /* Hide the Separator and CheckButton if selection isn't active */
   if (!self->selection_active) {
     gtk_widget_set_visible (separator, FALSE);
@@ -489,15 +494,14 @@ add_urls_source (EphyHistoryDialog *self)
   EphyHistoryURL *url;
   GList *element;
   GtkWidget *row;
-  GList *children;
+  gboolean has_results;
 
   set_is_loading (self, FALSE);
 
-  children = gtk_container_get_children (GTK_CONTAINER (self->listbox));
-  set_has_search_results (self, !!children);
-  if (!children)
+  has_results = !!gtk_list_box_get_row_at_index (GTK_LIST_BOX (self->listbox), 0);
+  set_has_search_results (self, has_results);
+  if (!has_results)
     set_has_data (self, FALSE);
-  g_list_free (children);
 
   if (!self->urls || !self->num_fetch) {
     self->sorter_source = 0;
@@ -531,7 +535,7 @@ confirmation_dialog_response_cb (GtkWidget         *dialog,
                                  int                response,
                                  EphyHistoryDialog *self)
 {
-  gtk_widget_destroy (dialog);
+  gtk_window_destroy (GTK_WINDOW (dialog));
 
   if (response == GTK_RESPONSE_ACCEPT) {
     ephy_history_service_clear (self->history_service,
@@ -574,7 +578,7 @@ confirmation_dialog_construct (EphyHistoryDialog *self)
 
   return dialog;
 }
-
+/*
 static gboolean
 on_listbox_key_press_event (GtkWidget         *widget,
                             GdkEventKey       *event,
@@ -588,7 +592,7 @@ on_listbox_key_press_event (GtkWidget         *widget,
 
   return FALSE;
 }
-
+*/
 static void
 on_search_entry_changed (GtkSearchEntry    *search_entry,
                          EphyHistoryDialog *self)
@@ -605,13 +609,14 @@ load_further_data (EphyHistoryDialog *self)
   self->sorter_source = g_idle_add ((GSourceFunc)add_urls_source, self);
 }
 
+#if 0
 static gboolean
 on_key_press_event (EphyHistoryDialog *self,
                     GdkEvent          *event,
                     gpointer           user_data)
 {
   GdkEventKey *key = (GdkEventKey *)event;
-  HdySearchBar *search_bar = HDY_SEARCH_BAR (self->search_bar);
+  GtkSearchBar *search_bar = GTK_SEARCH_BAR (self->search_bar);
 
   /* Keep track internally of the Shift modifier needed for the
    * interval selection logic */
@@ -619,13 +624,12 @@ on_key_press_event (EphyHistoryDialog *self,
     self->shift_modifier_active = TRUE;
 
   /* Check if event can be handled by the search bar */
-  if (hdy_search_bar_handle_event (search_bar, event) == GDK_EVENT_STOP)
+  if (adw_search_bar_handle_event (search_bar, event) == GDK_EVENT_STOP)
     return GDK_EVENT_STOP;
 
   if (key->keyval == GDK_KEY_Down || key->keyval == GDK_KEY_Page_Down) {
-    GList *childrens = gtk_container_get_children (GTK_CONTAINER (self->listbox));
-    GtkWidget *last = g_list_last (childrens)->data;
-    GtkWidget *focus = gtk_container_get_focus_child (GTK_CONTAINER (self->listbox));
+    GtkWidget *last = gtk_widget_get_last_child (self->listbox);
+    GtkWidget *focus = gtk_widget_get_focus_child (self->listbox);
 
     if (focus == last) {
       load_further_data (self);
@@ -635,7 +639,7 @@ on_key_press_event (EphyHistoryDialog *self,
   }
 
   if (key->keyval == GDK_KEY_Escape &&
-      !hdy_search_bar_get_search_mode (search_bar)) {
+      !adw_search_bar_get_search_mode (search_bar)) {
     if (self->selection_active)
       set_selection_active (self, FALSE);
     else
@@ -678,6 +682,7 @@ on_key_release_event (EphyHistoryDialog *self,
   /* Don't handle the event */
   return GDK_EVENT_PROPAGATE;
 }
+#endif
 
 static void
 check_rows_interval (GtkListBox *listbox,
@@ -700,7 +705,7 @@ check_rows_interval (GtkListBox *listbox,
     GtkListBoxRow *row = gtk_list_box_get_row_at_index (listbox, index);
     GtkCheckButton *check_button = GTK_CHECK_BUTTON (g_object_get_data (G_OBJECT (row), "check-button"));
 
-    gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button), TRUE);
+    gtk_check_button_set_active (check_button, TRUE);
   }
 }
 
@@ -710,11 +715,11 @@ handle_selection_row_activated_event (EphyHistoryDialog *self,
 {
   g_autoptr (GList) checked_rows = get_checked_rows (self);
   GtkCheckButton *check_button = GTK_CHECK_BUTTON (g_object_get_data (G_OBJECT (activated_row), 
"check-button"));
-  gboolean button_checked = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (check_button));
+  gboolean button_checked = gtk_check_button_get_active (check_button);
 
   /* If Shift modifier isn't active, event simply toggles the row's checkbox button */
   if (!self->shift_modifier_active) {
-    gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button), !button_checked);
+    gtk_check_button_set_active (check_button, !button_checked);
     return;
   }
 
@@ -729,17 +734,21 @@ handle_selection_row_activated_event (EphyHistoryDialog *self,
   } else {
     /* If there are zero or more than one other rows checked,
      * then we check the clicked row and uncheck all the others */
-    g_autoptr (GList) rows = gtk_container_get_children (GTK_CONTAINER (self->listbox));
-    GList *iter = NULL;
+    int i;
+
+    while (TRUE) {
+      GtkListBoxRow *row = gtk_list_box_get_row_at_index (GTK_LIST_BOX (self->listbox), i++);
+      GtkCheckButton *row_check_btn;
+
+      if (!row)
+        break;
 
-    for (iter = rows; iter != NULL; iter = g_list_next (iter)) {
-      GObject *row = iter->data;
-      GtkCheckButton *row_check_btn = GTK_CHECK_BUTTON (g_object_get_data (row, "check-button"));
+      row_check_btn = g_object_get_data (G_OBJECT (row), "check-button");
 
-      gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (row_check_btn), FALSE);
+      gtk_check_button_set_active (row_check_btn, FALSE);
     }
 
-    gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button), TRUE);
+    gtk_check_button_set_active (check_button, TRUE);
   }
 }
 
@@ -928,10 +937,10 @@ ephy_history_dialog_class_init (EphyHistoryDialogClass *klass)
   gtk_widget_class_bind_template_child (widget_class, EphyHistoryDialog, selection_delete_button);
   gtk_widget_class_bind_template_child (widget_class, EphyHistoryDialog, selection_open_button);
 
-  gtk_widget_class_bind_template_callback (widget_class, on_listbox_key_press_event);
+//  gtk_widget_class_bind_template_callback (widget_class, on_listbox_key_press_event);
   gtk_widget_class_bind_template_callback (widget_class, on_listbox_row_activated);
-  gtk_widget_class_bind_template_callback (widget_class, on_key_press_event);
-  gtk_widget_class_bind_template_callback (widget_class, on_key_release_event);
+//  gtk_widget_class_bind_template_callback (widget_class, on_key_press_event);
+//  gtk_widget_class_bind_template_callback (widget_class, on_key_release_event);
   gtk_widget_class_bind_template_callback (widget_class, on_selection_button_clicked);
   gtk_widget_class_bind_template_callback (widget_class, on_selection_cancel_button_clicked);
   gtk_widget_class_bind_template_callback (widget_class, on_search_entry_changed);
@@ -969,7 +978,8 @@ ephy_history_dialog_init (EphyHistoryDialog *self)
   self->sorter_source = 0;
   self->is_selection_empty = TRUE;
 
-  hdy_search_bar_connect_entry (HDY_SEARCH_BAR (self->search_bar), GTK_ENTRY (self->search_entry));
+  gtk_search_bar_connect_entry (GTK_SEARCH_BAR (self->search_bar),
+                                GTK_EDITABLE (self->search_entry));
 
   ephy_gui_ensure_window_group (GTK_WINDOW (self));
 
@@ -984,6 +994,6 @@ ephy_history_dialog_init (EphyHistoryDialog *self)
   gtk_widget_set_tooltip_text (self->clear_all_button, tooltip);
   set_is_loading (self, TRUE);
 
-  hdy_status_page_set_icon_name (HDY_STATUS_PAGE (self->empty_history_message),
+  adw_status_page_set_icon_name (ADW_STATUS_PAGE (self->empty_history_message),
                                  APPLICATION_ID "-symbolic");
 }
diff --git a/src/ephy-history-dialog.h b/src/ephy-history-dialog.h
index d77e45d8d..74a4252d0 100644
--- a/src/ephy-history-dialog.h
+++ b/src/ephy-history-dialog.h
@@ -20,7 +20,7 @@
 
 #pragma once
 
-#include <handy.h>
+#include <adwaita.h>
 
 #include "ephy-history-service.h"
 
@@ -28,7 +28,7 @@ G_BEGIN_DECLS
 
 #define EPHY_TYPE_HISTORY_DIALOG (ephy_history_dialog_get_type ())
 
-G_DECLARE_FINAL_TYPE (EphyHistoryDialog, ephy_history_dialog, EPHY, HISTORY_DIALOG, HdyWindow)
+G_DECLARE_FINAL_TYPE (EphyHistoryDialog, ephy_history_dialog, EPHY, HISTORY_DIALOG, AdwWindow)
 
 GtkWidget      *ephy_history_dialog_new        (EphyHistoryService *history_service);
 
diff --git a/src/ephy-link.c b/src/ephy-link.c
index cc7f69386..93c6a0009 100644
--- a/src/ephy-link.c
+++ b/src/ephy-link.c
@@ -94,6 +94,7 @@ ephy_link_open (EphyLink      *link,
   return new_embed;
 }
 
+#if 0
 EphyLinkFlags
 ephy_link_flags_from_current_event (void)
 {
@@ -122,3 +123,4 @@ ephy_link_flags_from_current_event (void)
 
   return flags;
 }
+#endif
diff --git a/src/ephy-location-controller.c b/src/ephy-location-controller.c
index b9d37ae19..4bff95e73 100644
--- a/src/ephy-location-controller.c
+++ b/src/ephy-location-controller.c
@@ -23,18 +23,17 @@
 #include "ephy-location-controller.h"
 
 #include "ephy-debug.h"
-#include "ephy-dnd.h"
+//#include "ephy-dnd.h"
 #include "ephy-embed-container.h"
 #include "ephy-embed-utils.h"
 #include "ephy-link.h"
-#include "ephy-location-entry.h"
+//#include "ephy-location-entry.h"
 #include "ephy-shell.h"
 #include "ephy-suggestion-model.h"
 #include "ephy-title-widget.h"
 #include "ephy-uri-helpers.h"
 #include "ephy-widgets-type-builtins.h"
 
-#include <dazzle.h>
 #include <gdk/gdkkeysyms.h>
 #include <gtk/gtk.h>
 #include <string.h>
@@ -78,7 +77,7 @@ static GParamSpec *obj_properties[LAST_PROP];
 G_DEFINE_TYPE_WITH_CODE (EphyLocationController, ephy_location_controller, G_TYPE_OBJECT,
                          G_IMPLEMENT_INTERFACE (EPHY_TYPE_LINK,
                                                 NULL))
-
+/*
 static void
 entry_drag_data_received_cb (GtkWidget              *widget,
                              GdkDragContext         *context,
@@ -128,7 +127,7 @@ entry_drag_data_received_cb (GtkWidget              *widget,
     g_free (address);
   }
 }
-
+*/
 static void
 entry_activate_cb (GtkEntry               *entry,
                    EphyLocationController *controller)
@@ -142,7 +141,7 @@ entry_activate_cb (GtkEntry               *entry,
     g_signal_handlers_unblock_by_func (controller, G_CALLBACK (sync_address), entry);
   }
 
-  content = gtk_entry_get_text (entry);
+  content = gtk_editable_get_text (GTK_EDITABLE (entry));
   if (content == NULL || content[0] == '\0')
     return;
 
@@ -201,8 +200,8 @@ entry_activate_cb (GtkEntry               *entry,
   }
 #endif
 
-  ephy_link_open (EPHY_LINK (controller), effective_address, NULL,
-                  ephy_link_flags_from_current_event () | EPHY_LINK_TYPED);
+//  ephy_link_open (EPHY_LINK (controller), effective_address, NULL,
+//                  ephy_link_flags_from_current_event () | EPHY_LINK_TYPED);
 
   g_free (effective_address);
 }
@@ -212,6 +211,7 @@ static void
 user_changed_cb (GtkWidget              *widget,
                  EphyLocationController *controller)
 {
+/*
   const char *address;
   DzlSuggestionEntry *entry = DZL_SUGGESTION_ENTRY (ephy_location_entry_get_entry (EPHY_LOCATION_ENTRY 
(widget)));
   GListModel *model;
@@ -222,7 +222,7 @@ user_changed_cb (GtkWidget              *widget,
 
   model = dzl_suggestion_entry_get_model (entry);
 
-  ephy_suggestion_model_query_async (EPHY_SUGGESTION_MODEL (model), address, TRUE, NULL, NULL, NULL);
+  ephy_suggestion_model_query_async (EPHY_SUGGESTION_MODEL (model), address, TRUE, NULL, NULL, NULL);*/
 }
 
 static void
@@ -237,6 +237,7 @@ sync_address (EphyLocationController *controller,
   g_signal_handlers_unblock_by_func (widget, G_CALLBACK (user_changed_cb), controller);
 }
 
+#if 0
 static char *
 get_location_cb (EphyLocationEntry      *entry,
                  EphyLocationController *controller)
@@ -292,6 +293,7 @@ focus_out_event_cb (GtkWidget              *entry,
 
   return FALSE;
 }
+#endif
 
 static void
 notify_selected_index_cb (EphyLocationController *controller)
@@ -321,14 +323,14 @@ reader_mode_button_clicked_cb (GtkButton *button,
   EphyWindow *window = controller->window;
   EphyEmbed *embed = ephy_embed_container_get_active_child (EPHY_EMBED_CONTAINER (window));
   EphyWebView *view = ephy_embed_get_web_view (embed);
-  EphyLocationEntry *lentry;
+/*  EphyLocationEntry *lentry;
 
   g_assert (EPHY_IS_LOCATION_ENTRY (controller->title_widget));
 
   lentry = EPHY_LOCATION_ENTRY (controller->title_widget);
 
   ephy_location_entry_set_reader_mode_state (lentry, !ephy_location_entry_get_reader_mode_state (lentry));
-  ephy_web_view_toggle_reader_mode (view, ephy_location_entry_get_reader_mode_state (lentry));
+  ephy_web_view_toggle_reader_mode (view, ephy_location_entry_get_reader_mode_state (lentry));*/
 }
 
 static void
@@ -353,7 +355,7 @@ ephy_location_controller_constructed (GObject *object)
   sync_address (controller, NULL, widget);
   g_signal_connect_object (controller, "notify::address",
                            G_CALLBACK (sync_address), widget, 0);
-
+/*
   if (!EPHY_IS_LOCATION_ENTRY (controller->title_widget))
     return;
 
@@ -390,7 +392,7 @@ ephy_location_controller_constructed (GObject *object)
   g_signal_connect_object (widget, "focus-in-event",
                            G_CALLBACK (focus_in_event_cb), controller, 0);
   g_signal_connect_object (widget, "focus-out-event",
-                           G_CALLBACK (focus_out_event_cb), controller, 0);
+                           G_CALLBACK (focus_out_event_cb), controller, 0);*/
 }
 
 static void
@@ -449,12 +451,12 @@ ephy_location_controller_dispose (GObject *object)
 
   g_clear_object (&controller->longpress_gesture);
 
-  if (EPHY_IS_LOCATION_ENTRY (controller->title_widget)) {
+/*  if (EPHY_IS_LOCATION_ENTRY (controller->title_widget)) {
     g_signal_handlers_disconnect_matched (controller, G_SIGNAL_MATCH_DATA,
                                           0, 0, NULL, NULL, controller->title_widget);
     g_signal_handlers_disconnect_matched (controller->title_widget, G_SIGNAL_MATCH_DATA,
                                           0, 0, NULL, NULL, controller);
-  }
+  }*/
   controller->title_widget = NULL;
 
   G_OBJECT_CLASS (ephy_location_controller_parent_class)->dispose (object);
diff --git a/src/ephy-lockdown.c b/src/ephy-lockdown.c
index 19d35af5f..249d68ee8 100644
--- a/src/ephy-lockdown.c
+++ b/src/ephy-lockdown.c
@@ -88,25 +88,25 @@ static const BindAction app_actions[] = {
 };
 
 static const BindAction app_mode_app_actions[] = {
-  { EPHY_PREFS_LOCKDOWN_HISTORY, "history", "enabled" }
+//  { EPHY_PREFS_LOCKDOWN_HISTORY, "history", "enabled" }
 };
 
 static const BindAction window_actions[] = {
   { EPHY_PREFS_LOCKDOWN_ARBITRARY_URL, "location", "enabled"},
 
-  { EPHY_PREFS_LOCKDOWN_BOOKMARK_EDITING, "bookmark-page", "enabled" },
+//  { EPHY_PREFS_LOCKDOWN_BOOKMARK_EDITING, "bookmark-page", "enabled" },
 
   { EPHY_PREFS_LOCKDOWN_FULLSCREEN, "fullscreen", "enabled" },
 
   { EPHY_PREFS_LOCKDOWN_PRINTING, "print", "enabled" },
 
-  { EPHY_PREFS_LOCKDOWN_SAVE_TO_DISK, "save-as", "enabled" }
+//  { EPHY_PREFS_LOCKDOWN_SAVE_TO_DISK, "save-as", "enabled" }
 };
 
 static const BindAction popup_actions[] = {
   { EPHY_PREFS_LOCKDOWN_SAVE_TO_DISK, "download-link-as", "enabled" },
   { EPHY_PREFS_LOCKDOWN_SAVE_TO_DISK, "save-image-as", "enabled" },
-  { EPHY_PREFS_LOCKDOWN_BOOKMARK_EDITING, "context-bookmark-page", "enabled" },
+//  { EPHY_PREFS_LOCKDOWN_BOOKMARK_EDITING, "context-bookmark-page", "enabled" },
 
   { EPHY_PREFS_LOCKDOWN_FULLSCREEN, "open-link-in-new-window", "enabled" }
 };
@@ -215,22 +215,19 @@ window_added_cb (GtkApplication *application,
                              action_group, app_mode_app_actions,
                              G_N_ELEMENTS (app_mode_app_actions));
 
-  action_group = gtk_widget_get_action_group (GTK_WIDGET (window),
-                                              "win");
+  action_group = ephy_window_get_action_group (EPHY_WINDOW (window), "win");
   bind_settings_and_actions (EPHY_SETTINGS_LOCKDOWN,
                              action_group,
                              window_actions,
                              G_N_ELEMENTS (window_actions));
 
-  action_group = gtk_widget_get_action_group (GTK_WIDGET (window),
-                                              "toolbar");
+  action_group = ephy_window_get_action_group (EPHY_WINDOW (window), "toolbar");
   bind_settings_and_actions (EPHY_SETTINGS_LOCKDOWN,
                              action_group,
                              toolbar_actions,
                              G_N_ELEMENTS (toolbar_actions));
 
-  action_group = gtk_widget_get_action_group (GTK_WIDGET (window),
-                                              "popup");
+  action_group = ephy_window_get_action_group (EPHY_WINDOW (window), "popup");
   bind_settings_and_actions (EPHY_SETTINGS_LOCKDOWN,
                              action_group, popup_actions,
                              G_N_ELEMENTS (popup_actions));
diff --git a/src/ephy-mouse-gesture-controller.c b/src/ephy-mouse-gesture-controller.c
index f3a804d91..55112ea01 100644
--- a/src/ephy-mouse-gesture-controller.c
+++ b/src/ephy-mouse-gesture-controller.c
@@ -178,9 +178,9 @@ static void
 handle_gesture (gpointer user_data)
 {
   EphyMouseGestureController *self = EPHY_MOUSE_GESTURE_CONTROLLER (user_data);
-  GActionGroup *action_group_toolbar = gtk_widget_get_action_group (GTK_WIDGET (self->window), "toolbar");
-  GActionGroup *action_group_win = gtk_widget_get_action_group (GTK_WIDGET (self->window), "win");
-  GActionGroup *action_group_tab = gtk_widget_get_action_group (GTK_WIDGET (self->window), "tab");
+  GActionGroup *action_group_toolbar = ephy_window_get_action_group (self->window, "toolbar");
+  GActionGroup *action_group_win = ephy_window_get_action_group (self->window, "win");
+  GActionGroup *action_group_tab = ephy_window_get_action_group (self->window, "tab");
   GAction *action;
 
   switch (self->sequence_pos) {
@@ -259,7 +259,9 @@ ephy_mouse_gesture_controller_dispose (GObject *object)
 {
   EphyMouseGestureController *self = EPHY_MOUSE_GESTURE_CONTROLLER (object);
 
-  g_clear_object (&self->controller);
+  gtk_widget_remove_controller (GTK_WIDGET (self->window), self->controller);
+  self->controller = NULL;
+
   ephy_mouse_gesture_controller_unset_web_view (self);
 
   G_OBJECT_CLASS (ephy_mouse_gesture_controller_parent_class)->dispose (object);
@@ -272,8 +274,9 @@ ephy_mouse_gesture_controller_constructed (GObject *object)
 
   ephy_mouse_gesture_controller_reset (self);
 
-  self->controller = gtk_event_controller_motion_new (GTK_WIDGET (self->window));
+  self->controller = gtk_event_controller_motion_new ();
   g_signal_connect (self->controller, "motion", G_CALLBACK (ephy_mouse_gesture_controller_motion_cb), self);
+  gtk_widget_add_controller (GTK_WIDGET (self->window), self->controller);
 }
 
 static void
diff --git a/src/ephy-page-row.c b/src/ephy-page-row.c
index 932e8f37e..eb99c05b0 100644
--- a/src/ephy-page-row.c
+++ b/src/ephy-page-row.c
@@ -37,7 +37,7 @@ struct _EphyPageRow {
   GtkLabel *title;
   GtkButton *close_button;
 
-  HdyTabPage *page;
+  AdwTabPage *page;
   EphyTabView *tab_view;
 };
 
@@ -47,7 +47,7 @@ static void
 update_spinner (EphyPageRow *self)
 {
   if (gtk_widget_get_mapped (GTK_WIDGET (self)) &&
-      hdy_tab_page_get_loading (self->page))
+      adw_tab_page_get_loading (self->page))
     gtk_spinner_start (self->spinner);
   else
     gtk_spinner_stop (self->spinner);
@@ -56,23 +56,19 @@ update_spinner (EphyPageRow *self)
 static void
 close_clicked_cb (EphyPageRow *self)
 {
-  hdy_tab_view_close_page (ephy_tab_view_get_tab_view (self->tab_view), self->page);
+  adw_tab_view_close_page (ephy_tab_view_get_tab_view (self->tab_view), self->page);
 }
 
-static gboolean
-button_release_event (GtkWidget   *widget,
-                      GdkEvent    *event,
-                      EphyPageRow *self)
+static void
+released_cb (GtkGesture  *gesture,
+             int          n_press,
+             double       x,
+             double       y,
+             EphyPageRow *self)
 {
-  GdkEventButton *button_event = (GdkEventButton *)event;
-
-  if (button_event->button == GDK_BUTTON_MIDDLE) {
-    hdy_tab_view_close_page (ephy_tab_view_get_tab_view (self->tab_view), self->page);
-
-    return GDK_EVENT_STOP;
-  }
+  gtk_gesture_set_state (gesture, GTK_EVENT_SEQUENCE_CLAIMED);
 
-  return GDK_EVENT_PROPAGATE;
+  adw_tab_view_close_page (ephy_tab_view_get_tab_view (self->tab_view), self->page);
 }
 
 static void
@@ -90,7 +86,7 @@ ephy_page_row_class_init (EphyPageRowClass *klass)
   gtk_widget_class_bind_template_child (widget_class, EphyPageRow, close_button);
   gtk_widget_class_bind_template_callback (widget_class, update_spinner);
   gtk_widget_class_bind_template_callback (widget_class, close_clicked_cb);
-  gtk_widget_class_bind_template_callback (widget_class, button_release_event);
+  gtk_widget_class_bind_template_callback (widget_class, released_cb);
 }
 
 static void
@@ -116,14 +112,14 @@ loading_to_visible_child (GBinding     *binding,
 static void
 update_icon_cb (EphyPageRow *self)
 {
-  EphyEmbed *embed = EPHY_EMBED (hdy_tab_page_get_child (self->page));
+  EphyEmbed *embed = EPHY_EMBED (adw_tab_page_get_child (self->page));
   EphyWebView *view = ephy_embed_get_web_view (embed);
   GIcon *icon = G_ICON (ephy_web_view_get_icon (view));
   const char *uri, *favicon_name;
-  HdyTabView *tab_view;
+  AdwTabView *tab_view;
 
   if (icon) {
-    gtk_image_set_from_gicon (self->icon, icon, GTK_ICON_SIZE_MENU);
+    gtk_image_set_from_gicon (self->icon, icon);
 
     return;
   }
@@ -134,25 +130,25 @@ update_icon_cb (EphyPageRow *self)
   if (favicon_name) {
     g_autoptr (GIcon) fallback_icon = g_themed_icon_new (favicon_name);
 
-    gtk_image_set_from_gicon (self->icon, fallback_icon, GTK_ICON_SIZE_MENU);
+    gtk_image_set_from_gicon (self->icon, fallback_icon);
 
     return;
   }
 
   tab_view = ephy_tab_view_get_tab_view (self->tab_view);
 
-  gtk_image_set_from_gicon (self->icon, hdy_tab_view_get_default_icon (tab_view), GTK_ICON_SIZE_MENU);
+  gtk_image_set_from_gicon (self->icon, adw_tab_view_get_default_icon (tab_view));
 }
 
 EphyPageRow *
 ephy_page_row_new (EphyTabView *tab_view,
-                   HdyTabPage  *page)
+                   AdwTabPage  *page)
 {
   EphyPageRow *self;
-  GtkWidget *embed = hdy_tab_page_get_child (page);
+  GtkWidget *embed = adw_tab_page_get_child (page);
   EphyWebView *view;
 
-  g_assert (HDY_IS_TAB_PAGE (page));
+  g_assert (ADW_IS_TAB_PAGE (page));
   g_assert (EPHY_IS_EMBED (embed));
 
   view = ephy_embed_get_web_view (EPHY_EMBED (embed));
@@ -214,7 +210,7 @@ ephy_page_row_set_adaptive_mode (EphyPageRow      *self,
   }
 }
 
-HdyTabPage *
+AdwTabPage *
 ephy_page_row_get_page (EphyPageRow *self)
 {
   g_assert (EPHY_IS_PAGE_ROW (self));
diff --git a/src/ephy-page-row.h b/src/ephy-page-row.h
index bff823af3..e74957220 100644
--- a/src/ephy-page-row.h
+++ b/src/ephy-page-row.h
@@ -21,7 +21,7 @@
 
 #pragma once
 
-#include <handy.h>
+#include <adwaita.h>
 #include "ephy-adaptive-mode.h"
 #include "ephy-tab-view.h"
 
@@ -32,11 +32,11 @@ G_BEGIN_DECLS
 G_DECLARE_FINAL_TYPE (EphyPageRow, ephy_page_row, EPHY, PAGE_ROW, GtkListBoxRow)
 
 EphyPageRow *ephy_page_row_new (EphyTabView *view,
-                                HdyTabPage  *page);
+                                AdwTabPage  *page);
 
 void ephy_page_row_set_adaptive_mode (EphyPageRow      *self,
                                       EphyAdaptiveMode  adaptive_mode);
 
-HdyTabPage *ephy_page_row_get_page (EphyPageRow *self);
+AdwTabPage *ephy_page_row_get_page (EphyPageRow *self);
 
 G_END_DECLS
diff --git a/src/ephy-pages-button.c b/src/ephy-pages-button.c
index 757a7f79e..4a4b683c6 100644
--- a/src/ephy-pages-button.c
+++ b/src/ephy-pages-button.c
@@ -92,7 +92,7 @@ update_icon (EphyPagesButton *self)
 
   gtk_widget_set_visible (GTK_WIDGET (self->pages_label), !is_overflow);
   gtk_label_set_text (self->pages_label, label_text);
-  gtk_image_set_from_icon_name (self->pages_icon, icon_name, GTK_ICON_SIZE_BUTTON);
+  gtk_image_set_from_icon_name (self->pages_icon, icon_name);
 }
 
 EphyPagesButton *
diff --git a/src/ephy-pages-popover.c b/src/ephy-pages-popover.c
index 04c190e40..f6c028e11 100644
--- a/src/ephy-pages-popover.c
+++ b/src/ephy-pages-popover.c
@@ -23,10 +23,6 @@
 
 #include "ephy-pages-popover.h"
 
-#ifdef GDK_WINDOWING_X11
-#include <gdk/gdkx.h>
-#endif
-
 #include "ephy-page-row.h"
 #include "ephy-window.h"
 
@@ -63,7 +59,7 @@ row_activated_cb (EphyPagesPopover *self,
 {
   EphyWindow *window;
   GApplication *application;
-  HdyTabPage *page;
+  AdwTabPage *page;
 
   g_assert (EPHY_IS_PAGES_POPOVER (self));
   g_assert (EPHY_IS_PAGE_ROW (row));
@@ -72,31 +68,29 @@ row_activated_cb (EphyPagesPopover *self,
   window = EPHY_WINDOW (gtk_application_get_active_window (GTK_APPLICATION (application)));
   page = ephy_page_row_get_page (EPHY_PAGE_ROW (row));
 
-  hdy_tab_view_set_selected_page (ephy_tab_view_get_tab_view (self->tab_view), page);
+  adw_tab_view_set_selected_page (ephy_tab_view_get_tab_view (self->tab_view), page);
   ephy_window_close_pages_view (window);
 
   gtk_popover_popdown (GTK_POPOVER (self));
 }
 
 static GtkWidget *
-create_row (HdyTabPage       *page,
+create_row (AdwTabPage       *page,
             EphyPagesPopover *self)
 {
   EphyPageRow *row = ephy_page_row_new (self->tab_view, page);
 
   ephy_page_row_set_adaptive_mode (row, EPHY_ADAPTIVE_MODE_NORMAL);
 
-  gtk_widget_show (GTK_WIDGET (row));
-
   return GTK_WIDGET (row);
 }
 
 static void
-selected_page_changed_cb (HdyTabView       *tab_view,
+selected_page_changed_cb (AdwTabView       *tab_view,
                           GParamSpec       *pspec,
                           EphyPagesPopover *self)
 {
-  HdyTabPage *page = hdy_tab_view_get_selected_page (tab_view);
+  AdwTabPage *page = adw_tab_view_get_selected_page (tab_view);
   gint position;
   GtkListBoxRow *row;
 
@@ -106,7 +100,7 @@ selected_page_changed_cb (HdyTabView       *tab_view,
     return;
   }
 
-  position = hdy_tab_view_get_page_position (tab_view, page);
+  position = adw_tab_view_get_page_position (tab_view, page);
   row = gtk_list_box_get_row_at_index (self->list_box, position);
   gtk_list_box_select_row (self->list_box, row);
 }
@@ -121,30 +115,6 @@ ephy_pages_popover_dispose (GObject *object)
   G_OBJECT_CLASS (ephy_pages_popover_parent_class)->dispose (object);
 }
 
-#ifdef GDK_WINDOWING_X11
-static void
-ephy_pages_popover_get_preferred_height (GtkWidget *widget,
-                                         gint      *minimum_height,
-                                         gint      *natural_height)
-{
-  EphyPagesPopover *self = EPHY_PAGES_POPOVER (widget);
-  int height;
-
-  GTK_WIDGET_CLASS (ephy_pages_popover_parent_class)->get_preferred_height (widget,
-                                                                            minimum_height,
-                                                                            natural_height);
-  /* Ensure that popover won't leave current window */
-  height = gtk_widget_get_allocated_height (GTK_WIDGET (self->tab_view));
-  gtk_scrolled_window_set_max_content_height (self->scrolled_window, height);
-}
-
-static GtkSizeRequestMode
-ephy_pages_popover_get_request_mode (GtkWidget *widget)
-{
-  return GTK_SIZE_REQUEST_WIDTH_FOR_HEIGHT;
-}
-#endif
-
 static void
 ephy_pages_popover_class_init (EphyPagesPopoverClass *klass)
 {
@@ -153,13 +123,6 @@ ephy_pages_popover_class_init (EphyPagesPopoverClass *klass)
 
   object_class->dispose = ephy_pages_popover_dispose;
 
-#ifdef GDK_WINDOWING_X11
-  if (GDK_IS_X11_DISPLAY (gdk_display_get_default ())) {
-    widget_class->get_request_mode = ephy_pages_popover_get_request_mode;
-    widget_class->get_preferred_height = ephy_pages_popover_get_preferred_height;
-  }
-#endif
-
   gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/epiphany/gtk/pages-popover.ui");
   gtk_widget_class_bind_template_child (widget_class, EphyPagesPopover, list_box);
   gtk_widget_class_bind_template_child (widget_class, EphyPagesPopover, scrolled_window);
@@ -173,13 +136,9 @@ ephy_pages_popover_init (EphyPagesPopover *self)
 }
 
 EphyPagesPopover *
-ephy_pages_popover_new (GtkWidget *relative_to)
+ephy_pages_popover_new (void)
 {
-  g_assert (!relative_to || GTK_IS_WIDGET (relative_to));
-
-  return g_object_new (EPHY_TYPE_PAGES_POPOVER,
-                       "relative-to", relative_to,
-                       NULL);
+  return g_object_new (EPHY_TYPE_PAGES_POPOVER, NULL);
 }
 
 EphyTabView *
@@ -205,7 +164,7 @@ ephy_pages_popover_set_tab_view (EphyPagesPopover *self,
   g_object_weak_ref (G_OBJECT (tab_view), (GWeakNotify)drop_tab_view, self);
   self->tab_view = tab_view;
 
-  self->model = hdy_tab_view_get_pages (ephy_tab_view_get_tab_view (tab_view));
+  self->model = G_LIST_MODEL (adw_tab_view_get_pages (ephy_tab_view_get_tab_view (tab_view)));
 
   gtk_list_box_bind_model (self->list_box,
                            self->model,
diff --git a/src/ephy-pages-popover.h b/src/ephy-pages-popover.h
index 1c148d403..d0a9c5eba 100644
--- a/src/ephy-pages-popover.h
+++ b/src/ephy-pages-popover.h
@@ -31,7 +31,7 @@ G_BEGIN_DECLS
 
 G_DECLARE_FINAL_TYPE (EphyPagesPopover, ephy_pages_popover, EPHY, PAGES_POPOVER, GtkPopover)
 
-EphyPagesPopover *ephy_pages_popover_new (GtkWidget *relative_to);
+EphyPagesPopover *ephy_pages_popover_new (void);
 
 EphyTabView *ephy_pages_popover_get_tab_view (EphyPagesPopover *self);
 void         ephy_pages_popover_set_tab_view (EphyPagesPopover *self,
diff --git a/src/ephy-pages-view.c b/src/ephy-pages-view.c
index 6b0f57184..4eb11ab56 100644
--- a/src/ephy-pages-view.c
+++ b/src/ephy-pages-view.c
@@ -44,7 +44,7 @@ row_activated_cb (EphyPagesView *self,
 {
   EphyWindow *window;
   GApplication *application;
-  HdyTabPage *page;
+  AdwTabPage *page;
 
   g_assert (EPHY_IS_PAGES_VIEW (self));
   g_assert (EPHY_IS_PAGE_ROW (row));
@@ -53,29 +53,27 @@ row_activated_cb (EphyPagesView *self,
   window = EPHY_WINDOW (gtk_application_get_active_window (GTK_APPLICATION (application)));
   page = ephy_page_row_get_page (EPHY_PAGE_ROW (row));
 
-  hdy_tab_view_set_selected_page (ephy_tab_view_get_tab_view (self->tab_view), page);
+  adw_tab_view_set_selected_page (ephy_tab_view_get_tab_view (self->tab_view), page);
   ephy_window_close_pages_view (window);
 }
 
 static GtkWidget *
-create_row (HdyTabPage    *page,
+create_row (AdwTabPage    *page,
             EphyPagesView *self)
 {
   EphyPageRow *row = ephy_page_row_new (self->tab_view, page);
 
   ephy_page_row_set_adaptive_mode (row, EPHY_ADAPTIVE_MODE_NARROW);
 
-  gtk_widget_show (GTK_WIDGET (row));
-
   return GTK_WIDGET (row);
 }
 
 static void
-selected_page_changed_cb (HdyTabView    *tab_view,
+selected_page_changed_cb (AdwTabView    *tab_view,
                           GParamSpec    *pspec,
                           EphyPagesView *self)
 {
-  HdyTabPage *page = hdy_tab_view_get_selected_page (tab_view);
+  AdwTabPage *page = adw_tab_view_get_selected_page (tab_view);
   gint position;
   GtkListBoxRow *row;
 
@@ -85,7 +83,7 @@ selected_page_changed_cb (HdyTabView    *tab_view,
     return;
   }
 
-  position = hdy_tab_view_get_page_position (tab_view, page);
+  position = adw_tab_view_get_page_position (tab_view, page);
   row = gtk_list_box_get_row_at_index (self->list_box, position);
   gtk_list_box_select_row (self->list_box, row);
 }
@@ -147,7 +145,7 @@ ephy_pages_view_set_tab_view (EphyPagesView *self,
   g_object_add_weak_pointer (G_OBJECT (tab_view), (gpointer *)&self->tab_view);
   self->tab_view = tab_view;
 
-  self->model = hdy_tab_view_get_pages (ephy_tab_view_get_tab_view (tab_view));
+  self->model = G_LIST_MODEL (adw_tab_view_get_pages (ephy_tab_view_get_tab_view (tab_view)));
 
   gtk_list_box_bind_model (self->list_box,
                            self->model,
diff --git a/src/ephy-session.c b/src/ephy-session.c
index af2df8f3c..fa8016955 100644
--- a/src/ephy-session.c
+++ b/src/ephy-session.c
@@ -255,7 +255,7 @@ ephy_session_undo_close_tab (EphySession *session)
       flags |= EPHY_NEW_TAB_FIRST;
     }
 
-    window = EPHY_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (tab_view)));
+    window = EPHY_WINDOW (gtk_widget_get_root (GTK_WIDGET (tab_view)));
     new_tab = ephy_shell_new_tab (ephy_shell_get_default (),
                                   window, embed,
                                   flags);
@@ -278,7 +278,7 @@ ephy_session_undo_close_tab (EphySession *session)
   }
 
   gtk_widget_grab_focus (GTK_WIDGET (new_tab));
-  gtk_window_present_with_time (GTK_WINDOW (window), gtk_get_current_event_time ());
+  gtk_window_present (GTK_WINDOW (window));
 
   closed_tab_free (tab);
 
@@ -325,24 +325,24 @@ ephy_session_get_can_undo_tab_closed (EphySession *session)
 }
 
 static void
-tab_view_page_attached_cb (HdyTabView  *tab_view,
-                           HdyTabPage  *page,
+tab_view_page_attached_cb (AdwTabView  *tab_view,
+                           AdwTabPage  *page,
                            guint        position,
                            EphySession *session)
 {
-  EphyEmbed *embed = EPHY_EMBED (hdy_tab_page_get_child (page));
+  EphyEmbed *embed = EPHY_EMBED (adw_tab_page_get_child (page));
 
   g_signal_connect (ephy_embed_get_web_view (embed), "load-changed",
                     G_CALLBACK (load_changed_cb), session);
 }
 
 static void
-tab_view_page_detached_cb (HdyTabView  *tab_view,
-                           HdyTabPage  *page,
+tab_view_page_detached_cb (AdwTabView  *tab_view,
+                           AdwTabPage  *page,
                            gint         position,
                            EphySession *session)
 {
-  EphyEmbed *embed = EPHY_EMBED (hdy_tab_page_get_child (page));
+  EphyEmbed *embed = EPHY_EMBED (adw_tab_page_get_child (page));
   EphyTabView *ephy_tab_view = EPHY_TAB_VIEW (g_object_get_data (G_OBJECT (tab_view), "ephy-tab-view"));
 
   ephy_session_save (session);
@@ -355,8 +355,8 @@ tab_view_page_detached_cb (HdyTabView  *tab_view,
 }
 
 static void
-tab_view_page_reordered_cb (HdyTabView  *tab_view,
-                            HdyTabPage  *page,
+tab_view_page_reordered_cb (AdwTabView  *tab_view,
+                            AdwTabPage  *page,
                             guint        position,
                             EphySession *session)
 {
@@ -364,7 +364,7 @@ tab_view_page_reordered_cb (HdyTabView  *tab_view,
 }
 
 static void
-tab_view_notify_selected_page_cb (HdyTabView  *tab_view,
+tab_view_notify_selected_page_cb (AdwTabView  *tab_view,
                                   GParamSpec  *pspec,
                                   EphySession *session)
 {
@@ -391,7 +391,7 @@ window_added_cb (GtkApplication *application,
                  EphySession    *session)
 {
   EphyWindow *ephy_window;
-  HdyTabView *tab_view;
+  AdwTabView *tab_view;
 
   ephy_session_save (session);
 
@@ -1136,6 +1136,14 @@ session_parser_context_free (SessionParserContext *context)
   g_free (context);
 }
 
+static void
+window_destroyed (GtkWidget  *widget,
+                  GtkWidget **widget_pointer)
+{
+  if (widget_pointer)
+    *widget_pointer = NULL;
+}
+
 static void
 session_parse_window (SessionParserContext  *context,
                       const gchar          **names,
@@ -1152,7 +1160,7 @@ session_parse_window (SessionParserContext  *context,
   }
 
   context->window = ephy_window_new ();
-  context->destroy_id = g_signal_connect (context->window, "destroy", G_CALLBACK (gtk_widget_destroyed), 
&context->window);
+  context->destroy_id = g_signal_connect (context->window, "destroy", G_CALLBACK (window_destroyed), 
&context->window);
 
   for (i = 0; names[i]; i++) {
     gulong int_value;
@@ -1198,7 +1206,7 @@ session_parse_embed (SessionParserContext  *context,
                      const gchar          **names,
                      const gchar          **values)
 {
-  HdyTabView *tab_view;
+  AdwTabView *tab_view;
   const char *url = NULL;
   const char *title = NULL;
   const char *history = NULL;
@@ -1265,8 +1273,8 @@ session_parse_embed (SessionParserContext  *context,
                                      context->window, NULL, flags,
                                      0);
 
-    hdy_tab_view_set_page_pinned (tab_view,
-                                  hdy_tab_view_get_page (tab_view, GTK_WIDGET (embed)),
+    adw_tab_view_set_page_pinned (tab_view,
+                                  adw_tab_view_get_page (tab_view, GTK_WIDGET (embed)),
                                   is_pin);
 
     web_view = ephy_embed_get_web_view (embed);
@@ -1796,7 +1804,7 @@ ephy_session_clear (EphySession *session)
   shell = ephy_shell_get_default ();
   windows = g_list_copy (gtk_application_get_windows (GTK_APPLICATION (shell)));
   for (p = windows; p; p = p->next)
-    gtk_widget_destroy (GTK_WIDGET (p->data));
+    gtk_window_destroy (GTK_WINDOW (p->data));
   g_list_free (windows);
   g_queue_foreach (session->closed_tabs,
                    (GFunc)closed_tab_free, NULL);
diff --git a/src/ephy-shell.c b/src/ephy-shell.c
index 0ace095aa..8f0357ddd 100644
--- a/src/ephy-shell.c
+++ b/src/ephy-shell.c
@@ -50,7 +50,6 @@
 
 #include <glib/gi18n.h>
 #include <gtk/gtk.h>
-#include <handy.h>
 
 struct _EphyShell {
   EphyEmbedShell parent_instance;
@@ -339,7 +338,7 @@ launch_app (GSimpleAction *action,
    * is disabled when running under flatpak.
    */
   ephy_file_launch_desktop_file (desktop_file,
-                                 gtk_get_current_event_time (),
+                                 g_get_monotonic_time (),
                                  EPHY_FILE_HELPERS_I_UNDERSTAND_I_MUST_NOT_USE_THIS_FUNCTION_UNDER_FLATPAK);
 }
 
@@ -493,11 +492,6 @@ ephy_shell_startup (GApplication *application)
 
   G_APPLICATION_CLASS (ephy_shell_parent_class)->startup (application);
 
-  hdy_init ();
-
-  hdy_style_manager_set_color_scheme (hdy_style_manager_get_default (),
-                                      HDY_COLOR_SCHEME_PREFER_LIGHT);
-
   /* If we are under Pantheon set the icon-theme and cursor-theme accordingly. */
   if (is_desktop_pantheon ()) {
     GtkSettings *settings = gtk_settings_get_default ();
@@ -819,8 +813,8 @@ ephy_shell_constructed (GObject *object)
   }
 
   if (ephy_embed_shell_get_mode (EPHY_EMBED_SHELL (object)) == EPHY_EMBED_SHELL_MODE_APPLICATION) {
-    dzl_application_add_resources (DZL_APPLICATION (object),
-                                   "resource:///org/gnome/Epiphany");
+//    dzl_application_add_resources (DZL_APPLICATION (object),
+//                                   "resource:///org/gnome/Epiphany");
   }
 
   /* FIXME: not sure if this is the best place to put this stuff. */
@@ -876,7 +870,7 @@ ephy_shell_dispose (GObject *object)
 
   g_clear_object (&shell->session);
   g_clear_object (&shell->lockdown);
-  g_clear_pointer (&shell->history_dialog, gtk_widget_destroy);
+  g_clear_pointer ((GtkWindow **) &shell->history_dialog, gtk_window_destroy);
   g_clear_object (&shell->prefs_dialog);
   g_clear_object (&shell->network_monitor);
   g_clear_object (&shell->sync_service);
@@ -1169,7 +1163,6 @@ ephy_shell_get_bookmarks_manager (EphyShell *shell)
 
   return shell->bookmarks_manager;
 }
-
 /**
  * ephy_shell_get_history_manager:
  * @shell: the #EphyShell
@@ -1220,6 +1213,14 @@ ephy_shell_get_net_monitor (EphyShell *shell)
   return shell->network_monitor;
 }
 
+static void
+window_destroyed (GtkWidget  *widget,
+                  GtkWidget **widget_pointer)
+{
+  if (widget_pointer)
+    *widget_pointer = NULL;
+}
+
 /**
  * ephy_shell_get_history_dialog:
  *
@@ -1238,7 +1239,7 @@ ephy_shell_get_history_dialog (EphyShell *shell)
     shell->history_dialog = ephy_history_dialog_new (service);
     g_signal_connect (shell->history_dialog,
                       "destroy",
-                      G_CALLBACK (gtk_widget_destroyed),
+                      G_CALLBACK (window_destroyed),
                       &shell->history_dialog);
   }
 
@@ -1257,7 +1258,7 @@ ephy_shell_get_firefox_sync_dialog (EphyShell *shell)
     shell->firefox_sync_dialog = ephy_firefox_sync_dialog_new ();
     g_signal_connect (shell->firefox_sync_dialog,
                       "destroy",
-                      G_CALLBACK (gtk_widget_destroyed),
+                      G_CALLBACK (window_destroyed),
                       &shell->firefox_sync_dialog);
   }
 
@@ -1277,7 +1278,7 @@ ephy_shell_get_prefs_dialog (EphyShell *shell)
 
     g_signal_connect (shell->prefs_dialog,
                       "destroy",
-                      G_CALLBACK (gtk_widget_destroyed),
+                      G_CALLBACK (window_destroyed),
                       &shell->prefs_dialog);
   }
 
@@ -1359,7 +1360,7 @@ ephy_shell_close_all_windows (EphyShell *shell)
     windows = windows->next;
 
     if (ephy_window_close (window))
-      gtk_widget_destroy (GTK_WIDGET (window));
+      gtk_window_destroy (GTK_WINDOW (window));
     else
       retval = FALSE;
   }
diff --git a/src/ephy-suggestion-model.c b/src/ephy-suggestion-model.c
index 101dcb7d4..eb5a4d238 100644
--- a/src/ephy-suggestion-model.c
+++ b/src/ephy-suggestion-model.c
@@ -27,7 +27,7 @@
 #include "ephy-user-agent.h"
 #include "ephy-window.h"
 
-#include <dazzle.h>
+#include "dzl-fuzzy-mutable-index.h"
 #include <glib/gi18n.h>
 
 #define MAX_URL_ENTRIES             25
diff --git a/src/ephy-tab-view.c b/src/ephy-tab-view.c
index e2c785892..65f39c18d 100644
--- a/src/ephy-tab-view.c
+++ b/src/ephy-tab-view.c
@@ -22,7 +22,7 @@
 #include "ephy-tab-view.h"
 
 #include "ephy-desktop-utils.h"
-#include "ephy-dnd.h"
+//#include "ephy-dnd.h"
 #include "ephy-embed-utils.h"
 #include "ephy-link.h"
 #include "ephy-settings.h"
@@ -31,14 +31,14 @@
 #define MAX_NUMBER_OF_URLS 20
 
 struct _EphyTabView {
-  GtkBin parent_instance;
+  AdwBin parent_instance;
 
-  HdyTabView *tab_view;
-  HdyTabBar *tab_bar;
-  HdyTabPage *current_page;
+  AdwTabView *tab_view;
+  AdwTabBar *tab_bar;
+  AdwTabPage *current_page;
 };
 
-G_DEFINE_TYPE (EphyTabView, ephy_tab_view, GTK_TYPE_BIN)
+G_DEFINE_TYPE (EphyTabView, ephy_tab_view, ADW_TYPE_BIN)
 
 enum {
   PROP_0,
@@ -58,19 +58,19 @@ notify_n_pages_cb (EphyTabView *self)
 static void
 notify_selected_page_cb (EphyTabView *self)
 {
-  HdyTabPage *page = hdy_tab_view_get_selected_page (self->tab_view);
+  AdwTabPage *page = adw_tab_view_get_selected_page (self->tab_view);
 
   if (page)
-    hdy_tab_page_set_needs_attention (page, FALSE);
+    adw_tab_page_set_needs_attention (page, FALSE);
 
   g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_SELECTED_INDEX]);
 }
 
 static void
 indicator_activated_cb (EphyTabView *self,
-                        HdyTabPage  *page)
+                        AdwTabPage  *page)
 {
-  EphyEmbed *embed = EPHY_EMBED (hdy_tab_page_get_child (page));
+  EphyEmbed *embed = EPHY_EMBED (adw_tab_page_get_child (page));
   EphyWebView *view = ephy_embed_get_web_view (embed);
   gboolean muted = webkit_web_view_get_is_muted (WEBKIT_WEB_VIEW (view));
 
@@ -79,18 +79,18 @@ indicator_activated_cb (EphyTabView *self,
 
 static void
 setup_menu_cb (EphyTabView *self,
-               HdyTabPage  *page)
+               AdwTabPage  *page)
 {
   self->current_page = page;
 }
 
-static HdyTabPage *
+static AdwTabPage *
 get_current_page (EphyTabView *self)
 {
   if (self->current_page)
     return self->current_page;
 
-  return hdy_tab_view_get_selected_page (self->tab_view);
+  return adw_tab_view_get_selected_page (self->tab_view);
 }
 
 static void
@@ -150,12 +150,11 @@ ephy_tab_view_class_init (EphyTabViewClass *klass)
 static void
 ephy_tab_view_init (EphyTabView *self)
 {
-  self->tab_view = HDY_TAB_VIEW (hdy_tab_view_new ());
-  gtk_widget_show (GTK_WIDGET (self->tab_view));
+  self->tab_view = ADW_TAB_VIEW (adw_tab_view_new ());
 
   g_object_set_data (G_OBJECT (self->tab_view), "ephy-tab-view", self);
 
-  gtk_container_add (GTK_CONTAINER (self), GTK_WIDGET (self->tab_view));
+  adw_bin_set_child (ADW_BIN (self), GTK_WIDGET (self->tab_view));
 
   g_signal_connect_object (self->tab_view,
                            "notify::n-pages",
@@ -191,52 +190,52 @@ ephy_tab_view_new (void)
 void
 ephy_tab_view_next (EphyTabView *self)
 {
-  hdy_tab_view_select_next_page (self->tab_view);
+  adw_tab_view_select_next_page (self->tab_view);
 }
 
 void
 ephy_tab_view_pin (EphyTabView *self)
 {
-  hdy_tab_view_set_page_pinned (self->tab_view, get_current_page (self), TRUE);
+  adw_tab_view_set_page_pinned (self->tab_view, get_current_page (self), TRUE);
 }
 
 void
 ephy_tab_view_unpin (EphyTabView *self)
 {
-  hdy_tab_view_set_page_pinned (self->tab_view, get_current_page (self), FALSE);
+  adw_tab_view_set_page_pinned (self->tab_view, get_current_page (self), FALSE);
 }
 
 void
 ephy_tab_view_close (EphyTabView *self,
                      GtkWidget   *widget)
 {
-  HdyTabPage *page = hdy_tab_view_get_page (self->tab_view, widget);
+  AdwTabPage *page = adw_tab_view_get_page (self->tab_view, widget);
 
-  hdy_tab_view_close_page (self->tab_view, page);
+  adw_tab_view_close_page (self->tab_view, page);
 }
 
 void
 ephy_tab_view_close_selected (EphyTabView *self)
 {
-  hdy_tab_view_close_page (self->tab_view, get_current_page (self));
+  adw_tab_view_close_page (self->tab_view, get_current_page (self));
 }
 
 void
 ephy_tab_view_close_left (EphyTabView *self)
 {
-  hdy_tab_view_close_pages_before (self->tab_view, get_current_page (self));
+  adw_tab_view_close_pages_before (self->tab_view, get_current_page (self));
 }
 
 void
 ephy_tab_view_close_right (EphyTabView *self)
 {
-  hdy_tab_view_close_pages_after (self->tab_view, get_current_page (self));
+  adw_tab_view_close_pages_after (self->tab_view, get_current_page (self));
 }
 
 void
 ephy_tab_view_close_other (EphyTabView *self)
 {
-  hdy_tab_view_close_other_pages (self->tab_view, get_current_page (self));
+  adw_tab_view_close_other_pages (self->tab_view, get_current_page (self));
 }
 
 void
@@ -246,67 +245,67 @@ ephy_tab_view_foreach (EphyTabView         *self,
 {
   int i, n;
 
-  n = hdy_tab_view_get_n_pages (self->tab_view);
+  n = adw_tab_view_get_n_pages (self->tab_view);
 
   for (i = 0; i < n; i++) {
-    HdyTabPage *page = hdy_tab_view_get_nth_page (self->tab_view, i);
+    AdwTabPage *page = adw_tab_view_get_nth_page (self->tab_view, i);
 
-    callback (hdy_tab_page_get_child (page), user_data);
+    callback (adw_tab_page_get_child (page), user_data);
   }
 }
 
 int
 ephy_tab_view_get_n_pages (EphyTabView *self)
 {
-  return hdy_tab_view_get_n_pages (self->tab_view);
+  return adw_tab_view_get_n_pages (self->tab_view);
 }
 
 int
 ephy_tab_view_get_selected_index (EphyTabView *self)
 {
-  HdyTabPage *page = hdy_tab_view_get_selected_page (self->tab_view);
+  AdwTabPage *page = adw_tab_view_get_selected_page (self->tab_view);
 
   if (!page)
     return -1;
 
-  return hdy_tab_view_get_page_position (self->tab_view, page);
+  return adw_tab_view_get_page_position (self->tab_view, page);
 }
 
 int
 ephy_tab_view_get_page_index (EphyTabView *self,
                               GtkWidget   *widget)
 {
-  HdyTabPage *page = hdy_tab_view_get_page (self->tab_view, widget);
+  AdwTabPage *page = adw_tab_view_get_page (self->tab_view, widget);
 
-  return hdy_tab_view_get_page_position (self->tab_view, page);
+  return adw_tab_view_get_page_position (self->tab_view, page);
 }
 
 GtkWidget *
 ephy_tab_view_get_nth_page (EphyTabView *self,
                             int          index)
 {
-  HdyTabPage *page = hdy_tab_view_get_nth_page (self->tab_view, index);
+  AdwTabPage *page = adw_tab_view_get_nth_page (self->tab_view, index);
 
-  return hdy_tab_page_get_child (page);
+  return adw_tab_page_get_child (page);
 }
 
 void
 ephy_tab_view_select_nth_page (EphyTabView *self,
                                int          index)
 {
-  HdyTabPage *page = hdy_tab_view_get_nth_page (self->tab_view, index);
+  AdwTabPage *page = adw_tab_view_get_nth_page (self->tab_view, index);
 
-  hdy_tab_view_set_selected_page (self->tab_view, page);
+  adw_tab_view_set_selected_page (self->tab_view, page);
 }
 
 gboolean
 ephy_tab_view_select_page (EphyTabView *self,
                            GtkWidget   *widget)
 {
-  HdyTabPage *page = hdy_tab_view_get_page (self->tab_view, widget);
+  AdwTabPage *page = adw_tab_view_get_page (self->tab_view, widget);
 
   if (page)
-    hdy_tab_view_set_selected_page (self->tab_view, page);
+    adw_tab_view_set_selected_page (self->tab_view, page);
 
   return !!page;
 }
@@ -314,15 +313,15 @@ ephy_tab_view_select_page (EphyTabView *self,
 GtkWidget *
 ephy_tab_view_get_selected_page (EphyTabView *self)
 {
-  HdyTabPage *page = hdy_tab_view_get_selected_page (self->tab_view);
+  AdwTabPage *page = adw_tab_view_get_selected_page (self->tab_view);
 
   if (!page)
     return NULL;
 
-  return hdy_tab_page_get_child (page);
+  return adw_tab_page_get_child (page);
 }
 
-HdyTabView *
+AdwTabView *
 ephy_tab_view_get_tab_view (EphyTabView *self)
 {
   return self->tab_view;
@@ -334,11 +333,11 @@ ephy_tab_view_get_pages (EphyTabView *self)
   GList *list = NULL;
   int i, n;
 
-  n = hdy_tab_view_get_n_pages (self->tab_view);
+  n = adw_tab_view_get_n_pages (self->tab_view);
 
   for (i = 0; i < n; i++) {
-    HdyTabPage *page = hdy_tab_view_get_nth_page (self->tab_view, i);
-    GtkWidget *content = hdy_tab_page_get_child (page);
+    AdwTabPage *page = adw_tab_view_get_nth_page (self->tab_view, i);
+    GtkWidget *content = adw_tab_page_get_child (page);
 
     list = g_list_prepend (list, content);
   }
@@ -350,26 +349,26 @@ gboolean
 ephy_tab_view_get_is_pinned (EphyTabView *self,
                              GtkWidget   *widget)
 {
-  HdyTabPage *page = hdy_tab_view_get_page (self->tab_view, widget);
+  AdwTabPage *page = adw_tab_view_get_page (self->tab_view, widget);
 
-  return hdy_tab_page_get_pinned (page);
+  return adw_tab_page_get_pinned (page);
 }
 
 static void
-update_title_cb (HdyTabPage *page)
+update_title_cb (AdwTabPage *page)
 {
-  EphyEmbed *embed = EPHY_EMBED (hdy_tab_page_get_child (page));
+  EphyEmbed *embed = EPHY_EMBED (adw_tab_page_get_child (page));
   EphyWebView *view = ephy_embed_get_web_view (embed);
   const char *title = ephy_embed_get_title (embed);
   const char *address;
 
   if (!ephy_embed_has_load_pending (embed) &&
-      !hdy_tab_page_get_selected (page) &&
-      hdy_tab_page_get_pinned (page))
-    hdy_tab_page_set_needs_attention (page, TRUE);
+      !adw_tab_page_get_selected (page) &&
+      adw_tab_page_get_pinned (page))
+    adw_tab_page_set_needs_attention (page, TRUE);
 
   if (title && strlen (title)) {
-    hdy_tab_page_set_title (page, title);
+    adw_tab_page_set_title (page, title);
     return;
   }
 
@@ -377,20 +376,20 @@ update_title_cb (HdyTabPage *page)
 
   if (ephy_web_view_is_loading (view) &&
       !ephy_embed_utils_is_no_show_address (address))
-    hdy_tab_page_set_title (page, address);
+    adw_tab_page_set_title (page, address);
 }
 
 static void
-update_icon_cb (HdyTabPage *page)
+update_icon_cb (AdwTabPage *page)
 {
-  EphyEmbed *embed = EPHY_EMBED (hdy_tab_page_get_child (page));
+  EphyEmbed *embed = EPHY_EMBED (adw_tab_page_get_child (page));
   EphyWebView *view = ephy_embed_get_web_view (embed);
   GIcon *icon = G_ICON (ephy_web_view_get_icon (view));
   g_autoptr (GIcon) placeholder_icon = NULL;
   const char *uri, *favicon_name;
 
   if (icon) {
-    hdy_tab_page_set_icon (page, icon);
+    adw_tab_page_set_icon (page, icon);
     return;
   }
 
@@ -400,13 +399,13 @@ update_icon_cb (HdyTabPage *page)
   if (favicon_name)
     placeholder_icon = g_themed_icon_new (favicon_name);
 
-  hdy_tab_page_set_icon (page, placeholder_icon);
+  adw_tab_page_set_icon (page, placeholder_icon);
 }
 
 static void
-update_indicator_cb (HdyTabPage *page)
+update_indicator_cb (AdwTabPage *page)
 {
-  EphyEmbed *embed = EPHY_EMBED (hdy_tab_page_get_child (page));
+  EphyEmbed *embed = EPHY_EMBED (adw_tab_page_get_child (page));
   EphyWebView *view = ephy_embed_get_web_view (embed);
   g_autoptr (GIcon) icon = NULL;
 
@@ -417,7 +416,7 @@ update_indicator_cb (HdyTabPage *page)
       icon = G_ICON (g_themed_icon_new ("ephy-audio-playing-symbolic"));
   }
 
-  hdy_tab_page_set_indicator_icon (page, icon);
+  adw_tab_page_set_indicator_icon (page, icon);
 }
 
 int
@@ -427,26 +426,26 @@ ephy_tab_view_add_tab (EphyTabView *self,
                        int          position,
                        gboolean     jump_to)
 {
-  HdyTabPage *page;
+  AdwTabPage *page;
   EphyWebView *view;
 
   if (parent) {
-    HdyTabPage *parent_page;
+    AdwTabPage *parent_page;
 
-    parent_page = hdy_tab_view_get_page (self->tab_view, GTK_WIDGET (parent));
-    page = hdy_tab_view_add_page (self->tab_view, GTK_WIDGET (embed), parent_page);
+    parent_page = adw_tab_view_get_page (self->tab_view, GTK_WIDGET (parent));
+    page = adw_tab_view_add_page (self->tab_view, GTK_WIDGET (embed), parent_page);
   } else if (position < 0) {
-    page = hdy_tab_view_append (self->tab_view, GTK_WIDGET (embed));
+    page = adw_tab_view_append (self->tab_view, GTK_WIDGET (embed));
   } else {
-    page = hdy_tab_view_insert (self->tab_view, GTK_WIDGET (embed), position);
+    page = adw_tab_view_insert (self->tab_view, GTK_WIDGET (embed), position);
   }
 
   if (jump_to)
-    hdy_tab_view_set_selected_page (self->tab_view, page);
+    adw_tab_view_set_selected_page (self->tab_view, page);
 
   view = ephy_embed_get_web_view (embed);
 
-  hdy_tab_page_set_indicator_activatable (page, TRUE);
+  adw_tab_page_set_indicator_activatable (page, TRUE);
 
   g_object_bind_property (view, "is-loading", page, "loading", G_BINDING_SYNC_CREATE);
 
@@ -473,23 +472,23 @@ ephy_tab_view_add_tab (EphyTabView *self,
   update_icon_cb (page);
   update_indicator_cb (page);
 
-  return hdy_tab_view_get_page_position (self->tab_view, page);
+  return adw_tab_view_get_page_position (self->tab_view, page);
 }
 
 GtkWidget *
 ephy_tab_view_get_current_page (EphyTabView *self)
 {
-  HdyTabPage *page = get_current_page (self);
+  AdwTabPage *page = get_current_page (self);
 
   if (!page)
     return NULL;
 
-  return hdy_tab_page_get_child (page);
+  return adw_tab_page_get_child (page);
 }
-
+#if 0
 static void
 drag_data_received_cb (EphyTabView      *self,
-                       HdyTabPage       *page,
+                       AdwTabPage       *page,
                        GdkDragContext   *context,
                        GtkSelectionData *selection_data,
                        guint             info,
@@ -508,7 +507,7 @@ drag_data_received_cb (EphyTabView      *self,
   if (gtk_selection_data_get_length (selection_data) <= 0 || data)
     return;
 
-  embed = EPHY_EMBED (hdy_tab_page_get_child (page));
+  embed = EPHY_EMBED (adw_tab_page_get_child (page));
   target = gtk_selection_data_get_target (selection_data);
 
   window = gtk_widget_get_toplevel (GTK_WIDGET (self));
@@ -546,7 +545,7 @@ drag_data_received_cb (EphyTabView      *self,
     }
   }
 }
-
+#endif
 static void
 visibility_policy_changed_cb (EphyTabView *self)
 {
@@ -561,7 +560,7 @@ visibility_policy_changed_cb (EphyTabView *self)
     policy = g_settings_get_enum (EPHY_SETTINGS_UI,
                                   EPHY_PREFS_UI_TABS_BAR_VISIBILITY_POLICY);
 
-  hdy_tab_bar_set_autohide (self->tab_bar,
+  adw_tab_bar_set_autohide (self->tab_bar,
                             policy != EPHY_PREFS_UI_TABS_BAR_VISIBILITY_POLICY_ALWAYS);
   gtk_widget_set_visible (GTK_WIDGET (self->tab_bar),
                           mode != EPHY_EMBED_SHELL_MODE_APPLICATION &&
@@ -574,7 +573,7 @@ expand_changed_cb (EphyTabView *self)
   gboolean expand = g_settings_get_boolean (EPHY_SETTINGS_UI,
                                             EPHY_PREFS_UI_EXPAND_TABS_BAR);
 
-  hdy_tab_bar_set_expand_tabs (self->tab_bar, expand);
+  adw_tab_bar_set_expand_tabs (self->tab_bar, expand);
 }
 
 static gboolean
@@ -599,46 +598,45 @@ is_layout_reversed (void)
 static void
 notify_decoration_layout_cb (EphyTabView *self)
 {
-  hdy_tab_bar_set_inverted (self->tab_bar, is_layout_reversed ());
+  adw_tab_bar_set_inverted (self->tab_bar, is_layout_reversed ());
 }
 
 void
 ephy_tab_view_set_tab_bar (EphyTabView *self,
-                           HdyTabBar   *tab_bar)
+                           AdwTabBar   *tab_bar)
 {
-  g_autoptr (GtkTargetList) target_list = NULL;
+//  g_autoptr (GtkTargetList) target_list = NULL;
   GtkSettings *settings;
-  static const GtkTargetEntry url_drag_types [] = {
+/*  static const GtkTargetEntry url_drag_types [] = {
     { (char *)EPHY_DND_URI_LIST_TYPE, 0, 0 },
     { (char *)EPHY_DND_URL_TYPE, 0, 1 },
-  };
+  };*/
 
   self->tab_bar = tab_bar;
-
+/*
   target_list = gtk_target_list_new (url_drag_types,
                                      G_N_ELEMENTS (url_drag_types));
   gtk_target_list_add_text_targets (target_list, 0);
 
-  hdy_tab_bar_set_extra_drag_dest_targets (self->tab_bar, target_list);
+  adw_tab_bar_set_extra_drag_dest_targets (self->tab_bar, target_list);
 
   g_signal_connect_object (tab_bar, "extra-drag-data-received",
                            G_CALLBACK (drag_data_received_cb), self,
                            G_CONNECT_SWAPPED);
-
+*/
   if (is_desktop_pantheon ()) {
     GtkWidget *button;
 
-    hdy_tab_bar_set_autohide (tab_bar, FALSE);
-    hdy_tab_bar_set_expand_tabs (tab_bar, FALSE);
+    adw_tab_bar_set_autohide (tab_bar, FALSE);
+    adw_tab_bar_set_expand_tabs (tab_bar, FALSE);
 
-    button = gtk_button_new_from_icon_name ("list-add-symbolic", GTK_ICON_SIZE_MENU);
+    button = gtk_button_new_from_icon_name ("list-add-symbolic");
     /* Translators: tooltip for the new tab button */
     gtk_widget_set_tooltip_text (button, _("Open a new tab"));
     gtk_actionable_set_action_name (GTK_ACTIONABLE (button), "win.new-tab");
     gtk_style_context_add_class (gtk_widget_get_style_context (button), "flat");
-    gtk_widget_show (button);
 
-    hdy_tab_bar_set_start_action_widget (tab_bar, button);
+    adw_tab_bar_set_start_action_widget (tab_bar, button);
   } else {
     g_signal_connect_object (EPHY_SETTINGS_UI,
                              "changed::" EPHY_PREFS_UI_TABS_BAR_VISIBILITY_POLICY,
diff --git a/src/ephy-tab-view.h b/src/ephy-tab-view.h
index b95d1c85f..fd6c04484 100644
--- a/src/ephy-tab-view.h
+++ b/src/ephy-tab-view.h
@@ -22,13 +22,13 @@
 
 #include "ephy-embed.h"
 
-#include <handy.h>
+#include <adwaita.h>
 
 G_BEGIN_DECLS
 
 #define EPHY_TYPE_TAB_VIEW (ephy_tab_view_get_type())
 
-G_DECLARE_FINAL_TYPE (EphyTabView, ephy_tab_view, EPHY, TAB_VIEW, GtkBin)
+G_DECLARE_FINAL_TYPE (EphyTabView, ephy_tab_view, EPHY, TAB_VIEW, AdwBin)
 
 typedef void (*EphyTabViewCallback) (GtkWidget *widget,
                                      gpointer   data);
@@ -66,7 +66,7 @@ gboolean     ephy_tab_view_select_page        (EphyTabView *self,
 
 GtkWidget   *ephy_tab_view_get_selected_page  (EphyTabView *self);
 
-HdyTabView  *ephy_tab_view_get_tab_view       (EphyTabView *self);
+AdwTabView  *ephy_tab_view_get_tab_view       (EphyTabView *self);
 
 GList        *ephy_tab_view_get_pages         (EphyTabView *self);
 
@@ -82,6 +82,6 @@ gint          ephy_tab_view_add_tab           (EphyTabView *self,
 GtkWidget    *ephy_tab_view_get_current_page  (EphyTabView *self);
 
 void          ephy_tab_view_set_tab_bar       (EphyTabView *self,
-                                               HdyTabBar   *tab_bar);
+                                               AdwTabBar   *tab_bar);
 
 G_END_DECLS
diff --git a/src/ephy-web-extension-dialog.c b/src/ephy-web-extension-dialog.c
index b8255f2e5..d660dd5d4 100644
--- a/src/ephy-web-extension-dialog.c
+++ b/src/ephy-web-extension-dialog.c
@@ -26,10 +26,11 @@
 #include "ephy-web-extension-dialog.h"
 #include "ephy-web-extension-manager.h"
 
+#include <adwaita.h>
 #include <gtk/gtk.h>
 
 struct _EphyWebExtensionDialog {
-  HdyWindow parent_instance;
+  GtkWindow parent_instance;
 
   EphyWebExtensionManager *web_extension_manager;
 
@@ -37,20 +38,7 @@ struct _EphyWebExtensionDialog {
   GtkStack *stack;
 };
 
-G_DEFINE_TYPE (EphyWebExtensionDialog, ephy_web_extension_dialog, HDY_TYPE_WINDOW)
-
-static void
-clear_listbox (GtkWidget *listbox)
-{
-  GList *children, *iter;
-
-  children = gtk_container_get_children (GTK_CONTAINER (listbox));
-
-  for (iter = children; iter && iter->data; iter = g_list_next (iter))
-    gtk_widget_destroy (GTK_WIDGET (iter->data));
-
-  g_list_free (children);
-}
+G_DEFINE_TYPE (EphyWebExtensionDialog, ephy_web_extension_dialog, GTK_TYPE_WINDOW)
 
 static void
 on_remove_confirmed (GtkDialog       *dialog,
@@ -59,9 +47,9 @@ on_remove_confirmed (GtkDialog       *dialog,
 {
   GtkListBoxRow *row = user_data;
   EphyWebExtensionDialog *self =
-    EPHY_WEB_EXTENSION_DIALOG (gtk_widget_get_toplevel (GTK_WIDGET (row)));
+    EPHY_WEB_EXTENSION_DIALOG (gtk_widget_get_root (GTK_WIDGET (row)));
 
-  gtk_widget_destroy (GTK_WIDGET (dialog));
+  gtk_window_destroy (GTK_WINDOW (dialog));
 
   if (response == GTK_RESPONSE_OK) {
     EphyWebExtension *web_extension = g_object_get_data (G_OBJECT (row), "web_extension");
@@ -115,20 +103,15 @@ toggle_state_set_cb (GtkSwitch *widget,
 }
 
 static void
-homepage_activated_cb (HdyActionRow *row,
+homepage_activated_cb (AdwActionRow *row,
                        gpointer      user_data)
 {
   EphyWebExtensionDialog *self = EPHY_WEB_EXTENSION_DIALOG (user_data);
   EphyWebExtension *web_extension = g_object_get_data (G_OBJECT (row), "web_extension");
-  g_autoptr (GError) error = NULL;
-
-  gtk_show_uri_on_window (GTK_WINDOW (self),
-                          ephy_web_extension_get_homepage_url (web_extension),
-                          GDK_CURRENT_TIME,
-                          &error);
 
-  if (error)
-    g_warning ("Couldn't to open homepage: %s", error->message);
+  gtk_show_uri (GTK_WINDOW (self),
+                ephy_web_extension_get_homepage_url (web_extension),
+                GDK_CURRENT_TIME);
 }
 
 static GtkWidget *
@@ -146,7 +129,7 @@ create_row (EphyWebExtensionDialog *self,
   g_autoptr (GdkPixbuf) icon = NULL;
   EphyWebExtensionManager *manager = ephy_shell_get_web_extension_manager (ephy_shell_get_default ());
 
-  row = hdy_expander_row_new ();
+  row = adw_expander_row_new ();
   g_object_set_data (G_OBJECT (row), "web_extension", web_extension);
 
   /* Tooltip */
@@ -154,66 +137,64 @@ create_row (EphyWebExtensionDialog *self,
 
   /* Icon */
   icon = ephy_web_extension_get_icon (web_extension, 32);
-  image = icon ? gtk_image_new_from_pixbuf (icon) : gtk_image_new_from_icon_name 
("application-x-addon-symbolic", GTK_ICON_SIZE_DND);
+  image = icon ? gtk_image_new_from_pixbuf (icon) : gtk_image_new_from_icon_name 
("application-x-addon-symbolic");
   gtk_image_set_pixel_size (GTK_IMAGE (image), 32);
-  hdy_expander_row_add_prefix (HDY_EXPANDER_ROW (row), image);
+  adw_expander_row_add_prefix (ADW_EXPANDER_ROW (row), image);
 
   /* Titles */
-  hdy_preferences_row_set_title (HDY_PREFERENCES_ROW (row), ephy_web_extension_get_name (web_extension));
-  hdy_expander_row_set_subtitle (HDY_EXPANDER_ROW (row), ephy_web_extension_get_description (web_extension));
-  hdy_expander_row_set_show_enable_switch (HDY_EXPANDER_ROW (row), FALSE);
+  adw_preferences_row_set_title (ADW_PREFERENCES_ROW (row), ephy_web_extension_get_name (web_extension));
+  adw_expander_row_set_subtitle (ADW_EXPANDER_ROW (row), ephy_web_extension_get_description (web_extension));
+  adw_expander_row_set_show_enable_switch (ADW_EXPANDER_ROW (row), FALSE);
 
   toggle = gtk_switch_new ();
   gtk_switch_set_active (GTK_SWITCH (toggle), ephy_web_extension_manager_is_active (manager, web_extension));
   g_signal_connect (toggle, "state-set", G_CALLBACK (toggle_state_set_cb), web_extension);
   gtk_widget_set_valign (toggle, GTK_ALIGN_CENTER);
-  hdy_expander_row_add_action (HDY_EXPANDER_ROW (row), toggle);
+  adw_expander_row_add_action (ADW_EXPANDER_ROW (row), toggle);
 
   /* Author */
   if (ephy_web_extension_get_author (web_extension)) {
-    sub_row = hdy_action_row_new ();
-    gtk_container_add (GTK_CONTAINER (row), sub_row);
-    hdy_preferences_row_set_title (HDY_PREFERENCES_ROW (sub_row), _("Author"));
+    sub_row = adw_action_row_new ();
+    adw_expander_row_add_row (ADW_EXPANDER_ROW (row), sub_row);
+    adw_preferences_row_set_title (ADW_PREFERENCES_ROW (sub_row), _("Author"));
     author = gtk_label_new (ephy_web_extension_get_author (web_extension));
-    gtk_label_set_line_wrap (GTK_LABEL (author), TRUE);
-    gtk_container_add (GTK_CONTAINER (sub_row), author);
+    gtk_label_set_wrap (GTK_LABEL (author), TRUE);
+    adw_action_row_add_suffix (ADW_ACTION_ROW (sub_row), author);
   }
 
   /* Version */
-  sub_row = hdy_action_row_new ();
-  gtk_container_add (GTK_CONTAINER (row), sub_row);
-  hdy_preferences_row_set_title (HDY_PREFERENCES_ROW (sub_row), _("Version"));
+  sub_row = adw_action_row_new ();
+  adw_expander_row_add_row (ADW_EXPANDER_ROW (row), sub_row);
+  adw_preferences_row_set_title (ADW_PREFERENCES_ROW (sub_row), _("Version"));
   version = gtk_label_new (ephy_web_extension_get_version (web_extension));
-  dzl_gtk_widget_add_style_class (version, "dim-label");
-  gtk_container_add (GTK_CONTAINER (sub_row), version);
+  gtk_widget_add_css_class (version, "dim-label");
+  adw_action_row_add_suffix (ADW_ACTION_ROW (sub_row), version);
 
   /* Homepage url */
   if (ephy_web_extension_get_homepage_url (web_extension)) {
-    sub_row = hdy_action_row_new ();
-    gtk_container_add (GTK_CONTAINER (row), sub_row);
-    hdy_preferences_row_set_title (HDY_PREFERENCES_ROW (sub_row), _("Homepage"));
+    sub_row = adw_action_row_new ();
+    adw_expander_row_add_row (ADW_EXPANDER_ROW (row), sub_row);
+    adw_preferences_row_set_title (ADW_PREFERENCES_ROW (sub_row), _("Homepage"));
     gtk_list_box_row_set_activatable (GTK_LIST_BOX_ROW (sub_row), TRUE);
     g_signal_connect (sub_row, "activated", G_CALLBACK (homepage_activated_cb), self);
-    homepage_icon = gtk_image_new_from_icon_name ("ephy-open-link-symbolic", GTK_ICON_SIZE_BUTTON);
-    dzl_gtk_widget_add_style_class (homepage_icon, "dim-label");
-    gtk_container_add (GTK_CONTAINER (sub_row), homepage_icon);
+    homepage_icon = gtk_image_new_from_icon_name ("ephy-open-link-symbolic");
+    gtk_widget_add_css_class (homepage_icon, "dim-label");
+    adw_action_row_add_suffix (ADW_ACTION_ROW (sub_row), homepage_icon);
     g_object_set_data (G_OBJECT (sub_row), "web_extension", web_extension);
   }
 
   /* Remove button */
-  sub_row = hdy_action_row_new ();
-  gtk_container_add (GTK_CONTAINER (row), sub_row);
+  sub_row = adw_action_row_new ();
+  adw_expander_row_add_row (ADW_EXPANDER_ROW (row), sub_row);
 
   button = gtk_button_new_with_mnemonic (_("_Remove"));
   gtk_widget_set_valign (GTK_WIDGET (button), GTK_ALIGN_CENTER);
-  dzl_gtk_widget_add_style_class (button, "destructive-action");
+  gtk_widget_add_css_class (button, "destructive-action");
   g_signal_connect (button, "clicked", G_CALLBACK (on_remove_button_clicked), self);
   gtk_widget_set_tooltip_text (button, _("Remove selected WebExtension"));
-  gtk_container_add (GTK_CONTAINER (sub_row), button);
+  adw_action_row_add_suffix (ADW_ACTION_ROW (sub_row), button);
   g_object_set_data (G_OBJECT (button), "row", row);
 
-  gtk_widget_show_all (GTK_WIDGET (row));
-
   return GTK_WIDGET (row);
 }
 
@@ -222,8 +203,10 @@ ephy_web_extension_dialog_refresh_listbox (EphyWebExtensionDialog *self)
 {
   GList *extensions = ephy_web_extension_manager_get_web_extensions (self->web_extension_manager);
   gboolean empty = TRUE;
+  GtkListBoxRow *row;
 
-  clear_listbox (self->listbox);
+  while ((row = gtk_list_box_get_row_at_index (GTK_LIST_BOX (self->listbox), 0)))
+    gtk_list_box_remove (GTK_LIST_BOX (self->listbox), GTK_WIDGET (row));
 
   for (GList *tmp = extensions; tmp && tmp->data; tmp = tmp->next) {
     EphyWebExtension *web_extension = tmp->data;
diff --git a/src/ephy-web-extension-dialog.h b/src/ephy-web-extension-dialog.h
index b8418f0f8..8f3f4b3c6 100644
--- a/src/ephy-web-extension-dialog.h
+++ b/src/ephy-web-extension-dialog.h
@@ -28,7 +28,7 @@ G_BEGIN_DECLS
 
 #define EPHY_TYPE_WEB_EXTENSION_DIALOG (ephy_web_extension_dialog_get_type ())
 
-G_DECLARE_FINAL_TYPE (EphyWebExtensionDialog, ephy_web_extension_dialog, EPHY, WEB_EXTENSION_DIALOG, 
HdyWindow)
+G_DECLARE_FINAL_TYPE (EphyWebExtensionDialog, ephy_web_extension_dialog, EPHY, WEB_EXTENSION_DIALOG, 
GtkWindow)
 
 GtkWidget *ephy_web_extension_dialog_new (void);
 
diff --git a/src/ephy-window.c b/src/ephy-window.c
index ab8caedf5..1d35e988a 100644
--- a/src/ephy-window.c
+++ b/src/ephy-window.c
@@ -147,18 +147,17 @@ const struct {
 #define SETTINGS_CONNECTION_DATA_KEY    "EphyWindowSettings"
 
 struct _EphyWindow {
-  HdyApplicationWindow parent_instance;
+  AdwApplicationWindow parent_instance;
 
-  GtkWidget *main_deck;
+  GtkWidget *main_leaflet;
   EphyFullscreenBox *fullscreen_box;
-  GtkWidget *window_handle;
   GtkBox *titlebar_box;
   GtkWidget *header_bar;
   EphyPagesView *pages_view;
   EphyBookmarksManager *bookmarks_manager;
   GHashTable *action_labels;
   EphyTabView *tab_view;
-  HdyTabBar *tab_bar;
+  AdwTabBar *tab_bar;
   GtkRevealer *tab_bar_revealer;
   GtkRevealer *pages_menu_revealer;
   EphyPagesPopover *pages_popover;
@@ -185,7 +184,6 @@ struct _EphyWindow {
   gint current_y;
 
   guint has_default_size : 1;
-  guint has_default_position : 1;
   guint is_maximized : 1;
   guint is_fullscreen : 1;
   guint closing : 1;
@@ -196,7 +194,7 @@ struct _EphyWindow {
   guint confirmed_close_with_multiple_tabs : 1;
   guint present_on_insert : 1;
 
-  guint32 present_on_insert_user_time;
+  GHashTable *action_groups;
 };
 
 enum {
@@ -204,7 +202,6 @@ enum {
   PROP_ACTIVE_CHILD,
   PROP_CHROME,
   PROP_SINGLE_TAB_MODE,
-  PROP_FULLSCREEN
 };
 
 /* Make sure not to overlap with those in ephy-lockdown.c */
@@ -352,7 +349,7 @@ ephy_window_open_link (EphyLink      *link,
                EPHY_LINK_NEW_TAB |
                EPHY_LINK_NEW_WINDOW)) {
     EphyNewTabFlags ntflags = 0;
-    EphyWindow *target_window = EPHY_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (embed)));
+    EphyWindow *target_window = EPHY_WINDOW (gtk_widget_get_root (GTK_WIDGET (embed)));
 
     if (flags & EPHY_LINK_JUMP_TO) {
       ntflags |= EPHY_NEW_TAB_JUMP;
@@ -398,7 +395,7 @@ ephy_window_link_iface_init (EphyLinkInterface *iface)
   iface->open_link = ephy_window_open_link;
 }
 
-G_DEFINE_TYPE_WITH_CODE (EphyWindow, ephy_window, HDY_TYPE_APPLICATION_WINDOW,
+G_DEFINE_TYPE_WITH_CODE (EphyWindow, ephy_window, ADW_TYPE_APPLICATION_WINDOW,
                          G_IMPLEMENT_INTERFACE (EPHY_TYPE_LINK,
                                                 ephy_window_link_iface_init)
                          G_IMPLEMENT_INTERFACE (EPHY_TYPE_EMBED_CONTAINER,
@@ -447,7 +444,7 @@ sync_tab_load_status (EphyWebView     *view,
 
   loading = ephy_web_view_is_loading (view);
 
-  action_group = gtk_widget_get_action_group (GTK_WIDGET (window), "win");
+  action_group = ephy_window_get_action_group (window, "win");
 
   /* disable print while loading, see bug #116344 */
   action = g_action_map_lookup_action (G_ACTION_MAP (action_group),
@@ -455,7 +452,7 @@ sync_tab_load_status (EphyWebView     *view,
   ephy_action_change_sensitivity_flags (G_SIMPLE_ACTION (action),
                                         SENS_FLAG_LOADING, loading);
 
-  action_group = gtk_widget_get_action_group (GTK_WIDGET (window), "toolbar");
+  action_group = ephy_window_get_action_group (window, "toolbar");
 
   action = g_action_map_lookup_action (G_ACTION_MAP (action_group),
                                        "stop");
@@ -492,21 +489,21 @@ update_adaptive_mode (EphyWindow *window)
   EphyAdaptiveMode adaptive_mode;
   gint width, height;
   GdkDisplay *display;
-  GdkWindow *surface;
+  GdkSurface *surface;
   GdkMonitor *monitor = NULL;
   GdkRectangle geometry = {};
 
-  gtk_window_get_size (GTK_WINDOW (window),
-                       &width,
-                       &height);
+  gtk_window_get_default_size (GTK_WINDOW (window),
+                               &width,
+                               &height);
 
   /* Get the monitor to guess whether we are on a mobile or not. If not found,
    * fallback to the window size.
    */
   display = gtk_widget_get_display (GTK_WIDGET (window));
-  surface = gtk_widget_get_window (GTK_WIDGET (window));
+  surface = gtk_native_get_surface (GTK_NATIVE (window));
   if (display != NULL && surface != NULL)
-    monitor = gdk_display_get_monitor_at_window (display, surface);
+    monitor = gdk_display_get_monitor_at_surface (display, surface);
   if (monitor != NULL)
     gdk_monitor_get_geometry (monitor, &geometry);
   else
@@ -538,32 +535,47 @@ update_adaptive_mode (EphyWindow *window)
 }
 
 static void
-ephy_window_fullscreen (EphyWindow *window)
+notify_fullscreen_cb (EphyWindow *window)
 {
   EphyEmbed *embed;
+  gboolean fullscreen = gtk_window_is_fullscreen (GTK_WINDOW (window));
+  GAction *action;
+  GActionGroup *action_group;
 
-  window->is_fullscreen = TRUE;
-  g_object_notify (G_OBJECT (window), "fullscreen");
+  window->is_fullscreen = fullscreen;
 
-  /* sync status */
   embed = window->active_embed;
-  sync_tab_load_status (ephy_embed_get_web_view (embed), WEBKIT_LOAD_STARTED, window);
-  sync_tab_security (ephy_embed_get_web_view (embed), NULL, window);
+
+  if (embed && fullscreen) {
+    /* sync status */
+    sync_tab_load_status (ephy_embed_get_web_view (embed), WEBKIT_LOAD_STARTED, window);
+    sync_tab_security (ephy_embed_get_web_view (embed), NULL, window);
+  }
 
   update_adaptive_mode (window);
-  ephy_embed_entering_fullscreen (embed);
-}
 
-static void
-ephy_window_unfullscreen (EphyWindow *window)
-{
-  window->is_fullscreen = FALSE;
-  g_object_notify (G_OBJECT (window), "fullscreen");
+  if (embed) {
+    if (fullscreen)
+      ephy_embed_entering_fullscreen (embed);
+    else
+      ephy_embed_leaving_fullscreen (embed);
+  }
 
-  update_adaptive_mode (window);
-  ephy_embed_leaving_fullscreen (window->active_embed);
+  ephy_fullscreen_box_set_fullscreen (window->fullscreen_box,
+                                      fullscreen && window->show_fullscreen_header_bar);
+  gtk_widget_set_visible (GTK_WIDGET (window->titlebar_box),
+                          !fullscreen || window->show_fullscreen_header_bar);
+
+  window->show_fullscreen_header_bar = FALSE;
+
+  action_group = ephy_window_get_action_group (window, "win");
+  action = g_action_map_lookup_action (G_ACTION_MAP (action_group), "fullscreen");
+
+  g_simple_action_set_state (G_SIMPLE_ACTION (action),
+                             g_variant_new_boolean (fullscreen));
 }
 
+#if 0
 static gboolean
 ephy_window_should_view_receive_key_press_event (EphyWindow  *window,
                                                  GdkEventKey *event)
@@ -681,6 +693,7 @@ ephy_window_delete_event (GtkWidget   *widget,
 
   return FALSE;
 }
+#endif
 
 #define MAX_SPELL_CHECK_GUESSES 4
 
@@ -691,7 +704,7 @@ update_link_actions_sensitivity (EphyWindow *window,
   GAction *action;
   GActionGroup *action_group;
 
-  action_group = gtk_widget_get_action_group (GTK_WIDGET (window), "popup");
+  action_group = ephy_window_get_action_group (window, "popup");
 
   action = g_action_map_lookup_action (G_ACTION_MAP (action_group),
                                        "open-link-in-new-window");
@@ -715,8 +728,7 @@ update_edit_action_sensitivity (EphyWindow *window,
   GActionGroup *action_group;
   GAction *action;
 
-  action_group = gtk_widget_get_action_group (GTK_WIDGET (window),
-                                              "win");
+  action_group = ephy_window_get_action_group (window, "win");
 
   action = g_action_map_lookup_action (G_ACTION_MAP (action_group),
                                        action_name);
@@ -741,10 +753,10 @@ update_edit_actions_sensitivity (EphyWindow *window,
     can_cut = has_selection;
     can_copy = has_selection;
     can_paste = TRUE;
-    can_undo = EPHY_IS_LOCATION_ENTRY (title_widget) &&
-               ephy_location_entry_get_can_undo (EPHY_LOCATION_ENTRY (title_widget));
-    can_redo = EPHY_IS_LOCATION_ENTRY (title_widget) &&
-               ephy_location_entry_get_can_redo (EPHY_LOCATION_ENTRY (title_widget));
+//    can_undo = EPHY_IS_LOCATION_ENTRY (title_widget) &&
+//               ephy_location_entry_get_can_undo (EPHY_LOCATION_ENTRY (title_widget));
+//    can_redo = EPHY_IS_LOCATION_ENTRY (title_widget) &&
+//               ephy_location_entry_get_can_redo (EPHY_LOCATION_ENTRY (title_widget));
   } else {
     EphyEmbed *embed;
     WebKitWebView *view;
@@ -777,8 +789,7 @@ enable_edit_actions_sensitivity (EphyWindow *window)
   GActionGroup *action_group;
   GAction *action;
 
-  action_group = gtk_widget_get_action_group (GTK_WIDGET (window),
-                                              "win");
+  action_group = ephy_window_get_action_group (window, "win");
 
   action = g_action_map_lookup_action (G_ACTION_MAP (action_group), "cut");
   g_simple_action_set_enabled (G_SIMPLE_ACTION (action), TRUE);
@@ -817,16 +828,16 @@ change_combined_stop_reload_state (GSimpleAction *action,
 static const GActionEntry window_entries [] = {
   { "page-menu", window_cmd_page_menu },
   { "new-tab", window_cmd_new_tab },
-  { "open", window_cmd_open },
-  { "save-as", window_cmd_save_as },
-  { "save-as-application", window_cmd_save_as_application },
+//  { "open", window_cmd_open },
+//  { "save-as", window_cmd_save_as },
+//  { "save-as-application", window_cmd_save_as_application },
   { "open-application-manager", window_cmd_open_application_manager },
-  { "undo", window_cmd_undo },
-  { "redo", window_cmd_redo },
-  { "cut", window_cmd_cut },
-  { "copy", window_cmd_copy },
-  { "paste", window_cmd_paste },
-  { "paste-as-plain-text", window_cmd_paste_as_plain_text },
+//  { "undo", window_cmd_undo },
+//  { "redo", window_cmd_redo },
+//  { "cut", window_cmd_cut },
+//  { "copy", window_cmd_copy },
+//  { "paste", window_cmd_paste },
+//  { "paste-as-plain-text", window_cmd_paste_as_plain_text },
   { "delete", window_cmd_delete },
   { "zoom-in", window_cmd_zoom_in },
   { "zoom-out", window_cmd_zoom_out },
@@ -835,9 +846,9 @@ static const GActionEntry window_entries [] = {
   { "find", window_cmd_find },
   { "find-prev", window_cmd_find_prev },
   { "find-next", window_cmd_find_next },
-  { "open-bookmark", window_cmd_open_bookmark, "s" },
-  { "bookmark-page", window_cmd_bookmark_page },
-  { "bookmarks", window_cmd_bookmarks },
+//  { "open-bookmark", window_cmd_open_bookmark, "s" },
+//  { "bookmark-page", window_cmd_bookmark_page },
+//  { "bookmarks", window_cmd_bookmarks },
   { "show-downloads", window_cmd_show_downloads },
   { "encoding", window_cmd_encoding },
   { "page-source", window_cmd_page_source },
@@ -849,7 +860,7 @@ static const GActionEntry window_entries [] = {
 
   { "send-to", window_cmd_send_to },
   { "location", window_cmd_go_location },
-  { "location-search", window_cmd_location_search },
+//  { "location-search", window_cmd_location_search },
   { "home", window_cmd_go_home },
   { "content", window_cmd_go_content },
   { "tabs-view", window_cmd_go_tabs_view },
@@ -887,7 +898,7 @@ static const GActionEntry toolbar_entries [] = {
 };
 
 static const GActionEntry popup_entries [] = {
-  { "context-bookmark-page", window_cmd_bookmark_page },
+//  { "context-bookmark-page", window_cmd_bookmark_page },
   /* Links. */
 
   { "open-link-in-new-window", popup_cmd_link_in_new_window },
@@ -1019,7 +1030,7 @@ _ephy_window_set_default_actions_sensitive (EphyWindow *window,
     NULL
   };
 
-  action_group = gtk_widget_get_action_group (GTK_WIDGET (window), "win");
+  action_group = ephy_window_get_action_group (window, "win");
 
   /* Page menu */
   for (i = 0; action_group_actions[i] != NULL; i++) {
@@ -1030,14 +1041,14 @@ _ephy_window_set_default_actions_sensitive (EphyWindow *window,
   }
 
   /* Page context popup */
-  action_group = gtk_widget_get_action_group (GTK_WIDGET (window), "popup");
+  action_group = ephy_window_get_action_group (window, "popup");
   action = g_action_map_lookup_action (G_ACTION_MAP (action_group),
                                        "context-bookmark-page");
   ephy_action_change_sensitivity_flags (G_SIMPLE_ACTION (action),
                                         flags, set);
 
   /* Toolbar */
-  action_group = gtk_widget_get_action_group (GTK_WIDGET (window), "toolbar");
+  action_group = ephy_window_get_action_group (window, "toolbar");
   action = g_action_map_lookup_action (G_ACTION_MAP (action_group),
                                        "combined-stop-reload");
   ephy_action_change_sensitivity_flags (G_SIMPLE_ACTION (action),
@@ -1103,8 +1114,7 @@ sync_tab_zoom (WebKitWebView *web_view,
     can_zoom_normal = TRUE;
   }
 
-  action_group = gtk_widget_get_action_group (GTK_WIDGET (window),
-                                              "win");
+  action_group = ephy_window_get_action_group (window, "win");
 
   action = g_action_map_lookup_action (G_ACTION_MAP (action_group), "zoom-in");
   g_simple_action_set_enabled (G_SIMPLE_ACTION (action), can_zoom_in);
@@ -1135,8 +1145,7 @@ sync_tab_document_type (EphyWebView *view,
   is_image = type == EPHY_WEB_VIEW_DOCUMENT_IMAGE;
   disable = (type != EPHY_WEB_VIEW_DOCUMENT_HTML);
 
-  action_group = gtk_widget_get_action_group (GTK_WIDGET (window),
-                                              "win");
+  action_group = ephy_window_get_action_group (window, "win");
 
   action = g_action_map_lookup_action (G_ACTION_MAP (action_group), "encoding");
   ephy_action_change_sensitivity_flags (G_SIMPLE_ACTION (action), SENS_FLAG_DOCUMENT, disable);
@@ -1161,7 +1170,7 @@ _ephy_window_set_navigation_flags (EphyWindow                 *window,
   GActionGroup *action_group;
   GAction *action;
 
-  action_group = gtk_widget_get_action_group (GTK_WIDGET (window), "toolbar");
+  action_group = ephy_window_get_action_group (window, "toolbar");
 
   action = g_action_map_lookup_action (G_ACTION_MAP (action_group), "navigation-back");
   g_simple_action_set_enabled (G_SIMPLE_ACTION (action), flags & EPHY_WEB_VIEW_NAV_BACK);
@@ -1198,18 +1207,18 @@ void
 ephy_window_sync_bookmark_state (GtkWidget             *widget,
                                  EphyBookmarkIconState  state)
 {
-  GtkWidget *toplevel = gtk_widget_get_toplevel (GTK_WIDGET (widget));
-  EphyWindow *window = EPHY_WINDOW (toplevel);
+  GtkRoot *root = gtk_widget_get_root (GTK_WIDGET (widget));
+  EphyWindow *window = EPHY_WINDOW (root);
   EphyActionBarEnd *action_bar_end = ephy_action_bar_get_action_bar_end (EPHY_ACTION_BAR 
(window->action_bar));
-  GtkWidget *lentry;
+//  GtkWidget *lentry;
 
   if (action_bar_end)
     ephy_action_bar_end_set_bookmark_icon_state (EPHY_ACTION_BAR_END (action_bar_end), state);
 
-  lentry = GTK_WIDGET (ephy_header_bar_get_title_widget (EPHY_HEADER_BAR (window->header_bar)));
+//  lentry = GTK_WIDGET (ephy_header_bar_get_title_widget (EPHY_HEADER_BAR (window->header_bar)));
 
-  if (EPHY_IS_LOCATION_ENTRY (lentry))
-    ephy_location_entry_set_bookmark_icon_state (EPHY_LOCATION_ENTRY (lentry), state);
+//  if (EPHY_IS_LOCATION_ENTRY (lentry))
+//    ephy_location_entry_set_bookmark_icon_state (EPHY_LOCATION_ENTRY (lentry), state);
 }
 
 static void
@@ -1228,8 +1237,8 @@ sync_tab_bookmarked_status (EphyWebView *view,
 
   widget = GTK_WIDGET (ephy_header_bar_get_title_widget (EPHY_HEADER_BAR (window->header_bar)));
 
-  if (!EPHY_IS_LOCATION_ENTRY (widget))
-    return;
+//  if (!EPHY_IS_LOCATION_ENTRY (widget))
+//    return;
 
   address = ephy_web_view_get_address (view);
   mode = ephy_embed_shell_get_mode (shell);
@@ -1246,7 +1255,7 @@ sync_tab_bookmarked_status (EphyWebView *view,
   }
 
   ephy_action_bar_end_set_bookmark_icon_state (EPHY_ACTION_BAR_END (action_bar_end), state);
-  ephy_location_entry_set_bookmark_icon_state (EPHY_LOCATION_ENTRY (widget), state);
+//  ephy_location_entry_set_bookmark_icon_state (EPHY_LOCATION_ENTRY (widget), state);
 }
 
 static void
@@ -1524,12 +1533,9 @@ populate_context_menu (WebKitWebView       *web_view,
                               EPHY_PREFS_LOCKDOWN_CONTEXT_MENU))
     return GDK_EVENT_STOP;
 
-  window_action_group = gtk_widget_get_action_group (GTK_WIDGET (window),
-                                                     "win");
-  toolbar_action_group = gtk_widget_get_action_group (GTK_WIDGET (window),
-                                                      "toolbar");
-  popup_action_group = gtk_widget_get_action_group (GTK_WIDGET (window),
-                                                    "popup");
+  window_action_group = ephy_window_get_action_group (window, "win");
+  toolbar_action_group = ephy_window_get_action_group (window, "toolbar");
+  popup_action_group = ephy_window_get_action_group (window, "popup");
 
   if (webkit_hit_test_result_context_is_image (hit_test_result)) {
     is_image = TRUE;
@@ -1895,11 +1901,11 @@ window_properties_geometry_changed (WebKitWindowProperties *properties,
   GdkRectangle geometry;
 
   webkit_window_properties_get_geometry (properties, &geometry);
-  if (geometry.x >= 0 && geometry.y >= 0)
-    gtk_window_move (GTK_WINDOW (window), geometry.x, geometry.y);
+//  if (geometry.x >= 0 && geometry.y >= 0)
+//    gtk_window_move (GTK_WINDOW (window), geometry.x, geometry.y);
 
-  if (geometry.width > 0 && geometry.height > 0)
-    gtk_window_resize (GTK_WINDOW (window), geometry.width, geometry.height);
+//  if (geometry.width > 0 && geometry.height > 0)
+//    gtk_window_resize (GTK_WINDOW (window), geometry.width, geometry.height);
 }
 
 static void
@@ -1921,7 +1927,7 @@ ephy_window_configure_for_view (EphyWindow    *window,
 
     title_widget = GTK_WIDGET (ephy_header_bar_get_title_widget (EPHY_HEADER_BAR (window->header_bar)));
     lentry = EPHY_LOCATION_ENTRY (title_widget);
-    gtk_editable_set_editable (GTK_EDITABLE (ephy_location_entry_get_entry (lentry)), FALSE);
+    gtk_editable_set_editable (GTK_EDITABLE (lentry), FALSE);
 
     if (webkit_window_properties_get_menubar_visible (properties))
       chrome |= EPHY_WINDOW_CHROME_MENU;
@@ -1950,8 +1956,8 @@ web_view_ready_cb (WebKitWebView *web_view,
   EphyWindow *window, *parent_view_window;
   gboolean using_new_window;
 
-  window = EPHY_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (web_view)));
-  parent_view_window = EPHY_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (parent_web_view)));
+  window = EPHY_WINDOW (gtk_widget_get_root (GTK_WIDGET (web_view)));
+  parent_view_window = EPHY_WINDOW (gtk_widget_get_root (GTK_WIDGET (parent_web_view)));
 
   using_new_window = window != parent_view_window;
 
@@ -2101,12 +2107,7 @@ decide_navigation_policy (WebKitWebView            *web_view,
   uri = webkit_uri_request_get_uri (request);
 
   if (!ephy_embed_utils_address_has_web_scheme (uri) && webkit_navigation_action_is_user_gesture 
(navigation_action)) {
-    g_autoptr (GError) error = NULL;
-    gtk_show_uri_on_window (GTK_WINDOW (window), uri, GDK_CURRENT_TIME, &error);
-    if (error) {
-      LOG ("failed to handle non-web scheme: %s", error->message);
-      return accept_navigation_policy_decision (window, decision, uri);
-    }
+    gtk_show_uri (GTK_WINDOW (window), uri, GDK_CURRENT_TIME);
 
     webkit_policy_decision_ignore (decision);
     return TRUE;
@@ -2130,11 +2131,11 @@ decide_navigation_policy (WebKitWebView            *web_view,
          * executes in web app mode.
          */
         ephy_file_open_uri_in_default_browser (uri, GDK_CURRENT_TIME,
-                                               gtk_window_get_screen (GTK_WINDOW (window)),
+                                               gdk_surface_get_display (gtk_native_get_surface (GTK_NATIVE 
(window))),
                                                
EPHY_FILE_HELPERS_I_UNDERSTAND_I_MUST_NOT_USE_THIS_FUNCTION_UNDER_FLATPAK);
         webkit_policy_decision_ignore (decision);
 
-        gtk_widget_destroy (GTK_WIDGET (window));
+        gtk_window_destroy (GTK_WINDOW (window));
 
         return TRUE;
       }
@@ -2149,7 +2150,7 @@ decide_navigation_policy (WebKitWebView            *web_view,
        * executes in web app mode.
        */
       ephy_file_open_uri_in_default_browser (uri, GDK_CURRENT_TIME,
-                                             gtk_window_get_screen (GTK_WINDOW (window)),
+                                             gdk_surface_get_display (gtk_native_get_surface (GTK_NATIVE 
(window))),
                                              
EPHY_FILE_HELPERS_I_UNDERSTAND_I_MUST_NOT_USE_THIS_FUNCTION_UNDER_FLATPAK);
       webkit_policy_decision_ignore (decision);
 
@@ -2190,7 +2191,7 @@ decide_navigation_policy (WebKitWebView            *web_view,
       inherit_session = TRUE;
     }
     /* Alt+click means download URI */
-    else if (button == GDK_BUTTON_PRIMARY && state == GDK_MOD1_MASK) {
+    else if (button == GDK_BUTTON_PRIMARY && state == GDK_ALT_MASK) {
       if (save_target_uri (window, web_view)) {
         webkit_policy_decision_ignore (decision);
         return TRUE;
@@ -2458,9 +2459,9 @@ ephy_window_connect_active_embed (EphyWindow *window)
   g_signal_connect_object (view, "notify::is-blank",
                            G_CALLBACK (sync_tab_is_blank),
                            window, 0);
-  g_signal_connect_object (view, "context-menu",
-                           G_CALLBACK (populate_context_menu),
-                           window, 0);
+//  g_signal_connect_object (view, "context-menu",
+//                           G_CALLBACK (populate_context_menu),
+//                           window, 0);
   g_signal_connect_object (view, "mouse-target-changed",
                            G_CALLBACK (ephy_window_mouse_target_changed_cb),
                            window, 0);
@@ -2468,7 +2469,7 @@ ephy_window_connect_active_embed (EphyWindow *window)
                            G_CALLBACK (web_process_terminated_cb),
                            window, 0);
 
-  ephy_mouse_gesture_controller_set_web_view (window->mouse_gesture_controller, web_view);
+//  ephy_mouse_gesture_controller_set_web_view (window->mouse_gesture_controller, web_view);
 
   g_object_notify (G_OBJECT (window), "active-child");
 }
@@ -2488,7 +2489,7 @@ ephy_window_disconnect_active_embed (EphyWindow *window)
 
   ephy_embed_detach_notification_container (window->active_embed);
 
-  ephy_mouse_gesture_controller_unset_web_view (window->mouse_gesture_controller);
+//  ephy_mouse_gesture_controller_unset_web_view (window->mouse_gesture_controller);
 
   g_signal_handlers_disconnect_by_func (web_view,
                                         G_CALLBACK (progress_update),
@@ -2523,9 +2524,9 @@ ephy_window_disconnect_active_embed (EphyWindow *window)
   g_signal_handlers_disconnect_by_func (view,
                                         G_CALLBACK (sync_tab_address),
                                         window);
-  g_signal_handlers_disconnect_by_func (view,
-                                        G_CALLBACK (populate_context_menu),
-                                        window);
+//  g_signal_handlers_disconnect_by_func (view,
+//                                        G_CALLBACK (populate_context_menu),
+//                                        window);
   g_signal_handlers_disconnect_by_func (view,
                                         G_CALLBACK (ephy_window_mouse_target_changed_cb),
                                         window);
@@ -2541,7 +2542,7 @@ ephy_window_set_active_tab (EphyWindow *window,
   EphyEmbed *old_embed;
 
   g_assert (EPHY_IS_WINDOW (window));
-  g_assert (gtk_widget_get_toplevel (GTK_WIDGET (new_embed)) == GTK_WIDGET (window));
+  g_assert (gtk_widget_get_root (GTK_WIDGET (new_embed)) == GTK_ROOT (window));
 
   old_embed = window->active_embed;
 
@@ -2558,8 +2559,8 @@ ephy_window_set_active_tab (EphyWindow *window,
 }
 
 static void
-tab_view_setup_menu_cb (HdyTabView *tab_view,
-                        HdyTabPage *page,
+tab_view_setup_menu_cb (AdwTabView *tab_view,
+                        AdwTabPage *page,
                         EphyWindow *window)
 {
   EphyWebView *view;
@@ -2573,17 +2574,17 @@ tab_view_setup_menu_cb (HdyTabView *tab_view,
   gboolean muted;
 
   if (page) {
-    n_pages = hdy_tab_view_get_n_pages (tab_view);
-    n_pinned_pages = hdy_tab_view_get_n_pinned_pages (tab_view);
-    position = hdy_tab_view_get_page_position (tab_view, page);
-    pinned = hdy_tab_page_get_pinned (page);
+    n_pages = adw_tab_view_get_n_pages (tab_view);
+    n_pinned_pages = adw_tab_view_get_n_pinned_pages (tab_view);
+    position = adw_tab_view_get_page_position (tab_view, page);
+    pinned = adw_tab_page_get_pinned (page);
 
-    view = ephy_embed_get_web_view (EPHY_EMBED (hdy_tab_page_get_child (page)));
+    view = ephy_embed_get_web_view (EPHY_EMBED (adw_tab_page_get_child (page)));
     audio_playing = webkit_web_view_is_playing_audio (WEBKIT_WEB_VIEW (view));
     muted = webkit_web_view_get_is_muted (WEBKIT_WEB_VIEW (view));
   }
 
-  action_group = gtk_widget_get_action_group (GTK_WIDGET (window), "tab");
+  action_group = ephy_window_get_action_group (window, "tab");
 
   /* enable/disable close others/left/right */
   /* If there's no page, enable all actions so that we don't interfere with hotkeys */
@@ -2625,10 +2626,7 @@ tab_view_setup_menu_cb (HdyTabView *tab_view,
 static gboolean
 present_on_idle_cb (GtkWindow *window)
 {
-  EphyWindow *ephy_window = EPHY_WINDOW (window);
-
-  gtk_window_present_with_time (window, ephy_window->present_on_insert_user_time);
-  ephy_window->present_on_insert_user_time = 0;
+  gtk_window_present (window);
 
   return FALSE;
 }
@@ -2637,7 +2635,7 @@ static gboolean
 delayed_remove_child (gpointer data)
 {
   GtkWidget *widget = GTK_WIDGET (data);
-  EphyEmbedContainer *container = EPHY_EMBED_CONTAINER (gtk_widget_get_toplevel (widget));
+  EphyEmbedContainer *container = EPHY_EMBED_CONTAINER (gtk_widget_get_root (widget));
 
   ephy_embed_container_remove_child (container, EPHY_EMBED (widget));
 
@@ -2691,12 +2689,12 @@ reader_mode_cb (EphyWebView *view,
 }
 
 static void
-tab_view_page_attached_cb (HdyTabView *tab_view,
-                           HdyTabPage *page,
+tab_view_page_attached_cb (AdwTabView *tab_view,
+                           AdwTabPage *page,
                            gint        position,
                            EphyWindow *window)
 {
-  GtkWidget *content = hdy_tab_page_get_child (page);
+  GtkWidget *content = adw_tab_page_get_child (page);
   EphyEmbed *embed;
 
   g_assert (EPHY_IS_EMBED (content));
@@ -2718,12 +2716,12 @@ tab_view_page_attached_cb (HdyTabView *tab_view,
 }
 
 static void
-tab_view_page_detached_cb (HdyTabView *tab_view,
-                           HdyTabPage *page,
+tab_view_page_detached_cb (AdwTabView *tab_view,
+                           AdwTabPage *page,
                            gint        position,
                            EphyWindow *window)
 {
-  GtkWidget *content = hdy_tab_page_get_child (page);
+  GtkWidget *content = adw_tab_page_get_child (page);
 
   LOG ("page-detached tab view %p embed %p position %d\n", tab_view, content, position);
 
@@ -2786,19 +2784,19 @@ ephy_window_close_tab (EphyWindow *window,
    * tab, even if it wasn't at the start of this function.
    */
   if (!window->closing && ephy_tab_view_get_n_pages (window->tab_view) == 0)
-    gtk_widget_destroy (GTK_WIDGET (window));
+    gtk_window_destroy (GTK_WINDOW (window));
 }
 
 typedef struct {
   EphyWindow *window;
   EphyEmbed *embed;
-  HdyTabPage *page;
+  AdwTabPage *page;
 } TabHasModifiedFormsData;
 
 static TabHasModifiedFormsData *
 tab_has_modified_forms_data_new (EphyWindow *window,
                                  EphyEmbed  *embed,
-                                 HdyTabPage *page)
+                                 AdwTabPage *page)
 {
   TabHasModifiedFormsData *data = g_new (TabHasModifiedFormsData, 1);
   data->window = window;
@@ -2823,9 +2821,9 @@ tab_has_modified_forms_dialog_cb (GtkDialog               *dialog,
                                   GtkResponseType          response,
                                   TabHasModifiedFormsData *data)
 {
-  HdyTabView *tab_view = ephy_tab_view_get_tab_view (data->window->tab_view);
+  AdwTabView *tab_view = ephy_tab_view_get_tab_view (data->window->tab_view);
 
-  gtk_widget_destroy (GTK_WIDGET (dialog));
+  gtk_window_destroy (GTK_WINDOW (dialog));
 
   if (response == GTK_RESPONSE_ACCEPT) {
     /* It's safe to close the tab immediately because we are only checking a
@@ -2833,10 +2831,10 @@ tab_has_modified_forms_dialog_cb (GtkDialog               *dialog,
      * codepath for checking modified forms when closing the whole window,
      * see ephy_window_check_modified_forms().
      */
-    hdy_tab_view_close_page_finish (tab_view, data->page, TRUE);
+    adw_tab_view_close_page_finish (tab_view, data->page, TRUE);
     ephy_window_close_tab (data->window, data->embed);
   } else
-    hdy_tab_view_close_page_finish (tab_view, data->page, FALSE);
+    adw_tab_view_close_page_finish (tab_view, data->page, FALSE);
 
   tab_has_modified_forms_data_free (data);
 }
@@ -2853,10 +2851,10 @@ tab_has_modified_forms_cb (EphyWebView             *view,
   if (data->window != NULL &&
       data->embed != NULL &&
       data->page != NULL) {
-    HdyTabView *tab_view = ephy_tab_view_get_tab_view (data->window->tab_view);
+    AdwTabView *tab_view = ephy_tab_view_get_tab_view (data->window->tab_view);
 
     if (!has_modified_forms) {
-      hdy_tab_view_close_page_finish (tab_view, data->page, TRUE);
+      adw_tab_view_close_page_finish (tab_view, data->page, TRUE);
       ephy_window_close_tab (data->window, data->embed);
     } else {
       GtkWidget *dialog;
@@ -2900,19 +2898,19 @@ run_downloads_in_background (EphyWindow *window,
 }
 
 static gboolean
-tab_view_close_page_cb (HdyTabView *tab_view,
-                        HdyTabPage *page,
+tab_view_close_page_cb (AdwTabView *tab_view,
+                        AdwTabPage *page,
                         EphyWindow *window)
 {
-  EphyEmbed *embed = EPHY_EMBED (hdy_tab_page_get_child (page));
+  EphyEmbed *embed = EPHY_EMBED (adw_tab_page_get_child (page));
 
-  if (hdy_tab_page_get_pinned (page))
+  if (adw_tab_page_get_pinned (page))
     return GDK_EVENT_PROPAGATE;
 
   if (ephy_tab_view_get_n_pages (window->tab_view) == 1) {
     if (g_settings_get_boolean (EPHY_SETTINGS_LOCKDOWN,
                                 EPHY_PREFS_LOCKDOWN_QUIT)) {
-      hdy_tab_view_close_page_finish (tab_view, page, FALSE);
+      adw_tab_view_close_page_finish (tab_view, page, FALSE);
       return GDK_EVENT_STOP;
     }
 
@@ -2928,7 +2926,7 @@ tab_view_close_page_cb (HdyTabView *tab_view,
       if (ephy_downloads_manager_has_active_downloads (manager)) {
         GList *list = ephy_downloads_manager_get_downloads (manager);
         run_downloads_in_background (window, g_list_length (list));
-        hdy_tab_view_close_page_finish (tab_view, page, FALSE);
+        adw_tab_view_close_page_finish (tab_view, page, FALSE);
         return GDK_EVENT_STOP;
       }
     }
@@ -2957,8 +2955,8 @@ tab_view_close_page_cb (HdyTabView *tab_view,
   return GDK_EVENT_PROPAGATE;
 }
 
-static HdyTabView *
-tab_view_create_window_cb (HdyTabView *tab_view,
+static AdwTabView *
+tab_view_create_window_cb (AdwTabView *tab_view,
                            EphyWindow *window)
 {
   EphyWindow *new_window;
@@ -2966,7 +2964,6 @@ tab_view_create_window_cb (HdyTabView *tab_view,
   new_window = ephy_window_new ();
 
   new_window->present_on_insert = TRUE;
-  new_window->present_on_insert_user_time = gtk_get_current_event_time ();
 
   return ephy_tab_view_get_tab_view (new_window->tab_view);
 }
@@ -2986,10 +2983,9 @@ ephy_window_update_entry_focus (EphyWindow  *window,
     return;
 
   title_widget = GTK_WIDGET (ephy_header_bar_get_title_widget (EPHY_HEADER_BAR (window->header_bar)));
-  if (EPHY_IS_LOCATION_ENTRY (title_widget)) {
-    entry = ephy_location_entry_get_entry (EPHY_LOCATION_ENTRY (title_widget));
-    gtk_entry_grab_focus_without_selecting (GTK_ENTRY (entry));
-  }
+
+  if (EPHY_IS_LOCATION_ENTRY (title_widget))
+    ephy_location_bar_grab_focus_without_selecting (EPHY_LOCATION_ENTRY (title_widget));
 }
 
 static void
@@ -3030,15 +3026,14 @@ static EphyTabView *
 setup_tab_view (EphyWindow *window)
 {
   EphyTabView *tab_view = ephy_tab_view_new ();
-  HdyTabView *view = ephy_tab_view_get_tab_view (tab_view);
+  AdwTabView *view = ephy_tab_view_get_tab_view (tab_view);
   g_autoptr (GtkBuilder) builder = NULL;
 
   gtk_widget_set_vexpand (GTK_WIDGET (tab_view), TRUE);
 
   builder = gtk_builder_new_from_resource ("/org/gnome/epiphany/gtk/notebook-context-menu.ui");
 
-  hdy_tab_view_set_menu_model (view, G_MENU_MODEL (gtk_builder_get_object (builder, "notebook-menu")));
-  hdy_tab_view_set_shortcut_widget (view, GTK_WIDGET (window));
+  adw_tab_view_set_menu_model (view, G_MENU_MODEL (gtk_builder_get_object (builder, "notebook-menu")));
 
   g_signal_connect_object (view, "notify::selected-page",
                            G_CALLBACK (tab_view_notify_selected_page_cb),
@@ -3145,15 +3140,13 @@ ephy_window_get_property (GObject    *object,
     case PROP_SINGLE_TAB_MODE:
       g_value_set_boolean (value, window->is_popup);
       break;
-    case PROP_FULLSCREEN:
-      g_value_set_boolean (value, window->is_fullscreen);
-      break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
       break;
   }
 }
 
+#if 0
 static gboolean
 ephy_window_state_event (GtkWidget           *widget,
                          GdkEventWindowState *event)
@@ -3161,32 +3154,8 @@ ephy_window_state_event (GtkWidget           *widget,
   EphyWindow *window = EPHY_WINDOW (widget);
   gboolean result = GDK_EVENT_PROPAGATE;
 
-  if (event->changed_mask & GDK_WINDOW_STATE_FULLSCREEN) {
-    GActionGroup *action_group;
-    GAction *action;
-    gboolean fullscreen;
-
-    fullscreen = !!(event->new_window_state & GDK_WINDOW_STATE_FULLSCREEN);
-
-    if (fullscreen) {
-      ephy_window_fullscreen (window);
-    } else {
-      ephy_window_unfullscreen (window);
-    }
-
-    ephy_fullscreen_box_set_fullscreen (window->fullscreen_box, fullscreen && 
window->show_fullscreen_header_bar);
-    gtk_widget_set_visible (GTK_WIDGET (window->titlebar_box), !fullscreen || 
window->show_fullscreen_header_bar);
-
-    window->show_fullscreen_header_bar = FALSE;
-
-    action_group = gtk_widget_get_action_group (GTK_WIDGET (window), "win");
-    action = g_action_map_lookup_action (G_ACTION_MAP (action_group), "fullscreen");
-
-    g_simple_action_set_state (G_SIMPLE_ACTION (action),
-                               g_variant_new_boolean (fullscreen));
-  } else if (event->changed_mask & GDK_WINDOW_STATE_MAXIMIZED) {
+  if (event->changed_mask & GDK_WINDOW_STATE_MAXIMIZED)
     window->is_maximized = !!(event->new_window_state & GDK_WINDOW_STATE_MAXIMIZED);
-  }
 
   update_adaptive_mode (window);
 
@@ -3195,6 +3164,7 @@ ephy_window_state_event (GtkWidget           *widget,
 
   return result;
 }
+#endif
 
 void
 ephy_window_set_default_size (EphyWindow *window,
@@ -3210,8 +3180,6 @@ ephy_window_set_default_position (EphyWindow *window,
                                   gint        x,
                                   gint        y)
 {
-  gtk_window_move (GTK_WINDOW (window), x, y);
-  window->has_default_position = TRUE;
 }
 
 static void
@@ -3228,20 +3196,6 @@ ephy_window_show (GtkWidget *widget)
   if (window->is_maximized)
     gtk_window_maximize (GTK_WINDOW (window));
   else {
-    if (!window->has_default_position) {
-      g_settings_get (EPHY_SETTINGS_STATE,
-                      "window-position", "(ii)",
-                      &window->current_x,
-                      &window->current_y);
-      if (window->current_x >= 0 && window->current_y >= 0) {
-        gtk_window_move (GTK_WINDOW (window),
-                         window->current_x,
-                         window->current_y);
-      }
-
-      window->has_default_position = TRUE;
-    }
-
     if (!window->has_default_size) {
       g_settings_get (EPHY_SETTINGS_STATE,
                       "window-size", "(ii)",
@@ -3249,9 +3203,9 @@ ephy_window_show (GtkWidget *widget)
                       &window->current_height);
 
       if (window->current_width > 0 && window->current_height > 0) {
-        gtk_window_resize (GTK_WINDOW (window),
-                           window->current_width,
-                           window->current_height);
+        gtk_window_set_default_size (GTK_WINDOW (window),
+                                     window->current_width,
+                                     window->current_height);
       }
 
       window->has_default_size = TRUE;
@@ -3263,6 +3217,7 @@ ephy_window_show (GtkWidget *widget)
   GTK_WIDGET_CLASS (ephy_window_parent_class)->show (widget);
 }
 
+#if 0
 static gboolean
 ephy_window_should_save_state (EphyWindow *window)
 {
@@ -3294,12 +3249,17 @@ ephy_window_destroy (GtkWidget *widget)
 
   GTK_WIDGET_CLASS (ephy_window_parent_class)->destroy (widget);
 }
+#endif
 
 static void
 ephy_window_finalize (GObject *object)
 {
+  EphyWindow *window = EPHY_WINDOW (object);
+
   G_OBJECT_CLASS (ephy_window_parent_class)->finalize (object);
 
+  g_hash_table_unref (window->action_groups);
+
   LOG ("EphyWindow finalised %p", object);
 }
 
@@ -3326,6 +3286,7 @@ sync_user_input_cb (EphyLocationController *action,
   window->updating_address = FALSE;
 }
 
+#if 0
 static void
 security_popover_notify_visible_cb (GtkWidget  *widget,
                                     GParamSpec *param,
@@ -3363,6 +3324,7 @@ title_widget_lock_clicked_cb (EphyTitleWidget *title_widget,
   gtk_popover_set_position (GTK_POPOVER (security_popover), GTK_POS_BOTTOM);
   gtk_popover_popup (GTK_POPOVER (security_popover));
 }
+#endif
 
 static GtkWidget *
 setup_header_bar (EphyWindow *window)
@@ -3370,19 +3332,11 @@ setup_header_bar (EphyWindow *window)
   GtkWidget *header_bar;
   EphyTitleWidget *title_widget;
 
-  window->window_handle = hdy_window_handle_new ();
   header_bar = ephy_header_bar_new (window);
 
-  gtk_container_add (GTK_CONTAINER (window->window_handle), header_bar);
-
-  gtk_widget_show (window->window_handle);
-  gtk_widget_show (header_bar);
-
-  gtk_style_context_add_class (gtk_widget_get_style_context (header_bar), "titlebar");
-
-  title_widget = ephy_header_bar_get_title_widget (EPHY_HEADER_BAR (header_bar));
-  g_signal_connect (title_widget, "lock-clicked",
-                    G_CALLBACK (title_widget_lock_clicked_cb), window);
+//  title_widget = ephy_header_bar_get_title_widget (EPHY_HEADER_BAR (header_bar));
+//  g_signal_connect (title_widget, "lock-clicked",
+//                    G_CALLBACK (title_widget_lock_clicked_cb), window);
 
   return header_bar;
 }
@@ -3391,7 +3345,7 @@ static void
 update_pages_menu_revealer (EphyWindow *window)
 {
   gtk_revealer_set_reveal_child (window->pages_menu_revealer,
-                                 hdy_tab_bar_get_is_overflowing (window->tab_bar) ||
+                                 adw_tab_bar_get_is_overflowing (window->tab_bar) ||
                                  gtk_widget_get_visible (GTK_WIDGET (window->pages_popover)));
 }
 
@@ -3405,17 +3359,17 @@ setup_tabs_menu (EphyWindow *window)
   revealer = GTK_REVEALER (gtk_revealer_new ());
   gtk_revealer_set_transition_type (revealer,
                                     GTK_REVEALER_TRANSITION_TYPE_SLIDE_LEFT);
-  hdy_tab_bar_set_end_action_widget (window->tab_bar, GTK_WIDGET (revealer));
+  adw_tab_bar_set_end_action_widget (window->tab_bar, GTK_WIDGET (revealer));
   window->pages_menu_revealer = revealer;
 
   menu_button = gtk_menu_button_new ();
-  gtk_button_set_relief (GTK_BUTTON (menu_button), GTK_RELIEF_NONE);
+  gtk_widget_add_css_class (menu_button, "flat");
   /* Translators: tooltip for the tab switcher menu button */
   gtk_widget_set_tooltip_text (menu_button, _("View open tabs"));
   gtk_widget_set_margin_start (menu_button, 1);
-  gtk_container_add (GTK_CONTAINER (revealer), menu_button);
+  gtk_revealer_set_child (revealer, menu_button);
 
-  popover = ephy_pages_popover_new (menu_button);
+  popover = ephy_pages_popover_new ();
   ephy_pages_popover_set_tab_view (popover, window->tab_view);
   gtk_menu_button_set_popover (GTK_MENU_BUTTON (menu_button),
                                GTK_WIDGET (popover));
@@ -3427,8 +3381,6 @@ setup_tabs_menu (EphyWindow *window)
   g_signal_connect_object (window->pages_popover, "notify::visible",
                            G_CALLBACK (update_pages_menu_revealer), window,
                            G_CONNECT_SWAPPED);
-
-  gtk_widget_show_all (GTK_WIDGET (revealer));
 }
 
 static EphyLocationController *
@@ -3456,7 +3408,6 @@ setup_action_bar (EphyWindow *window)
   GtkWidget *action_bar;
 
   action_bar = GTK_WIDGET (ephy_action_bar_new (window));
-  gtk_widget_show (action_bar);
 
   g_object_bind_property (window->fullscreen_box, "revealed",
                           action_bar, "can-reveal",
@@ -3520,6 +3471,7 @@ set_as_default_browser ()
   }
 }
 
+#if 0
 static void
 on_default_browser_question_response (GtkInfoBar *info_bar,
                                       gint        response_id,
@@ -3561,9 +3513,8 @@ add_default_browser_question (GtkBox *box)
   g_signal_connect (info_bar, "response", G_CALLBACK (on_default_browser_question_response), NULL);
 
   gtk_box_pack_start (box, info_bar, FALSE, TRUE, 0);
-
-  gtk_widget_show (info_bar);
 }
+#endif
 
 static gboolean
 is_browser_default (void)
@@ -3599,14 +3550,14 @@ download_completed_cb (EphyDownload *download,
 }
 
 static void
-notify_deck_child_cb (EphyWindow *window)
+notify_leaflet_child_cb (EphyWindow *window)
 {
   GActionGroup *action_group;
   GAction *action;
   gboolean pages_open;
 
-  pages_open = hdy_deck_get_visible_child (HDY_DECK (window->main_deck)) == GTK_WIDGET (window->pages_view);
-  action_group = gtk_widget_get_action_group (GTK_WIDGET (window), "win");
+  pages_open = adw_leaflet_get_visible_child (ADW_LEAFLET (window->main_leaflet)) == GTK_WIDGET 
(window->pages_view);
+  action_group = ephy_window_get_action_group (window, "win");
 
   action = g_action_map_lookup_action (G_ACTION_MAP (action_group), "content");
   g_simple_action_set_enabled (G_SIMPLE_ACTION (action), pages_open);
@@ -3616,19 +3567,33 @@ notify_deck_child_cb (EphyWindow *window)
 }
 
 static void
-ephy_window_size_allocate (GtkWidget     *widget,
-                           GtkAllocation *allocation)
+ephy_window_size_allocate (GtkWidget *widget,
+                           int        width,
+                           int        height,
+                           int        baseline)
 {
   EphyWindow *window = EPHY_WINDOW (widget);
 
-  GTK_WIDGET_CLASS (ephy_window_parent_class)->size_allocate (widget, allocation);
+  GTK_WIDGET_CLASS (ephy_window_parent_class)->size_allocate (widget, width,
+                                                              height, baseline);
 
-  if (!(window->is_maximized || window->is_fullscreen))
-    gtk_window_get_size (GTK_WINDOW (widget), &window->current_width, &window->current_height);
+  if (!(window->is_maximized || window->is_fullscreen)) {
+    window->current_width = width;
+    window->current_height = height;
+  }
 
   update_adaptive_mode (window);
 }
 
+static void
+insert_action_group (const char   *prefix,
+                     GActionGroup *group,
+                     GtkWidget    *widget)
+{
+  gtk_widget_insert_action_group (widget, prefix, group);
+
+}
+
 static void
 ephy_window_constructed (GObject *object)
 {
@@ -3647,41 +3612,42 @@ ephy_window_constructed (GObject *object)
 
   window = EPHY_WINDOW (object);
 
+  window->action_groups = g_hash_table_new_full (g_str_hash,
+                                                 g_str_equal,
+                                                 g_free,
+                                                 NULL);
+
   /* Add actions */
   simple_action_group = g_simple_action_group_new ();
   g_action_map_add_action_entries (G_ACTION_MAP (simple_action_group),
                                    window_entries,
                                    G_N_ELEMENTS (window_entries),
                                    window);
-  gtk_widget_insert_action_group (GTK_WIDGET (window),
-                                  "win",
-                                  G_ACTION_GROUP (simple_action_group));
+  g_hash_table_insert (window->action_groups, g_strdup ("win"), simple_action_group);
 
   simple_action_group = g_simple_action_group_new ();
   g_action_map_add_action_entries (G_ACTION_MAP (simple_action_group),
                                    tab_entries,
                                    G_N_ELEMENTS (tab_entries),
                                    window);
-  gtk_widget_insert_action_group (GTK_WIDGET (window), "tab",
-                                  G_ACTION_GROUP (simple_action_group));
+  g_hash_table_insert (window->action_groups, g_strdup ("tab"), simple_action_group);
 
   simple_action_group = g_simple_action_group_new ();
   g_action_map_add_action_entries (G_ACTION_MAP (simple_action_group),
                                    toolbar_entries,
                                    G_N_ELEMENTS (toolbar_entries),
                                    window);
-  gtk_widget_insert_action_group (GTK_WIDGET (window),
-                                  "toolbar",
-                                  G_ACTION_GROUP (simple_action_group));
+  g_hash_table_insert (window->action_groups, g_strdup ("toolbar"), simple_action_group);
 
   simple_action_group = g_simple_action_group_new ();
   g_action_map_add_action_entries (G_ACTION_MAP (simple_action_group),
                                    popup_entries,
                                    G_N_ELEMENTS (popup_entries),
                                    window);
-  gtk_widget_insert_action_group (GTK_WIDGET (window),
-                                  "popup",
-                                  G_ACTION_GROUP (simple_action_group));
+  g_hash_table_insert (window->action_groups, g_strdup ("popup"), simple_action_group);
+
+  g_hash_table_foreach (window->action_groups,
+                        (GHFunc) insert_action_group, window);
 
   window->action_labels = g_hash_table_new_full (g_str_hash,
                                                  g_str_equal,
@@ -3710,20 +3676,24 @@ ephy_window_constructed (GObject *object)
                                            accels_navigation_ltr_rtl[i].accelerators);
   }
 
+  g_signal_connect (window, "notify::fullscreened",
+                    G_CALLBACK (notify_fullscreen_cb), NULL);
+
   ephy_gui_ensure_window_group (GTK_WINDOW (window));
 
   window->tab_view = setup_tab_view (window);
-  window->tab_bar = hdy_tab_bar_new ();
+  window->tab_bar = adw_tab_bar_new ();
   window->tab_bar_revealer = GTK_REVEALER (gtk_revealer_new ());
-  window->main_deck = hdy_deck_new ();
+  window->main_leaflet = adw_leaflet_new ();
   window->fullscreen_box = ephy_fullscreen_box_new ();
   window->pages_view = ephy_pages_view_new ();
 
-  g_signal_connect_swapped (window->main_deck, "notify::visible-child",
-                            G_CALLBACK (notify_deck_child_cb), window);
+  adw_leaflet_set_can_unfold (ADW_LEAFLET (window->main_leaflet), FALSE);
+  g_signal_connect_swapped (window->main_leaflet, "notify::visible-child",
+                            G_CALLBACK (notify_leaflet_child_cb), window);
 
   gtk_revealer_set_transition_type (window->tab_bar_revealer, GTK_REVEALER_TRANSITION_TYPE_SLIDE_DOWN);
-  hdy_tab_bar_set_view (window->tab_bar, ephy_tab_view_get_tab_view (window->tab_view));
+  adw_tab_bar_set_view (window->tab_bar, ephy_tab_view_get_tab_view (window->tab_view));
   ephy_pages_view_set_tab_view (window->pages_view, window->tab_view);
 
   setup_tabs_menu (window);
@@ -3744,38 +3714,30 @@ ephy_window_constructed (GObject *object)
   box = GTK_BOX (gtk_box_new (GTK_ORIENTATION_VERTICAL, 0));
   window->titlebar_box = GTK_BOX (gtk_box_new (GTK_ORIENTATION_VERTICAL, 0));
 
-  if (g_settings_get_boolean (EPHY_SETTINGS_MAIN, EPHY_PREFS_ASK_FOR_DEFAULT) &&
-      !is_browser_default () &&
-      !ephy_profile_dir_is_web_application ())
-    add_default_browser_question (box);
+//  if (g_settings_get_boolean (EPHY_SETTINGS_MAIN, EPHY_PREFS_ASK_FOR_DEFAULT) &&
+//      !is_browser_default () &&
+//      !ephy_profile_dir_is_web_application ())
+//    add_default_browser_question (box);
 
-  gtk_container_add (GTK_CONTAINER (window->tab_bar_revealer), GTK_WIDGET (window->tab_bar));
-  gtk_box_pack_start (window->titlebar_box, GTK_WIDGET (window->window_handle), FALSE, TRUE, 0);
-  gtk_box_pack_start (window->titlebar_box, GTK_WIDGET (window->tab_bar_revealer), FALSE, TRUE, 0);
-  gtk_box_pack_start (box, GTK_WIDGET (window->tab_view), FALSE, TRUE, 0);
-  gtk_box_pack_start (box, GTK_WIDGET (window->action_bar), FALSE, TRUE, 0);
+  gtk_revealer_set_child (window->tab_bar_revealer, GTK_WIDGET (window->tab_bar));
+  gtk_box_append (window->titlebar_box, GTK_WIDGET (window->header_bar));
+  gtk_box_append (window->titlebar_box, GTK_WIDGET (window->tab_bar_revealer));
+  gtk_box_append (box, GTK_WIDGET (window->tab_view));
+  gtk_box_append (box, GTK_WIDGET (window->action_bar));
   ephy_fullscreen_box_set_content (window->fullscreen_box, GTK_WIDGET (box));
   ephy_fullscreen_box_set_titlebar (window->fullscreen_box, GTK_WIDGET (window->titlebar_box));
 
-  gtk_container_add (GTK_CONTAINER (window->main_deck), GTK_WIDGET (window->fullscreen_box));
-  gtk_container_add (GTK_CONTAINER (window->main_deck), GTK_WIDGET (window->pages_view));
-  gtk_container_add (GTK_CONTAINER (window), GTK_WIDGET (window->main_deck));
-  gtk_widget_show (GTK_WIDGET (window->main_deck));
-  gtk_widget_show (GTK_WIDGET (window->pages_view));
-  gtk_widget_show (GTK_WIDGET (window->fullscreen_box));
-  gtk_widget_show (GTK_WIDGET (window->titlebar_box));
-  gtk_widget_show (GTK_WIDGET (box));
-  gtk_widget_show (GTK_WIDGET (window->tab_view));
-  gtk_widget_show (GTK_WIDGET (window->tab_bar));
-  gtk_widget_show (GTK_WIDGET (window->tab_bar_revealer));
+  adw_leaflet_append (ADW_LEAFLET (window->main_leaflet), GTK_WIDGET (window->fullscreen_box));
+  adw_leaflet_append (ADW_LEAFLET (window->main_leaflet), GTK_WIDGET (window->pages_view));
+  adw_application_window_set_content (ADW_APPLICATION_WINDOW (window), GTK_WIDGET (window->main_leaflet));
 
   ephy_tab_view_set_tab_bar (window->tab_view, window->tab_bar);
 
-  hdy_deck_set_visible_child (HDY_DECK (window->main_deck), GTK_WIDGET (window->fullscreen_box));
-  hdy_deck_set_can_swipe_back (HDY_DECK (window->main_deck), TRUE);
+  adw_leaflet_set_visible_child (ADW_LEAFLET (window->main_leaflet), GTK_WIDGET (window->fullscreen_box));
+  adw_leaflet_set_can_navigate_back (ADW_LEAFLET (window->main_leaflet), TRUE);
 
   /* other notifiers */
-  action_group = gtk_widget_get_action_group (GTK_WIDGET (window), "win");
+  action_group = ephy_window_get_action_group (window, "win");
   action = g_action_map_lookup_action (G_ACTION_MAP (action_group),
                                        "browse-with-caret");
 
@@ -3787,8 +3749,7 @@ ephy_window_constructed (GObject *object)
                                 NULL,
                                 action, NULL);
 
-  action_group = gtk_widget_get_action_group (GTK_WIDGET (window),
-                                              "win");
+  action_group = ephy_window_get_action_group (window, "win");
 
   /* Disable actions not needed for popup mode. */
   action = g_action_map_lookup_action (G_ACTION_MAP (action_group), "new-tab");
@@ -3796,7 +3757,7 @@ ephy_window_constructed (GObject *object)
                                         SENS_FLAG_CHROME,
                                         window->is_popup);
 
-  action_group = gtk_widget_get_action_group (GTK_WIDGET (window), "popup");
+  action_group = ephy_window_get_action_group (window, "popup");
   action = g_action_map_lookup_action (G_ACTION_MAP (action_group),
                                        "open-link-in-new-tab");
   ephy_action_change_sensitivity_flags (G_SIMPLE_ACTION (action),
@@ -3807,11 +3768,11 @@ ephy_window_constructed (GObject *object)
   if (mode == EPHY_EMBED_SHELL_MODE_APPLICATION) {
     g_object_set (window->location_controller, "editable", FALSE, NULL);
 
-    action_group = gtk_widget_get_action_group (GTK_WIDGET (window), "popup");
+    action_group = ephy_window_get_action_group (window, "popup");
     action = g_action_map_lookup_action (G_ACTION_MAP (action_group), "context-bookmark-page");
     ephy_action_change_sensitivity_flags (G_SIMPLE_ACTION (action), SENS_FLAG_CHROME, TRUE);
 
-    action_group = gtk_widget_get_action_group (GTK_WIDGET (window), "win");
+    action_group = ephy_window_get_action_group (window, "win");
     for (i = 0; i < G_N_ELEMENTS (disabled_actions_for_app_mode); i++) {
       action = g_action_map_lookup_action (G_ACTION_MAP (action_group),
                                            disabled_actions_for_app_mode[i]);
@@ -3820,12 +3781,12 @@ ephy_window_constructed (GObject *object)
     }
     chrome &= ~(EPHY_WINDOW_CHROME_LOCATION | EPHY_WINDOW_CHROME_TABSBAR | EPHY_WINDOW_CHROME_BOOKMARKS);
   } else if (mode == EPHY_EMBED_SHELL_MODE_INCOGNITO) {
-    action_group = gtk_widget_get_action_group (GTK_WIDGET (window), "win");
+    action_group = ephy_window_get_action_group (window, "win");
     action = g_action_map_lookup_action (G_ACTION_MAP (action_group), "bookmark-page");
     ephy_action_change_sensitivity_flags (G_SIMPLE_ACTION (action),
                                           SENS_FLAG_CHROME, TRUE);
 
-    action_group = gtk_widget_get_action_group (GTK_WIDGET (window), "popup");
+    action_group = ephy_window_get_action_group (window, "popup");
     action = g_action_map_lookup_action (G_ACTION_MAP (action_group), "context-bookmark-page");
     ephy_action_change_sensitivity_flags (G_SIMPLE_ACTION (action),
                                           SENS_FLAG_CHROME, TRUE);
@@ -3833,7 +3794,7 @@ ephy_window_constructed (GObject *object)
     g_object_set (window->location_controller, "editable", FALSE, NULL);
   }
 
-  window->mouse_gesture_controller = ephy_mouse_gesture_controller_new (window);
+//  window->mouse_gesture_controller = ephy_mouse_gesture_controller_new (window);
 
   ephy_window_set_chrome (window, chrome);
 
@@ -3853,11 +3814,11 @@ ephy_window_class_init (EphyWindowClass *klass)
   object_class->get_property = ephy_window_get_property;
   object_class->set_property = ephy_window_set_property;
 
-  widget_class->key_press_event = ephy_window_key_press_event;
-  widget_class->window_state_event = ephy_window_state_event;
+//  widget_class->key_press_event = ephy_window_key_press_event;
+//  widget_class->window_state_event = ephy_window_state_event;
   widget_class->show = ephy_window_show;
-  widget_class->destroy = ephy_window_destroy;
-  widget_class->delete_event = ephy_window_delete_event;
+//  widget_class->destroy = ephy_window_destroy;
+//  widget_class->delete_event = ephy_window_delete_event;
   widget_class->size_allocate = ephy_window_size_allocate;
 
   g_object_class_override_property (object_class,
@@ -3878,15 +3839,6 @@ ephy_window_class_init (EphyWindowClass *klass)
                                                        G_PARAM_READWRITE |
                                                        G_PARAM_STATIC_STRINGS));
 
-  g_object_class_install_property (object_class,
-                                   PROP_FULLSCREEN,
-                                   g_param_spec_boolean ("fullscreen",
-                                                         NULL,
-                                                         NULL,
-                                                         FALSE,
-                                                         G_PARAM_READABLE |
-                                                         G_PARAM_STATIC_STRINGS));
-
   manager = ephy_embed_shell_get_downloads_manager (EPHY_EMBED_SHELL (ephy_shell_get_default ()));
   g_signal_connect (manager, "download-completed", G_CALLBACK (download_completed_cb), NULL);
 }
@@ -3943,7 +3895,7 @@ ephy_window_open_pages_view (EphyWindow *window)
 {
   g_assert (EPHY_IS_WINDOW (window));
 
-  hdy_deck_navigate (HDY_DECK (window->main_deck), HDY_NAVIGATION_DIRECTION_FORWARD);
+  adw_leaflet_navigate (ADW_LEAFLET (window->main_leaflet), ADW_NAVIGATION_DIRECTION_FORWARD);
 }
 
 /**
@@ -3957,7 +3909,7 @@ ephy_window_close_pages_view (EphyWindow *window)
 {
   g_assert (EPHY_IS_WINDOW (window));
 
-  hdy_deck_navigate (HDY_DECK (window->main_deck), HDY_NAVIGATION_DIRECTION_BACK);
+  adw_leaflet_navigate (ADW_LEAFLET (window->main_leaflet), ADW_NAVIGATION_DIRECTION_BACK);
 }
 
 /**
@@ -4027,7 +3979,6 @@ ephy_window_location_search (EphyWindow *window)
 {
   EphyTitleWidget *title_widget = ephy_header_bar_get_title_widget (EPHY_HEADER_BAR (window->header_bar));
   EphyLocationEntry *location_entry = EPHY_LOCATION_ENTRY (title_widget);
-  GtkEntry *location_gtk_entry = GTK_ENTRY (ephy_location_entry_get_entry (location_entry));
   GtkApplication *gtk_application = gtk_window_get_application (GTK_WINDOW (window));
   EphyEmbedShell *embed_shell = EPHY_EMBED_SHELL (gtk_application);
   EphySearchEngineManager *search_engine_manager = ephy_embed_shell_get_search_engine_manager (embed_shell);
@@ -4035,9 +3986,9 @@ ephy_window_location_search (EphyWindow *window)
   const char *search_engine_bang = ephy_search_engine_manager_get_bang (search_engine_manager, 
search_engine_name);
   char *entry_text = g_strconcat (search_engine_bang, " ", NULL);
 
-  gtk_window_set_focus (GTK_WINDOW (window), GTK_WIDGET (location_gtk_entry));
-  gtk_entry_set_text (location_gtk_entry, entry_text);
-  gtk_editable_set_position (GTK_EDITABLE (location_gtk_entry), strlen (entry_text));
+  gtk_window_set_focus (GTK_WINDOW (window), GTK_WIDGET (location_entry));
+  gtk_editable_set_text (GTK_EDITABLE (location_entry), entry_text);
+  gtk_editable_set_position (GTK_EDITABLE (location_entry), strlen (entry_text));
 
   g_free (entry_text);
   g_free (search_engine_name);
@@ -4186,7 +4137,7 @@ finish_window_close_after_modified_forms_check (WindowHasModifiedFormsData *data
   should_close = ephy_window_close (data->window);
   data->window->force_close = FALSE;
   if (should_close)
-    gtk_widget_destroy (GTK_WIDGET (data->window));
+    gtk_window_destroy (GTK_WINDOW (data->window));
 
   window_has_modified_forms_data_free (data);
 }
@@ -4196,7 +4147,7 @@ confirm_close_window_with_modified_forms_cb (GtkDialog                  *dialog,
                                              GtkResponseType             response,
                                              WindowHasModifiedFormsData *data)
 {
-  gtk_widget_destroy (GTK_WIDGET (dialog));
+  gtk_window_destroy (GTK_WINDOW (dialog));
 
   if (response == GTK_RESPONSE_ACCEPT)
     finish_window_close_after_modified_forms_check (data);
@@ -4301,7 +4252,7 @@ window_close_with_multiple_tabs_cb (GtkDialog       *dialog,
                                     GtkResponseType  response,
                                     EphyWindow      *window)
 {
-  gtk_widget_destroy (GTK_WIDGET (dialog));
+  gtk_window_destroy (GTK_WINDOW (dialog));
 
   if (response == GTK_RESPONSE_ACCEPT) {
     window->confirmed_close_with_multiple_tabs = TRUE;
@@ -4424,3 +4375,11 @@ ephy_window_get_geometry (EphyWindow   *window,
   rectangle->width = window->current_width;
   rectangle->height = window->current_height;
 }
+
+GActionGroup *
+ephy_window_get_action_group (EphyWindow *window,
+                              const char *prefix)
+{
+  return g_hash_table_lookup (window->action_groups, prefix);
+}
+
diff --git a/src/ephy-window.h b/src/ephy-window.h
index 35997a3d9..76c39a0be 100644
--- a/src/ephy-window.h
+++ b/src/ephy-window.h
@@ -27,13 +27,13 @@
 #include "ephy-tab-view.h"
 #include "ephy-web-view.h"
 
-#include <handy.h>
+#include <adwaita.h>
 
 G_BEGIN_DECLS
 
 #define EPHY_TYPE_WINDOW (ephy_window_get_type ())
 
-G_DECLARE_FINAL_TYPE (EphyWindow, ephy_window, EPHY, WINDOW, HdyApplicationWindow)
+G_DECLARE_FINAL_TYPE (EphyWindow, ephy_window, EPHY, WINDOW, AdwApplicationWindow)
 
 typedef enum
 {
@@ -95,6 +95,9 @@ gboolean          ephy_window_is_fullscreen              (EphyWindow *window);
 void              ephy_window_get_geometry               (EphyWindow   *window,
                                                           GdkRectangle *rectangle);
 
+GActionGroup     *ephy_window_get_action_group           (EphyWindow  *window,
+                                                          const char  *prefix);
+
 void ephy_window_sync_bookmark_state (GtkWidget             *widget,
                                       EphyBookmarkIconState  state);
 
diff --git a/src/meson.build b/src/meson.build
index eaee92180..aa5bb5bf6 100644
--- a/src/meson.build
+++ b/src/meson.build
@@ -13,14 +13,14 @@ enums = gnome.mkenums_simple('ephy-type-builtins',
 subdir('webextension')
 
 libephymain_sources = [
-  'bookmarks/ephy-add-bookmark-popover.c',
+#  'bookmarks/ephy-add-bookmark-popover.c',
   'bookmarks/ephy-bookmark.c',
   'bookmarks/ephy-bookmark-properties.c',
   'bookmarks/ephy-bookmark-row.c',
   'bookmarks/ephy-bookmarks-export.c',
   'bookmarks/ephy-bookmarks-import.c',
   'bookmarks/ephy-bookmarks-manager.c',
-  'bookmarks/ephy-bookmarks-popover.c',
+#  'bookmarks/ephy-bookmarks-popover.c',
   'ephy-action-bar.c',
   'ephy-action-bar-end.c',
   'ephy-action-bar-start.c',
@@ -35,7 +35,7 @@ libephymain_sources = [
   'ephy-link.c',
   'ephy-location-controller.c',
   'ephy-lockdown.c',
-  'ephy-mouse-gesture-controller.c',
+#  'ephy-mouse-gesture-controller.c',
   'ephy-page-row.c',
   'ephy-pages-button.c',
   'ephy-pages-popover.c',
@@ -52,13 +52,13 @@ libephymain_sources = [
   'preferences/ephy-lang-row.c',
   'preferences/ephy-prefs-dialog.c',
   'preferences/passwords-view.c',
-  'preferences/ephy-search-engine-listbox.c',
-  'preferences/ephy-search-engine-row.c',
+#  'preferences/ephy-search-engine-listbox.c',
+#  'preferences/ephy-search-engine-row.c',
   'preferences/prefs-appearance-page.c',
-  'preferences/prefs-general-page.c',
+#  'preferences/prefs-general-page.c',
   'preferences/prefs-privacy-page.c',
   'preferences/webapp-additional-urls-dialog.c',
-  'synced-tabs-dialog.c',
+#  'synced-tabs-dialog.c',
   'window-commands.c',
   ephywebextension_src,
   compile_schemas,
@@ -73,7 +73,7 @@ libephymain_deps = [
   ephywidgets_dep,
   gvdb_dep,
   libarchive_dep,
-  libhandy_dep
+  libadwaita_dep
 ]
 
 libephymain_includes = include_directories(
diff --git a/src/popup-commands.c b/src/popup-commands.c
index 2f321a190..fb025d881 100644
--- a/src/popup-commands.c
+++ b/src/popup-commands.c
@@ -107,8 +107,9 @@ static void
 popup_cmd_copy_to_clipboard (EphyWindow *window,
                              const char *text)
 {
-  gtk_clipboard_set_text (gtk_clipboard_get_default (gdk_display_get_default ()),
-                          text, -1);
+  GdkClipboard *clipboard = gtk_widget_get_clipboard (GTK_WIDGET (window));
+
+  gdk_clipboard_set_text (clipboard, text);
 }
 
 void
@@ -149,6 +150,7 @@ typedef struct {
   EphyDownload *download;
 } SavePropertyURLData;
 
+#if 0
 static void
 filename_confirmed_cb (GtkFileChooser      *dialog,
                        GtkResponseType      response,
@@ -207,6 +209,7 @@ filename_suggested_cb (EphyDownload        *download,
                     G_CALLBACK (filename_confirmed_cb), data);
   gtk_native_dialog_show (GTK_NATIVE_DIALOG (dialog));
 }
+#endif
 
 static void
 save_property_url (const char *title,
@@ -227,9 +230,9 @@ save_property_url (const char *title,
   data->title = g_strdup (title);
   data->window = g_object_ref (window);
   data->download = download;
-  g_signal_connect (download, "filename-suggested",
-                    G_CALLBACK (filename_suggested_cb),
-                    data);
+//  g_signal_connect (download, "filename-suggested",
+//                    G_CALLBACK (filename_suggested_cb),
+//                    data);
 }
 
 void
diff --git a/src/preferences/ephy-data-view.c b/src/preferences/ephy-data-view.c
index 995ac2663..b990d22b2 100644
--- a/src/preferences/ephy-data-view.c
+++ b/src/preferences/ephy-data-view.c
@@ -21,12 +21,13 @@
 #include "config.h"
 #include "ephy-data-view.h"
 
+#include <adwaita.h>
 #include <ctype.h>
 
 typedef struct {
   GtkWidget *box;
   GtkWidget *child;
-  GtkWidget *header_bar;
+  GtkWidget *window_title;
   GtkWidget *back_button;
   GtkWidget *clear_button;
   GtkWidget *search_bar;
@@ -41,9 +42,17 @@ typedef struct {
   gboolean has_search_results : 1;
   gboolean can_clear : 1;
   char *search_text;
+  char *search_description;
 } EphyDataViewPrivate;
 
-G_DEFINE_TYPE_WITH_PRIVATE (EphyDataView, ephy_data_view, GTK_TYPE_BIN)
+static void ephy_data_view_buildable_init (GtkBuildableIface *iface);
+
+G_DEFINE_TYPE_WITH_CODE (EphyDataView, ephy_data_view, GTK_TYPE_WIDGET,
+                         G_ADD_PRIVATE (EphyDataView)
+                         G_IMPLEMENT_INTERFACE (GTK_TYPE_BUILDABLE,
+                                                ephy_data_view_buildable_init))
+
+static GtkBuildableIface *parent_buildable_iface;
 
 enum {
   PROP_0,
@@ -121,13 +130,14 @@ on_search_entry_changed (GtkSearchEntry *entry,
   EphyDataViewPrivate *priv = ephy_data_view_get_instance_private (self);
   const char *text;
 
-  text = gtk_entry_get_text (GTK_ENTRY (entry));
+  text = gtk_editable_get_text (GTK_EDITABLE (entry));
   g_free (priv->search_text);
   priv->search_text = g_strdup (text);
 
   g_object_notify_by_pspec (G_OBJECT (self), obj_properties[PROP_SEARCH_TEXT]);
 }
 
+#if 0
 gboolean
 ephy_data_view_handle_event (EphyDataView *self,
                              GdkEvent     *event)
@@ -169,6 +179,7 @@ ephy_data_view_handle_event (EphyDataView *self,
 
   return GDK_EVENT_PROPAGATE;
 }
+#endif
 
 static void
 ephy_data_view_set_property (GObject      *object,
@@ -181,7 +192,7 @@ ephy_data_view_set_property (GObject      *object,
 
   switch (prop_id) {
     case PROP_TITLE:
-      gtk_header_bar_set_title (GTK_HEADER_BAR (priv->header_bar), g_value_get_string (value));
+      adw_window_title_set_title (ADW_WINDOW_TITLE (priv->window_title), g_value_get_string (value));
       break;
     case PROP_CLEAR_ACTION_NAME:
       gtk_actionable_set_action_name (GTK_ACTIONABLE (priv->clear_button), g_value_get_string (value));
@@ -196,14 +207,18 @@ ephy_data_view_set_property (GObject      *object,
       ephy_data_view_set_clear_button_tooltip (self, g_value_get_string (value));
       break;
     case PROP_SEARCH_DESCRIPTION:
-      gtk_entry_set_placeholder_text (GTK_ENTRY (priv->search_entry), g_value_get_string (value));
-      atk_object_set_description (gtk_widget_get_accessible (GTK_WIDGET (self)), g_value_get_string (value));
+      g_clear_pointer (&priv->search_description, g_free);
+      priv->search_description = g_value_dup_string (value);
+      gtk_accessible_update_property (GTK_ACCESSIBLE (self),
+                                      GTK_ACCESSIBLE_PROPERTY_DESCRIPTION,
+                                      priv->search_description,
+                                      -1);
       break;
     case PROP_EMPTY_TITLE:
-      hdy_status_page_set_title (HDY_STATUS_PAGE (priv->empty_page), g_value_get_string (value));
+      adw_status_page_set_title (ADW_STATUS_PAGE (priv->empty_page), g_value_get_string (value));
       break;
     case PROP_EMPTY_DESCRIPTION:
-      hdy_status_page_set_description (HDY_STATUS_PAGE (priv->empty_page), g_value_get_string (value));
+      adw_status_page_set_description (ADW_STATUS_PAGE (priv->empty_page), g_value_get_string (value));
       break;
     case PROP_IS_LOADING:
       ephy_data_view_set_is_loading (self, g_value_get_boolean (value));
@@ -234,7 +249,7 @@ ephy_data_view_get_property (GObject    *object,
 
   switch (prop_id) {
     case PROP_TITLE:
-      g_value_set_string (value, gtk_header_bar_get_title (GTK_HEADER_BAR (priv->header_bar)));
+      g_value_set_string (value, adw_window_title_get_title (ADW_WINDOW_TITLE (priv->window_title)));
       break;
     case PROP_CLEAR_ACTION_NAME:
       g_value_set_string (value, gtk_actionable_get_action_name (GTK_ACTIONABLE (priv->clear_button)));
@@ -249,13 +264,13 @@ ephy_data_view_get_property (GObject    *object,
       g_value_set_string (value, ephy_data_view_get_clear_button_tooltip (self));
       break;
     case PROP_SEARCH_DESCRIPTION:
-      g_value_set_string (value, gtk_entry_get_placeholder_text (GTK_ENTRY (priv->search_entry)));
+      g_value_set_string (value, priv->search_description);
       break;
     case PROP_EMPTY_TITLE:
-      g_value_set_string (value, hdy_status_page_get_title (HDY_STATUS_PAGE (priv->empty_page)));
+      g_value_set_string (value, adw_status_page_get_title (ADW_STATUS_PAGE (priv->empty_page)));
       break;
     case PROP_EMPTY_DESCRIPTION:
-      g_value_set_string (value, hdy_status_page_get_description (HDY_STATUS_PAGE (priv->empty_page)));
+      g_value_set_string (value, adw_status_page_get_description (ADW_STATUS_PAGE (priv->empty_page)));
       break;
     case PROP_SEARCH_TEXT:
       g_value_set_string (value, ephy_data_view_get_search_text (self));
@@ -279,34 +294,26 @@ ephy_data_view_get_property (GObject    *object,
 }
 
 static void
-ephy_data_view_finalize (GObject *object)
+ephy_data_view_dispose (GObject *object)
 {
   EphyDataView *self = EPHY_DATA_VIEW (object);
   EphyDataViewPrivate *priv = ephy_data_view_get_instance_private (self);
 
-  g_free (priv->search_text);
+  g_clear_pointer (&priv->box, gtk_widget_unparent);
 
-  G_OBJECT_CLASS (ephy_data_view_parent_class)->finalize (object);
+  G_OBJECT_CLASS (ephy_data_view_parent_class)->dispose (object);
 }
 
 static void
-ephy_data_view_add (GtkContainer *container,
-                    GtkWidget    *child)
+ephy_data_view_finalize (GObject *object)
 {
-  EphyDataView *self = EPHY_DATA_VIEW (container);
+  EphyDataView *self = EPHY_DATA_VIEW (object);
   EphyDataViewPrivate *priv = ephy_data_view_get_instance_private (self);
 
-  if (!priv->box) {
-    GTK_CONTAINER_CLASS (ephy_data_view_parent_class)->add (container, child);
-    return;
-  }
-
-  g_assert (!priv->child);
-
-  priv->child = child;
-  gtk_container_add (GTK_CONTAINER (priv->stack), child);
+  g_free (priv->search_text);
+  g_free (priv->search_description);
 
-  update (self);
+  G_OBJECT_CLASS (ephy_data_view_parent_class)->finalize (object);
 }
 
 static void
@@ -314,18 +321,16 @@ ephy_data_view_class_init (EphyDataViewClass *klass)
 {
   GObjectClass *object_class = G_OBJECT_CLASS (klass);
   GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
-  GtkContainerClass *container_class = GTK_CONTAINER_CLASS (klass);
 
   object_class->set_property = ephy_data_view_set_property;
   object_class->get_property = ephy_data_view_get_property;
+  object_class->dispose = ephy_data_view_dispose;
   object_class->finalize = ephy_data_view_finalize;
 
-  container_class->add = ephy_data_view_add;
-
   obj_properties[PROP_TITLE] =
     g_param_spec_string ("title",
                          "Title",
-                         "The title used for the top HdyHeaderBar",
+                         "The title used for the top header bar",
                          NULL,
                          G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
 
@@ -442,7 +447,7 @@ ephy_data_view_class_init (EphyDataViewClass *klass)
                                                "/org/gnome/epiphany/gtk/data-view.ui");
 
   gtk_widget_class_bind_template_child_private (widget_class, EphyDataView, box);
-  gtk_widget_class_bind_template_child_private (widget_class, EphyDataView, header_bar);
+  gtk_widget_class_bind_template_child_private (widget_class, EphyDataView, window_title);
   gtk_widget_class_bind_template_child_private (widget_class, EphyDataView, back_button);
   gtk_widget_class_bind_template_child_private (widget_class, EphyDataView, clear_button);
   gtk_widget_class_bind_template_child_private (widget_class, EphyDataView, empty_page);
@@ -455,6 +460,8 @@ ephy_data_view_class_init (EphyDataViewClass *klass)
   gtk_widget_class_bind_template_callback (widget_class, on_back_button_clicked);
   gtk_widget_class_bind_template_callback (widget_class, on_clear_button_clicked);
   gtk_widget_class_bind_template_callback (widget_class, on_search_entry_changed);
+
+  gtk_widget_class_set_layout_manager_type (widget_class, GTK_TYPE_BIN_LAYOUT);
 }
 
 static void
@@ -464,14 +471,44 @@ ephy_data_view_init (EphyDataView *self)
 
   gtk_widget_init_template (GTK_WIDGET (self));
 
-  hdy_search_bar_connect_entry (HDY_SEARCH_BAR (priv->search_bar), GTK_ENTRY (priv->search_entry));
+  gtk_search_bar_connect_entry (GTK_SEARCH_BAR (priv->search_bar),
+                                GTK_EDITABLE (priv->search_entry));
 
-  hdy_status_page_set_icon_name (HDY_STATUS_PAGE (priv->empty_page),
+  adw_status_page_set_icon_name (ADW_STATUS_PAGE (priv->empty_page),
                                  APPLICATION_ID "-symbolic");
 
   update (self);
 }
 
+static void
+ephy_data_view_add_child (GtkBuildable *buildable,
+                          GtkBuilder   *builder,
+                          GObject      *child,
+                          const char   *type)
+{
+  EphyDataView *self = EPHY_DATA_VIEW (buildable);
+  EphyDataViewPrivate *priv = ephy_data_view_get_instance_private (self);
+
+  if (!priv->box || !GTK_IS_WIDGET (child)) {
+    parent_buildable_iface->add_child (buildable, builder, child, type);
+    return;
+  }
+
+  g_assert (!priv->child);
+
+  priv->child = GTK_WIDGET (child);
+  gtk_stack_add_child (GTK_STACK (priv->stack), priv->child);
+
+  update (self);
+}
+
+static void
+ephy_data_view_buildable_init (GtkBuildableIface *iface)
+{
+  parent_buildable_iface = g_type_interface_peek_parent (iface);
+  iface->add_child = ephy_data_view_add_child;
+}
+
 const gchar *
 ephy_data_view_get_clear_button_label (EphyDataView *self)
 {
diff --git a/src/preferences/ephy-data-view.h b/src/preferences/ephy-data-view.h
index 907451960..9ca22602c 100644
--- a/src/preferences/ephy-data-view.h
+++ b/src/preferences/ephy-data-view.h
@@ -20,17 +20,17 @@
 
 #pragma once
 
-#include <handy.h>
+#include <gtk/gtk.h>
 
 G_BEGIN_DECLS
 
 #define EPHY_TYPE_DATA_VIEW (ephy_data_view_get_type ())
 
-G_DECLARE_DERIVABLE_TYPE (EphyDataView, ephy_data_view, EPHY, DATA_VIEW, GtkBin)
+G_DECLARE_DERIVABLE_TYPE (EphyDataView, ephy_data_view, EPHY, DATA_VIEW, GtkWidget)
 
 struct _EphyDataViewClass
 {
-  GtkBinClass parent_class;
+  GtkWidgetClass parent_class;
 };
 
 const gchar *ephy_data_view_get_clear_button_label (EphyDataView *self);
diff --git a/src/preferences/ephy-lang-row.c b/src/preferences/ephy-lang-row.c
index d2899b3fc..1ea7558b8 100644
--- a/src/preferences/ephy-lang-row.c
+++ b/src/preferences/ephy-lang-row.c
@@ -31,7 +31,7 @@ struct _EphyLangRow {
 
   GtkWidget *dnd_top_revealer;
   GtkWidget *action_row;
-  GtkWidget *drag_event_box;
+  GtkWidget *drag_handle;
   GtkWidget *delete_button;
   GtkWidget *dnd_bottom_revealer;
   char *code;
@@ -78,7 +78,7 @@ ephy_lang_row_class_init (EphyLangRowClass *klass)
 
   gtk_widget_class_bind_template_child (widget_class, EphyLangRow, dnd_top_revealer);
   gtk_widget_class_bind_template_child (widget_class, EphyLangRow, action_row);
-  gtk_widget_class_bind_template_child (widget_class, EphyLangRow, drag_event_box);
+  gtk_widget_class_bind_template_child (widget_class, EphyLangRow, drag_handle);
   gtk_widget_class_bind_template_child (widget_class, EphyLangRow, delete_button);
   gtk_widget_class_bind_template_child (widget_class, EphyLangRow, dnd_bottom_revealer);
 
@@ -101,7 +101,7 @@ void
 ephy_lang_row_set_title (EphyLangRow *self,
                          const char  *title)
 {
-  hdy_preferences_row_set_title (HDY_PREFERENCES_ROW (self->action_row), title);
+  adw_preferences_row_set_title (ADW_PREFERENCES_ROW (self->action_row), title);
 }
 
 void
@@ -121,9 +121,9 @@ ephy_lang_row_get_code (EphyLangRow *self)
 }
 
 GtkWidget *
-ephy_lang_row_get_drag_event_box (EphyLangRow *self)
+ephy_lang_row_get_drag_handle (EphyLangRow *self)
 {
-  return self->drag_event_box;
+  return self->drag_handle;
 }
 
 void
diff --git a/src/preferences/ephy-lang-row.h b/src/preferences/ephy-lang-row.h
index 612bc4f32..42a859112 100644
--- a/src/preferences/ephy-lang-row.h
+++ b/src/preferences/ephy-lang-row.h
@@ -20,7 +20,7 @@
 
 #pragma once
 
-#include <handy.h>
+#include <adwaita.h>
 
 G_BEGIN_DECLS
 
@@ -37,7 +37,7 @@ const char     *ephy_lang_row_get_code                (EphyLangRow *self);
 void            ephy_lang_row_set_code                (EphyLangRow *self,
                                                        const char  *code);
 
-GtkWidget      *ephy_lang_row_get_drag_event_box      (EphyLangRow *self);
+GtkWidget      *ephy_lang_row_get_drag_handle         (EphyLangRow *self);
 
 void            ephy_lang_row_set_delete_sensitive    (EphyLangRow *self,
                                                        gboolean     sensitive);
diff --git a/src/preferences/ephy-prefs-dialog.c b/src/preferences/ephy-prefs-dialog.c
index 6089b0860..ab2207939 100644
--- a/src/preferences/ephy-prefs-dialog.c
+++ b/src/preferences/ephy-prefs-dialog.c
@@ -23,24 +23,25 @@
 #include "config.h"
 
 #include "clear-data-view.h"
-#include "ephy-data-view.h"
+//#include "ephy-data-view.h"
 #include "ephy-embed-utils.h"
 #include "ephy-gui.h"
 #include "ephy-prefs-dialog.h"
 #include "ephy-settings.h"
 #include "passwords-view.h"
-#include "prefs-general-page.h"
+//#include "prefs-general-page.h"
 
 struct _EphyPrefsDialog {
-  HdyPreferencesWindow parent_instance;
+  AdwPreferencesWindow parent_instance;
 
-  PrefsGeneralPage *general_page;
+//  PrefsGeneralPage *general_page;
 
   GtkWidget *active_data_view;
 };
 
-G_DEFINE_TYPE (EphyPrefsDialog, ephy_prefs_dialog, HDY_TYPE_PREFERENCES_WINDOW)
+G_DEFINE_TYPE (EphyPrefsDialog, ephy_prefs_dialog, ADW_TYPE_PREFERENCES_WINDOW)
 
+#if 0
 static gboolean
 on_key_press_event (EphyPrefsDialog *prefs_dialog,
                     GdkEvent        *event,
@@ -60,15 +61,16 @@ static void
 on_delete_event (EphyPrefsDialog *prefs_dialog)
 {
   prefs_general_page_on_pd_delete_event (prefs_dialog->general_page);
-  gtk_widget_destroy (GTK_WIDGET (prefs_dialog));
+  gtk_window_destroy (GTK_WINDOW (prefs_dialog));
   g_settings_apply (EPHY_SETTINGS_MAIN);
 }
+#endif
 
 static void
 on_any_data_view_back_button_clicked (GtkWidget       *data_view,
                                       EphyPrefsDialog *prefs_dialog)
 {
-  hdy_preferences_window_close_subpage (HDY_PREFERENCES_WINDOW (prefs_dialog));
+  adw_preferences_window_close_subpage (ADW_PREFERENCES_WINDOW (prefs_dialog));
 
   prefs_dialog->active_data_view = NULL;
 }
@@ -81,7 +83,7 @@ present_data_view (EphyPrefsDialog *prefs_dialog,
                            G_CALLBACK (on_any_data_view_back_button_clicked),
                            prefs_dialog, 0);
 
-  hdy_preferences_window_present_subpage (HDY_PREFERENCES_WINDOW (prefs_dialog),
+  adw_preferences_window_present_subpage (ADW_PREFERENCES_WINDOW (prefs_dialog),
                                           presented_view);
 
   prefs_dialog->active_data_view = presented_view;
@@ -91,9 +93,7 @@ static void
 on_passwords_row_activated (GtkWidget       *privacy_page,
                             EphyPrefsDialog *prefs_dialog)
 {
-  GtkWidget *view = g_object_new (EPHY_TYPE_PASSWORDS_VIEW,
-                                  "visible", TRUE,
-                                  NULL);
+  GtkWidget *view = g_object_new (EPHY_TYPE_PASSWORDS_VIEW, NULL);
 
   present_data_view (prefs_dialog, view);
 }
@@ -102,9 +102,7 @@ static void
 on_clear_data_row_activated (GtkWidget       *privacy_page,
                              EphyPrefsDialog *prefs_dialog)
 {
-  GtkWidget *view = g_object_new (EPHY_TYPE_CLEAR_DATA_VIEW,
-                                  "visible", TRUE,
-                                  NULL);
+  GtkWidget *view = g_object_new (EPHY_TYPE_CLEAR_DATA_VIEW, NULL);
 
   present_data_view (prefs_dialog, view);
 }
@@ -117,11 +115,11 @@ ephy_prefs_dialog_class_init (EphyPrefsDialogClass *klass)
   gtk_widget_class_set_template_from_resource (widget_class,
                                                "/org/gnome/epiphany/gtk/prefs-dialog.ui");
 
-  gtk_widget_class_bind_template_child (widget_class, EphyPrefsDialog, general_page);
+//  gtk_widget_class_bind_template_child (widget_class, EphyPrefsDialog, general_page);
 
   /* Template file callbacks */
-  gtk_widget_class_bind_template_callback (widget_class, on_key_press_event);
-  gtk_widget_class_bind_template_callback (widget_class, on_delete_event);
+//  gtk_widget_class_bind_template_callback (widget_class, on_key_press_event);
+//  gtk_widget_class_bind_template_callback (widget_class, on_delete_event);
   gtk_widget_class_bind_template_callback (widget_class, on_passwords_row_activated);
   gtk_widget_class_bind_template_callback (widget_class, on_clear_data_row_activated);
 }
diff --git a/src/preferences/ephy-prefs-dialog.h b/src/preferences/ephy-prefs-dialog.h
index d5252ef83..bff692bd0 100644
--- a/src/preferences/ephy-prefs-dialog.h
+++ b/src/preferences/ephy-prefs-dialog.h
@@ -21,12 +21,12 @@
 
 #pragma once
 
-#include <handy.h>
+#include <adwaita.h>
 
 G_BEGIN_DECLS
 
 #define EPHY_TYPE_PREFS_DIALOG (ephy_prefs_dialog_get_type ())
 
-G_DECLARE_FINAL_TYPE (EphyPrefsDialog, ephy_prefs_dialog, EPHY, PREFS_DIALOG, HdyPreferencesWindow)
+G_DECLARE_FINAL_TYPE (EphyPrefsDialog, ephy_prefs_dialog, EPHY, PREFS_DIALOG, AdwPreferencesWindow)
 
 G_END_DECLS
diff --git a/src/preferences/ephy-search-engine-row.c b/src/preferences/ephy-search-engine-row.c
index 30b0377fa..6cf5a8306 100644
--- a/src/preferences/ephy-search-engine-row.c
+++ b/src/preferences/ephy-search-engine-row.c
@@ -30,7 +30,7 @@
 #include "ephy-embed-shell.h"
 
 struct _EphySearchEngineRow {
-  HdyExpanderRow parent_instance;
+  AdwExpanderRow parent_instance;
 
   /* Widgets */
   GtkWidget *name_entry;
@@ -49,7 +49,7 @@ struct _EphySearchEngineRow {
   EphySearchEngineManager *manager;
 };
 
-G_DEFINE_TYPE (EphySearchEngineRow, ephy_search_engine_row, HDY_TYPE_EXPANDER_ROW)
+G_DEFINE_TYPE (EphySearchEngineRow, ephy_search_engine_row, ADW_TYPE_EXPANDER_ROW)
 
 enum {
   PROP_0,
@@ -132,10 +132,10 @@ ephy_search_engine_row_set_can_remove (EphySearchEngineRow *self,
  */
 void
 ephy_search_engine_row_set_radio_button_group (EphySearchEngineRow *self,
-                                               GtkRadioButton      *radio_button_group)
+                                               GtkCheckButton      *radio_button_group)
 {
-  gtk_radio_button_set_group (GTK_RADIO_BUTTON (self->radio_button),
-                              gtk_radio_button_get_group (radio_button_group));
+  gtk_check_button_set_group (GTK_CHECK_BUTTON (self->radio_button),
+                              radio_button_group);
 }
 
 /**
@@ -158,9 +158,11 @@ static gboolean
 search_engine_already_exists (EphySearchEngineRow *searched_row,
                               const char          *engine_name)
 {
-  GList *children = gtk_container_get_children (GTK_CONTAINER (gtk_widget_get_parent (GTK_WIDGET 
(searched_row))));
+  int i;
+  GtkListBoxRow *row;
+  GtkListBox *parent = GTK_LIST_BOX (gtk_widget_get_ancestor (GTK_WIDGET (searched_row), GTK_TYPE_LIST_BOX));
 
-  for (; children->next != NULL; children = children->next) {
+  while ((row = gtk_list_box_get_row_at_index (parent, i++))) {
     EphySearchEngineRow *iterated_row;
 
     /* As it iterates on the whole list box, this function will run on the "add search engine" row, which 
isn't an EphySearchEngineRow. */
@@ -267,7 +269,7 @@ on_bang_entry_text_changed_cb (EphySearchEngineRow *row,
                                GParamSpec          *pspec,
                                GtkEntry            *bang_entry)
 {
-  const char *bang = gtk_entry_get_text (bang_entry);
+  const char *bang = gtk_editable_get_text (GTK_EDITABLE (bang_entry));
   const char *engine_from_bang = ephy_search_engine_manager_engine_from_bang (row->manager, bang);
 
   /* Checks if the bang already exists */
@@ -278,7 +280,7 @@ on_bang_entry_text_changed_cb (EphySearchEngineRow *row,
     ephy_search_engine_manager_modify_engine (row->manager,
                                               row->saved_name,
                                               ephy_search_engine_manager_get_address (row->manager, 
row->saved_name),
-                                              gtk_entry_get_text (bang_entry));
+                                              gtk_editable_get_text (GTK_EDITABLE (bang_entry)));
   }
 }
 
@@ -290,13 +292,13 @@ on_address_entry_text_changed_cb (EphySearchEngineRow *row,
   const char *validation_message = NULL;
 
   /* Address in invalid. */
-  if (!validate_search_engine_address (gtk_entry_get_text (address_entry), &validation_message)) {
+  if (!validate_search_engine_address (gtk_editable_get_text (GTK_EDITABLE (address_entry)), 
&validation_message)) {
     set_entry_as_invalid (address_entry, validation_message);
   } else { /* Address in valid. */
     set_entry_as_valid (address_entry);
     ephy_search_engine_manager_modify_engine (row->manager,
                                               row->saved_name,
-                                              gtk_entry_get_text (address_entry),
+                                              gtk_editable_get_text (GTK_EDITABLE (address_entry)),
                                               ephy_search_engine_manager_get_bang (row->manager,
                                                                                    row->saved_name));
   }
@@ -387,11 +389,11 @@ update_bang_for_name (EphySearchEngineRow *row,
   }
   lowercase_acronym = g_utf8_strdown (acronym, -1); /* Bangs are usually lowercase */
   final_bang = g_strconcat ("!", lowercase_acronym, NULL); /* "!" is the prefix for the bang */
-  gtk_entry_set_text (GTK_ENTRY (row->bang_entry), final_bang);
+  gtk_editable_set_text (GTK_EDITABLE (row->bang_entry), final_bang);
   ephy_search_engine_manager_modify_engine (row->manager,
                                             row->saved_name,
                                             ephy_search_engine_manager_get_address (row->manager, 
row->saved_name),
-                                            gtk_entry_get_text (GTK_ENTRY (row->bang_entry)));
+                                            gtk_editable_get_text (GTK_EDITABLE (row->bang_entry)));
 }
 
 static void
@@ -400,7 +402,7 @@ on_name_entry_text_changed_cb (EphySearchEngineRow *row,
                                GtkEntry            *name_entry)
 {
   EphySearchEngineListBox *search_engine_list_box = EPHY_SEARCH_ENGINE_LIST_BOX (gtk_widget_get_parent 
(GTK_WIDGET (row)));
-  const char *new_name = gtk_entry_get_text (name_entry);
+  const char *new_name = gtk_editable_get_text (GTK_EDITABLE (name_entry));
 
   /* This is an edge case when you copy the whole name then paste it again in
    * place of the whole current name. GtkEntry will record a notify signal even
@@ -413,7 +415,7 @@ on_name_entry_text_changed_cb (EphySearchEngineRow *row,
   g_free (row->previous_name);
   row->previous_name = g_strdup (new_name);
 
-  hdy_preferences_row_set_title (HDY_PREFERENCES_ROW (row), new_name);
+  adw_preferences_row_set_title (ADW_PREFERENCES_ROW (row), new_name);
 
   if (g_strcmp0 (new_name, EMPTY_NEW_SEARCH_ENGINE_NAME) == 0)
     ephy_search_engine_list_box_set_can_add_engine (search_engine_list_box, FALSE);
@@ -469,16 +471,11 @@ on_remove_button_clicked_cb (EphySearchEngineRow *row,
   ephy_search_engine_manager_delete_engine (row->manager,
                                             row->saved_name);
 
-  /* FIXME: this should be fixed in libhandy
-   * Unexpand the row before removing it so the styling isn't broken.
-   * See the checked-expander-row-previous-sibling style class in HdyExpanderRow documentation.
-   */
-  hdy_expander_row_set_expanded (HDY_EXPANDER_ROW (row), FALSE);
   if (!search_engine_already_exists (row, row->saved_name))
     ephy_search_engine_list_box_set_can_add_engine (EPHY_SEARCH_ENGINE_LIST_BOX (parent_list_box),
                                                     TRUE);
 
-  gtk_container_remove (GTK_CONTAINER (parent_list_box), GTK_WIDGET (row));
+  gtk_list_box_remove (parent_list_box, GTK_WIDGET (row));
 
   top_row = EPHY_SEARCH_ENGINE_ROW (gtk_list_box_get_row_at_index (parent_list_box, 0));
   /* Set an other row (the first one) as default search engine to replace this one (if it was the default 
one). */
@@ -533,13 +530,13 @@ on_ephy_search_engine_row_constructed (GObject *object)
   g_assert (self->saved_name != NULL);
   g_assert (g_strcmp0 (self->previous_name, self->saved_name) == 0);
 
-  gtk_entry_set_text (GTK_ENTRY (self->name_entry), self->saved_name);
-  hdy_preferences_row_set_title (HDY_PREFERENCES_ROW (self), self->saved_name);
+  gtk_editable_set_text (GTK_EDITABLE (self->name_entry), self->saved_name);
+  adw_preferences_row_set_title (ADW_PREFERENCES_ROW (self), self->saved_name);
 
-  gtk_entry_set_text (GTK_ENTRY (self->address_entry),
-                      ephy_search_engine_manager_get_address (self->manager, self->saved_name));
-  gtk_entry_set_text (GTK_ENTRY (self->bang_entry),
-                      ephy_search_engine_manager_get_bang (self->manager, self->saved_name));
+  gtk_editable_set_text (GTK_EDITABLE (self->address_entry),
+                         ephy_search_engine_manager_get_address (self->manager, self->saved_name));
+  gtk_editable_set_text (GTK_EDITABLE (self->bang_entry),
+                         ephy_search_engine_manager_get_bang (self->manager, self->saved_name));
 
   /* Tick the radio button if it's the default search engine. */
   if (g_strcmp0 (self->saved_name, default_search_engine_name) == 0)
diff --git a/src/preferences/ephy-search-engine-row.h b/src/preferences/ephy-search-engine-row.h
index 4e5da5555..02f0bfd61 100644
--- a/src/preferences/ephy-search-engine-row.h
+++ b/src/preferences/ephy-search-engine-row.h
@@ -21,20 +21,20 @@
 
 #pragma once
 
-#include <handy.h>
+#include <adwaita.h>
 
 G_BEGIN_DECLS
 
 #define EPHY_TYPE_SEARCH_ENGINE_ROW (ephy_search_engine_row_get_type())
 
-G_DECLARE_FINAL_TYPE (EphySearchEngineRow, ephy_search_engine_row, EPHY, SEARCH_ENGINE_ROW, HdyExpanderRow)
+G_DECLARE_FINAL_TYPE (EphySearchEngineRow, ephy_search_engine_row, EPHY, SEARCH_ENGINE_ROW, AdwExpanderRow)
 
 EphySearchEngineRow *ephy_search_engine_row_new                    (const char *search_engine_name);
 GtkListBoxSortFunc   ephy_search_engine_row_get_sort_func          (void);
 void                 ephy_search_engine_row_set_can_remove         (EphySearchEngineRow *self,
                                                                     gboolean can_remove);
 void                 ephy_search_engine_row_set_radio_button_group (EphySearchEngineRow *self,
-                                                                    GtkRadioButton      *radio_button_group);
+                                                                    GtkCheckButton      *radio_button_group);
 void                 ephy_search_engine_row_set_as_default         (EphySearchEngineRow *self);
 
 G_END_DECLS
diff --git a/src/preferences/passwords-view.c b/src/preferences/passwords-view.c
index f4969f7d6..d994cd55c 100644
--- a/src/preferences/passwords-view.c
+++ b/src/preferences/passwords-view.c
@@ -20,10 +20,9 @@
 
 #include "config.h"
 
-#include <dazzle.h>
+#include <adwaita.h>
 #include <glib/gi18n.h>
 #include <gtk/gtk.h>
-#include <handy.h>
 #include <string.h>
 
 #define SECRET_API_SUBJECT_TO_CHANGE
@@ -67,15 +66,10 @@ ephy_passwords_view_dispose (GObject *object)
 static void
 clear_listbox (GtkWidget *listbox)
 {
-  GList *children, *iter;
+  GtkListBoxRow *row;
 
-  children = gtk_container_get_children (GTK_CONTAINER (listbox));
-
-  for (iter = children; iter; iter = g_list_next (iter)) {
-    gtk_widget_destroy (GTK_WIDGET (iter->data));
-  }
-
-  g_list_free (children);
+  while ((row = gtk_list_box_get_row_at_index (GTK_LIST_BOX (listbox), 0)))
+    gtk_list_box_remove (GTK_LIST_BOX (listbox), GTK_WIDGET (row));
 }
 
 static void
@@ -134,7 +128,7 @@ copy_password_clicked (GtkWidget *button,
   const char *password = user_data;
 
   if (password)
-    gtk_clipboard_set_text (gtk_widget_get_clipboard (GTK_WIDGET (button), GDK_SELECTION_CLIPBOARD), 
password, -1);
+    gdk_clipboard_set_text (gtk_widget_get_clipboard (GTK_WIDGET (button)), password);
 }
 
 static void
@@ -144,7 +138,7 @@ copy_username_clicked (GtkWidget *button,
   const char *username = user_data;
 
   if (username)
-    gtk_clipboard_set_text (gtk_widget_get_clipboard (GTK_WIDGET (button), GDK_SELECTION_CLIPBOARD), 
username, -1);
+    gdk_clipboard_set_text (gtk_widget_get_clipboard (GTK_WIDGET (button)), username);
 }
 
 static void
@@ -167,7 +161,7 @@ confirmation_dialog_response_cb (GtkWidget         *dialog,
                                  int                response,
                                  EphyPasswordsView *self)
 {
-  gtk_widget_destroy (dialog);
+  gtk_window_destroy (GTK_WINDOW (dialog));
 
   if (response == GTK_RESPONSE_ACCEPT) {
     ephy_password_manager_forget_all (self->manager);
@@ -185,9 +179,9 @@ confirmation_dialog_construct (EphyPasswordsView *self)
 {
   GtkWidget *dialog;
   GtkWidget *button;
-  GtkWidget *window;
+  GtkRoot *window;
 
-  window = gtk_widget_get_toplevel (GTK_WIDGET (self));
+  window = gtk_widget_get_root (GTK_WIDGET (self));
 
   dialog = gtk_message_dialog_new (GTK_WINDOW (window),
                                    GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
@@ -247,26 +241,25 @@ populate_model_cb (GList    *records,
     GtkWidget *sub_row;
     GtkWidget *separator;
     GtkWidget *button;
-    GtkWidget *image;
     GtkWidget *entry;
     const char *text;
 
-    row = hdy_expander_row_new ();
+    row = adw_expander_row_new ();
     g_object_set_data (G_OBJECT (row), "record", record);
-    hdy_preferences_row_set_title (HDY_PREFERENCES_ROW (row), ephy_password_record_get_origin (record));
-    hdy_expander_row_set_subtitle (HDY_EXPANDER_ROW (row), ephy_password_record_get_username (record));
-    hdy_expander_row_set_show_enable_switch (HDY_EXPANDER_ROW (row), FALSE);
+    adw_preferences_row_set_title (ADW_PREFERENCES_ROW (row), ephy_password_record_get_origin (record));
+    adw_expander_row_set_subtitle (ADW_EXPANDER_ROW (row), ephy_password_record_get_username (record));
+    adw_expander_row_set_show_enable_switch (ADW_EXPANDER_ROW (row), FALSE);
 
-    button = gtk_button_new_from_icon_name ("edit-copy-symbolic", GTK_ICON_SIZE_BUTTON);
+    button = gtk_button_new_from_icon_name ("edit-copy-symbolic");
     gtk_widget_set_valign (button, GTK_ALIGN_CENTER);
     gtk_widget_set_tooltip_text (button, _("Copy password"));
-    hdy_expander_row_add_action (HDY_EXPANDER_ROW (row), button);
+    adw_expander_row_add_action (ADW_EXPANDER_ROW (row), button);
     g_signal_connect (button, "clicked", G_CALLBACK (copy_password_clicked), (void 
*)(ephy_password_record_get_password (record)));
 
     /* Username */
-    sub_row = hdy_action_row_new ();
-    hdy_preferences_row_set_title (HDY_PREFERENCES_ROW (sub_row), _("Username"));
-    gtk_container_add (GTK_CONTAINER (row), sub_row);
+    sub_row = adw_action_row_new ();
+    adw_preferences_row_set_title (ADW_PREFERENCES_ROW (sub_row), _("Username"));
+    adw_expander_row_add_row (ADW_EXPANDER_ROW (row), sub_row);
 
     entry = gtk_entry_new ();
     gtk_widget_set_hexpand (entry, TRUE);
@@ -277,73 +270,69 @@ populate_model_cb (GList    *records,
 
     text = ephy_password_record_get_username (record);
     if (text)
-      gtk_entry_set_text (GTK_ENTRY (entry), text);
+      gtk_editable_set_text (GTK_EDITABLE (entry), text);
 
-    gtk_container_add (GTK_CONTAINER (sub_row), entry);
+    adw_action_row_add_suffix (ADW_ACTION_ROW (sub_row), entry);
 
     separator = gtk_separator_new (GTK_ORIENTATION_VERTICAL);
     gtk_widget_set_margin_top (separator, 8);
     gtk_widget_set_margin_bottom (separator, 8);
-    gtk_container_add (GTK_CONTAINER (sub_row), separator);
+    adw_action_row_add_suffix (ADW_ACTION_ROW (sub_row), separator);
 
-    button = gtk_button_new_from_icon_name ("edit-copy-symbolic", GTK_ICON_SIZE_BUTTON);
+    button = gtk_button_new_from_icon_name ("edit-copy-symbolic");
     g_signal_connect (button, "clicked", G_CALLBACK (copy_username_clicked), (void 
*)(ephy_password_record_get_username (record)));
     gtk_widget_set_tooltip_text (button, _("Copy username"));
     gtk_widget_set_valign (button, GTK_ALIGN_CENTER);
-    gtk_container_add (GTK_CONTAINER (sub_row), button);
+    adw_action_row_add_suffix (ADW_ACTION_ROW (sub_row), button);
 
     /* Password */
-    sub_row = hdy_action_row_new ();
-    hdy_preferences_row_set_title (HDY_PREFERENCES_ROW (sub_row), _("Password"));
-    gtk_container_add (GTK_CONTAINER (row), sub_row);
+    sub_row = adw_action_row_new ();
+    adw_preferences_row_set_title (ADW_PREFERENCES_ROW (sub_row), _("Password"));
+    adw_expander_row_add_row (ADW_EXPANDER_ROW (row), sub_row);
 
-    entry = gtk_entry_new ();
+    entry = gtk_password_entry_new ();
     gtk_widget_set_hexpand (entry, TRUE);
     gtk_widget_set_valign (entry, GTK_ALIGN_CENTER);
     gtk_editable_set_editable (GTK_EDITABLE (entry), FALSE);
     gtk_entry_set_alignment (GTK_ENTRY (entry), 1.0f);
     gtk_entry_set_has_frame (GTK_ENTRY (entry), FALSE);
-    gtk_entry_set_visibility (GTK_ENTRY (entry), FALSE);
 
     text = ephy_password_record_get_password (record);
     if (text)
-      gtk_entry_set_text (GTK_ENTRY (entry), text);
+      gtk_editable_set_text (GTK_EDITABLE (entry), text);
 
-    gtk_container_add (GTK_CONTAINER (sub_row), entry);
+    adw_action_row_add_suffix (ADW_ACTION_ROW (sub_row), entry);
 
     separator = gtk_separator_new (GTK_ORIENTATION_VERTICAL);
     gtk_widget_set_margin_top (separator, 8);
     gtk_widget_set_margin_bottom (separator, 8);
-    gtk_container_add (GTK_CONTAINER (sub_row), separator);
+    adw_action_row_add_suffix (ADW_ACTION_ROW (sub_row), separator);
 
     button = gtk_toggle_button_new ();
-    image = gtk_image_new_from_icon_name ("dialog-password-symbolic", GTK_ICON_SIZE_BUTTON);
-    gtk_button_set_image (GTK_BUTTON (button), image);
+    gtk_button_set_icon_name (GTK_BUTTON (button), "dialog-password-symbolic");
     gtk_widget_set_tooltip_text (button, _("Reveal password"));
     gtk_widget_set_valign (button, GTK_ALIGN_CENTER);
 
     g_object_bind_property (G_OBJECT (button), "active", G_OBJECT (entry), "visibility", G_BINDING_DEFAULT);
-    gtk_container_add (GTK_CONTAINER (sub_row), button);
+    adw_action_row_add_suffix (ADW_ACTION_ROW (sub_row), button);
 
     /* Remove button */
-    sub_row = hdy_action_row_new ();
-    gtk_container_add (GTK_CONTAINER (row), sub_row);
+    sub_row = adw_action_row_new ();
+    adw_expander_row_add_row (ADW_EXPANDER_ROW (row), sub_row);
 
     button = gtk_button_new_with_label (_("Remove Password"));
     gtk_widget_set_valign (button, GTK_ALIGN_CENTER);
-    dzl_gtk_widget_add_style_class (button, "destructive-action");
+    gtk_widget_add_css_class (button, "destructive-action");
     g_signal_connect (button, "clicked", G_CALLBACK (forget_clicked), record);
-    gtk_container_add (GTK_CONTAINER (sub_row), button);
+    adw_action_row_add_suffix (ADW_ACTION_ROW (sub_row), button);
 
     g_object_set_data (G_OBJECT (record), "passwords-view", passwords_view);
 
-    gtk_list_box_insert (GTK_LIST_BOX (passwords_view->listbox), row, -1);
+    gtk_list_box_append (GTK_LIST_BOX (passwords_view->listbox), row);
   }
 
-  if (g_list_length (records)) {
+  if (g_list_length (records))
     ephy_data_view_set_has_data (EPHY_DATA_VIEW (passwords_view), TRUE);
-    gtk_widget_show_all (passwords_view->listbox);
-  }
 
   g_assert (!passwords_view->records);
   passwords_view->records = g_list_copy_deep (records, (GCopyFunc)g_object_ref, NULL);
diff --git a/src/preferences/prefs-appearance-page.c b/src/preferences/prefs-appearance-page.c
index 1f3a43aaf..717501f33 100644
--- a/src/preferences/prefs-appearance-page.c
+++ b/src/preferences/prefs-appearance-page.c
@@ -32,7 +32,7 @@
 #include <math.h>
 
 struct _PrefsAppearancePage {
-  HdyPreferencesPage parent_instance;
+  AdwPreferencesPage parent_instance;
 
   /* Fonts */
   GtkWidget *use_gnome_fonts_row;
@@ -53,58 +53,22 @@ struct _PrefsAppearancePage {
   GtkWidget *default_zoom_spin_button;
 };
 
-G_DEFINE_TYPE (PrefsAppearancePage, prefs_appearance_page, HDY_TYPE_PREFERENCES_PAGE)
+G_DEFINE_TYPE (PrefsAppearancePage, prefs_appearance_page, ADW_TYPE_PREFERENCES_PAGE)
 
 static gchar *
-reader_font_style_get_name (HdyEnumValueObject *value,
-                            gpointer            user_data)
+reader_font_style_get_name (gpointer                 user_data,
+                            EphyPrefsReaderFontStyle style)
 {
-  g_assert (HDY_IS_ENUM_VALUE_OBJECT (value));
-
-  switch (hdy_enum_value_object_get_value (value)) {
+  switch (style) {
     case EPHY_PREFS_READER_FONT_STYLE_SANS:
-      return g_strdup_printf ("<span font-family=\"%s\">%s</span>", "sans", _("Sans"));
+      return g_strdup (_("Sans"));
     case EPHY_PREFS_READER_FONT_STYLE_SERIF:
-      return g_strdup_printf ("<span font-family=\"%s\">%s</span>", "serif", _("Serif"));
+      return g_strdup (_("Serif"));
     default:
-      return NULL;
+      g_assert_not_reached ();
   }
 }
 
-static GtkWidget *
-reader_font_style_create_list_widget (gpointer item,
-                                      gpointer user_data)
-{
-  g_autofree gchar *name = reader_font_style_get_name (item, NULL);
-
-  return g_object_new (GTK_TYPE_LABEL,
-                       "ellipsize", PANGO_ELLIPSIZE_END,
-                       "label", name,
-                       "use-markup", TRUE,
-                       "max-width-chars", 20,
-                       "valign", GTK_ALIGN_CENTER,
-                       "visible", TRUE,
-                       "xalign", 0.0,
-                       NULL);
-}
-
-static GtkWidget *
-reader_font_style_create_current_widget (gpointer item,
-                                         gpointer user_data)
-{
-  g_autofree gchar *name = reader_font_style_get_name (item, NULL);
-
-  return g_object_new (GTK_TYPE_LABEL,
-                       "ellipsize", PANGO_ELLIPSIZE_END,
-                       "halign", GTK_ALIGN_END,
-                       "label", name,
-                       "use-markup", TRUE,
-                       "valign", GTK_ALIGN_CENTER,
-                       "visible", TRUE,
-                       "xalign", 0.0,
-                       NULL);
-}
-
 static gboolean
 reader_font_style_get_mapping (GValue   *value,
                                GVariant *variant,
@@ -113,9 +77,9 @@ reader_font_style_get_mapping (GValue   *value,
   const char *reader_colors = g_variant_get_string (variant, NULL);
 
   if (g_strcmp0 (reader_colors, "sans") == 0)
-    g_value_set_int (value, EPHY_PREFS_READER_FONT_STYLE_SANS);
+    g_value_set_uint (value, EPHY_PREFS_READER_FONT_STYLE_SANS);
   else if (g_strcmp0 (reader_colors, "serif") == 0)
-    g_value_set_int (value, EPHY_PREFS_READER_FONT_STYLE_SERIF);
+    g_value_set_uint (value, EPHY_PREFS_READER_FONT_STYLE_SERIF);
 
   return TRUE;
 }
@@ -125,7 +89,7 @@ reader_font_style_set_mapping (const GValue       *value,
                                const GVariantType *expected_type,
                                gpointer            user_data)
 {
-  switch (g_value_get_int (value)) {
+  switch (g_value_get_uint (value)) {
     case EPHY_PREFS_READER_FONT_STYLE_SANS:
       return g_variant_new_string ("sans");
     case EPHY_PREFS_READER_FONT_STYLE_SERIF:
@@ -136,18 +100,16 @@ reader_font_style_set_mapping (const GValue       *value,
 }
 
 static gchar *
-reader_color_scheme_get_name (HdyEnumValueObject *value,
-                              gpointer            user_data)
+reader_color_scheme_get_name (gpointer                   user_data,
+                              EphyPrefsReaderColorScheme scheme)
 {
-  g_assert (HDY_IS_ENUM_VALUE_OBJECT (value));
-
-  switch (hdy_enum_value_object_get_value (value)) {
+  switch (scheme) {
     case EPHY_PREFS_READER_COLORS_LIGHT:
       return g_strdup (_("Light"));
     case EPHY_PREFS_READER_COLORS_DARK:
       return g_strdup (_("Dark"));
     default:
-      return NULL;
+      g_assert_not_reached ();
   }
 }
 
@@ -159,9 +121,9 @@ reader_color_scheme_get_mapping (GValue   *value,
   const char *reader_colors = g_variant_get_string (variant, NULL);
 
   if (g_strcmp0 (reader_colors, "light") == 0)
-    g_value_set_int (value, EPHY_PREFS_READER_COLORS_LIGHT);
+    g_value_set_uint (value, EPHY_PREFS_READER_COLORS_LIGHT);
   else if (g_strcmp0 (reader_colors, "dark") == 0)
-    g_value_set_int (value, EPHY_PREFS_READER_COLORS_DARK);
+    g_value_set_uint (value, EPHY_PREFS_READER_COLORS_DARK);
 
   return TRUE;
 }
@@ -171,7 +133,7 @@ reader_color_scheme_set_mapping (const GValue       *value,
                                  const GVariantType *expected_type,
                                  gpointer            user_data)
 {
-  switch (g_value_get_int (value)) {
+  switch (g_value_get_uint (value)) {
     case EPHY_PREFS_READER_COLORS_LIGHT:
       return g_variant_new_string ("light");
     case EPHY_PREFS_READER_COLORS_DARK:
@@ -198,7 +160,7 @@ css_file_created_cb (GObject      *source,
       g_autofree char *uri = g_file_get_uri (file);
       ephy_open_uri_via_flatpak_portal (uri);
     } else {
-      ephy_file_launch_handler (file, gtk_get_current_event_time ());
+      ephy_file_launch_handler (file, GDK_CURRENT_TIME);
     }
   }
 }
@@ -233,7 +195,7 @@ js_file_created_cb (GObject      *source,
       g_autofree char *uri = g_file_get_uri (file);
       ephy_open_uri_via_flatpak_portal (uri);
     } else {
-      ephy_file_launch_handler (file, gtk_get_current_event_time ());
+      ephy_file_launch_handler (file, GDK_CURRENT_TIME);
     }
   }
 }
@@ -262,7 +224,7 @@ on_default_zoom_spin_button_output (GtkSpinButton *spin,
   adjustment = gtk_spin_button_get_adjustment (spin);
   value = (int)gtk_adjustment_get_value (adjustment);
   text = g_strdup_printf ("%.f%%", value);
-  gtk_entry_set_text (GTK_ENTRY (spin), text);
+  gtk_editable_set_text (GTK_EDITABLE (spin), text);
 
   return TRUE;
 }
@@ -280,26 +242,6 @@ on_default_zoom_spin_button_value_changed (GtkSpinButton *spin,
   g_settings_set_double (EPHY_SETTINGS_WEB, EPHY_PREFS_WEB_DEFAULT_ZOOM_LEVEL, value);
 }
 
-static void
-setup_font_row (PrefsAppearancePage *appearance_page)
-{
-  g_autoptr (GListStore) store = g_list_store_new (HDY_TYPE_ENUM_VALUE_OBJECT);
-  g_autoptr (GEnumClass) enum_class = g_type_class_ref (EPHY_TYPE_PREFS_READER_FONT_STYLE);
-
-  for (guint i = 0; i < enum_class->n_values; i++) {
-    g_autoptr (HdyEnumValueObject) obj = hdy_enum_value_object_new (&enum_class->values[i]);
-
-    g_list_store_append (store, obj);
-  }
-
-  hdy_combo_row_bind_model (HDY_COMBO_ROW (appearance_page->reader_mode_font_style),
-                            G_LIST_MODEL (store),
-                            (GtkListBoxCreateWidgetFunc)reader_font_style_create_list_widget,
-                            (GtkListBoxCreateWidgetFunc)reader_font_style_create_current_widget,
-                            NULL,
-                            NULL);
-}
-
 static void
 setup_appearance_page (PrefsAppearancePage *appearance_page)
 {
@@ -318,48 +260,41 @@ setup_appearance_page (PrefsAppearancePage *appearance_page)
   g_settings_bind (web_settings,
                    EPHY_PREFS_WEB_SANS_SERIF_FONT,
                    appearance_page->sans_fontbutton,
-                   "font-name",
+                   "font",
                    G_SETTINGS_BIND_DEFAULT);
 
   g_settings_bind (web_settings,
                    EPHY_PREFS_WEB_SERIF_FONT,
                    appearance_page->serif_fontbutton,
-                   "font-name",
+                   "font",
                    G_SETTINGS_BIND_DEFAULT);
 
   g_settings_bind (web_settings,
                    EPHY_PREFS_WEB_MONOSPACE_FONT,
                    appearance_page->mono_fontbutton,
-                   "font-name",
+                   "font",
                    G_SETTINGS_BIND_DEFAULT);
 
   /* ======================================================================== */
   /* ========================== Reader Mode ================================= */
   /* ======================================================================== */
-
-  setup_font_row (appearance_page);
-
   g_settings_bind_with_mapping (reader_settings,
                                 EPHY_PREFS_READER_FONT_STYLE,
                                 appearance_page->reader_mode_font_style,
-                                "selected-index",
+                                "selected",
                                 G_SETTINGS_BIND_DEFAULT,
                                 reader_font_style_get_mapping,
                                 reader_font_style_set_mapping,
                                 NULL, NULL);
 
-  g_object_bind_property (hdy_style_manager_get_default (), "system-supports-color-schemes",
+  g_object_bind_property (adw_style_manager_get_default (), "system-supports-color-schemes",
                           appearance_page->reader_mode_color_scheme, "visible",
                           G_BINDING_SYNC_CREATE | G_BINDING_INVERT_BOOLEAN);
 
-  hdy_combo_row_set_for_enum (HDY_COMBO_ROW (appearance_page->reader_mode_color_scheme),
-                              EPHY_TYPE_PREFS_READER_COLOR_SCHEME,
-                              reader_color_scheme_get_name, NULL, NULL);
-
   g_settings_bind_with_mapping (reader_settings,
                                 EPHY_PREFS_READER_COLOR_SCHEME,
                                 appearance_page->reader_mode_color_scheme,
-                                "selected-index",
+                                "selected",
                                 G_SETTINGS_BIND_DEFAULT,
                                 reader_color_scheme_get_mapping,
                                 reader_color_scheme_set_mapping,
@@ -433,6 +368,8 @@ prefs_appearance_page_class_init (PrefsAppearancePageClass *klass)
   gtk_widget_class_bind_template_child (widget_class, PrefsAppearancePage, default_zoom_spin_button);
 
   /* Signals */
+  gtk_widget_class_bind_template_callback (widget_class, reader_font_style_get_name);
+  gtk_widget_class_bind_template_callback (widget_class, reader_color_scheme_get_name);
   gtk_widget_class_bind_template_callback (widget_class, on_default_zoom_spin_button_output);
   gtk_widget_class_bind_template_callback (widget_class, on_default_zoom_spin_button_value_changed);
 }
diff --git a/src/preferences/prefs-appearance-page.h b/src/preferences/prefs-appearance-page.h
index 6489ba8cf..052e403d8 100644
--- a/src/preferences/prefs-appearance-page.h
+++ b/src/preferences/prefs-appearance-page.h
@@ -21,12 +21,12 @@
 #pragma once
 
 #include <glib-object.h>
-#include <handy.h>
+#include <adwaita.h>
 
 G_BEGIN_DECLS
 
 #define EPHY_TYPE_PREFS_APPEARANCE_PAGE (prefs_appearance_page_get_type ())
 
-G_DECLARE_FINAL_TYPE (PrefsAppearancePage, prefs_appearance_page, EPHY, PREFS_APPEARANCE_PAGE, 
HdyPreferencesPage)
+G_DECLARE_FINAL_TYPE (PrefsAppearancePage, prefs_appearance_page, EPHY, PREFS_APPEARANCE_PAGE, 
AdwPreferencesPage)
 
 G_END_DECLS
diff --git a/src/preferences/prefs-general-page.c b/src/preferences/prefs-general-page.c
index dc4517f88..a01ac7a80 100644
--- a/src/preferences/prefs-general-page.c
+++ b/src/preferences/prefs-general-page.c
@@ -442,7 +442,7 @@ language_editor_add (PrefsGeneralPage *general_page,
   ephy_lang_row_set_title (EPHY_LANG_ROW (row), desc);
   gtk_style_context_add_class (gtk_widget_get_style_context (row), "row");
 
-  event_box = ephy_lang_row_get_drag_event_box (EPHY_LANG_ROW (row));
+  event_box = ephy_lang_row_get_drag_handle (EPHY_LANG_ROW (row));
   gtk_drag_source_set (event_box, GDK_BUTTON1_MASK, entries, 1, GDK_ACTION_MOVE);
   g_signal_connect (event_box, "drag-begin", G_CALLBACK (drag_begin), general_page);
   g_signal_connect (event_box, "drag-end", G_CALLBACK (drag_end), general_page);
diff --git a/src/preferences/prefs-privacy-page.c b/src/preferences/prefs-privacy-page.c
index d8caea0e9..1c85c5d8e 100644
--- a/src/preferences/prefs-privacy-page.c
+++ b/src/preferences/prefs-privacy-page.c
@@ -34,7 +34,7 @@ enum {
 };
 
 struct _PrefsPrivacyPage {
-  HdyPreferencesPage parent_instance;
+  AdwPreferencesPage parent_instance;
 
   /* Web Safety */
   GtkWidget *safe_browsing_group;
@@ -53,7 +53,7 @@ struct _PrefsPrivacyPage {
 
 static guint signals[LAST_SIGNAL];
 
-G_DEFINE_TYPE (PrefsPrivacyPage, prefs_privacy_page, HDY_TYPE_PREFERENCES_PAGE)
+G_DEFINE_TYPE (PrefsPrivacyPage, prefs_privacy_page, ADW_TYPE_PREFERENCES_PAGE)
 
 static void
 on_passwords_row_activated (GtkWidget        *row,
diff --git a/src/preferences/prefs-privacy-page.h b/src/preferences/prefs-privacy-page.h
index 2a07a2234..7a0c71057 100644
--- a/src/preferences/prefs-privacy-page.h
+++ b/src/preferences/prefs-privacy-page.h
@@ -20,13 +20,12 @@
 
 #pragma once
 
-#include <glib-object.h>
-#include <handy.h>
+#include <adwaita.h>
 
 G_BEGIN_DECLS
 
 #define EPHY_TYPE_PREFS_PRIVACY_PAGE (prefs_privacy_page_get_type ())
 
-G_DECLARE_FINAL_TYPE (PrefsPrivacyPage, prefs_privacy_page, EPHY, PREFS_PRIVACY_PAGE, HdyPreferencesPage)
+G_DECLARE_FINAL_TYPE (PrefsPrivacyPage, prefs_privacy_page, EPHY, PREFS_PRIVACY_PAGE, AdwPreferencesPage)
 
 G_END_DECLS
diff --git a/src/resources/gtk/action-bar-end.ui b/src/resources/gtk/action-bar-end.ui
index 2c74b14bd..811e5235e 100644
--- a/src/resources/gtk/action-bar-end.ui
+++ b/src/resources/gtk/action-bar-end.ui
@@ -4,27 +4,26 @@
     <property name="spacing">6</property>
     <child>
       <object class="GtkBox" id="browser_action_box">
-        <property name="visible">True</property>
         <property name="spacing">6</property>
       </object>
     </child>
     <child>
       <object class="GtkRevealer" id="downloads_revealer">
-        <property name="visible">True</property>
         <property name="transition-type">crossfade</property>
         <child>
           <object class="GtkMenuButton" id="downloads_button">
             <!-- Translators: tooltip for the downloads button -->
             <property name="tooltip_text" translatable="yes">View downloads</property>
-            <property name="visible">True</property>
             <property name="receives_default">True</property>
+            <style>
+              <class name="image-button"/>
+            </style>
             <child>
               <object class="GtkOverlay">
-                <property name="visible">True</property>
                 <property name="valign">center</property>
+                <property name="can-target">False</property>
                 <child>
                   <object class="GtkImage" id="downloads_icon">
-                    <property name="visible">True</property>
                     <property name="icon_name">ephy-download-symbolic</property>
                     <style>
                       <class name="download_icon"/>
@@ -33,15 +32,11 @@
                 </child>
                 <child type="overlay">
                   <object class="GtkProgressBar" id="downloads_progress">
-                    <property name="visible">True</property>
                     <property name="valign">end</property>
                     <style>
                       <class name="download_progress"/>
                     </style>
                   </object>
-                  <packing>
-                    <property name="pass-through">True</property>
-                  </packing>
                 </child>
               </object>
             </child>
@@ -51,41 +46,20 @@
     </child>
     <child>
       <object class="GtkButton" id="bookmark_button">
-        <property name="visible">True</property>
         <!-- Translators: tooltip for the bookmark button -->
         <property name="tooltip_text" translatable="yes">Bookmark page</property>
-        <child>
-          <object class="GtkImage" id="bookmark_image">
-            <property name="visible">True</property>
-            <property name="can_focus">False</property>
-            <property name="icon_name">non-starred-symbolic</property>
-          </object>
-        </child>
-        <style>
-          <class name="image-button"/>
-        </style>
+        <property name="icon_name">non-starred-symbolic</property>
       </object>
     </child>
     <child>
       <object class="GtkMenuButton" id="bookmarks_button">
-        <property name="visible">True</property>
         <!-- Translators: tooltip for the bookmarks popover button -->
         <property name="tooltip_text" translatable="yes">View and manage your bookmarks</property>
-        <property name="popover">bookmarks_popover</property>
-        <style>
-          <class name="image-button"/>
-        </style>
-        <child>
-          <object class="GtkImage" id="bookmarks_image">
-            <property name="visible">True</property>
-            <property name="icon-name">ephy-library-symbolic</property>
-            <property name="icon-size">1</property>
-          </object>
-        </child>
+        <property name="icon-name">ephy-library-symbolic</property>
+<!--        <property name="popover">
+          <object class="EphyBookmarksPopover" id="bookmarks_popover"/>
+        </property>-->
       </object>
     </child>
   </template>
-  <object class="EphyBookmarksPopover" id="bookmarks_popover">
-    <property name="visible">True</property>
-  </object>
 </interface>
diff --git a/src/resources/gtk/action-bar-start.ui b/src/resources/gtk/action-bar-start.ui
index 3c8b22a10..0163b8127 100644
--- a/src/resources/gtk/action-bar-start.ui
+++ b/src/resources/gtk/action-bar-start.ui
@@ -4,106 +4,53 @@
     <property name="spacing">6</property>
     <child>
       <object class="GtkBox" id="navigation_box">
-        <property name="visible">True</property>
         <property name="orientation">horizontal</property>
+        <property name="spacing">6</property>
         <style>
-          <class name="linked"/>
           <class name="navigation-box"/>
         </style>
         <child>
           <object class="GtkButton" id="navigation_back">
-            <property name="visible">True</property>
             <property name="action-name">toolbar.navigation-back</property>
+            <property name="icon-name">go-previous-symbolic</property>
             <!-- Translators: tooltip for the back button -->
             <property name="tooltip_text" translatable="yes">Go back to the previous page</property>
-            <style>
-              <class name="image-button"/>
-            </style>
-            <child>
-              <object class="GtkImage" id="back_image">
-                <property name="visible">True</property>
-                <property name="icon-name">go-previous-symbolic</property>
-                <property name="icon-size">1</property>
-              </object>
-            </child>
           </object>
         </child>
         <child>
           <object class="GtkButton" id="navigation_forward">
-            <property name="visible">True</property>
             <property name="action-name">toolbar.navigation-forward</property>
+            <property name="icon-name">go-next-symbolic</property>
             <!-- Translators: tooltip for the forward button -->
             <property name="tooltip_text" translatable="yes">Go forward to the next page</property>
-            <style>
-              <class name="image-button"/>
-            </style>
-            <child>
-              <object class="GtkImage" id="forward_image">
-                <property name="visible">True</property>
-                <property name="icon-name">go-next-symbolic</property>
-                <property name="icon-size">1</property>
-              </object>
-            </child>
           </object>
         </child>
       </object>
     </child>
     <child>
       <object class="GtkButton" id="combined_stop_reload_button">
-        <property name="visible">True</property>
         <property name="action-name">toolbar.combined-stop-reload</property>
-        <style>
-          <class name="image-button"/>
-        </style>
-        <child>
-          <object class="GtkImage" id="combined_stop_reload_image">
-            <property name="visible">True</property>
-            <property name="icon-name">view-refresh-symbolic</property>
-            <property name="icon-size">1</property>
-          </object>
-        </child>
+        <property name="icon-name">view-refresh-symbolic</property>
       </object>
     </child>
     <child>
       <object class="GtkButton" id="homepage_button">
-        <property name="visible">True</property>
         <property name="action-name">win.home</property>
+        <property name="icon-name">go-home-symbolic</property>
         <!-- Translators: tooltip for the secret homepage button -->
         <property name="tooltip_text" translatable="yes">Go to your homepage</property>
-        <style>
-          <class name="image-button"/>
-        </style>
-        <child>
-          <object class="GtkImage" id="homepage_image">
-            <property name="visible">True</property>
-            <property name="icon-name">go-home-symbolic</property>
-            <property name="icon-size">1</property>
-          </object>
-        </child>
       </object>
     </child>
     <child>
       <object class="GtkButton" id="new_tab_button">
-        <property name="visible">True</property>
         <property name="action-name">win.new-tab</property>
+        <property name="icon-name">tab-new-symbolic</property>
         <!-- Translators: tooltip for the new tab button -->
         <property name="tooltip_text" translatable="yes">Open a new tab</property>
-        <style>
-          <class name="image-button"/>
-        </style>
-        <child>
-          <object class="GtkImage" id="new_tab_image">
-            <property name="visible">True</property>
-            <property name="icon-name">tab-new-symbolic</property>
-            <property name="icon-size">1</property>
-          </object>
-        </child>
       </object>
     </child>
     <child>
-      <object class="GtkBox" id="placeholder">
-        <property name="visible">True</property>
-      </object>
+      <object class="GtkBox" id="placeholder"/>
     </child>
   </template>
 </interface>
diff --git a/src/resources/gtk/action-bar.ui b/src/resources/gtk/action-bar.ui
index 102cd5f71..dc1851c20 100644
--- a/src/resources/gtk/action-bar.ui
+++ b/src/resources/gtk/action-bar.ui
@@ -1,42 +1,23 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <interface>
-  <template class="EphyActionBar" parent="GtkBin">
+  <template class="EphyActionBar" parent="AdwBin">
     <child>
       <object class="GtkRevealer" id="revealer">
-        <property name="visible">True</property>
         <property name="transition-type">slide-up</property>
         <child>
           <object class="GtkActionBar" id="action_bar">
-            <property name="visible">True</property>
-            <child>
-              <object class="EphyActionBarStart" id="action_bar_start">
-                <property name="visible">True</property>
-              </object>
-              <packing>
-                <property name="pack-type">start</property>
-              </packing>
+            <child type="start">
+              <object class="EphyActionBarStart" id="action_bar_start"/>
             </child>
-            <child>
+            <child type="end">
               <object class="EphyPagesButton" id="pages_button">
-                <property name="visible">True</property>
                 <!-- Translators: tooltip for the page switcher button -->
                 <property name="tooltip_text" translatable="yes">View open pages</property>
                 <property name="action_name">win.tabs-view</property>
-                <style>
-                  <class name="image-button"/>
-                </style>
               </object>
-              <packing>
-                <property name="pack-type">end</property>
-              </packing>
             </child>
-            <child>
-              <object class="EphyActionBarEnd" id="action_bar_end">
-                <property name="visible">True</property>
-              </object>
-              <packing>
-                <property name="pack-type">end</property>
-              </packing>
+            <child type="end">
+              <object class="EphyActionBarEnd" id="action_bar_end"/>
             </child>
           </object>
         </child>
diff --git a/src/resources/gtk/bookmark-properties.ui b/src/resources/gtk/bookmark-properties.ui
index a89a90514..5f3ddf071 100644
--- a/src/resources/gtk/bookmark-properties.ui
+++ b/src/resources/gtk/bookmark-properties.ui
@@ -3,7 +3,6 @@
 <interface>
   <requires lib="gtk+" version="3.18"/>
   <template class="EphyBookmarkProperties" parent="GtkBox">
-    <property name="visible">True</property>
     <property name="margin-top">12</property>
     <property name="margin-bottom">12</property>
     <property name="margin-start">12</property>
@@ -12,7 +11,6 @@
     <property name="spacing">6</property>
     <child>
       <object class="GtkLabel" id="popover_bookmark_label">
-        <property name="visible">True</property>
         <property name="label" translatable="yes">Bookmark</property>
         <attributes>
           <attribute name="weight" value="bold"/>
@@ -21,7 +19,6 @@
     </child>
     <child>
       <object class="GtkLabel">
-        <property name="visible">True</property>
         <property name="xalign">0</property>
         <property name="label" translatable="yes">_Name</property>
         <property name="use-underline">True</property>
@@ -33,13 +30,11 @@
     </child>
     <child>
       <object class="GtkEntry" id="name_entry">
-        <property name="visible">True</property>
         <property name="max_width_chars">32</property>
       </object>
     </child>
     <child>
       <object class="GtkLabel" id="address_label">
-        <property name="visible">True</property>
         <property name="xalign">0</property>
         <property name="margin_top">6</property>
         <property name="label" translatable="yes">_Address</property>
@@ -51,13 +46,10 @@
       </object>
     </child>
     <child>
-      <object class="GtkEntry" id="address_entry">
-        <property name="visible">True</property>
-      </object>
+      <object class="GtkEntry" id="address_entry"/>
     </child>
     <child>
       <object class="GtkLabel" id="popover_tags_label">
-        <property name="visible">True</property>
         <property name="xalign">0</property>
         <property name="margin_top">12</property>
         <property name="label" translatable="yes">Tags</property>
@@ -68,7 +60,6 @@
     </child>
     <child>
       <object class="GtkScrolledWindow" id="tags_scrolled_window">
-        <property name="visible">True</property>
         <property name="vexpand">True</property>
         <property name="min_content_height">38</property>
         <property name="max_content_width">270</property>
@@ -77,7 +68,6 @@
         <property name="propagate_natural_height">True</property>
         <child>
           <object class="GtkFlowBox" id="tags_box">
-            <property name="visible">True</property>
             <property name="homogeneous">True</property>
             <property name="valign">start</property>
             <property name="column_spacing">6</property>
@@ -91,10 +81,8 @@
     </child>
     <child>
       <object class="GtkBox">
-        <property name="visible">True</property>
         <child>
           <object class="GtkEntry" id="add_tag_entry">
-            <property name="visible">True</property>
             <property name="hexpand">True</property>
             <property name="activates_default">True</property>
             <property name="placeholder_text" translatable="yes">Add Tag…</property>
@@ -102,7 +90,6 @@
         </child>
         <child>
           <object class="GtkButton" id="add_tag_button">
-            <property name="label" translatable="yes">_Add</property>
             <property name="visible">True</property>
             <property name="can_default">True</property>
             <property name="receives_default">False</property>
@@ -117,7 +104,6 @@
     </child>
     <child>
       <object class="GtkButton" id="remove_bookmark_button">
-        <property name="label" translatable="yes">_Remove</property>
         <property name="visible">True</property>
         <property name="receives_default">False</property>
         <property name="halign">end</property>
diff --git a/src/resources/gtk/bookmark-row.ui b/src/resources/gtk/bookmark-row.ui
index b3f29d8de..b26fb5286 100644
--- a/src/resources/gtk/bookmark-row.ui
+++ b/src/resources/gtk/bookmark-row.ui
@@ -3,20 +3,16 @@
 <interface>
   <requires lib="gtk+" version="3.18"/>
   <template class="EphyBookmarkRow" parent="GtkListBoxRow">
-    <property name="visible">True</property>
     <child>
       <object class="GtkBox">
-        <property name="visible">True</property>
         <property name="spacing">6</property>
         <child>
           <object class="GtkImage" id="favicon_image">
-            <property name="visible">True</property>
             <property name="margin-start">6</property>
           </object>
         </child>
         <child>
           <object class="GtkLabel" id="title_label">
-            <property name="visible">True</property>
             <property name="hexpand">True</property>
             <property name="ellipsize">end</property>
             <property name="max_width_chars">1</property>
@@ -26,13 +22,8 @@
         <child>
           <object class="GtkButton" id="properties_button">
             <property name="visible">True</property>
+            <property name="icon_name">emblem-system-symbolic</property>
             <property name="receives_default">False</property>
-            <child>
-              <object class="GtkImage">
-                <property name="visible">True</property>
-                <property name="icon_name">emblem-system-symbolic</property>
-              </object>
-            </child>
             <style>
               <class name="flat"/>
             </style>
diff --git a/src/resources/gtk/clear-data-view.ui b/src/resources/gtk/clear-data-view.ui
index 16d94f47f..319706436 100644
--- a/src/resources/gtk/clear-data-view.ui
+++ b/src/resources/gtk/clear-data-view.ui
@@ -31,27 +31,22 @@
     <signal name="notify::search-text" handler="search_text_changed_cb" swapped="yes"/>
     <child>
       <object class="GtkScrolledWindow" id="scrolled_window">
-        <property name="visible">True</property>
         <child>
-          <object class="HdyClamp">
-            <property name="visible">True</property>
+          <object class="AdwClamp">
             <property name="margin_start">6</property>
             <property name="margin_end">6</property>
             <child>
               <object class="GtkBox">
-                <property name="visible">True</property>
                 <property name="orientation">vertical</property>
                 <property name="margin_top">6</property>
                 <property name="margin_bottom">6</property>
                 <property name="spacing">12</property>
                 <child>
                   <object class="GtkBox">
-                    <property name="visible">True</property>
                     <property name="orientation">vertical</property>
                     <property name="spacing">6</property>
                     <child>
                       <object class="GtkLabel">
-                        <property name="visible">True</property>
                         <property name="label" translatable="yes">Clear selected personal data:</property>
                         <property name="use-underline">True</property>
                         <property name="xalign">0</property>
@@ -61,7 +56,6 @@
                     </child>
                     <child>
                       <object class="GtkScrolledWindow">
-                        <property name="visible">True</property>
                         <property name="vexpand">True</property>
                         <property name="min_content_height">100</property>
                         <style>
@@ -69,7 +63,6 @@
                         </style>
                         <child>
                           <object class="GtkTreeView" id="treeview">
-                            <property name="visible">True</property>
                             <property name="model">treemodelfilter</property>
                             <property name="headers-visible">False</property>
                             <child internal-child="selection">
@@ -109,7 +102,6 @@
                 </child>
                 <child>
                   <object class="GtkLabel">
-                    <property name="visible">True</property>
                     <property name="label" translatable="yes">You cannot undo this action. The data you are 
choosing to clear will be removed forever.</property>
                     <property name="justify">left</property>
                     <property name="xalign">0</property>
diff --git a/src/resources/gtk/data-view.ui b/src/resources/gtk/data-view.ui
index d46584ff7..3d437d7ac 100644
--- a/src/resources/gtk/data-view.ui
+++ b/src/resources/gtk/data-view.ui
@@ -2,70 +2,39 @@
 <interface>
   <requires lib="gtk+" version="3.20"/>
   <requires lib="libhandy" version="0.0"/>
-  <object class="GtkImage" id="search_image">
-    <property name="visible">True</property>
-    <property name="icon_name">edit-find-symbolic</property>
-  </object>
-  <object class="GtkImage" id="back_image">
-    <property name="visible">True</property>
-    <property name="icon_name">go-previous-symbolic</property>
-  </object>
-  <template class="EphyDataView" parent="GtkBin">
+  <template class="EphyDataView" parent="GtkWidget">
     <child>
       <object class="GtkBox" id="box">
-        <property name="visible">True</property>
         <property name="orientation">vertical</property>
         <child>
-          <object class="HdyWindowHandle">
-            <property name="visible">True</property>
-            <child>
-              <object class="GtkHeaderBar" id="header_bar">
-                <property name="visible">True</property>
-                <property name="show_close_button">True</property>
-                <child>
-                  <object class="GtkButton" id="back_button">
-                    <property name="visible">True</property>
-                    <property name="image">back_image</property>
-                    <signal name="clicked" handler="on_back_button_clicked"/>
-                  </object>
-                </child>
-                <child>
-                  <object class="GtkToggleButton" id="search_button">
-                    <property name="visible">True</property>
-                    <property name="receives_default">True</property>
-                    <property name="image">search_image</property>
-                    <property name="always_show_image">True</property>
-                    <property name="active" bind-source="search_bar" bind-property="search-mode-enabled" 
bind-flags="sync-create|bidirectional"/>
-                    <style>
-                      <class name="image-button"/>
-                    </style>
-                    <child internal-child="accessible">
-                      <object class="AtkObject">
-                        <property name="AtkObject::accessible-name" translatable="yes">Search</property>
-                      </object>
-                    </child>
-                  </object>
-                  <packing>
-                    <property name="pack_type">end</property>
-                  </packing>
-                </child>
+          <object class="GtkHeaderBar" id="header_bar">
+            <property name="title-widget">
+              <object class="AdwWindowTitle" id="window_title"/>
+            </property>
+            <child type="start">
+              <object class="GtkButton" id="back_button">
+                <property name="icon-name">go-previous-symbolic</property>
+                <signal name="clicked" handler="on_back_button_clicked"/>
+              </object>
+            </child>
+            <child type="end">
+              <object class="GtkToggleButton" id="search_button">
+                <property name="icon-name">edit-find-symbolic</property>
+                <property name="active" bind-source="search_bar" bind-property="search-mode-enabled" 
bind-flags="sync-create|bidirectional"/>
+                <property name="tooltip-text" translatable="yes">Search</property>
               </object>
             </child>
           </object>
         </child>
         <child>
-          <object class="HdySearchBar" id="search_bar">
-            <property name="visible">True</property>
+          <object class="GtkSearchBar" id="search_bar">
             <property name="search_mode_enabled">False</property>
             <child>
-              <object class="HdyClamp">
-                <property name="visible">True</property>
+              <object class="AdwClamp">
+                <property name="hexpand">True</property>
                 <child>
                   <object class="GtkSearchEntry" id="search_entry">
-                    <property name="visible">True</property>
-                    <property name="primary_icon_name">edit-find-symbolic</property>
-                    <property name="primary_icon_activatable">False</property>
-                    <property name="primary_icon_sensitive">False</property>
+                    <property name="placeholder-text" bind-source="EphyDataView" 
bind-property="search-description" bind-flags="sync-create"/>
                     <signal name="search-changed" handler="on_search_entry_changed" swapped="no"/>
                   </object>
                 </child>
@@ -76,52 +45,51 @@
         <child>
           <object class="GtkStack" id="stack">
             <property name="vexpand">True</property>
-            <property name="visible">True</property>
             <child>
-              <object class="GtkSpinner" id="spinner">
-                <property name="visible">True</property>
-              </object>
-              <packing>
+              <object class="GtkStackPage">
                 <property name="name">loading</property>
-              </packing>
+                <property name="child">
+                  <object class="GtkSpinner" id="spinner">
+                    <property name="halign">center</property>
+                    <property name="valign">center</property>
+                    <property name="width-request">32</property>
+                    <property name="height-request">32</property>
+                  </object>
+                </property>
+              </object>
             </child>
             <child>
-              <object class="HdyStatusPage" id="empty_page">
-                <property name="visible">True</property>
-              </object>
-              <packing>
+              <object class="GtkStackPage">
                 <property name="name">empty</property>
-              </packing>
+                <property name="child">
+                  <object class="AdwStatusPage" id="empty_page"/>
+                </property>
+              </object>
             </child>
             <child>
-              <object class="HdyStatusPage">
-                <property name="visible">True</property>
-                <property name="icon_name">edit-find-symbolic</property>
-                <property name="title" translatable="yes">No Results Found</property>
-                <property name="description" translatable="yes">Try a different search</property>
-              </object>
-              <packing>
+              <object class="GtkStackPage">
                 <property name="name">no-results</property>
-              </packing>
+                <property name="child">
+                  <object class="AdwStatusPage">
+                    <property name="icon_name">edit-find-symbolic</property>
+                    <property name="title" translatable="yes">No Results Found</property>
+                    <property name="description" translatable="yes">Try a different search</property>
+                  </object>
+                </property>
+              </object>
             </child>
           </object>
         </child>
         <child>
           <object class="GtkActionBar">
-            <property name="visible">True</property>
-            <child>
+            <child type="end">
               <object class="GtkButton" id="clear_button">
-                <property name="visible">True</property>
-                <property name="receives_default">True</property>
                 <property name="use_underline">True</property>
                 <signal name="clicked" handler="on_clear_button_clicked" swapped="yes"/>
                 <style>
                   <class name="destructive-action"/>
                 </style>
               </object>
-              <packing>
-                <property name="pack-type">end</property>
-              </packing>
             </child>
           </object>
         </child>
diff --git a/src/resources/gtk/encoding-dialog.ui b/src/resources/gtk/encoding-dialog.ui
index 01796c782..19c51680b 100644
--- a/src/resources/gtk/encoding-dialog.ui
+++ b/src/resources/gtk/encoding-dialog.ui
@@ -4,16 +4,11 @@
   <requires lib="gtk+" version="3.14"/>
   <template class="EphyEncodingDialog" parent="GtkDialog">
     <property name="title" translatable="yes">Text Encoding</property>
-    <property name="role">epiphany-encoding-chooser</property>
     <property name="modal">True</property>
     <property name="default_width">500</property>
     <property name="default_height">420</property>
-    <property name="type_hint">dialog</property>
     <signal name="response" handler="ephy_encoding_dialog_response_cb" swapped="no"/>
-    <child>
-      <placeholder/>
-    </child>
-    <child internal-child="vbox">
+    <child internal-child="content_area">
       <object class="GtkBox">
         <property name="orientation">vertical</property>
         <property name="spacing">6</property>
@@ -23,11 +18,9 @@
         <property name="margin-end">6</property>
         <child>
           <object class="GtkBox">
-            <property name="visible">True</property>
             <property name="spacing">6</property>
             <child>
               <object class="GtkLabel">
-                <property name="visible">True</property>
                 <property name="xalign">0</property>
                 <property name="margin-start">6</property>
                 <property name="hexpand">True</property>
@@ -37,7 +30,6 @@
             </child>
             <child>
               <object class="GtkSwitch" id="default_switch">
-                <property name="visible">True</property>
                 <property name="valign">start</property>
                 <signal name="state-set" handler="default_switch_toggled_cb" swapped="no"/>
               </object>
@@ -46,108 +38,100 @@
         </child>
         <child>
           <object class="GtkStack" id="type_stack">
-            <property name="visible">True</property>
             <property name="sensitive">False</property>
             <property name="vexpand">True</property>
             <property name="interpolate_size">True</property>
             <child>
-              <object class="GtkBox" id="suggested_box">
-                <property name="visible">True</property>
-                <property name="orientation">vertical</property>
-                <property name="spacing">16</property>
-                <child>
-                  <object class="GtkBox" id="recent_box">
-                    <property name="visible">True</property>
+              <object class="GtkStackPage">
+                <property name="name">suggested_box</property>
+                <property name="child">
+                  <object class="GtkBox" id="suggested_box">
                     <property name="orientation">vertical</property>
-                    <property name="spacing">8</property>
+                    <property name="spacing">16</property>
                     <child>
-                      <object class="GtkLabel">
-                        <property name="visible">True</property>
-                        <property name="xalign">0</property>
-                        <property name="margin_start">8</property>
-                        <property name="label" translatable="yes">Recent encodings</property>
-                        <attributes>
-                          <attribute name="weight" value="bold"/>
-                        </attributes>
+                      <object class="GtkBox" id="recent_box">
+                        <property name="orientation">vertical</property>
+                        <property name="spacing">8</property>
+                        <child>
+                          <object class="GtkLabel">
+                            <property name="xalign">0</property>
+                            <property name="margin_start">8</property>
+                            <property name="label" translatable="yes">Recent encodings</property>
+                            <attributes>
+                              <attribute name="weight" value="bold"/>
+                            </attributes>
+                          </object>
+                        </child>
+                        <child>
+                          <object class="GtkFrame">
+                            <property name="vexpand">True</property>
+                            <child>
+                              <object class="GtkListBox" id="recent_list_box">
+                                <signal name="row-activated" handler="row_activated_cb" swapped="no"/>
+                              </object>
+                            </child>
+                          </object>
+                        </child>
                       </object>
                     </child>
                     <child>
-                      <object class="GtkFrame">
-                        <property name="visible">True</property>
-                        <property name="vexpand">True</property>
+                      <object class="GtkBox" id="related_box">
+                        <property name="orientation">vertical</property>
+                        <property name="spacing">8</property>
+                        <child>
+                          <object class="GtkLabel">
+                            <property name="xalign">0</property>
+                            <property name="margin_start">8</property>
+                            <property name="label" translatable="yes">Related encodings</property>
+                            <attributes>
+                              <attribute name="weight" value="bold"/>
+                            </attributes>
+                          </object>
+                        </child>
                         <child>
-                          <object class="GtkListBox" id="recent_list_box">
-                            <property name="visible">True</property>
-                            <signal name="row-activated" handler="row_activated_cb" swapped="no"/>
+                          <object class="GtkFrame">
+                            <property name="margin-top">6</property>
+                            <property name="margin-bottom">6</property>
+                            <property name="margin-start">6</property>
+                            <property name="margin-end">6</property>
+                            <child>
+                              <object class="GtkListBox" id="related_list_box">
+                                <signal name="row-activated" handler="row_activated_cb" swapped="no"/>
+                              </object>
+                            </child>
                           </object>
                         </child>
                       </object>
                     </child>
-                  </object>
-                </child>
-                <child>
-                  <object class="GtkBox" id="related_box">
-                    <property name="visible">True</property>
-                    <property name="orientation">vertical</property>
-                    <property name="spacing">8</property>
                     <child>
-                      <object class="GtkLabel">
-                        <property name="visible">True</property>
-                        <property name="xalign">0</property>
-                        <property name="margin_start">8</property>
-                        <property name="label" translatable="yes">Related encodings</property>
-                        <attributes>
-                          <attribute name="weight" value="bold"/>
-                        </attributes>
+                      <object class="GtkButton">
+                        <property name="label" translatable="yes">Show all…</property>
+                        <property name="receives_default">False</property>
+                        <signal name="clicked" handler="show_all_button_clicked_cb" swapped="no"/>
                       </object>
                     </child>
+                  </object>
+                </property>
+              </object>
+            </child>
+            <child>
+              <object class="GtkStackPage">
+                <property name="name">scrolled-window</property>
+                <property name="child">
+                  <object class="GtkFrame">
                     <child>
-                      <object class="GtkFrame">
-                        <property name="visible">True</property>
-                        <property name="margin-top">6</property>
-                        <property name="margin-bottom">6</property>
-                        <property name="margin-start">6</property>
-                        <property name="margin-end">6</property>
+                      <object class="GtkScrolledWindow">
+                        <property name="hscrollbar_policy">never</property>
                         <child>
-                          <object class="GtkListBox" id="related_list_box">
-                            <property name="visible">True</property>
-                            <signal name="row-activated" handler="row_activated_cb" swapped="no"/>
+                          <object class="GtkListBox" id="list_box">
+                            <signal name="row-activated" handler="row_activated_cb"/>
                           </object>
                         </child>
                       </object>
                     </child>
                   </object>
-                </child>
-                <child>
-                  <object class="GtkButton">
-                    <property name="label" translatable="yes">Show all…</property>
-                    <property name="visible">True</property>
-                    <property name="receives_default">False</property>
-                    <signal name="clicked" handler="show_all_button_clicked_cb" swapped="no"/>
-                  </object>
-                </child>
+                </property>
               </object>
-              <packing>
-                <property name="name">suggested_box</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkScrolledWindow">
-                <property name="visible">True</property>
-                <property name="hscrollbar_policy">never</property>
-                <style>
-                  <class name="frame"/>
-                </style>
-                <child>
-                  <object class="GtkListBox" id="list_box">
-                    <property name="visible">True</property>
-                    <signal name="row-activated" handler="row_activated_cb"/>
-                  </object>
-                </child>
-              </object>
-              <packing>
-                <property name="name">scrolled-window</property>
-              </packing>
             </child>
           </object>
         </child>
diff --git a/src/resources/gtk/encoding-row.ui b/src/resources/gtk/encoding-row.ui
index 966a1017f..d22827a8d 100644
--- a/src/resources/gtk/encoding-row.ui
+++ b/src/resources/gtk/encoding-row.ui
@@ -2,17 +2,15 @@
 <interface>
   <!-- interface-requires gtk+ 3.0 -->
   <template class="EphyEncodingRow" parent="GtkBox">
-    <property name="visible">True</property> <!-- TODO remove when never called manually -->
     <property name="halign">center</property>
     <property name="height-request">30</property>
     <property name="spacing">8</property>
     <child>
-      <object class="GtkLabel" id="encoding_label">
-        <property name="visible">True</property>
-      </object>
+      <object class="GtkLabel" id="encoding_label"/>
     </child>
     <child>
       <object class="GtkImage" id="selected_image">
+        <property name="visible">False</property>
         <property name="icon-name">object-select-symbolic</property>
       </object>
     </child>
diff --git a/src/resources/gtk/firefox-sync-dialog.ui b/src/resources/gtk/firefox-sync-dialog.ui
index 7011a4264..277f740b4 100644
--- a/src/resources/gtk/firefox-sync-dialog.ui
+++ b/src/resources/gtk/firefox-sync-dialog.ui
@@ -1,203 +1,172 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <interface>
   <requires lib="gtk+" version="3.0"/>
-  <template class="EphyFirefoxSyncDialog" parent="HdyWindow">
-    <property name="visible">True</property>
+  <template class="EphyFirefoxSyncDialog" parent="GtkWindow">
     <property name="modal">False</property>
-    <property name="window-position">center-on-parent</property>
     <property name="default-width">640</property>
     <property name="default-height">800</property>
     <property name="destroy-with-parent">True</property>
-    <property name="type-hint">dialog</property>
+    <property name="title" translatable="yes">Firefox Sync</property>
+    <child type="titlebar">
+      <object class="GtkHeaderBar"/>
+    </child>
     <child>
-      <object class="GtkBox">
-        <property name="visible">True</property>
-        <property name="orientation">vertical</property>
+      <object class="AdwPreferencesPage">
         <child>
-          <object class="HdyHeaderBar">
-            <property name="visible">True</property>
-            <property name="show-close-button">True</property>
-            <property name="title" translatable="yes">Firefox Sync</property>
+          <object class="AdwPreferencesGroup" id="sync_page_group">
+            <property name="description" translatable="yes">Sign in with your Firefox account to sync your 
data with GNOME Web and Firefox on other computers. GNOME Web is not Firefox and is not produced or endorsed 
by Mozilla.</property>
+            <child>
+              <object class="GtkBox" id="sync_firefox_iframe_box">
+                <property name="orientation">vertical</property>
+                <property name="spacing">6</property>
+                <child>
+                  <object class="GtkLabel" id="sync_firefox_iframe_label">
+                    <property name="visible">False</property>
+                    <property name="xalign">0</property>
+                  </object>
+                </child>
+              </object>
+            </child>
           </object>
         </child>
         <child>
-          <object class="HdyPreferencesPage">
-            <property name="visible">True</property>
+          <object class="AdwPreferencesGroup" id="sync_firefox_account_group">
+            <property name="title" translatable="yes">Firefox Account</property>
+            <child>
+              <object class="AdwActionRow" id="sync_firefox_account_row">
+                <property name="subtitle" translatable="yes">Logged in</property>
+                <property name="use_underline">True</property>
+                <child>
+                  <object class="GtkButton" id="sync_sign_out_button">
+                    <property name="label" translatable="yes">Sign _out</property>
+                    <property name="use-underline">True</property>
+                    <property name="valign">center</property>
+                    <signal name="clicked" handler="on_sync_sign_out_button_clicked"/>
+                  </object>
+                </child>
+              </object>
+            </child>
+          </object>
+        </child>
+        <child>
+          <object class="AdwPreferencesGroup" id="sync_options_group">
+            <property name="title" translatable="yes">Sync Options</property>
+            <child>
+              <object class="AdwActionRow">
+                <property name="activatable_widget">sync_bookmarks_switch</property>
+                <property name="title" translatable="yes">Sync _Bookmarks</property>
+                <property name="use_underline">True</property>
+                <child>
+                  <object class="GtkSwitch" id="sync_bookmarks_switch">
+                    <property name="valign">center</property>
+                  </object>
+                </child>
+              </object>
+            </child>
             <child>
-              <object class="HdyPreferencesGroup" id="sync_page_group">
-                <property name="description" translatable="yes">Sign in with your Firefox account to sync 
your data with GNOME Web and Firefox on other computers. GNOME Web is not Firefox and is not produced or 
endorsed by Mozilla.</property>
-                <property name="visible">True</property>
+              <object class="AdwActionRow">
+                <property name="activatable_widget">sync_passwords_switch</property>
+                <property name="title" translatable="yes">Sync _Passwords</property>
+                <property name="use_underline">True</property>
                 <child>
-                  <object class="GtkBox" id="sync_firefox_iframe_box">
-                    <property name="visible">True</property>
-                    <property name="orientation">vertical</property>
-                    <property name="spacing">6</property>
-                    <child>
-                      <object class="GtkLabel" id="sync_firefox_iframe_label">
-                        <property name="visible">False</property>
-                        <property name="xalign">0</property>
-                      </object>
-                    </child>
+                  <object class="GtkSwitch" id="sync_passwords_switch">
+                    <property name="valign">center</property>
                   </object>
                 </child>
               </object>
             </child>
             <child>
-              <object class="HdyPreferencesGroup" id="sync_firefox_account_group">
-                <property name="title" translatable="yes">Firefox Account</property>
-                <property name="visible">True</property>
+              <object class="AdwActionRow">
+                <property name="activatable_widget">sync_history_switch</property>
+                <property name="title" translatable="yes">Sync _History</property>
+                <property name="use_underline">True</property>
                 <child>
-                  <object class="HdyActionRow" id="sync_firefox_account_row">
-                    <property name="subtitle" translatable="yes">Logged in</property>
-                    <property name="use_underline">True</property>
-                    <property name="visible">True</property>
-                    <child>
-                      <object class="GtkButton" id="sync_sign_out_button">
-                        <property name="label" translatable="yes">Sign _out</property>
-                        <property name="use-underline">True</property>
-                        <property name="valign">center</property>
-                        <property name="visible">True</property>
-                        <signal name="clicked" handler="on_sync_sign_out_button_clicked"/>
-                      </object>
-                    </child>
+                  <object class="GtkSwitch" id="sync_history_switch">
+                    <property name="valign">center</property>
                   </object>
                 </child>
               </object>
             </child>
             <child>
-              <object class="HdyPreferencesGroup" id="sync_options_group">
-                <property name="title" translatable="yes">Sync Options</property>
-                <property name="visible">True</property>
+              <object class="AdwActionRow">
+                <property name="activatable_widget">sync_open_tabs_switch</property>
+                <property name="title" translatable="yes">Sync Open _Tabs</property>
+                <property name="use_underline">True</property>
                 <child>
-                  <object class="HdyActionRow">
-                    <property name="activatable_widget">sync_bookmarks_switch</property>
-                    <property name="title" translatable="yes">Sync _Bookmarks</property>
-                    <property name="use_underline">True</property>
-                    <property name="visible">True</property>
-                    <child>
-                      <object class="GtkSwitch" id="sync_bookmarks_switch">
-                        <property name="valign">center</property>
-                        <property name="visible">True</property>
-                      </object>
-                    </child>
+                  <object class="GtkSwitch" id="sync_open_tabs_switch">
+                    <property name="valign">center</property>
                   </object>
                 </child>
                 <child>
-                  <object class="HdyActionRow">
-                    <property name="activatable_widget">sync_passwords_switch</property>
-                    <property name="title" translatable="yes">Sync _Passwords</property>
-                    <property name="use_underline">True</property>
-                    <property name="visible">True</property>
-                    <child>
-                      <object class="GtkSwitch" id="sync_passwords_switch">
-                        <property name="valign">center</property>
-                        <property name="visible">True</property>
-                      </object>
-                    </child>
+                  <object class="GtkButton" id="synced_tabs_button">
+                    <property name="label" translatable="yes">S_ynced tabs</property>
+                    <property name="use-underline">True</property>
+                    <property name="valign">center</property>
+                    <signal name="clicked" handler="on_sync_synced_tabs_button_clicked"/>
                   </object>
                 </child>
+              </object>
+            </child>
+            <child>
+              <object class="AdwComboRow" id="sync_frequency_row">
+                <property name="title" translatable="yes">Frequency</property>
+                <property name="expression">
+                  <closure type="gchararray" function="get_sync_frequency_minutes_name"/>
+                </property>
+                <child>
+                  <object class="GtkSeparator">
+                    <property name="margin_bottom">8</property>
+                    <property name="margin_top">8</property>
+                  </object>
+                </child>
+                <child>
+                  <object class="GtkButton" id="sync_now_button">
+                    <property name="label" translatable="yes">Sync _now</property>
+                    <property name="use-underline">True</property>
+                    <property name="valign">center</property>
+                    <signal name="clicked" handler="on_sync_sync_now_button_clicked"/>
+                  </object>
+                </child>
+              </object>
+            </child>
+            <child>
+              <object class="AdwActionRow">
+                <property name="activatable">False</property>
+                <property name="title" translatable="yes">Device name</property>
+                <property name="use_underline">True</property>
                 <child>
-                  <object class="HdyActionRow">
-                    <property name="activatable_widget">sync_history_switch</property>
-                    <property name="title" translatable="yes">Sync _History</property>
-                    <property name="use_underline">True</property>
-                    <property name="visible">True</property>
-                    <child>
-                      <object class="GtkSwitch" id="sync_history_switch">
-                        <property name="valign">center</property>
-                        <property name="visible">True</property>
-                      </object>
-                    </child>
+                  <object class="GtkButton" id="sync_device_name_cancel_button">
+                    <property name="label" translatable="yes">_Cancel</property>
+                    <property name="use-underline">True</property>
+                    <property name="valign">center</property>
+                    <property name="visible">False</property>
+                    <signal name="clicked" handler="on_sync_device_name_cancel_button_clicked"/>
                   </object>
                 </child>
                 <child>
-                  <object class="HdyActionRow">
-                    <property name="activatable_widget">sync_open_tabs_switch</property>
-                    <property name="title" translatable="yes">Sync Open _Tabs</property>
-                    <property name="use_underline">True</property>
-                    <property name="visible">True</property>
-                    <child>
-                      <object class="GtkSwitch" id="sync_open_tabs_switch">
-                        <property name="valign">center</property>
-                        <property name="visible">True</property>
-                      </object>
-                    </child>
-                    <child>
-                      <object class="GtkButton" id="synced_tabs_button">
-                        <property name="label" translatable="yes">S_ynced tabs</property>
-                        <property name="use-underline">True</property>
-                        <property name="valign">center</property>
-                        <property name="visible">True</property>
-                        <signal name="clicked" handler="on_sync_synced_tabs_button_clicked"/>
-                      </object>
-                    </child>
+                  <object class="GtkButton" id="sync_device_name_save_button">
+                    <property name="label" translatable="yes">_Save</property>
+                    <property name="use-underline">True</property>
+                    <property name="valign">center</property>
+                    <property name="visible">False</property>
+                    <signal name="clicked" handler="on_sync_device_name_save_button_clicked"/>
                   </object>
                 </child>
                 <child>
-                  <object class="HdyComboRow" id="sync_frequency_row">
-                    <property name="title" translatable="yes">Frequency</property>
-                    <property name="visible">True</property>
-                    <child>
-                      <object class="GtkSeparator">
-                        <property name="margin_bottom">8</property>
-                        <property name="margin_top">8</property>
-                        <property name="visible">True</property>
-                      </object>
-                    </child>
-                    <child>
-                      <object class="GtkButton" id="sync_now_button">
-                        <property name="label" translatable="yes">Sync _now</property>
-                        <property name="use-underline">True</property>
-                        <property name="valign">center</property>
-                        <property name="visible">True</property>
-                        <signal name="clicked" handler="on_sync_sync_now_button_clicked"/>
-                      </object>
-                    </child>
+                  <object class="GtkButton" id="sync_device_name_change_button">
+                    <property name="label" translatable="yes">_Change</property>
+                    <property name="use-underline">True</property>
+                    <property name="valign">center</property>
+                    <signal name="clicked" handler="on_sync_device_name_change_button_clicked"/>
                   </object>
                 </child>
                 <child>
-                  <object class="HdyActionRow">
-                    <property name="activatable">False</property>
-                    <property name="title" translatable="yes">Device name</property>
-                    <property name="use_underline">True</property>
-                    <property name="visible">True</property>
-                    <child>
-                      <object class="GtkButton" id="sync_device_name_cancel_button">
-                        <property name="label" translatable="yes">_Cancel</property>
-                        <property name="use-underline">True</property>
-                        <property name="valign">center</property>
-                        <property name="visible">False</property>
-                        <signal name="clicked" handler="on_sync_device_name_cancel_button_clicked"/>
-                      </object>
-                    </child>
-                    <child>
-                      <object class="GtkButton" id="sync_device_name_save_button">
-                        <property name="label" translatable="yes">_Save</property>
-                        <property name="use-underline">True</property>
-                        <property name="valign">center</property>
-                        <property name="visible">False</property>
-                        <signal name="clicked" handler="on_sync_device_name_save_button_clicked"/>
-                      </object>
-                    </child>
-                    <child>
-                      <object class="GtkButton" id="sync_device_name_change_button">
-                        <property name="label" translatable="yes">_Change</property>
-                        <property name="use-underline">True</property>
-                        <property name="valign">center</property>
-                        <property name="visible">True</property>
-                        <signal name="clicked" handler="on_sync_device_name_change_button_clicked"/>
-                      </object>
-                    </child>
-                    <child>
-                      <object class="GtkEntry" id="sync_device_name_entry">
-                        <property name="sensitive">False</property>
-                        <property name="margin-start">12</property>
-                        <property name="margin-end">12</property>
-                        <property name="margin-top">8</property>
-                        <property name="margin-bottom">8</property>
-                        <property name="visible">True</property>
-                      </object>
-                    </child>
+                  <object class="GtkEntry" id="sync_device_name_entry">
+                    <property name="sensitive">False</property>
+                    <property name="margin-start">12</property>
+                    <property name="margin-end">12</property>
+                    <property name="margin-top">8</property>
+                    <property name="margin-bottom">8</property>
                   </object>
                 </child>
               </object>
diff --git a/src/resources/gtk/history-dialog.ui b/src/resources/gtk/history-dialog.ui
index 89830749b..8ce992842 100644
--- a/src/resources/gtk/history-dialog.ui
+++ b/src/resources/gtk/history-dialog.ui
@@ -2,143 +2,76 @@
 <interface>
   <requires lib="gtk+" version="3.20"/>
   <requires lib="libhandy" version="0.0"/>
-  <template class="EphyHistoryDialog" parent="HdyWindow">
-    <!--property name="search_description" translatable="yes">Search history</property-->
+  <template class="EphyHistoryDialog" parent="AdwWindow">
     <property name="modal">True</property>
-    <property name="window-position">center-on-parent</property>
     <property name="default-width">640</property>
     <property name="default-height">800</property>
     <property name="destroy-with_parent">True</property>
-    <property name="type-hint">dialog</property>
-    <signal name="key-press-event" handler="on_key_press_event" swapped="no"/>
-    <signal name="key-release-event" handler="on_key_release_event"/>
+    <property name="title" translatable="yes">History</property>
+<!--    <signal name="key-press-event" handler="on_key_press_event" swapped="no"/>
+    <signal name="key-release-event" handler="on_key_release_event"/>-->
     <child>
       <object class="GtkBox">
-        <property name="visible">True</property>
         <property name="orientation">vertical</property>
         <child>
           <object class="GtkStack" id="header_bars_stack">
-            <property name="visible">True</property>
-            <property name="transition-type">GTK_STACK_TRANSITION_TYPE_CROSSFADE</property>
+            <property name="transition-type">crossfade</property>
             <child>
-              <object class="HdyHeaderBar" id="window_header_bar">
-                <property name="visible">True</property>
-                <property name="show_close_button">True</property>
-                <property name="title" translatable="yes">History</property>
-                <child>
+              <object class="GtkHeaderBar" id="window_header_bar">
+                <child type="end">
                   <object class="GtkButton" id="selection_button">
-                    <property name="visible">True</property>
-                    <property name="valign">center</property>
                     <property name="use-underline">True</property>
+                    <property name="icon-name">selection-mode-symbolic</property>
+                    <property name="tooltip-text" translatable="yes">Select Items</property>
                     <signal name="clicked" handler="on_selection_button_clicked"/>
-                    <style>
-                      <class name="image-button"/>
-                    </style>
-                    <child internal-child="accessible">
-                      <object class="AtkObject" id="a11y-button3">
-                        <property name="accessible-name" translatable="yes">Select Items</property>
-                      </object>
-                    </child>
-                    <child>
-                      <object class="GtkImage">
-                        <property name="visible">True</property>
-                        <property name="icon-name">object-select-symbolic</property>
-                        <property name="icon-size">1</property>
-                      </object>
-                    </child>
                   </object>
-                  <packing>
-                    <property name="pack-type">end</property>
-                  </packing>
                 </child>
-                <child>
+                <child type="end">
                   <object class="GtkToggleButton" id="search_button">
-                    <property name="visible">True</property>
-                    <property name="receives_default">True</property>
-                    <property name="always_show_image">True</property>
+                    <property name="icon-name">edit-find-symbolic</property>
+                    <property name="tooltip-text" translatable="yes">Search</property>
                     <property name="active" bind-source="search_bar" bind-property="search-mode-enabled" 
bind-flags="sync-create|bidirectional"/>
-                    <accelerator key="F" modifiers="GDK_CONTROL_MASK" signal="clicked"/>
-                    <child>
-                      <object class="GtkImage">
-                        <property name="visible">True</property>
-                        <property name="icon_name">edit-find-symbolic</property>
-                      </object>
-                    </child>
-                    <child internal-child="accessible">
-                      <object class="AtkObject">
-                        <property name="AtkObject::accessible-name" translatable="yes">Search</property>
-                      </object>
-                    </child>
+<!--                    <accelerator key="F" modifiers="GDK_CONTROL_MASK" signal="clicked"/>-->
                   </object>
-                  <packing>
-                    <property name="pack_type">end</property>
-                  </packing>
                 </child>
               </object>
             </child>
             <child>
-              <object class="HdyHeaderBar" id="selection_header_bar">
-                <property name="visible">True</property>
-                <property name="title" translatable="yes">History</property>
+              <object class="GtkHeaderBar" id="selection_header_bar">
+                <property name="show-title-buttons">False</property>
                 <style>
                   <class name="selection-mode"/>
                 </style>
-                <child>
+                <child type="end">
                   <object class="GtkButton" id="selection_cancel_button">
-                    <property name="visible">True</property>
-                    <property name="valign">center</property>
                     <property name="use-underline">True</property>
                     <property name="label" translatable="yes">_Cancel</property>
                     <signal name="clicked" handler="on_selection_cancel_button_clicked"/>
-                    <style>
-                      <class name="text-button"/>
-                    </style>
                   </object>
-                  <packing>
-                    <property name="pack-type">end</property>
-                  </packing>
                 </child>
-                <child>
+                <child type="end">
                   <object class="GtkToggleButton" id="selection_search_button">
-                    <property name="visible">True</property>
+                    <property name="icon-name">edit-find-symbolic</property>
+                    <property name="tooltip-text" translatable="yes">Search</property>
                     <property name="active" bind-source="search_bar" bind-property="search-mode-enabled" 
bind-flags="sync-create|bidirectional"/>
-                    <accelerator key="F" modifiers="GDK_CONTROL_MASK" signal="clicked"/>
-                    <child>
-                      <object class="GtkImage">
-                        <property name="visible">True</property>
-                        <property name="icon_name">edit-find-symbolic</property>
-                      </object>
-                    </child>
-                    <child internal-child="accessible">
-                      <object class="AtkObject">
-                        <property name="AtkObject::accessible-name" translatable="yes">Search</property>
-                      </object>
-                    </child>
+<!--                    <accelerator key="F" modifiers="GDK_CONTROL_MASK" signal="clicked"/>-->
                   </object>
-                  <packing>
-                    <property name="pack_type">end</property>
-                  </packing>
                 </child>
               </object>
             </child>
           </object>
         </child>
         <child>
-          <object class="HdySearchBar" id="search_bar">
-            <property name="visible">True</property>
+          <object class="GtkSearchBar" id="search_bar">
             <property name="search_mode_enabled">False</property>
             <child>
-              <object class="HdyClamp">
-                <property name="visible">True</property>
+              <object class="AdwClamp">
+                <property name="hexpand">True</property>
                 <property name="maximum_size">400</property>
                 <property name="tightening_threshold">300</property>
                 <child>
                   <object class="GtkSearchEntry" id="search_entry">
-                    <property name="visible">True</property>
                     <property name="placeholder-text" translatable="yes">Search history</property>
-                    <property name="primary_icon_name">edit-find-symbolic</property>
-                    <property name="primary_icon_activatable">False</property>
-                    <property name="primary_icon_sensitive">False</property>
                     <signal name="search-changed" handler="on_search_entry_changed"/>
                   </object>
                 </child>
@@ -148,31 +81,32 @@
         </child>
         <child>
           <object class="GtkStack" id="history_presentation_stack">
-            <property name="visible">True</property>
             <property name="vexpand">True</property>
             <child>
               <object class="GtkScrolledWindow" id="history_scrolled_window">
-                <property name="visible">True</property>
                 <signal name="edge-reached" handler="on_edge_reached" object="EphyHistoryDialog" 
swapped="no"/>
                 <child>
-                  <object class="HdyClamp">
-                    <property name="visible">True</property>
-                    <property name="margin_start">6</property>
-                    <property name="margin_end">6</property>
-                    <property name="maximum_size">1024</property>
+                  <object class="GtkViewport">
+                    <property name="scroll-to-focus">True</property>
                     <child>
-                      <object class="GtkListBox" id="listbox">
-                        <property name="visible">True</property>
-                        <property name="margin_top">6</property>
-                        <property name="margin_bottom">6</property>
-                        <property name="valign">start</property>
-                        <property name="selection_mode">none</property>
-                        <property name="activate_on_single_click">True</property>
-                        <signal name="key-press-event" handler="on_listbox_key_press_event" swapped="no"/>
-                        <signal name="row-activated" handler="on_listbox_row_activated"/>
-                        <style>
-                          <class name="content"/>
-                        </style>
+                      <object class="AdwClamp">
+                        <property name="margin_start">6</property>
+                        <property name="margin_end">6</property>
+                        <property name="maximum_size">1024</property>
+                        <child>
+                          <object class="GtkListBox" id="listbox">
+                            <property name="margin_top">6</property>
+                            <property name="margin_bottom">6</property>
+                            <property name="valign">start</property>
+                            <property name="selection_mode">none</property>
+                            <property name="activate_on_single_click">True</property>
+<!--                            <signal name="key-press-event" handler="on_listbox_key_press_event" 
swapped="no"/>-->
+                            <signal name="row-activated" handler="on_listbox_row_activated"/>
+                            <style>
+                              <class name="boxed-list"/>
+                            </style>
+                          </object>
+                        </child>
                       </object>
                     </child>
                   </object>
@@ -181,19 +115,20 @@
             </child>
             <child>
               <object class="GtkSpinner" id="loading_spinner">
-                <property name="visible">True</property>
+                <property name="halign">center</property>
+                <property name="valign">center</property>
+                <property name="width-request">32</property>
+                <property name="height-request">32</property>
               </object>
             </child>
             <child>
-              <object class="HdyStatusPage" id="empty_history_message">
-                <property name="visible">True</property>
+              <object class="AdwStatusPage" id="empty_history_message">
                 <property name="title" translatable="yes">The History is Empty</property>
                 <property name="description" translatable="yes">Visited pages will be listed here</property>
               </object>
             </child>
             <child>
-              <object class="HdyStatusPage" id="no_search_results_message">
-                <property name="visible">True</property>
+              <object class="AdwStatusPage" id="no_search_results_message">
                 <property name="icon_name">edit-find-symbolic</property>
                 <property name="title" translatable="yes">No Results Found</property>
                 <property name="description" translatable="yes">Try a different search</property>
@@ -203,37 +138,26 @@
         </child>
         <child>
           <object class="GtkStack" id="action_bars_stack">
-            <property name="visible">True</property>
-            <property name="transition-type">GTK_STACK_TRANSITION_TYPE_CROSSFADE</property>
+            <property name="transition-type">crossfade</property>
             <child>
               <object class="GtkActionBar" id="regular_action_bar">
-                <property name="visible">True</property>
-                <child>
+                <child type="end">
                   <object class="GtkButton" id="clear_all_button">
-                    <property name="visible">True</property>
-                    <property name="receives_default">True</property>
                     <property name="use-underline">True</property>
                     <property name="label" translatable="yes">_Clear All</property>
                     <signal name="clicked" handler="on_clear_all_button_clicked"/>
-                    <accelerator key="Delete" modifiers="GDK_SHIFT_MASK" signal="clicked"/>
+<!--                    <accelerator key="Delete" modifiers="GDK_SHIFT_MASK" signal="clicked"/>-->
                     <style>
                       <class name="destructive-action"/>
-                      <class name="image-button"/>
                     </style>
                   </object>
-                  <packing>
-                    <property name="pack-type">end</property>
-                  </packing>
                 </child>
               </object>
             </child>
             <child>
               <object class="GtkActionBar" id="selection_action_bar">
-                <property name="visible">True</property>
-                <child>
+                <child type="end">
                   <object class="GtkButton" id="selection_delete_button">
-                    <property name="visible">True</property>
-                    <property name="receives_default">True</property>
                     <property name="sensitive">False</property>
                     <property name="use_underline">True</property>
                     <property name="label" translatable="yes">_Delete</property>
@@ -242,14 +166,9 @@
                       <class name="destructive-action"/>
                     </style>
                   </object>
-                  <packing>
-                    <property name="pack-type">end</property>
-                  </packing>
                 </child>
                 <child>
                   <object class="GtkButton" id="selection_open_button">
-                    <property name="visible">True</property>
-                    <property name="receives_default">True</property>
                     <property name="sensitive">False</property>
                     <property name="use_underline">True</property>
                     <property name="label" translatable="yes">_Open</property>
diff --git a/src/resources/gtk/lang-row.ui b/src/resources/gtk/lang-row.ui
index 09318894c..c20e67002 100644
--- a/src/resources/gtk/lang-row.ui
+++ b/src/resources/gtk/lang-row.ui
@@ -2,63 +2,37 @@
 <interface>
   <requires lib="gtk+" version="3.20"/>
   <template class="EphyLangRow" parent="GtkListBoxRow">
-    <property name="visible">True</property>
     <child>
       <object class="GtkBox">
-        <property name="visible">True</property>
-        <property name="orientation">GTK_ORIENTATION_VERTICAL</property>
+        <property name="orientation">vertical</property>
         <child>
           <object class="GtkRevealer" id="dnd_top_revealer">
-            <property name="visible">True</property>
             <child>
-              <object class="HdyActionRow">
-                <property name="visible">True</property>
-              </object>
+              <object class="AdwActionRow"/>
             </child>
           </object>
         </child>
         <child>
-          <object class="HdyActionRow" id="action_row">
-            <property name="visible">True</property>
+          <object class="AdwActionRow" id="action_row">
             <child type="prefix">
-              <object class="GtkEventBox" id="drag_event_box">
-                <property name="visible">True</property>
-                <child>
-                  <object class="GtkImage">
-                    <property name="visible">True</property>
-                    <property name="icon-name">list-drag-handle-symbolic</property>
-                    <property name="icon-size">1</property>
-                  </object>
-                </child>
+              <object class="GtkImage" id="drag_handle">
+                <property name="icon-name">list-drag-handle-symbolic</property>
               </object>
             </child>
             <child>
               <object class="GtkButton" id="delete_button">
-                <property name="visible">True</property>
                 <property name="valign">center</property>
+                <property name="icon-name">edit-delete-symbolic</property>
                 <property name="tooltip-text" translatable="yes">Delete language</property>
                 <signal name="clicked" handler="on_delete_button_clicked"/>
-                <child>
-                  <object class="GtkImage">
-                    <property name="visible">True</property>
-                    <property name="icon-name">edit-delete-symbolic</property>
-                    <property name="icon-size">2</property>
-                    <style>
-                      <class name="image-button"/>
-                    </style>
-                  </object>
-                </child>
               </object>
             </child>
           </object>
         </child>
         <child>
           <object class="GtkRevealer" id="dnd_bottom_revealer">
-            <property name="visible">True</property>
             <child>
-              <object class="HdyActionRow">
-                <property name="visible">True</property>
-              </object>
+              <object class="AdwActionRow"/>
             </child>
           </object>
         </child>
diff --git a/src/resources/gtk/page-menu-popover.ui b/src/resources/gtk/page-menu-popover.ui
index 0e1b5b786..592844f92 100644
--- a/src/resources/gtk/page-menu-popover.ui
+++ b/src/resources/gtk/page-menu-popover.ui
@@ -1,374 +1,178 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <interface>
+  <menu id="menu">
+    <section>
+      <item>
+        <attribute name="custom">zoom</attribute>
+      </item>
+      <item>
+        <attribute name="custom">header</attribute>
+      </item>
+    </section>
+    <section>
+      <item>
+        <attribute name="label" translatable="yes">_Run in Background</attribute>
+        <attribute name="action">app.run-in-background</attribute>
+        <attribute name="hidden-when">action-disabled</attribute>
+      </item>
+    </section>
+    <section>
+      <item>
+        <attribute name="label" translatable="yes">_New Window</attribute>
+        <attribute name="action">app.new-window</attribute>
+      </item>
+      <item>
+        <attribute name="label" translatable="yes">New _Incognito Window</attribute>
+        <attribute name="action">app.new-incognito</attribute>
+      </item>
+    </section>
+    <section>
+      <item>
+        <attribute name="label" translatable="yes">Reopen Closed _Tab</attribute>
+        <attribute name="action">app.reopen-closed-tab</attribute>
+      </item>
+      <item>
+        <attribute name="label" translatable="yes">_History</attribute>
+        <attribute name="action">app.history</attribute>
+      </item>
+    </section>
+    <section>
+      <item>
+        <attribute name="label" translatable="yes">Firefox _Sync</attribute>
+        <attribute name="action">app.firefox-sync-dialog</attribute>
+      </item>
+      <submenu>
+        <attribute name="label" translatable="yes">I_mport and Export</attribute>
+        <section>
+          <item>
+            <attribute name="label" translatable="yes">I_mport Bookmarks…</attribute>
+            <attribute name="action">app.import-bookmarks</attribute>
+          </item>
+          <item>
+            <attribute name="label" translatable="yes">E_xport Bookmarks…</attribute>
+            <attribute name="action">app.export-bookmarks</attribute>
+          </item>
+        </section>
+        <section>
+          <item>
+            <attribute name="label" translatable="yes">Import _Passwords…</attribute>
+            <attribute name="action">app.import-passwords</attribute>
+          </item>
+        </section>
+      </submenu>
+    </section>
+    <section>
+      <item>
+        <attribute name="label" translatable="yes">Install Site as Web _Application…</attribute>
+        <attribute name="action">win.save-as-application</attribute>
+      </item>
+      <item>
+        <attribute name="label" translatable="yes">Open Appli_cation Manager</attribute>
+        <attribute name="action">win.open-application-manager</attribute>
+      </item>
+      <item>
+        <attribute name="label" translatable="yes">E_xtensions</attribute>
+        <attribute name="action">win.extensions</attribute>
+      </item>
+    </section>
+    <section>
+      <item>
+        <attribute name="label" translatable="yes">_Override Text Encoding…</attribute>
+        <attribute name="action">win.encoding</attribute>
+      </item>
+    </section>
+    <section>
+      <item>
+        <attribute name="label" translatable="yes">Pr_eferences</attribute>
+        <attribute name="action">app.preferences</attribute>
+      </item>
+      <item>
+        <attribute name="label" translatable="yes">_Keyboard Shortcuts</attribute>
+        <attribute name="action">app.shortcuts</attribute>
+      </item>
+      <item>
+        <attribute name="label" translatable="yes">_Help</attribute>
+        <attribute name="action">app.help</attribute>
+      </item>
+      <item>
+        <attribute name="label" translatable="yes">_About Web</attribute>
+        <attribute name="action">app.about</attribute>
+      </item>
+    </section>
+  </menu>
   <object class="GtkPopoverMenu" id="page-menu-popover">
-    <child>
-      <object class="GtkBox">
-        <property name="margin-top">12</property>
-        <property name="orientation">vertical</property>
-        <property name="visible">True</property>
-        <property name="spacing">6</property>
+    <property name="menu-model">menu</property>
+    <child type="zoom">
+      <object class="GtkBox" id="zoom-box">
+        <property name="orientation">horizontal</property>
+        <property name="homogeneous">True</property>
+        <style>
+          <class name="linked"/>
+          <class name="page-menu-zoom-box"/>
+        </style>
         <child>
-          <object class="GtkBox" id="zoom-box">
-            <property name="visible">True</property>
-            <property name="orientation">horizontal</property>
-            <property name="homogeneous">True</property>
-            <property name="margin-start">12</property>
-            <property name="margin-end">12</property>
-            <style>
-              <class name="linked"/>
-              <class name="page-menu-zoom-box"/>
-            </style>
-            <child>
-              <object class="GtkButton">
-                <property name="tooltip_text" translatable="yes" context="tooltip">Zoom Out</property>
-                <property name="action-name">win.zoom-out</property>
-                <property name="visible">True</property>
-                <child>
-                  <object class="GtkImage">
-                    <property name="visible">True</property>
-                    <property name="icon_name">zoom-out-symbolic</property>
-                  </object>
-                </child>
-              </object>
-            </child>
-            <child>
-              <object class="GtkButton">
-                <property name="tooltip_text" translatable="yes">Restore Zoom</property>
-                <property name="action-name">win.zoom-normal</property>
-                <property name="visible">True</property>
-                <child>
-                  <object class="GtkLabel" id="zoom-level">
-                    <property name="visible">True</property>
-                    <property name="width-chars">5</property>
-                  </object>
-                </child>
-              </object>
-            </child>
-            <child>
-              <object class="GtkButton">
-                <property name="tooltip_text" translatable="yes" context="tooltip">Zoom In</property>
-                <property name="action-name">win.zoom-in</property>
-                <property name="visible">True</property>
-                <child>
-                  <object class="GtkImage">
-                    <property name="visible">True</property>
-                    <property name="icon_name">zoom-in-symbolic</property>
-                  </object>
-                </child>
-              </object>
-            </child>
+          <object class="GtkButton">
+            <property name="tooltip_text" translatable="yes" context="tooltip">Zoom Out</property>
+            <property name="icon_name">zoom-out-symbolic</property>
+            <property name="action-name">win.zoom-out</property>
           </object>
         </child>
         <child>
-          <object class="GtkBox">
-            <property name="visible">True</property>
-            <property name="orientation">horizontal</property>
-            <property name="spacing">6</property>
-            <property name="homogeneous">True</property>
-            <property name="margin-start">12</property>
-            <property name="margin-end">12</property>
+          <object class="GtkButton">
+            <property name="tooltip_text" translatable="yes">Restore Zoom</property>
+            <property name="action-name">win.zoom-normal</property>
             <child>
-              <object class="GtkModelButton">
-                <property name="tooltip_text" translatable="yes">Print…</property>
-                <property name="action-name">win.print</property>
-                <property name="iconic">True</property>
-                <property name="centered">True</property>
-                <property name="icon">print</property>
+              <object class="GtkLabel" id="zoom-level">
                 <property name="visible">True</property>
-              </object>
-            </child>
-            <child>
-              <object class="GtkModelButton">
-                <property name="tooltip_text" translatable="yes">Find…</property>
-                <property name="action-name">win.find</property>
-                <property name="iconic">True</property>
-                <property name="centered">True</property>
-                <property name="icon">find</property>
-                <property name="visible">True</property>
-              </object>
-            </child>
-            <child>
-              <object class="GtkModelButton">
-                <property name="tooltip_text" translatable="yes">Fullscreen</property>
-                <property name="action-name">win.fullscreen</property>
-                <property name="iconic">True</property>
-                <property name="centered">True</property>
-                <property name="icon">fullscreen</property>
-                <property name="visible">True</property>
-              </object>
-            </child>
-            <child>
-              <object class="GtkButton" id="combined_stop_reload_button">
-                <property name="tooltip_text" translatable="yes">Reload</property>
-                <property name="action-name">toolbar.combined-stop-reload</property>
-                <property name="visible">True</property>
-                <style>
-                  <class name="image-button"/>
-                </style>
-                <child>
-                  <object class="GtkImage" id="combined_stop_reload_image">
-                    <property name="visible">True</property>
-                    <property name="icon-name">view-refresh-symbolic</property>
-                    <property name="icon-size">1</property>
-                  </object>
-                </child>
+                <property name="width-chars">5</property>
               </object>
             </child>
           </object>
         </child>
         <child>
-          <object class="GtkBox">
-            <property name="orientation">vertical</property>
-            <property name="visible">True</property>
-            <style>
-              <class name="page-menu-contents"/>
-            </style>
-
-            <!-- FRAGILE: These buttons are manually removed for non app mode in ephy-header-bar.c. -->
-            <child>
-              <object class="GtkSeparator" id="run-in-background-separator">
-                <property name="orientation">horizontal</property>
-                <property name="margin-top">6</property>
-                <property name="margin-bottom">6</property>
-                <property name="visible">True</property>
-              </object>
-            </child>
-            <child>
-              <object class="GtkModelButton" id="run-in-background-button">
-                <property name="text" translatable="yes">_Run in Background</property>
-                <property name="action-name">app.run-in-background</property>
-                <property name="visible">True</property>
-              </object>
-            </child>
-
-            <!-- FRAGILE: These buttons are manually removed for app mode in ephy-header-bar.c. -->
-            <child>
-              <object class="GtkSeparator" id="new-window-separator">
-                <property name="orientation">horizontal</property>
-                <property name="margin-top">6</property>
-                <property name="margin-bottom">6</property>
-                <property name="visible">True</property>
-              </object>
-            </child>
-            <child>
-              <object class="GtkModelButton" id="new-window-button">
-                <property name="text" translatable="yes">_New Window</property>
-                <property name="action-name">app.new-window</property>
-                <property name="visible">True</property>
-              </object>
-            </child>
-            <child>
-              <object class="GtkModelButton" id="new-incognito-window-button">
-                <property name="text" translatable="yes">New _Incognito Window</property>
-                <property name="action-name">app.new-incognito</property>
-                <property name="visible">True</property>
-              </object>
-            </child>
-            <child>
-              <object class="GtkSeparator">
-                <property name="orientation">horizontal</property>
-                <property name="margin-top">6</property>
-                <property name="margin-bottom">6</property>
-                <property name="visible">True</property>
-              </object>
-            </child>
-            <!-- FRAGILE: This button is manually removed for app mode in ephy-header-bar.c. -->
-            <child>
-              <object class="GtkModelButton" id="reopen-closed-tab-button">
-                <property name="text" translatable="yes">Reopen Closed _Tab</property>
-                <property name="action-name">app.reopen-closed-tab</property>
-                <property name="visible">True</property>
-              </object>
-            </child>
-            <child>
-              <object class="GtkModelButton">
-                <property name="text" translatable="yes">_History</property>
-                <property name="action-name">app.history</property>
-                <property name="visible">True</property>
-              </object>
-            </child>
-            <!-- FRAGILE: These buttons are manually removed for app mode in ephy-header-bar.c. -->
-            <child>
-              <object class="GtkSeparator" id="firefox-sync-separator">
-                <property name="orientation">horizontal</property>
-                <property name="margin-top">6</property>
-                <property name="margin-bottom">6</property>
-                <property name="visible">True</property>
-              </object>
-            </child>
-            <child>
-              <object class="GtkModelButton" id="firefox-sync-button">
-                <property name="text" translatable="yes">Firefox _Sync</property>
-                <property name="action-name">app.firefox-sync-dialog</property>
-                <property name="visible">True</property>
-              </object>
-            </child>
-            <child>
-              <object class="GtkModelButton" id="import-export-menu">
-                <property name="text" translatable="yes">I_mport and Export</property>
-                <property name="visible">True</property>
-                <property name="menu-name">import_export</property>
-              </object>
-            </child>
-            <!-- FRAGILE: These buttons are manually removed for app mode in ephy-header-bar.c. -->
-            <child>
-              <object class="GtkSeparator" id="save-as-application-separator">
-                <property name="orientation">horizontal</property>
-                <property name="margin-top">6</property>
-                <property name="margin-bottom">6</property>
-                <property name="visible">True</property>
-              </object>
-            </child>
-            <child>
-              <object class="GtkModelButton" id="save-as-application-button">
-                <property name="text" translatable="yes">Install Site as Web _Application…</property>
-                <property name="action-name">win.save-as-application</property>
-                <property name="visible">True</property>
-              </object>
-            </child>
-            <child>
-              <object class="GtkModelButton" id="application-manager-button">
-                <property name="text" translatable="yes">Open Appli_cation Manager</property>
-                <property name="action-name">win.open-application-manager</property>
-                <property name="visible">True</property>
-              </object>
-            </child>
-            <child>
-              <object class="GtkModelButton" id="extensions-button">
-                <property name="text" translatable="yes">E_xtensions</property>
-                <property name="action-name">win.extensions</property>
-                <property name="visible">True</property>
-              </object>
-            </child>
-            <!-- FRAGILE: These buttons are manually removed for app mode in ephy-header-bar.c. -->
-            <child>
-              <object class="GtkSeparator" id="override-text-encoding-separator">
-                <property name="orientation">horizontal</property>
-                <property name="margin-top">6</property>
-                <property name="margin-bottom">6</property>
-                <property name="visible">True</property>
-              </object>
-            </child>
-            <child>
-              <object class="GtkModelButton" id="override-text-encoding-button">
-                <property name="text" translatable="yes">_Override Text Encoding…</property>
-                <property name="action-name">win.encoding</property>
-                <property name="visible">True</property>
-              </object>
-            </child>
-            <child>
-              <object class="GtkSeparator">
-                <property name="orientation">horizontal</property>
-                <property name="margin-top">6</property>
-                <property name="margin-bottom">6</property>
-                <property name="visible">True</property>
-              </object>
-            </child>
-            <child>
-              <object class="GtkModelButton">
-                <property name="text" translatable="yes">Pr_eferences</property>
-                <property name="action-name">app.preferences</property>
-                <property name="visible">True</property>
-              </object>
-            </child>
-            <!-- FRAGILE: This button is manually removed for app mode in ephy-header-bar.c. -->
-            <child>
-              <object class="GtkModelButton" id="keyboard-shortcuts-button">
-                <property name="text" translatable="yes">_Keyboard Shortcuts</property>
-                <property name="action-name">app.shortcuts</property>
-                <property name="visible">True</property>
-              </object>
-            </child>
-            <!-- FRAGILE: This button is manually removed for app mode/Pantheon in ephy-header-bar.c. -->
-            <child>
-              <object class="GtkModelButton" id="help-button">
-                <property name="text" translatable="yes">_Help</property>
-                <property name="action-name">app.help</property>
-                <property name="visible">True</property>
-              </object>
-            </child>
-            <!-- FRAGILE: This button is manually removed for Pantheon in ephy-header-bar.c. -->
-            <child>
-              <object class="GtkModelButton" id="about-button">
-                <property name="text" translatable="yes">_About Web</property>
-                <property name="action-name">app.about</property>
-                <property name="visible">True</property>
-              </object>
-            </child>
-
+          <object class="GtkButton">
+            <property name="tooltip_text" translatable="yes" context="tooltip">Zoom In</property>
+            <property name="icon_name">zoom-in-symbolic</property>
+            <property name="action-name">win.zoom-in</property>
           </object>
         </child>
       </object>
-      <packing>
-        <property name="submenu">main</property>
-      </packing>
     </child>
-    <child>
+    <child type="header">
       <object class="GtkBox">
-        <property name="margin-top">12</property>
-        <property name="orientation">vertical</property>
-        <property name="visible">True</property>
-        <style>
-          <class name="page-menu-contents"/>
-        </style>
-        <child>
-          <object class="GtkModelButton">
-            <property name="text" translatable="yes">Import and Export</property>
-            <property name="visible">True</property>
-            <property name="centered">True</property>
-            <property name="menu-name">main</property>
-            <property name="inverted">True</property>
-            <property name="margin-bottom">6</property>
-          </object>
-        </child>
+        <property name="orientation">horizontal</property>
+        <property name="spacing">6</property>
+        <property name="homogeneous">True</property>
+        <property name="margin-top">6</property>
         <child>
-          <object class="GtkModelButton">
-            <property name="text" translatable="yes">I_mport Bookmarks…</property>
-            <property name="action-name">app.import-bookmarks</property>
-            <property name="visible">True</property>
+          <object class="GtkButton">
+            <property name="tooltip_text" translatable="yes">Print…</property>
+            <property name="icon-name">document-print-symbolic</property>
+            <property name="action-name">win.print</property>
           </object>
         </child>
         <child>
-          <object class="GtkModelButton">
-            <property name="text" translatable="yes">E_xport Bookmarks…</property>
-            <property name="action-name">app.export-bookmarks</property>
-            <property name="visible">True</property>
+          <object class="GtkButton">
+            <property name="tooltip_text" translatable="yes">Find…</property>
+            <property name="icon-name">edit-find-symbolic</property>
+            <property name="action-name">win.find</property>
           </object>
         </child>
         <child>
-          <object class="GtkSeparator">
-            <property name="orientation">horizontal</property>
-            <property name="margin-top">6</property>
-            <property name="margin-bottom">6</property>
-            <property name="visible">True</property>
+          <object class="GtkButton">
+            <property name="tooltip_text" translatable="yes">Fullscreen</property>
+            <property name="icon-name">view-fullscreen-symbolic</property>
+            <property name="action-name">win.fullscreen</property>
           </object>
         </child>
         <child>
-          <object class="GtkModelButton">
-            <property name="text" translatable="yes">Import _Passwords…</property>
-            <property name="action-name">app.import-passwords</property>
-            <property name="visible">True</property>
+          <object class="GtkButton" id="combined_stop_reload_button">
+            <property name="tooltip_text" translatable="yes">Reload</property>
+            <property name="icon-name">view-refresh-symbolic</property>
+            <property name="action-name">toolbar.combined-stop-reload</property>
           </object>
         </child>
       </object>
-      <packing>
-        <property name="submenu">import_export</property>
-      </packing>
     </child>
   </object>
-    <object class="GThemedIcon" id="zoom_out">
-    <property name="name">zoom-out-symbolic</property>
-  </object>
-  <object class="GThemedIcon" id="zoom_in">
-    <property name="name">zoom-in-symbolic</property>
-  </object>
-  <object class="GThemedIcon" id="print">
-    <property name="name">document-print-symbolic</property>
-  </object>
-  <object class="GThemedIcon" id="find">
-    <property name="name">system-search-symbolic</property>
-  </object>
-  <object class="GThemedIcon" id="fullscreen">
-    <property name="name">view-fullscreen-symbolic</property>
-  </object>
 </interface>
diff --git a/src/resources/gtk/page-row.ui b/src/resources/gtk/page-row.ui
index 0cb1a93e5..e3a301fe8 100644
--- a/src/resources/gtk/page-row.ui
+++ b/src/resources/gtk/page-row.ui
@@ -6,77 +6,59 @@
     <signal name="map" handler="update_spinner" swapped="true"/>
     <signal name="unmap" handler="update_spinner" swapped="true"/>
     <child>
-      <object class="GtkEventBox">
-        <property name="visible">True</property>
-        <signal name="button-release-event" handler="button_release_event" swapped="no"/>
+      <object class="GtkGestureClick">
+        <property name="button">2</property>
+        <signal name="released" handler="released_cb"/>
+      </object>
+    </child>
+    <child>
+      <object class="GtkBox" id="box">
+        <property name="margin-start">3</property>
+        <property name="margin-end">1</property>
         <child>
-          <object class="GtkBox" id="box">
-            <property name="visible">True</property>
-            <property name="margin-start">3</property>
-            <property name="margin-end">1</property>
-            <child>
-              <object class="GtkStack" id="icon_stack">
-                <property name="visible">True</property>
-                <property name="margin_start">4</property>
-                <property name="margin_end">4</property>
-                <child>
-                  <object class="GtkImage" id="icon">
-                    <property name="visible">True</property>
-                    <property name="icon_size">1</property>
-                    <property name="pixel_size">16</property>
-                    <property name="margin_top">6</property>
-                    <property name="margin_bottom">6</property>
-                  </object>
-                </child>
-                <child>
-                  <object class="GtkSpinner" id="spinner">
-                    <property name="visible">True</property>
-                  </object>
-                </child>
-              </object>
-            </child>
+          <object class="GtkStack" id="icon_stack">
+            <property name="margin_start">4</property>
+            <property name="margin_end">4</property>
             <child>
-              <object class="GtkLabel" id="title">
-                <property name="visible">True</property>
-                <property name="margin_start">4</property>
-                <property name="hexpand">True</property>
-                <property name="ellipsize">end</property>
-                <property name="single_line_mode">True</property>
-                <property name="xalign">0</property>
+              <object class="GtkImage" id="icon">
+                <property name="pixel_size">16</property>
+                <property name="margin_top">6</property>
+                <property name="margin_bottom">6</property>
               </object>
             </child>
             <child>
-              <object class="GtkImage" id="speaker_icon">
-                <property name="visible">True</property>
-                <property name="margin_start">8</property>
-                <property name="icon_name">audio-volume-high-symbolic</property>
-                <property name="icon_size">1</property>
-              </object>
-            </child>
-            <child>
-              <object class="GtkButton" id="close_button">
-                <property name="visible">True</property>
-                <property name="focus_on_click">False</property>
-                <property name="receives_default">False</property>
-                <property name="tooltip_text" translatable="yes">Close page</property>
-                <property name="valign">center</property>
-                <signal name="clicked" handler="close_clicked_cb" swapped="yes"/>
-                <child>
-                  <object class="GtkImage">
-                    <property name="visible">True</property>
-                    <property name="icon_name">window-close-symbolic</property>
-                    <property name="icon_size">1</property>
-                  </object>
-                </child>
-                <style>
-                  <class name="flat"/>
-                  <class name="image-button"/>
-                  <class name="close-button"/>
-                </style>
-              </object>
+              <object class="GtkSpinner" id="spinner"/>
             </child>
           </object>
         </child>
+        <child>
+          <object class="GtkLabel" id="title">
+            <property name="margin_start">4</property>
+            <property name="hexpand">True</property>
+            <property name="ellipsize">end</property>
+            <property name="single_line_mode">True</property>
+            <property name="xalign">0</property>
+          </object>
+        </child>
+        <child>
+          <object class="GtkImage" id="speaker_icon">
+            <property name="margin_start">8</property>
+            <property name="icon_name">audio-volume-high-symbolic</property>
+          </object>
+        </child>
+        <child>
+          <object class="GtkButton" id="close_button">
+            <property name="focus_on_click">False</property>
+            <property name="tooltip_text" translatable="yes">Close page</property>
+            <property name="valign">center</property>
+            <property name="icon_name">window-close-symbolic</property>
+            <signal name="clicked" handler="close_clicked_cb" swapped="yes"/>
+            <style>
+              <class name="flat"/>
+              <class name="close-button"/>
+            </style>
+          </object>
+        </child>
       </object>
     </child>
   </template>
diff --git a/src/resources/gtk/pages-button.ui b/src/resources/gtk/pages-button.ui
index b08d4c320..c42512a02 100644
--- a/src/resources/gtk/pages-button.ui
+++ b/src/resources/gtk/pages-button.ui
@@ -2,17 +2,17 @@
 <interface>
   <!-- interface-requires gtk+ 3.16 -->
   <template class="EphyPagesButton" parent="GtkButton">
+    <style>
+    <class name="image-button"/>
+    </style>
     <child>
       <object class="GtkOverlay">
-        <property name="visible">True</property>
+        <property name="can-focus">False</property>
         <child>
-          <object class="GtkImage" id="pages_icon">
-            <property name="visible">True</property>
-          </object>
+          <object class="GtkImage" id="pages_icon"/>
         </child>
         <child type="overlay">
           <object class="GtkLabel" id="pages_label">
-            <property name="visible">True</property>
             <property name="width-chars">2</property>
             <attributes>
               <attribute name="font-features" value="tnum=1"/>
@@ -20,9 +20,6 @@
               <attribute name="weight" value="ultrabold"/>
             </attributes>
           </object>
-          <packing>
-            <property name="pass_through">True</property>
-          </packing>
         </child>
       </object>
     </child>
diff --git a/src/resources/gtk/pages-popover.ui b/src/resources/gtk/pages-popover.ui
index 9557d511a..e17212aa9 100644
--- a/src/resources/gtk/pages-popover.ui
+++ b/src/resources/gtk/pages-popover.ui
@@ -3,18 +3,16 @@
   <!-- interface-requires gtk+ 3.16 -->
   <template class="EphyPagesPopover" parent="GtkPopover">
     <style>
-      <class name="combo"/>
+      <class name="menu"/>
     </style>
     <child>
       <object class="GtkScrolledWindow" id="scrolled_window">
         <property name="hscrollbar_policy">never</property>
         <property name="propagate_natural_height">True</property>
         <property name="max-content-height">700</property>
-        <property name="visible">True</property>
         <child>
           <object class="GtkListBox" id="list_box">
             <property name="selection_mode">single</property>
-            <property name="visible">True</property>
             <property name="width_request">300</property>
             <signal name="row-activated" handler="row_activated_cb" swapped="true"/>
             <style>
diff --git a/src/resources/gtk/pages-view.ui b/src/resources/gtk/pages-view.ui
index 9ee40daa3..1077a53db 100644
--- a/src/resources/gtk/pages-view.ui
+++ b/src/resources/gtk/pages-view.ui
@@ -5,53 +5,38 @@
     <property name="name">pages-view</property>
     <property name="orientation">vertical</property>
     <child>
-      <object class="HdyHeaderBar">
-        <property name="visible">True</property>
-        <property name="show-close-button">True</property>
-        <property name="title" translatable="yes">Tabs</property>
-        <property name="has-subtitle">False</property>
-        <child>
+      <object class="GtkHeaderBar">
+        <property name="title-widget">
+          <object class="AdwWindowTitle">
+            <property name="title" translatable="yes">Tabs</property>
+          </object>
+        </property>
+        <child type="start">
           <object class="GtkButton">
-            <property name="visible">True</property>
             <property name="action-name">win.content</property>
-            <child>
-              <object class="GtkImage">
-                <property name="visible">True</property>
-                <property name="icon-name">go-previous-symbolic</property>
-              </object>
-            </child>
+            <property name="icon-name">go-previous-symbolic</property>
           </object>
         </child>
-        <child>
+        <child type="end">
           <object class="GtkButton">
-            <property name="visible">True</property>
             <property name="action-name">win.new-tab</property>
-            <child>
-              <object class="GtkImage">
-                <property name="visible">True</property>
-                <property name="icon-name">tab-new-symbolic</property>
-              </object>
-            </child>
+            <property name="icon-name">tab-new-symbolic</property>
           </object>
-          <packing>
-            <property name="pack-type">end</property>
-          </packing>
         </child>
       </object>
     </child>
     <child>
       <object class="GtkScrolledWindow">
-        <property name="visible">True</property>
         <property name="hscrollbar_policy">never</property>
         <property name="vexpand">True</property>
         <child>
           <object class="GtkListBox" id="list_box">
             <property name="selection_mode">single</property>
-            <property name="visible">True</property>
             <property name="width_request">300</property>
             <signal name="row-activated" handler="row_activated_cb" swapped="true"/>
             <style>
               <class name="pages-list"/>
+              <class name="navigation-sidebar"/>
             </style>
           </object>
         </child>
diff --git a/src/resources/gtk/passwords-view.ui b/src/resources/gtk/passwords-view.ui
index ebd15e246..d5f3bd6fe 100644
--- a/src/resources/gtk/passwords-view.ui
+++ b/src/resources/gtk/passwords-view.ui
@@ -33,31 +33,27 @@
     <signal name="notify::search-text" handler="on_search_text_changed" swapped="yes"/>
     <child>
       <object class="GtkBox">
-        <property name="visible">True</property>
         <property name="orientation">vertical</property>
         <child>
           <object class="GtkScrolledWindow">
             <property name="width_request">300</property>
             <property name="height_request">300</property>
-            <property name="visible">True</property>
             <property name="vexpand">True</property>
             <property name="min_content_width">300</property>
             <property name="min_content_height">300</property>
             <child>
-              <object class="HdyClamp">
-                <property name="visible">True</property>
+              <object class="AdwClamp">
                 <property name="margin_start">6</property>
                 <property name="margin_end">6</property>
                 <child>
                   <object class="GtkListBox" id="listbox">
-                    <property name="visible">True</property>
                     <property name="margin_top">6</property>
                     <property name="margin_bottom">6</property>
                     <property name="valign">start</property>
                     <property name="selection_mode">multiple</property>
                     <property name="activate_on_single_click">False</property>
                     <style>
-                      <class name="content"/>
+                      <class name="boxed-list"/>
                     </style>
                   </object>
                 </child>
diff --git a/src/resources/gtk/prefs-appearance-page.ui b/src/resources/gtk/prefs-appearance-page.ui
index 3c1987985..b7180bb2d 100644
--- a/src/resources/gtk/prefs-appearance-page.ui
+++ b/src/resources/gtk/prefs-appearance-page.ui
@@ -1,60 +1,51 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <interface>
   <requires lib="gtk+" version="3.0"/>
-  <template class="PrefsAppearancePage" parent="HdyPreferencesPage">
+  <template class="PrefsAppearancePage" parent="AdwPreferencesPage">
     <property name="icon_name">document-edit-symbolic</property>
     <property name="title" translatable="yes">Appearance</property>
-    <property name="visible">True</property>
     <child>
-      <object class="HdyPreferencesGroup">
+      <object class="AdwPreferencesGroup">
         <property name="title" translatable="yes">Fonts</property>
-        <property name="visible">True</property>
         <child>
-          <object class="HdyExpanderRow" id="use_gnome_fonts_row">
+          <object class="AdwExpanderRow" id="use_gnome_fonts_row">
             <property name="show_enable_switch">True</property>
             <property name="title" translatable="yes">Use Custom Fonts</property>
-            <property name="visible">True</property>
             <child>
-              <object class="HdyActionRow">
+              <object class="AdwActionRow">
                 <property name="activatable">False</property>
                 <property name="title" translatable="yes">Sans serif font</property>
-                <property name="visible">True</property>
                 <child>
                   <object class="GtkFontButton" id="sans_fontbutton">
                     <property name="font">Sans 12</property>
                     <property name="use-font">True</property>
                     <property name="valign">center</property>
-                    <property name="visible">True</property>
                   </object>
                 </child>
               </object>
             </child>
             <child>
-              <object class="HdyActionRow">
+              <object class="AdwActionRow">
                 <property name="activatable">False</property>
                 <property name="title" translatable="yes">Serif font</property>
-                <property name="visible">True</property>
                 <child>
                   <object class="GtkFontButton" id="serif_fontbutton">
                     <property name="font">Sans 12</property>
                     <property name="use-font">True</property>
                     <property name="valign">center</property>
-                    <property name="visible">True</property>
                   </object>
                 </child>
               </object>
             </child>
             <child>
-              <object class="HdyActionRow">
+              <object class="AdwActionRow">
                 <property name="activatable">False</property>
                 <property name="title" translatable="yes">Monospace font</property>
-                <property name="visible">True</property>
                 <child>
                   <object class="GtkFontButton" id="mono_fontbutton">
                     <property name="font">Sans 12</property>
                     <property name="use-font">True</property>
                     <property name="valign">center</property>
-                    <property name="visible">True</property>
                   </object>
                 </child>
               </object>
@@ -64,110 +55,106 @@
       </object>
     </child>
     <child>
-      <object class="HdyPreferencesGroup" id="reader_mode_box">
+      <object class="AdwPreferencesGroup" id="reader_mode_box">
         <property name="title" translatable="yes">Reader Mode</property>
-        <property name="visible">True</property>
         <child>
-          <object class="HdyComboRow" id="reader_mode_font_style">
+          <object class="AdwComboRow" id="reader_mode_font_style">
             <property name="title" translatable="yes">Font Style</property>
-            <property name="visible">True</property>
+            <property name="expression">
+              <closure type="gchararray" function="reader_font_style_get_name">
+                <lookup name="value" type="AdwEnumListItem"/>
+              </closure>
+            </property>
+            <property name="model">
+              <object class="AdwEnumListModel">
+                <property name="enum-type">EphyPrefsReaderFontStyle</property>
+              </object>
+            </property>
           </object>
         </child>
         <child>
-          <object class="HdyComboRow" id="reader_mode_color_scheme">
+          <object class="AdwComboRow" id="reader_mode_color_scheme">
             <property name="title" translatable="yes">Color Scheme</property>
-            <property name="visible">True</property>
+            <property name="expression">
+              <closure type="gchararray" function="reader_color_scheme_get_name">
+                <lookup name="value" type="AdwEnumListItem"/>
+              </closure>
+            </property>
+            <property name="model">
+              <object class="AdwEnumListModel">
+                <property name="enum-type">EphyPrefsReaderColorScheme</property>
+              </object>
+            </property>
           </object>
         </child>
       </object>
     </child>
     <child>
-      <object class="HdyPreferencesGroup">
+      <object class="AdwPreferencesGroup">
         <property name="title" translatable="yes">Style</property>
-        <property name="visible">True</property>
         <child>
-          <object class="HdyActionRow">
+          <object class="AdwActionRow">
             <property name="activatable_widget">css_switch</property>
             <property name="title" translatable="yes">Use Custom Stylesheet</property>
-            <property name="visible">True</property>
             <child>
               <object class="GtkSwitch" id="css_switch">
                 <property name="valign">center</property>
-                <property name="visible">True</property>
               </object>
             </child>
             <child>
               <object class="GtkSeparator">
                 <property name="margin_bottom">8</property>
                 <property name="margin_top">8</property>
-                <property name="visible">True</property>
               </object>
             </child>
             <child>
               <object class="GtkButton" id="css_edit_button">
                 <property name="valign">center</property>
-                <property name="visible">True</property>
-                <style>
-                  <class name="image-button"/>
-                </style>
-                <child>
-                  <object class="GtkImage">
-                    <property name="icon_name">document-edit-symbolic</property>
-                    <property name="visible">True</property>
-                  </object>
-                </child>
+                <property name="icon_name">document-edit-symbolic</property>
               </object>
             </child>
           </object>
         </child>
         <child>
-          <object class="HdyActionRow">
+          <object class="AdwActionRow">
             <property name="activatable_widget">js_switch</property>
             <property name="title" translatable="yes">Use Custom JavaScript</property>
-            <property name="visible">True</property>
             <child>
               <object class="GtkSwitch" id="js_switch">
                 <property name="valign">center</property>
-                <property name="visible">True</property>
               </object>
             </child>
             <child>
               <object class="GtkSeparator">
                 <property name="margin_bottom">8</property>
                 <property name="margin_top">8</property>
-                <property name="visible">True</property>
               </object>
             </child>
             <child>
               <object class="GtkButton" id="js_edit_button">
                 <property name="valign">center</property>
-                <property name="visible">True</property>
-                <style>
-                  <class name="image-button"/>
-                </style>
-                <child>
-                  <object class="GtkImage">
-                    <property name="icon_name">document-edit-symbolic</property>
-                    <property name="visible">True</property>
-                  </object>
-                </child>
+                <property name="icon_name">document-edit-symbolic</property>
               </object>
             </child>
           </object>
         </child>
         <child>
-          <object class="HdyActionRow">
+          <object class="AdwActionRow">
             <property name="activatable">False</property>
             <property name="title" translatable="yes">Default Zoom Level</property>
-            <property name="visible">True</property>
             <child>
               <object class="GtkSpinButton" id="default_zoom_spin_button">
-                <property name="adjustment">zoom_adjustment</property>
-                <property name="input_purpose">number</property>
+                <property name="adjustment">
+                  <object class="GtkAdjustment" id="zoom_adjustment">
+                    <property name="lower">33</property>
+                    <property name="upper">300</property>
+                    <property name="step_increment">1</property>
+                    <property name="page_increment">10</property>
+                  </object>
+                </property>
                 <property name="max_width_chars">5</property>
                 <property name="valign">center</property>
                 <property name="value">100</property>
-                <property name="visible">True</property>
                 <signal name="output" handler="on_default_zoom_spin_button_output"/>
                 <signal name="value-changed" handler="on_default_zoom_spin_button_value_changed"/>
               </object>
@@ -185,10 +172,4 @@
       <widget name="mono_fontbutton"/>
     </widgets>
   </object>
-  <object class="GtkAdjustment" id="zoom_adjustment">
-    <property name="lower">33</property>
-    <property name="upper">300</property>
-    <property name="step_increment">1</property>
-    <property name="page_increment">10</property>
-  </object>
 </interface>
diff --git a/src/resources/gtk/prefs-dialog.ui b/src/resources/gtk/prefs-dialog.ui
index 9556fbbe5..7398a0ed9 100644
--- a/src/resources/gtk/prefs-dialog.ui
+++ b/src/resources/gtk/prefs-dialog.ui
@@ -1,20 +1,18 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <interface>
   <requires lib="gtk+" version="3.0"/>
-  <template class="EphyPrefsDialog" parent="HdyPreferencesWindow">
-    <property name="role">epiphany-preferences</property>
+  <template class="EphyPrefsDialog" parent="AdwPreferencesWindow">
     <property name="modal">True</property>
-    <property name="window-position">center</property>
     <property name="destroy-with-parent">True</property>
     <property name="icon-name">gtk-preferences</property>
     <property name="default-width">640</property>
     <property name="default-height">800</property>
-    <property name="can-swipe-back">True</property>
-    <signal name="key-press-event" handler="on_key_press_event"/>
+    <property name="can-navigate-back">True</property>
+<!--    <signal name="key-press-event" handler="on_key_press_event"/>
     <signal name="delete-event" handler="on_delete_event"/>
     <child>
       <object class="PrefsGeneralPage" id="general_page"/>
-    </child>
+    </child>-->
     <child>
       <object class="PrefsPrivacyPage">
         <signal name="passwords-row-activated" handler="on_passwords_row_activated"/>
diff --git a/src/resources/gtk/prefs-general-page.ui b/src/resources/gtk/prefs-general-page.ui
index 98d534899..affde7c63 100644
--- a/src/resources/gtk/prefs-general-page.ui
+++ b/src/resources/gtk/prefs-general-page.ui
@@ -1,16 +1,16 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <interface>
   <requires lib="gtk+" version="3.0"/>
-  <template class="PrefsGeneralPage" parent="HdyPreferencesPage">
+  <template class="PrefsGeneralPage" parent="AdwPreferencesPage">
     <property name="icon_name">applications-system-symbolic</property>
     <property name="title" translatable="yes">General</property>
     <property name="visible">True</property>
     <child>
-      <object class="HdyPreferencesGroup" id="webapp_box">
+      <object class="AdwPreferencesGroup" id="webapp_box">
         <property name="title" translatable="yes">Web Application</property>
         <property name="visible">True</property>
         <child>
-          <object class="HdyActionRow">
+          <object class="AdwActionRow">
             <property name="activatable">False</property>
             <property name="title" translatable="yes">_Icon</property>
             <property name="use_underline">True</property>
@@ -33,7 +33,7 @@
           </object>
         </child>
         <child>
-          <object class="HdyActionRow">
+          <object class="AdwActionRow">
             <property name="activatable">False</property>
             <property name="title" translatable="yes">_Homepage</property>
             <property name="use_underline">True</property>
@@ -48,7 +48,7 @@
           </object>
         </child>
         <child>
-          <object class="HdyActionRow">
+          <object class="AdwActionRow">
             <property name="activatable">False</property>
             <property name="title" translatable="yes">_Title</property>
             <property name="use_underline">True</property>
@@ -63,7 +63,7 @@
           </object>
         </child>
         <child>
-          <object class="HdyActionRow">
+          <object class="AdwActionRow">
             <property name="activatable">False</property>
             <property name="title" translatable="yes">_Manage Additional URLs</property>
             <property name="use_underline">True</property>
@@ -89,11 +89,11 @@
       </object>
     </child>
     <child>
-      <object class="HdyPreferencesGroup">
+      <object class="AdwPreferencesGroup">
         <property name="title" translatable="yes">Web Content</property>
         <property name="visible">True</property>
         <child>
-          <object class="HdyActionRow" id="adblock_allow_row">
+          <object class="AdwActionRow" id="adblock_allow_row">
             <property name="activatable_widget">adblock_allow_switch</property>
             <property name="title" translatable="yes">Block _Advertisements</property>
             <property name="use_underline">True</property>
@@ -107,7 +107,7 @@
           </object>
         </child>
         <child>
-          <object class="HdyActionRow">
+          <object class="AdwActionRow">
             <property name="activatable_widget">popups_allow_switch</property>
             <property name="title" translatable="yes">Block _Popup Windows</property>
             <property name="use_underline">True</property>
@@ -123,11 +123,11 @@
       </object>
     </child>
     <child>
-      <object class="HdyPreferencesGroup" id="homepage_box">
+      <object class="AdwPreferencesGroup" id="homepage_box">
         <property name="title" translatable="yes">Homepage</property>
         <property name="visible">True</property>
         <child>
-          <object class="HdyActionRow">
+          <object class="AdwActionRow">
             <property name="activatable_widget">new_tab_homepage_radiobutton</property>
             <property name="title" translatable="yes">Most _Visited Pages</property>
             <property name="use_underline">True</property>
@@ -141,7 +141,7 @@
           </object>
         </child>
         <child>
-          <object class="HdyActionRow">
+          <object class="AdwActionRow">
             <property name="activatable_widget">blank_homepage_radiobutton</property>
             <property name="title" translatable="yes">_Blank Page</property>
             <property name="use_underline">True</property>
@@ -156,7 +156,7 @@
           </object>
         </child>
         <child>
-          <object class="HdyActionRow">
+          <object class="AdwActionRow">
             <property name="activatable_widget">custom_homepage_radiobutton</property>
             <property name="title" translatable="yes">_Custom</property>
             <property name="use_underline">True</property>
@@ -181,11 +181,11 @@
       </object>
     </child>
     <child>
-      <object class="HdyPreferencesGroup" id="download_box">
+      <object class="AdwPreferencesGroup" id="download_box">
         <property name="title" translatable="yes">Downloads</property>
         <property name="visible">True</property>
         <child>
-          <object class="HdyActionRow">
+          <object class="AdwActionRow">
             <property name="activatable_widget">ask_on_download_switch</property>
             <property name="title" translatable="yes">Ask o_n Download</property>
             <property name="use_underline">True</property>
@@ -200,7 +200,7 @@
           </object>
         </child>
         <child>
-          <object class="HdyActionRow" id="download_folder_row">
+          <object class="AdwActionRow" id="download_folder_row">
             <property name="sensitive" bind-source="ask_on_download_switch" bind-property="active" 
bind-flags="sync-create|invert-boolean"/>
             <property name="title" translatable="yes">_Download Folder</property>
             <property name="use_underline">True</property>
@@ -210,7 +210,7 @@
       </object>
     </child>
     <child>
-      <object class="HdyPreferencesGroup" id="search_engine_group">
+      <object class="AdwPreferencesGroup" id="search_engine_group">
         <property name="title" translatable="yes">Search Engines</property>
         <property name="visible">True</property>
         <child>
@@ -221,11 +221,11 @@
       </object>
     </child>
     <child>
-      <object class="HdyPreferencesGroup" id="session_box">
+      <object class="AdwPreferencesGroup" id="session_box">
         <property name="title" translatable="yes">Session</property>
         <property name="visible">True</property>
         <child>
-          <object class="HdyActionRow">
+          <object class="AdwActionRow">
             <property name="activatable_widget">start_in_incognito_mode_switch</property>
             <property name="title" translatable="yes">Start in _Incognito Mode</property>
             <property name="use_underline">True</property>
@@ -239,7 +239,7 @@
           </object>
         </child>
         <child>
-          <object class="HdyActionRow" id="restore_session_row">
+          <object class="AdwActionRow" id="restore_session_row">
             <property name="activatable_widget">restore_session_switch</property>
             <property name="title" translatable="yes">_Restore Tabs on Startup</property>
             <property name="use_underline">True</property>
@@ -255,11 +255,11 @@
       </object>
     </child>
     <child>
-      <object class="HdyPreferencesGroup" id="browsing_box">
+      <object class="AdwPreferencesGroup" id="browsing_box">
         <property name="title" translatable="yes">Browsing</property>
         <property name="visible">True</property>
         <child>
-          <object class="HdyActionRow">
+          <object class="AdwActionRow">
             <property name="activatable_widget">enable_mouse_gesture_switch</property>
             <property name="title" translatable="yes">Mouse _Gestures</property>
             <property name="use_underline">True</property>
@@ -273,7 +273,7 @@
           </object>
         </child>
         <child>
-          <object class="HdyActionRow">
+          <object class="AdwActionRow">
             <property name="activatable_widget">enable_switch_to_new_tab</property>
             <property name="title" translatable="yes">S_witch Immediately to New Tabs</property>
             <property name="use_underline">True</property>
@@ -289,7 +289,7 @@
       </object>
     </child>
     <child>
-      <object class="HdyPreferencesGroup" id="lang_group">
+      <object class="AdwPreferencesGroup" id="lang_group">
         <property name="title" translatable="yes">Languages</property>
         <property name="visible">True</property>
         <child>
@@ -304,11 +304,11 @@
       </object>
     </child>
     <child>
-      <object class="HdyPreferencesGroup">
+      <object class="AdwPreferencesGroup">
         <property name="title" translatable="yes"></property>
         <property name="visible">True</property>
         <child>
-          <object class="HdyActionRow">
+          <object class="AdwActionRow">
             <property name="activatable_widget">enable_spell_checking_switch</property>
             <property name="title" translatable="yes">_Spell Checking</property>
             <property name="use_underline">True</property>
diff --git a/src/resources/gtk/prefs-lang-dialog.ui b/src/resources/gtk/prefs-lang-dialog.ui
index 81f7c3fbe..3f5620c5a 100644
--- a/src/resources/gtk/prefs-lang-dialog.ui
+++ b/src/resources/gtk/prefs-lang-dialog.ui
@@ -27,7 +27,7 @@
         <property name="use_underline">True</property>
       </object>
     </child>
-    <child internal-child="vbox">
+    <child internal-child="content_area">
       <object class="GtkBox" id="dialog-vbox3">
         <property name="visible">True</property>
         <property name="orientation">vertical</property>
diff --git a/src/resources/gtk/prefs-privacy-page.ui b/src/resources/gtk/prefs-privacy-page.ui
index bf61d6b91..9ebf61acf 100644
--- a/src/resources/gtk/prefs-privacy-page.ui
+++ b/src/resources/gtk/prefs-privacy-page.ui
@@ -1,24 +1,20 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <interface>
   <requires lib="gtk+" version="3.0"/>
-  <template class="PrefsPrivacyPage" parent="HdyPreferencesPage">
+  <template class="PrefsPrivacyPage" parent="AdwPreferencesPage">
     <property name="icon_name">preferences-system-privacy-symbolic</property>
     <property name="title" translatable="yes">Privacy</property>
-    <property name="visible">True</property>
     <child>
-      <object class="HdyPreferencesGroup" id="safe_browsing_group">
+      <object class="AdwPreferencesGroup" id="safe_browsing_group">
         <property name="title" translatable="yes">Web Safety</property>
-        <property name="visible">True</property>
         <child>
-          <object class="HdyActionRow">
+          <object class="AdwActionRow">
             <property name="activatable_widget">enable_safe_browsing_switch</property>
             <property name="title" translatable="yes">Block Dangerous Web_sites</property>
             <property name="use_underline">True</property>
-            <property name="visible">True</property>
             <child>
               <object class="GtkSwitch" id="enable_safe_browsing_switch">
                 <property name="valign">center</property>
-                <property name="visible">True</property>
               </object>
             </child>
           </object>
@@ -26,25 +22,23 @@
       </object>
     </child>
     <child>
-      <object class="HdyPreferencesGroup">
+      <object class="AdwPreferencesGroup">
         <property name="title" translatable="yes">Web Tracking</property>
         <property name="visible">True</property>
         <child>
-          <object class="HdyActionRow">
+          <object class="AdwActionRow">
             <property name="activatable_widget">enable_itp_switch</property>
             <property name="title" translatable="yes">Intelligent _Tracking Prevention</property>
             <property name="use_underline">True</property>
-            <property name="visible">True</property>
             <child>
               <object class="GtkSwitch" id="enable_itp_switch">
                 <property name="valign">center</property>
-                <property name="visible">True</property>
               </object>
             </child>
           </object>
         </child>
         <child>
-          <object class="HdyActionRow">
+          <object class="AdwActionRow">
             <property name="activatable_widget">enable_website_data_storage_switch</property>
             <property name="subtitle" translatable="yes">Allow websites to store cookies, databases, and 
local storage data.</property>
             <property name="title" translatable="yes">_Website Data Storage</property>
@@ -61,11 +55,11 @@
       </object>
     </child>
     <child>
-      <object class="HdyPreferencesGroup">
+      <object class="AdwPreferencesGroup">
         <property name="title" translatable="yes">Search Suggestions</property>
         <property name="visible">True</property>
         <child>
-          <object class="HdyActionRow">
+          <object class="AdwActionRow">
             <property name="activatable_widget">enable_google_search_suggestions_switch</property>
             <property name="subtitle" translatable="yes">Enable search suggestions in the URL 
entry.</property>
             <property name="title" translatable="yes">_Google Search Suggestions</property>
@@ -82,11 +76,11 @@
       </object>
     </child>
     <child>
-      <object class="HdyPreferencesGroup">
+      <object class="AdwPreferencesGroup">
         <property name="title" translatable="yes">Personal Data</property>
         <property name="visible">True</property>
         <child>
-          <object class="HdyActionRow">
+          <object class="AdwActionRow">
             <property name="activatable">True</property>
             <property name="subtitle" translatable="yes">You can clear stored personal data.</property>
             <property name="title" translatable="yes">Clear Personal _Data</property>
@@ -104,11 +98,11 @@
       </object>
     </child>
     <child>
-      <object class="HdyPreferencesGroup">
+      <object class="AdwPreferencesGroup">
         <property name="title" translatable="yes">Passwords</property>
         <property name="visible">True</property>
         <child>
-          <object class="HdyActionRow">
+          <object class="AdwActionRow">
             <property name="activatable">True</property>
             <property name="title" translatable="yes">_Passwords</property>
             <property name="use_underline">True</property>
@@ -123,15 +117,13 @@
           </object>
         </child>
         <child>
-          <object class="HdyActionRow">
+          <object class="AdwActionRow">
             <property name="activatable_widget">remember_passwords_switch</property>
             <property name="title" translatable="yes">_Remember Passwords</property>
             <property name="use_underline">True</property>
-            <property name="visible">True</property>
             <child>
               <object class="GtkSwitch" id="remember_passwords_switch">
                 <property name="valign">center</property>
-                <property name="visible">True</property>
               </object>
             </child>
           </object>
diff --git a/src/resources/gtk/search-engine-row.ui b/src/resources/gtk/search-engine-row.ui
index 2656603bf..91b3cf894 100644
--- a/src/resources/gtk/search-engine-row.ui
+++ b/src/resources/gtk/search-engine-row.ui
@@ -1,11 +1,9 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <interface>
   <requires lib="gtk+" version="3.20"/>
-  <template class="EphySearchEngineRow" parent="HdyExpanderRow">
-    <property name="visible">True</property>
+  <template class="EphySearchEngineRow" parent="AdwExpanderRow">
     <child type="prefix">
       <object class="GtkRadioButton" id="radio_button">
-        <property name="visible">True</property>
         <property name="valign">center</property>
         <property name="tooltip-text" translatable="yes">Selects the default search engine</property>
         <signal name="clicked" handler="on_radio_button_clicked_cb" object="EphySearchEngineRow" 
swapped="yes"/>
@@ -14,10 +12,8 @@
     <child>
       <object class="GtkListBoxRow">
         <property name="activatable">False</property>
-        <property name="visible">True</property>
         <child>
           <object class="GtkGrid">
-            <property name="visible">True</property>
             <property name="margin-top">12</property>
             <property name="margin-bottom">12</property>
             <property name="margin-start">12</property>
@@ -27,7 +23,6 @@
             <!-- Name field -->
             <child>
               <object class="GtkLabel">
-                <property name="visible">True</property>
                 <property name="label" translatable="yes">Name</property>
                 <property name="xalign">1</property>
               </object>
@@ -38,7 +33,6 @@
             </child>
             <child>
               <object class="GtkEntry" id="name_entry">
-                <property name="visible">True</property>
                 <property name="hexpand">True</property>
               </object>
               <packing>
@@ -49,7 +43,6 @@
             <!-- Address field -->
             <child>
               <object class="GtkLabel">
-                <property name="visible">True</property>
                 <property name="label" translatable="yes">Address</property>
                 <property name="xalign">1</property>
               </object>
@@ -60,7 +53,6 @@
             </child>
             <child>
               <object class="GtkEntry" id="address_entry">
-                <property name="visible">True</property>
                 <property name="hexpand">True</property>
 
                 <property name="placeholder-text">https://www.example.com/search?q=%s</property>
@@ -75,7 +67,6 @@
             <!-- Bang field -->
             <child>
               <object class="GtkLabel">
-                <property name="visible">True</property>
                 <property name="label" translatable="yes">Shortcut</property>
                 <property name="xalign">1</property>
               </object>
@@ -86,7 +77,6 @@
             </child>
             <child>
               <object class="GtkEntry" id="bang_entry">
-                <property name="visible">True</property>
                 <property name="hexpand">True</property>
 
                 <property name="placeholder-text">!e</property>
@@ -101,8 +91,6 @@
             <!-- Search engine address insight -->
             <child>
               <object class="GtkLabel">
-                <property name="visible">True</property>
-
                 <property name="label" translatable="yes">To determine the search address, perform a search 
using the search engine that you want to add and replace the search term with %s.</property>
                 <property name="xalign">0</property>
                 <property name="wrap">True</property>
@@ -120,7 +108,6 @@
 
             <child>
               <object class="GtkButton" id="remove_button">
-                <property name="visible">True</property>
                 <property name="halign">end</property>
 
                 <property name="label" translatable="yes">R_emove Search Engine</property>
diff --git a/src/resources/gtk/synced-tabs-dialog.ui b/src/resources/gtk/synced-tabs-dialog.ui
index 9d1dcaf65..6c26adb37 100644
--- a/src/resources/gtk/synced-tabs-dialog.ui
+++ b/src/resources/gtk/synced-tabs-dialog.ui
@@ -14,18 +14,13 @@
   <template class="SyncedTabsDialog" parent="GtkDialog">
     <property name="height_request">500</property>
     <property name="modal">True</property>
-    <property name="window_position">center</property>
     <property name="destroy_with_parent">True</property>
-    <property name="type_hint">dialog</property>
+    <property name="title" translatable="yes">Synced Tabs</property>
     <child internal-child="headerbar">
-      <object class="GtkHeaderBar">
-        <property name="title" translatable="yes">Synced Tabs</property>
-        <property name="show-close-button">True</property>
-      </object>
+      <object class="GtkHeaderBar"/>
     </child>
-    <child internal-child="vbox">
+    <child internal-child="content_area">
       <object class="GtkBox">
-        <property name="visible">True</property>
         <property name="orientation">vertical</property>
         <property name="margin-top">15</property>
         <property name="margin-bottom">15</property>
@@ -34,7 +29,6 @@
         <property name="spacing">12</property>
         <child>
           <object class="GtkLabel">
-            <property name="visible">True</property>
             <property name="xalign">0</property>
             <property name="wrap">True</property>
             <property name="max-width-chars">50</property>
@@ -43,16 +37,13 @@
         </child>
         <child>
           <object class="GtkBox">
-            <property name="visible">True</property>
             <property name="orientation">vertical</property>
             <property name="spacing">6</property>
             <child>
               <object class="GtkScrolledWindow">
-                <property name="visible">True</property>
                 <property name="vexpand">True</property>
                 <child>
                   <object class="GtkTreeView" id="treeview">
-                    <property name="visible">True</property>
                     <property name="model">treestore</property>
                     <property name="headers-visible">False</property>
                     <signal name="row-activated" handler="treeview_row_activated_cb"/>
diff --git a/src/resources/gtk/web-extensions-dialog.ui b/src/resources/gtk/web-extensions-dialog.ui
index 67dd0b025..85087bdb6 100644
--- a/src/resources/gtk/web-extensions-dialog.ui
+++ b/src/resources/gtk/web-extensions-dialog.ui
@@ -2,70 +2,56 @@
 <!-- Generated with glade 3.38.0 -->
 <interface>
   <requires lib="gtk+" version="3.20"/>
-  <template class="EphyWebExtensionDialog" parent="HdyWindow">
+  <template class="EphyWebExtensionDialog" parent="GtkWindow">
     <property name="modal">True</property>
-    <property name="window-position">center-on-parent</property>
     <property name="default-width">640</property>
     <property name="default-height">400</property>
     <property name="destroy-with_parent">True</property>
-    <property name="type-hint">dialog</property>
     <property name="title" translatable="yes">Extensions</property>
-    <child>
-      <object class="GtkBox">
-        <property name="visible">True</property>
-        <property name="orientation">vertical</property>
+    <child type="titlebar">
+      <object class="GtkHeaderBar">
         <child>
-          <object class="HdyHeaderBar">
-            <property name="visible">True</property>
-            <property name="show-close-button">True</property>
-            <property name="title" translatable="yes">Extensions</property>
-            <child>
-              <object class="GtkButton" id="add_button">
-                <property name="visible">True</property>
-                <property name="use-underline">True</property>
-                <property name="label" translatable="yes">_Add…</property>
-                <signal name="clicked" handler="on_add_button_clicked"/>
-              </object>
-            </child>
+          <object class="GtkButton" id="add_button">
+            <property name="icon-name">list-add-symbolic</property>
+            <property name="tooltip-text" translatable="yes">Add an Extension</property>
+            <signal name="clicked" handler="on_add_button_clicked"/>
           </object>
         </child>
+      </object>
+    </child>
+    <child>
+      <object class="GtkStack" id="stack">
         <child>
-          <object class="GtkStack" id="stack">
-            <property name="visible">True</property>
-            <property name="vexpand">True</property>
-            <child>
-              <object class="HdyStatusPage">
-                <property name="visible">True</property>
+          <object class="GtkStackPage">
+            <property name="name">empty</property>
+            <property name="child">
+              <object class="AdwStatusPage">
                 <property name="icon-name">application-x-addon-symbolic</property>
                 <property name="title" translatable="yes">No Extensions Installed</property>
                 <property name="description" translatable="yes">Add some extensions to display them 
here.</property>
               </object>
-              <packing>
-                <property name="name">empty</property>
-              </packing>
-            </child>
-            <child>
-              <object class="HdyPreferencesPage">
-                <property name="visible">True</property>
+            </property>
+          </object>
+        </child>
+        <child>
+          <object class="GtkStackPage">
+            <property name="name">list</property>
+            <property name="child">
+              <object class="AdwPreferencesPage">
                 <child>
-                  <object class="HdyPreferencesGroup">
-                    <property name="visible">True</property>
+                  <object class="AdwPreferencesGroup">
                     <child>
                       <object class="GtkListBox" id="listbox">
-                        <property name="visible">True</property>
                         <property name="selection-mode">none</property>
                         <style>
-                          <class name="content"/>
+                          <class name="boxed-list"/>
                         </style>
                       </object>
                     </child>
                   </object>
                 </child>
               </object>
-              <packing>
-                <property name="name">list</property>
-              </packing>
-            </child>
+            </property>
           </object>
         </child>
       </object>
diff --git a/src/resources/gtk/webapp-additional-urls-dialog.ui 
b/src/resources/gtk/webapp-additional-urls-dialog.ui
index a0aaa7649..f3b0c11a7 100644
--- a/src/resources/gtk/webapp-additional-urls-dialog.ui
+++ b/src/resources/gtk/webapp-additional-urls-dialog.ui
@@ -9,17 +9,14 @@
   </object>
   <template class="EphyWebappAdditionalURLsDialog" parent="GtkDialog">
     <property name="modal">True</property>
-    <property name="window_position">center-on-parent</property>
     <property name="default_width">300</property>
     <property name="default_height">400</property>
     <property name="destroy_with_parent">True</property>
-    <property name="type_hint">dialog</property>
     <property name="title" translatable="yes">Additional URLs</property>
-    <child internal-child="vbox">
+    <child internal-child="content_area">
       <object class="GtkBox">
         <child>
           <object class="GtkLabel">
-            <property name="visible">True</property>
             <property name="xalign">0</property>
             <property name="margin-top">12</property>
             <property name="margin-bottom">12</property>
@@ -31,12 +28,10 @@
         </child>
         <child>
           <object class="GtkScrolledWindow">
-            <property name="visible">True</property>
             <property name="vexpand">True</property>
             <property name="hscrollbar_policy">never</property>
             <child>
               <object class="GtkTreeView" id="treeview">
-                <property name="visible">True</property>
                 <property name="model">liststore</property>
                 <property name="enable_search">False</property>
                 <property name="search_column">0</property>
@@ -70,50 +65,32 @@
         </child>
         <child>
           <object class="GtkActionBar">
-            <property name="visible">True</property>
             <child>
-              <object class="GtkButton">
-                <property name="visible">True</property>
+              <object class="GtkButton" type="start">
+                <property name="icon_name">list-add-symbolic</property>
                 <property name="tooltip_text" translatable="yes">Add new URL</property>
                 <property name="action-name">webapp-additional-urls.new</property>
-                <child>
-                  <object class="GtkImage">
-                    <property name="visible">True</property>
-                    <property name="icon_name">list-add-symbolic</property>
-                  </object>
-                </child>
               </object>
             </child>
-            <child>
+            <child type="start">
               <object class="GtkButton">
-                <property name="visible">True</property>
                 <property name="tooltip_text" translatable="yes">Remove the selected URLs</property>
+                <property name="icon_name">list-remove-symbolic</property>
                 <property name="action-name">webapp-additional-urls.forget</property>
                 <accelerator key="Delete" signal="clicked"/>
                 <accelerator key="KP_Delete" signal="clicked"/>
-                <child>
-                  <object class="GtkImage">
-                    <property name="visible">True</property>
-                    <property name="icon_name">list-remove-symbolic</property>
-                  </object>
-                </child>
               </object>
             </child>
-            <child>
+            <child type="end">
               <object class="GtkButton">
                 <property name="label" translatable="yes">C_lear All</property>
-                <property name="visible">True</property>
                 <property name="use_underline">True</property>
                 <property name="action-name">webapp-additional-urls.forget-all</property>
                 <accelerator key="Delete" modifiers="GDK_SHIFT_MASK" signal="clicked"/>
                 <style>
                   <class name="destructive-action"/>
-                  <class name="text-button"/>
                 </style>
               </object>
-              <packing>
-                <property name="pack-type">end</property>
-              </packing>
             </child>
           </object>
         </child>
diff --git a/src/webextension/api/pageaction.c b/src/webextension/api/pageaction.c
index 1f2d53ff4..7ee94ec90 100644
--- a/src/webextension/api/pageaction.c
+++ b/src/webextension/api/pageaction.c
@@ -57,6 +57,7 @@ pageaction_handler_seticon (EphyWebExtension *self,
   GtkWidget *action;
   g_autoptr (JSCValue) path = NULL;
   g_autoptr (GdkPixbuf) pixbuf = NULL;
+  GtkWidget *child;
 
   action = pageaction_get_action (self, args);
   if (!action)
@@ -65,7 +66,10 @@ pageaction_handler_seticon (EphyWebExtension *self,
   path = jsc_value_object_get_property (args, "path");
   pixbuf = ephy_web_extension_load_pixbuf (self, jsc_value_to_string (path));
 
-  gtk_image_set_from_pixbuf (GTK_IMAGE (gtk_bin_get_child (GTK_BIN (action))), pixbuf);
+  /* action can be a GtkButton or GtkMenuButton. They both have a "child" property */
+  g_object_get (action, "child", &child, NULL);
+
+  gtk_image_set_from_pixbuf (GTK_IMAGE (child), pixbuf);
 
   return NULL;
 }
@@ -94,7 +98,7 @@ pageaction_handler_gettitle (EphyWebExtension *self,
                              JSCValue         *args)
 {
   GtkWidget *action;
-  g_autofree char *title = NULL;
+  const char *title = NULL;
 
   action = pageaction_get_action (self, args);
   if (!action)
diff --git a/src/webextension/ephy-web-extension-manager.c b/src/webextension/ephy-web-extension-manager.c
index 4aaa9f9fe..b67e6e547 100644
--- a/src/webextension/ephy-web-extension-manager.c
+++ b/src/webextension/ephy-web-extension-manager.c
@@ -40,6 +40,7 @@
 #include "api/runtime.h"
 #include "api/tabs.h"
 
+#include <adwaita.h>
 #include <json-glib/json-glib.h>
 
 struct _EphyWebExtensionManager {
@@ -149,6 +150,16 @@ ephy_web_extension_manager_scan_directory (EphyWebExtensionManager *self,
   }
 }
 
+static void
+destroy_action (GtkWidget *action)
+{
+  GtkWidget *parent = gtk_widget_get_parent (action);
+
+  g_assert (GTK_IS_BOX (parent));
+
+  gtk_box_remove (GTK_BOX (parent), action);
+}
+
 static void
 ephy_web_extension_manager_constructed (GObject *object)
 {
@@ -157,7 +168,7 @@ ephy_web_extension_manager_constructed (GObject *object)
 
   self->background_web_views = g_hash_table_new (NULL, NULL);
   self->page_action_map = g_hash_table_new_full (NULL, NULL, NULL, (GDestroyNotify)g_hash_table_destroy);
-  self->browser_action_map = g_hash_table_new_full (NULL, NULL, NULL, (GDestroyNotify)gtk_widget_destroy);
+  self->browser_action_map = g_hash_table_new_full (NULL, NULL, NULL, (GDestroyNotify)destroy_action);
   self->web_extensions = NULL;
 
   ephy_web_extension_manager_scan_directory (self, dir);
@@ -282,7 +293,6 @@ ephy_web_extension_manager_uninstall (EphyWebExtensionManager *self,
   ephy_web_extension_remove (web_extension);
   ephy_web_extension_manager_remove_from_list (self, web_extension);
 }
-
 void
 ephy_web_extension_manager_update_location_entry (EphyWebExtensionManager *self,
                                                   EphyWindow              *window)
@@ -329,10 +339,12 @@ ephy_web_extension_manager_set_background_web_view (EphyWebExtensionManager *sel
   g_hash_table_insert (self->background_web_views, web_extension, web_view);
 }
 
-static gboolean
-page_action_clicked (GtkWidget      *event_box,
-                     GdkEventButton *event,
-                     gpointer        user_data)
+static void
+page_action_clicked (GtkGesture *gesture,
+                     int         n_press,
+                     double      x,
+                     double      y,
+                     gpointer    user_data)
 {
   EphyWebExtension *web_extension = EPHY_WEB_EXTENSION (user_data);
   EphyShell *shell = ephy_shell_get_default ();
@@ -344,6 +356,8 @@ page_action_clicked (GtkWidget      *event_box,
   EphyWebExtensionManager *self = ephy_shell_get_web_extension_manager (shell);
   WebKitWebView *web_view = WEBKIT_WEB_VIEW (ephy_web_extension_manager_get_background_web_view (self, 
web_extension));
 
+  gtk_gesture_set_state (gesture, GTK_EVENT_SEQUENCE_CLAIMED);
+
   json_builder_begin_object (builder);
   json_builder_set_member_name (builder, "url");
   json_builder_add_string_value (builder, ephy_web_view_get_address (view));
@@ -362,8 +376,6 @@ page_action_clicked (GtkWidget      *event_box,
                                            NULL,
                                            NULL,
                                            NULL);
-
-  return GDK_EVENT_STOP;
 }
 
 static GtkWidget *
@@ -372,17 +384,20 @@ create_page_action_widget (EphyWebExtensionManager *self,
 {
   GtkWidget *image;
   GtkWidget *event_box;
-  GtkStyleContext *context;
+  GtkGesture *gesture;
 
   /* Create new event box with page action */
-  event_box = gtk_event_box_new ();
+  // FIXME: the bin is here so if some code does get_parent(), it won't fall
+  // apart. Remove this once we know nothing is doing this
+  event_box = adw_bin_new ();
   image = gtk_image_new ();
-  gtk_container_add (GTK_CONTAINER (event_box), image);
-  g_signal_connect_object (event_box, "button_press_event", G_CALLBACK (page_action_clicked), web_extension, 
0);
-  gtk_widget_show_all (event_box);
+  adw_bin_set_child (ADW_BIN (event_box), image);
+  gtk_widget_add_css_class (image, "entry_icon");
 
-  context = gtk_widget_get_style_context (image);
-  gtk_style_context_add_class (context, "entry_icon");
+  gesture = gtk_gesture_click_new ();
+  g_signal_connect_object (gesture, "released",
+                           G_CALLBACK (page_action_clicked), web_extension, 0);
+  gtk_widget_add_controller (image, GTK_EVENT_CONTROLLER (gesture));
 
   return g_object_ref (event_box);
 }
@@ -548,7 +563,7 @@ ephy_web_extension_manager_add_web_extension_to_webview (EphyWebExtensionManager
 
       table = g_hash_table_lookup (self->page_action_map, web_extension);
       if (!table) {
-        table = g_hash_table_new_full (NULL, NULL, NULL, (GDestroyNotify)gtk_widget_destroy);
+        table = g_hash_table_new_full (NULL, NULL, NULL, (GDestroyNotify)NULL); // FIXME was 
gtk_widget_destroy
         g_hash_table_insert (self->page_action_map, web_extension, table);
       }
 
@@ -561,15 +576,15 @@ ephy_web_extension_manager_add_web_extension_to_webview (EphyWebExtensionManager
 }
 
 static void
-page_attached_cb (HdyTabView *tab_view,
-                  HdyTabPage *page,
+page_attached_cb (AdwTabView *tab_view,
+                  AdwTabPage *page,
                   gint        position,
                   gpointer    user_data)
 {
   EphyWebExtension *web_extension = EPHY_WEB_EXTENSION (user_data);
-  GtkWidget *child = hdy_tab_page_get_child (page);
+  GtkWidget *child = adw_tab_page_get_child (page);
   EphyWebView *web_view = ephy_embed_get_web_view (EPHY_EMBED (child));
-  EphyWindow *window = EPHY_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (tab_view)));
+  EphyWindow *window = EPHY_WINDOW (gtk_widget_get_root (GTK_WIDGET (tab_view)));
   EphyWebExtensionManager *self = ephy_shell_get_web_extension_manager (ephy_shell_get_default ());
 
   ephy_web_extension_manager_add_web_extension_to_webview (self, web_extension, window, web_view);
@@ -671,7 +686,7 @@ create_browser_popup (EphyWebExtension *web_extension)
   g_autofree char *dir_name = NULL;
   const char *popup;
 
-  popover = gtk_popover_new (NULL);
+  popover = gtk_popover_new ();
 
   web_view = create_web_extensions_webview (web_extension, TRUE);
 
@@ -680,8 +695,7 @@ create_browser_popup (EphyWebExtension *web_extension)
   base_uri = g_strdup_printf ("ephy-webextension:///%s/", dir_name);
   data = ephy_web_extension_get_resource_as_string (web_extension, popup);
   webkit_web_view_load_html (WEBKIT_WEB_VIEW (web_view), (char *)data, base_uri);
-  gtk_container_add (GTK_CONTAINER (popover), web_view);
-  gtk_widget_show_all (web_view);
+  gtk_popover_set_child (GTK_POPOVER (popover), web_view);
 
   return popover;
 }
@@ -728,8 +742,7 @@ create_browser_action (EphyWebExtension *web_extension)
     popover = create_browser_popup (web_extension);
     gtk_menu_button_set_popover (GTK_MENU_BUTTON (button), popover);
 
-    gtk_button_set_image (GTK_BUTTON (button), image);
-    gtk_widget_set_visible (button, TRUE);
+    gtk_menu_button_set_child (GTK_MENU_BUTTON (button), image);
   } else {
     GdkPixbuf *pixbuf = ephy_web_extension_browser_action_get_icon (web_extension, 16);
 
@@ -738,11 +751,10 @@ create_browser_action (EphyWebExtension *web_extension)
     if (pixbuf)
       image = gtk_image_new_from_pixbuf (pixbuf);
     else
-      image = gtk_image_new_from_icon_name ("application-x-addon-symbolic", GTK_ICON_SIZE_BUTTON);
+      image = gtk_image_new_from_icon_name ("application-x-addon-symbolic");
 
     g_signal_connect_object (button, "clicked", G_CALLBACK (on_browser_action_clicked), web_extension, 0);
-    gtk_button_set_image (GTK_BUTTON (button), image);
-    gtk_widget_set_visible (button, TRUE);
+    gtk_button_set_child (GTK_BUTTON (button), image);
   }
 
   return button;
@@ -754,7 +766,7 @@ ephy_web_extension_manager_add_web_extension_to_window (EphyWebExtensionManager
                                                         EphyWindow              *window)
 {
   EphyTabView *tab_view = ephy_window_get_tab_view (EPHY_WINDOW (window));
-  HdyTabView *view = ephy_tab_view_get_tab_view (tab_view);
+  AdwTabView *view = ephy_tab_view_get_tab_view (tab_view);
 
   if (!ephy_web_extension_manager_is_active (self, web_extension))
     return;
@@ -821,7 +833,7 @@ ephy_web_extension_manager_remove_web_extension_from_window (EphyWebExtensionMan
                                                              EphyWindow              *window)
 {
   EphyTabView *tab_view = ephy_window_get_tab_view (EPHY_WINDOW (window));
-  HdyTabView *view = ephy_tab_view_get_tab_view (tab_view);
+  AdwTabView *view = ephy_tab_view_get_tab_view (tab_view);
   GtkWidget *browser_action_widget;
 
   if (ephy_web_extension_manager_is_active (self, web_extension))
diff --git a/src/window-commands.c b/src/window-commands.c
index 8b138257d..9f41d8c3b 100644
--- a/src/window-commands.c
+++ b/src/window-commands.c
@@ -25,7 +25,7 @@
 
 #include "window-commands.h"
 
-#include "ephy-add-bookmark-popover.h"
+//#include "ephy-add-bookmark-popover.h"
 #include "ephy-bookmarks-export.h"
 #include "ephy-bookmarks-import.h"
 #include "ephy-bookmarks-manager.h"
@@ -252,10 +252,10 @@ show_import_export_result (GtkWindow  *parent,
 
   if (destroy_parent)
     g_signal_connect_swapped (info_dialog, "response",
-                              G_CALLBACK (gtk_widget_destroy), parent);
+                              G_CALLBACK (gtk_window_destroy), parent);
 
   g_signal_connect (info_dialog, "response",
-                    G_CALLBACK (gtk_widget_destroy), NULL);
+                    G_CALLBACK (gtk_window_destroy), NULL);
 
   gtk_window_present (GTK_WINDOW (info_dialog));
 }
@@ -275,11 +275,11 @@ show_firefox_profile_selector_cb (GtkDialog       *selector,
 
     list_box = g_object_get_data (G_OBJECT (selector), "list_box");
     row = gtk_list_box_get_selected_row (GTK_LIST_BOX (list_box));
-    row_widget = gtk_bin_get_child (GTK_BIN (row));
+    row_widget = gtk_list_box_row_get_child (GTK_LIST_BOX_ROW (row));
     selected_profile = g_object_steal_data (G_OBJECT (row_widget), "profile_path");
   }
 
-  gtk_widget_destroy (GTK_WIDGET (selector));
+  gtk_window_destroy (GTK_WINDOW (selector));
 
   /* If there are multiple profiles, but the user didn't select one in
    * the profile (he pressed Cancel), don't display the import info dialog
@@ -332,11 +332,9 @@ show_firefox_profile_selector (GtkWindow *parent,
     gtk_widget_set_margin_bottom (label, 6);
     gtk_list_box_insert (GTK_LIST_BOX (list_box), label, -1);
   }
-  gtk_container_add (GTK_CONTAINER (content_area), list_box);
+  gtk_box_append (GTK_BOX (content_area), list_box);
   g_object_set_data (G_OBJECT (selector), "list_box", list_box);
 
-  gtk_widget_show_all (content_area);
-
   g_signal_connect (selector, "response",
                     G_CALLBACK (show_firefox_profile_selector_cb),
                     parent);
@@ -351,6 +349,7 @@ dialog_bookmarks_import_file_chooser_cb (GtkNativeDialog *file_chooser_dialog,
 {
   EphyBookmarksManager *manager = ephy_shell_get_bookmarks_manager (ephy_shell_get_default ());
   g_autoptr (GError) error = NULL;
+  g_autoptr (GFile) file = NULL;
   g_autofree char *filename = NULL;
   gboolean imported;
 
@@ -359,7 +358,8 @@ dialog_bookmarks_import_file_chooser_cb (GtkNativeDialog *file_chooser_dialog,
   if (response != GTK_RESPONSE_ACCEPT)
     return;
 
-  filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (file_chooser_dialog));
+  file = gtk_file_chooser_get_file (GTK_FILE_CHOOSER (file_chooser_dialog));
+  filename = g_file_get_path (file);
   imported = ephy_bookmarks_import (manager, filename, &error);
 
   show_import_export_result (parent, imported, imported, error,
@@ -396,6 +396,7 @@ dialog_bookmarks_import_from_html_file_chooser_cb (GtkNativeDialog *file_chooser
 {
   EphyBookmarksManager *manager = ephy_shell_get_bookmarks_manager (ephy_shell_get_default ());
   g_autoptr (GError) error = NULL;
+  g_autoptr (GFile) file = NULL;
   g_autofree char *filename = NULL;
   gboolean imported;
 
@@ -404,7 +405,8 @@ dialog_bookmarks_import_from_html_file_chooser_cb (GtkNativeDialog *file_chooser
   if (response != GTK_RESPONSE_ACCEPT)
     return;
 
-  filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (file_chooser_dialog));
+  file = gtk_file_chooser_get_file (GTK_FILE_CHOOSER (file_chooser_dialog));
+  filename = g_file_get_path (file);
   imported = ephy_bookmarks_import_from_html (manager, filename, &error);
 
   show_import_export_result (parent, imported, imported, error,
@@ -522,7 +524,7 @@ dialog_bookmarks_import_cb (GtkWindow       *parent,
         g_assert_not_reached ();
     }
   } else if (response == GTK_RESPONSE_CANCEL) {
-    gtk_widget_destroy (GTK_WIDGET (parent));
+    gtk_window_destroy (GTK_WINDOW (parent));
   }
 }
 
@@ -562,9 +564,10 @@ window_cmd_import_bookmarks (GSimpleAction *action,
   gtk_widget_set_margin_end (content_area, 30);
 
   hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 12);
+  gtk_widget_set_vexpand (hbox, TRUE);
 
   label = gtk_label_new (_("From:"));
-  gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
+  gtk_box_append (GTK_BOX (hbox), label);
 
   tree_model = create_tree_model ();
   combo_box = gtk_combo_box_new_with_model (GTK_TREE_MODEL (tree_model));
@@ -580,16 +583,16 @@ window_cmd_import_bookmarks (GSimpleAction *action,
   gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (combo_box), cell_renderer, TRUE);
   gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (combo_box), cell_renderer,
                                   "text", 0, NULL);
-  gtk_box_pack_start (GTK_BOX (hbox), combo_box, FALSE, TRUE, 0);
+  gtk_box_append (GTK_BOX (hbox), combo_box);
 
-  gtk_container_add (GTK_CONTAINER (content_area), hbox);
+  gtk_box_append (GTK_BOX (content_area), hbox);
 
   gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_OK);
   g_signal_connect (dialog, "response",
                     G_CALLBACK (dialog_bookmarks_import_cb),
                     GTK_COMBO_BOX (combo_box));
 
-  gtk_widget_show_all (dialog);
+  gtk_window_present (GTK_WINDOW (dialog));
 }
 
 static void
@@ -617,6 +620,7 @@ export_bookmarks_file_chooser_cb (GtkNativeDialog *dialog,
                                   GtkWindow       *parent)
 {
   EphyBookmarksManager *manager = ephy_shell_get_bookmarks_manager (ephy_shell_get_default ());
+  g_autoptr (GFile) file = NULL;
   g_autofree char *filename = NULL;
 
   gtk_native_dialog_destroy (dialog);
@@ -624,7 +628,8 @@ export_bookmarks_file_chooser_cb (GtkNativeDialog *dialog,
   if (response != GTK_RESPONSE_ACCEPT)
     return;
 
-  filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog));
+  file = gtk_file_chooser_get_file (GTK_FILE_CHOOSER (dialog));
+  filename = g_file_get_path (file);
   ephy_bookmarks_export (g_object_ref (manager),
                          filename,
                          NULL,
@@ -646,7 +651,6 @@ window_cmd_export_bookmarks (GSimpleAction *action,
                                                           GTK_FILE_CHOOSER_ACTION_SAVE,
                                                           _("_Save"),
                                                           _("_Cancel")));
-  gtk_file_chooser_set_show_hidden (dialog, TRUE);
 
   /* Translators: Only translate the part before ".html" (e.g. "bookmarks") */
   gtk_file_chooser_set_current_name (dialog, _("bookmarks.html"));
@@ -748,7 +752,7 @@ dialog_passwords_import_cb (GtkDialog   *dialog,
         g_assert_not_reached ();
     }
   } else {
-    gtk_widget_destroy (GTK_WIDGET (dialog));
+    gtk_window_destroy (GTK_WINDOW (dialog));
   }
 }
 
@@ -804,9 +808,10 @@ window_cmd_import_passwords (GSimpleAction *action,
   gtk_widget_set_margin_end (content_area, 30);
 
   hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 12);
+  gtk_widget_set_vexpand (hbox, TRUE);
 
   label = gtk_label_new (_("From:"));
-  gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
+  gtk_box_append (GTK_BOX (hbox), label);
 
   tree_model = create_import_passwords_tree_model ();
 
@@ -829,19 +834,18 @@ window_cmd_import_passwords (GSimpleAction *action,
   gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (combo_box), cell_renderer, TRUE);
   gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (combo_box), cell_renderer,
                                   "text", 0, NULL);
-  gtk_box_pack_start (GTK_BOX (hbox), combo_box, FALSE, TRUE, 0);
+  gtk_box_append (GTK_BOX (hbox), combo_box);
 
-  gtk_container_add (GTK_CONTAINER (content_area), hbox);
+  gtk_box_append (GTK_BOX (content_area), hbox);
 
   gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_OK);
   g_signal_connect (dialog, "response",
                     G_CALLBACK (dialog_passwords_import_cb),
                     GTK_COMBO_BOX (combo_box));
 
-  gtk_widget_show_all (dialog);
+  gtk_window_present (GTK_WINDOW (dialog));
 }
 
-
 void
 window_cmd_show_history (GSimpleAction *action,
                          GVariant      *parameter,
@@ -854,7 +858,7 @@ window_cmd_show_history (GSimpleAction *action,
   if (GTK_WINDOW (user_data) != gtk_window_get_transient_for (GTK_WINDOW (dialog)))
     gtk_window_set_transient_for (GTK_WINDOW (dialog),
                                   GTK_WINDOW (user_data));
-  gtk_window_present_with_time (GTK_WINDOW (dialog), gtk_get_current_event_time ());
+  gtk_window_present (GTK_WINDOW (dialog));
 }
 
 void
@@ -869,7 +873,7 @@ window_cmd_show_firefox_sync (GSimpleAction *action,
   if (GTK_WINDOW (user_data) != gtk_window_get_transient_for (GTK_WINDOW (dialog)))
     gtk_window_set_transient_for (GTK_WINDOW (dialog),
                                   GTK_WINDOW (user_data));
-  gtk_window_present_with_time (GTK_WINDOW (dialog), gtk_get_current_event_time ());
+  gtk_window_present (GTK_WINDOW (dialog));
 }
 
 void
@@ -885,7 +889,15 @@ window_cmd_show_preferences (GSimpleAction *action,
     gtk_window_set_transient_for (dialog,
                                   GTK_WINDOW (user_data));
 
-  gtk_window_present_with_time (dialog, gtk_get_current_event_time ());
+  gtk_window_present (dialog);
+}
+
+static void
+window_destroyed (GtkWidget  *widget,
+                  GtkWidget **widget_pointer)
+{
+  if (widget_pointer)
+    *widget_pointer = NULL;
 }
 
 void
@@ -922,7 +934,7 @@ window_cmd_show_shortcuts (GSimpleAction *action,
 
     g_signal_connect (shortcuts_window,
                       "destroy",
-                      G_CALLBACK (gtk_widget_destroyed),
+                      G_CALLBACK (window_destroyed),
                       &shortcuts_window);
 
     g_object_unref (builder);
@@ -931,7 +943,7 @@ window_cmd_show_shortcuts (GSimpleAction *action,
   if (gtk_window_get_transient_for (GTK_WINDOW (shortcuts_window)) != GTK_WINDOW (user_data))
     gtk_window_set_transient_for (GTK_WINDOW (shortcuts_window), GTK_WINDOW (user_data));
 
-  gtk_window_present_with_time (GTK_WINDOW (shortcuts_window), gtk_get_current_event_time ());
+  gtk_window_present (GTK_WINDOW (shortcuts_window));
 }
 
 void
@@ -1045,7 +1057,7 @@ window_cmd_show_about (GSimpleAction *action,
   gtk_about_dialog_set_translator_credits (dialog, _("translator-credits"));
 
   g_signal_connect (dialog, "response",
-                    G_CALLBACK (gtk_widget_destroy), NULL);
+                    G_CALLBACK (gtk_window_destroy), NULL);
   gtk_window_present (GTK_WINDOW (dialog));
 
   g_free (comments);
@@ -1123,7 +1135,7 @@ window_cmd_navigation_new_tab (GSimpleAction *action,
     back_uri = webkit_back_forward_list_item_get_original_uri (back_item);
 
     embed = ephy_shell_new_tab (ephy_shell_get_default (),
-                                EPHY_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (embed))),
+                                EPHY_WINDOW (gtk_widget_get_root (GTK_WIDGET (embed))),
                                 NULL,
                                 0);
 
@@ -1143,7 +1155,7 @@ window_cmd_navigation_new_tab (GSimpleAction *action,
     forward_uri = webkit_back_forward_list_item_get_original_uri (forward_item);
 
     embed = ephy_shell_new_tab (ephy_shell_get_default (),
-                                EPHY_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (embed))),
+                                EPHY_WINDOW (gtk_widget_get_root (GTK_WIDGET (embed))),
                                 embed,
                                 0);
 
@@ -1176,7 +1188,7 @@ check_tab_has_modified_forms_confirm_cb (GtkDialog       *dialog,
 {
   WebKitWebView *view = EPHY_GET_WEBKIT_WEB_VIEW_FROM_EMBED (embed);
 
-  gtk_widget_destroy (GTK_WIDGET (dialog));
+  gtk_window_destroy (GTK_WINDOW (dialog));
 
   if (response == GTK_RESPONSE_ACCEPT) {
     gtk_widget_grab_focus (GTK_WIDGET (embed));
@@ -1191,7 +1203,7 @@ check_tab_has_modified_forms_and_reload_cb (EphyWebView  *view,
                                             GAsyncResult *result,
                                             EphyEmbed    *embed)
 {
-  EphyWindow *window = EPHY_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (view)));
+  EphyWindow *window = EPHY_WINDOW (gtk_widget_get_root (GTK_WIDGET (view)));
   GtkWidget *dialog;
   GtkWidget *button;
   gboolean has_modified_forms;
@@ -1272,7 +1284,7 @@ window_cmd_combined_stop_reload (GSimpleAction *action,
   GAction *gaction;
   GVariant *state;
 
-  action_group = gtk_widget_get_action_group (GTK_WIDGET (user_data), "toolbar");
+  action_group = ephy_window_get_action_group (EPHY_WINDOW (user_data), "toolbar");
 
   state = g_action_get_state (G_ACTION (action));
   /* If loading */
@@ -1295,12 +1307,10 @@ window_cmd_page_menu (GSimpleAction *action,
   EphyWindow *window = EPHY_WINDOW (user_data);
   EphyHeaderBar *header_bar;
   GtkMenuButton *button;
-  GtkPopover *popover;
 
   header_bar = EPHY_HEADER_BAR (ephy_window_get_header_bar (window));
   button = GTK_MENU_BUTTON (ephy_header_bar_get_page_menu_button (header_bar));
-  popover = gtk_menu_button_get_popover (button);
-  gtk_popover_popup (popover);
+  gtk_menu_button_popup (button);
 }
 
 void
@@ -1324,6 +1334,7 @@ window_cmd_new_tab (GSimpleAction *action,
   g_free (url);
 }
 
+#if 0
 static void
 open_response_cb (GtkNativeDialog *dialog,
                   int              response,
@@ -2218,6 +2229,7 @@ window_cmd_redo (GSimpleAction *action,
     }
   }
 }
+
 void
 window_cmd_cut (GSimpleAction *action,
                 GVariant      *parameter,
@@ -2296,6 +2308,7 @@ window_cmd_paste_as_plain_text (GSimpleAction *action,
     webkit_web_view_execute_editing_command (EPHY_GET_WEBKIT_WEB_VIEW_FROM_EMBED (embed), 
WEBKIT_EDITING_COMMAND_PASTE_AS_PLAIN_TEXT);
   }
 }
+#endif
 
 void
 window_cmd_delete (GSimpleAction *action,
@@ -2374,6 +2387,7 @@ window_cmd_find_next (GSimpleAction *action,
   ephy_find_toolbar_find_next (toolbar);
 }
 
+#if 0
 void
 window_cmd_open_bookmark (GSimpleAction *action,
                           GVariant      *parameter,
@@ -2419,6 +2433,7 @@ window_cmd_bookmarks (GSimpleAction *action,
   action_bar_end = EPHY_ACTION_BAR_END (ephy_header_bar_get_action_bar_end (header_bar));
   ephy_action_bar_end_show_bookmarks (action_bar_end);
 }
+#endif
 
 void
 window_cmd_show_downloads (GSimpleAction *action,
@@ -2518,7 +2533,7 @@ window_cmd_page_source (GSimpleAction *action,
 
   new_embed = ephy_shell_new_tab
                 (ephy_shell_get_default (),
-                EPHY_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (embed))),
+                EPHY_WINDOW (gtk_widget_get_root (GTK_WIDGET (embed))),
                 embed,
                 EPHY_NEW_TAB_JUMP | EPHY_NEW_TAB_APPEND_AFTER);
 
@@ -2585,7 +2600,6 @@ window_cmd_send_to (GSimpleAction *action,
   EphyEmbed *embed;
   char *command, *subject, *body;
   const char *location, *title;
-  GError *error = NULL;
 
   embed = ephy_embed_container_get_active_child
             (EPHY_EMBED_CONTAINER (window));
@@ -2604,10 +2618,7 @@ window_cmd_send_to (GSimpleAction *action,
   g_free (subject);
   g_free (body);
 
-  if (!gtk_show_uri_on_window (GTK_WINDOW (window), command, gtk_get_current_event_time (), &error)) {
-    g_warning ("Unable to send link by email: %s\n", error->message);
-    g_error_free (error);
-  }
+  gtk_show_uri (GTK_WINDOW (window), command, GDK_CURRENT_TIME);
 
   g_free (command);
 }
@@ -2620,6 +2631,7 @@ window_cmd_go_location (GSimpleAction *action,
   ephy_window_activate_location (user_data);
 }
 
+#if 0
 void
 window_cmd_location_search (GSimpleAction *action,
                             GVariant      *parameter,
@@ -2627,6 +2639,7 @@ window_cmd_location_search (GSimpleAction *action,
 {
   ephy_window_location_search (user_data);
 }
+#endif
 
 void
 window_cmd_go_home (GSimpleAction *action,
@@ -2659,10 +2672,10 @@ enable_browse_with_caret_state_cb (GtkMessageDialog *dialog,
                                    GtkResponseType   response,
                                    EphyWindow       *window)
 {
-  GActionGroup *action_group = gtk_widget_get_action_group (GTK_WIDGET (window), "win");
+  GActionGroup *action_group = ephy_window_get_action_group (window, "win");
   GAction *action;
 
-  gtk_widget_destroy (GTK_WIDGET (dialog));
+  gtk_window_destroy (GTK_WINDOW (dialog));
 
   action = g_action_map_lookup_action (G_ACTION_MAP (action_group),
                                        "browse-with-caret");
@@ -2904,7 +2917,7 @@ window_cmd_homepage_new_tab (GSimpleAction *action,
   g_assert (embed != NULL);
 
   embed = ephy_shell_new_tab (ephy_shell_get_default (),
-                              EPHY_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (embed))),
+                              EPHY_WINDOW (gtk_widget_get_root (GTK_WIDGET (embed))),
                               NULL,
                               0);
 
@@ -2917,18 +2930,26 @@ window_cmd_homepage_new_tab (GSimpleAction *action,
 }
 
 static void
-clipboard_text_received_cb (GtkClipboard *clipboard,
-                            const gchar  *text,
+clipboard_text_received_cb (GdkClipboard *clipboard,
+                            GAsyncResult *res,
                             EphyWindow   *window)
 {
   EphyEmbed *embed;
   EphyWebView *web_view;
+  g_autoptr (GError) error = NULL;
+  g_autofree char *text;
+
+  text = gdk_clipboard_read_text_finish (clipboard, res, &error);
+  if (error) {
+    g_warning ("Failed to the URL from clipboard: %s", error->message);
+    return;
+  }
 
   embed = ephy_embed_container_get_active_child (EPHY_EMBED_CONTAINER (window));
   g_assert (embed != NULL);
 
   embed = ephy_shell_new_tab (ephy_shell_get_default (),
-                              EPHY_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (embed))),
+                              EPHY_WINDOW (gtk_widget_get_root (GTK_WIDGET (embed))),
                               NULL,
                               0);
 
@@ -2947,12 +2968,13 @@ window_cmd_new_tab_from_clipboard (GSimpleAction *action,
                                    gpointer       user_data)
 {
   EphyWindow *ephy_window = EPHY_WINDOW (user_data);
-  GtkClipboard *clipboard;
+  GdkClipboard *clipboard;
 
-  clipboard = gtk_clipboard_get_default (gdk_display_get_default ());
-  gtk_clipboard_request_text (clipboard,
-                              (GtkClipboardTextReceivedFunc)clipboard_text_received_cb,
-                              g_object_ref (ephy_window));
+  clipboard = gtk_widget_get_clipboard (GTK_WIDGET (ephy_window));
+  gdk_clipboard_read_text_async (clipboard,
+                                 NULL,
+                                 (GAsyncReadyCallback) clipboard_text_received_cb,
+                                 g_object_ref (ephy_window));
 }
 
 void
@@ -3010,5 +3032,5 @@ window_cmd_extensions (GSimpleAction *action,
 
   dialog = ephy_web_extension_dialog_new ();
   gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (window));
-  gtk_widget_show_all (dialog);
+  gtk_window_present (GTK_WINDOW (dialog));
 }
diff --git a/tests/ephy-embed-shell-test.c b/tests/ephy-embed-shell-test.c
index a3107dac9..335bab82a 100644
--- a/tests/ephy-embed-shell-test.c
+++ b/tests/ephy-embed-shell-test.c
@@ -50,9 +50,9 @@ test_ephy_embed_shell_web_view_created (void)
   g_signal_connect (embed_shell, "web-view-created",
                     G_CALLBACK (web_view_created_cb), &web_view_created);
 
-  view = ephy_web_view_new ();
+  view = g_object_ref_sink (ephy_web_view_new ());
   g_assert_true (web_view_created);
-  gtk_widget_destroy (view);
+  g_object_unref (view);
 }
 
 int
diff --git a/tests/ephy-location-entry-test.c b/tests/ephy-location-entry-test.c
index db412847c..d92132065 100644
--- a/tests/ephy-location-entry-test.c
+++ b/tests/ephy-location-entry-test.c
@@ -36,18 +36,6 @@ test_entry_new (void)
   g_assert_true (EPHY_IS_LOCATION_ENTRY (entry));
 }
 
-static void
-test_entry_get_entry (void)
-{
-  EphyLocationEntry *lentry;
-  GtkWidget *entry;
-
-  lentry = EPHY_LOCATION_ENTRY (ephy_location_entry_new ());
-  entry = ephy_location_entry_get_entry (lentry);
-
-  g_assert_true (GTK_IS_ENTRY (entry));
-}
-
 static void
 test_entry_set_location (void)
 {
@@ -108,7 +96,6 @@ test_entry_can_undo (void)
   const char *test = "test";
 
   EphyLocationEntry *lentry;
-  GtkWidget *entry;
 
   lentry = EPHY_LOCATION_ENTRY (ephy_location_entry_new ());
 
@@ -117,8 +104,7 @@ test_entry_can_undo (void)
   /* Use gtk_* function or otherwise user_changed won't be correctly handled
    * internally by the location entry (see editable_changed_cb and
    * block_update) */
-  entry = ephy_location_entry_get_entry (lentry);
-  gtk_entry_set_text (GTK_ENTRY (entry), test);
+  gtk_editable_set_text (GTK_EDITABLE (lentry), test);
   g_assert_cmpint (ephy_location_entry_get_can_undo (lentry), ==, TRUE);
 }
 
@@ -156,8 +142,6 @@ main (int   argc,
 
   g_test_add_func ("/lib/widgets/ephy-location-entry/new",
                    test_entry_new);
-  g_test_add_func ("/lib/widgets/ephy-location-entry/get_entry",
-                   test_entry_get_entry);
   g_test_add_func ("/lib/widgets/ephy-location-entry/set_location",
                    test_entry_set_location);
   g_test_add_func ("/lib/widgets/ephy-location-entry/get_location",
diff --git a/tests/ephy-web-view-test.c b/tests/ephy-web-view-test.c
index 3c359237e..2c50a8860 100644
--- a/tests/ephy-web-view-test.c
+++ b/tests/ephy-web-view-test.c
@@ -168,10 +168,10 @@ test_ephy_web_view_load_url (void)
     URLTest test;
     GMainLoop *loop;
     EphyWebView *view;
-    GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+    GtkWidget *window = gtk_window_new ();
 
     view = EPHY_WEB_VIEW (ephy_web_view_new ());
-    gtk_container_add (GTK_CONTAINER (window), GTK_WIDGET (view));
+    gtk_window_set_child (GTK_WINDOW (window), GTK_WIDGET (view));
     test = test_load_url[i];
     loop = g_main_loop_new (NULL, FALSE);
 
@@ -187,7 +187,7 @@ test_ephy_web_view_load_url (void)
 
     g_main_loop_run (loop);
     g_main_loop_unref (loop);
-    g_object_unref (g_object_ref_sink (view));
+    g_object_unref (window);
   }
 }
 
diff --git a/tests/meson.build b/tests/meson.build
index bfee4398c..a00dc89e5 100644
--- a/tests/meson.build
+++ b/tests/meson.build
@@ -72,25 +72,25 @@ if get_option('unit_tests').enabled()
        env: envs
   )
 
-  history_test = executable('test-ephy-history',
-    'ephy-history-test.c',
-    dependencies: ephymain_dep,
-    c_args: test_cargs,
-  )
-  test('History test',
-       history_test,
-       env: envs
-  )
-
-  location_entry_test = executable('test-location-entry',
-    'ephy-location-entry-test.c',
-    dependencies: ephymain_dep,
-    c_args: test_cargs,
-  )
-  test('Location entry test',
-       location_entry_test,
-       env: envs
-  )
+#  history_test = executable('test-ephy-history',
+#    'ephy-history-test.c',
+#    dependencies: ephymain_dep,
+#    c_args: test_cargs,
+#  )
+#  test('History test',
+#       history_test,
+#       env: envs
+#  )
+
+#  location_entry_test = executable('test-location-entry',
+#    'ephy-location-entry-test.c',
+#    dependencies: ephymain_dep,
+#    c_args: test_cargs,
+#  )
+#  test('Location entry test',
+#       location_entry_test,
+#       env: envs
+#  )
 
   migration_test = executable('test-ephy-migration',
     'ephy-migration-test.c',


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