diff --git a/configure.ac b/configure.ac
index a787728..c098e41 100644
--- a/configure.ac
+++ b/configure.ac
@@ -34,7 +34,7 @@ AC_COPYRIGHT([
 FOLKS_REQUIRED=0.3.3
 GLIB_REQUIRED=2.27.2
 GNUTLS_REQUIRED=2.8.5
-GTK_REQUIRED=2.91.6
+GTK_REQUIRED=2.99.0
 KEYRING_REQUIRED=2.26.0
 GCR_REQUIRED=2.91.4
 LIBCANBERRA_GTK_REQUIRED=0.25
diff --git a/libempathy-gtk/empathy-account-widget.c b/libempathy-gtk/empathy-account-widget.c
index 591c964..b6e84aa 100644
--- a/libempathy-gtk/empathy-account-widget.c
+++ b/libempathy-gtk/empathy-account-widget.c
@@ -1090,6 +1090,7 @@ account_widget_launch_external_clicked (GtkWidget *button,
       GDesktopAppInfo *desktop_info;
       GError *error = NULL;
       GdkAppLaunchContext *context = NULL;
+      GdkDisplay *display;
       gchar *cmd;
       GAppInfo *app_info;
 
@@ -1114,9 +1115,8 @@ account_widget_launch_external_clicked (GtkWidget *button,
           goto out;
         }
 
-      context = gdk_app_launch_context_new ();
-      gdk_app_launch_context_set_screen  (context,
-          gtk_widget_get_screen (button));
+      display = gdk_display_get_default ();
+      context = gdk_display_get_app_launch_context (display);
 
       if (!g_app_info_launch (app_info, NULL, (GAppLaunchContext *) context,
             &error))
diff --git a/libempathy-gtk/empathy-cell-renderer-expander.c b/libempathy-gtk/empathy-cell-renderer-expander.c
index 8e363aa..d6fa877 100644
--- a/libempathy-gtk/empathy-cell-renderer-expander.c
+++ b/libempathy-gtk/empathy-cell-renderer-expander.c
@@ -336,14 +336,12 @@ empathy_cell_renderer_expander_render (GtkCellRenderer      *cell,
 		      "ypad", &ypad,
 		      NULL);
 
-	gtk_paint_expander (gtk_widget_get_style (widget),
-			    cr,
-			    GTK_STATE_NORMAL,
-			    widget,
-			    "treeview",
-			    cell_area->x + x_offset + xpad + priv->expander_size / 2,
-			    cell_area->y + y_offset + ypad + priv->expander_size / 2,
-			    expander_style);
+	gtk_render_expander (gtk_widget_get_style_context (widget),
+			     cr,
+			     cell_area->x + x_offset + xpad,
+			     cell_area->y + y_offset + ypad,
+			     priv->expander_size,
+			     priv->expander_size);
 }
 
 static void
diff --git a/libempathy-gtk/empathy-cell-renderer-text.c b/libempathy-gtk/empathy-cell-renderer-text.c
index d0590ef..d52abb4 100644
--- a/libempathy-gtk/empathy-cell-renderer-text.c
+++ b/libempathy-gtk/empathy-cell-renderer-text.c
@@ -298,10 +298,12 @@ cell_renderer_text_update_text (EmpathyCellRendererText *cell,
 				gboolean                selected)
 {
 	EmpathyCellRendererTextPriv *priv;
+	const PangoFontDescription *font_desc;
 	PangoAttrList              *attr_list;
 	PangoAttribute             *attr_color = NULL, *attr_size;
-	GtkStyle                   *style;
+	GtkStyleContext            *style;
 	gchar                      *str;
+	gint                        font_size;
 
 	priv = GET_PRIV (cell);
 
@@ -324,21 +326,25 @@ cell_renderer_text_update_text (EmpathyCellRendererText *cell,
 		return;
 	}
 
-	style = gtk_widget_get_style (widget);
+	style = gtk_widget_get_style_context (widget);
 
 	attr_list = pango_attr_list_new ();
 
-	attr_size = pango_attr_size_new (pango_font_description_get_size (style->font_desc) / 1.2);
+	font_desc = gtk_style_context_get_font (style, GTK_STATE_FLAG_NORMAL);
+	font_size = pango_font_description_get_size (font_desc);
+	attr_size = pango_attr_size_new (font_size / 1.2);
 	attr_size->start_index = strlen (priv->name) + 1;
 	attr_size->end_index = -1;
 	pango_attr_list_insert (attr_list, attr_size);
 
 	if (!selected) {
-		GdkColor color;
+		GdkRGBA color;
 
-		color = style->text_aa[GTK_STATE_NORMAL];
+		gtk_style_context_get_color (style, 0, &color);
 
-		attr_color = pango_attr_foreground_new (color.red, color.green, color.blue);
+		attr_color = pango_attr_foreground_new (color.red * 0xffff,
+							color.green * 0xffff,
+							color.blue * 0xffff);
 		attr_color->start_index = attr_size->start_index;
 		attr_color->end_index = -1;
 		pango_attr_list_insert (attr_list, attr_color);
diff --git a/libempathy-gtk/empathy-password-dialog.c b/libempathy-gtk/empathy-password-dialog.c
index 2b1048c..30fbc5c 100644
--- a/libempathy-gtk/empathy-password-dialog.c
+++ b/libempathy-gtk/empathy-password-dialog.c
@@ -157,13 +157,25 @@ password_dialog_grab_keyboard (GtkWidget *widget,
 
   if (!priv->grabbing)
     {
-      GdkGrabStatus status = gdk_keyboard_grab (gtk_widget_get_window (widget),
-          FALSE, gdk_event_get_time (event));
-
-      if (status != GDK_GRAB_SUCCESS)
-        DEBUG ("Could not grab keyboard; grab status was %u", status);
+      GdkDevice *device = gdk_event_get_device (event);
+
+      if (device != NULL)
+        {
+          GdkGrabStatus status = gdk_device_grab (device,
+              gtk_widget_get_window (widget),
+              GDK_OWNERSHIP_WINDOW,
+              FALSE,
+              GDK_ALL_EVENTS_MASK,
+              NULL,
+              gdk_event_get_time (event));
+
+          if (status != GDK_GRAB_SUCCESS)
+            DEBUG ("Could not grab keyboard; grab status was %u", status);
+          else
+            priv->grabbing = TRUE;
+        }
       else
-        priv->grabbing = TRUE;
+        DEBUG ("Could not get the event device!");
     }
 
   return FALSE;
@@ -178,7 +190,8 @@ password_dialog_ungrab_keyboard (GtkWidget *widget,
 
   if (priv->grabbing)
     {
-      gdk_keyboard_ungrab (gdk_event_get_time (event));
+      gdk_device_ungrab (gdk_event_get_device (event),
+          gdk_event_get_time (event));
       priv->grabbing = FALSE;
     }
 
diff --git a/src/empathy-accounts-dialog.c b/src/empathy-accounts-dialog.c
index 196ffce..f1a2114 100644
--- a/src/empathy-accounts-dialog.c
+++ b/src/empathy-accounts-dialog.c
@@ -2389,6 +2389,7 @@ empathy_accounts_dialog_show_application (GdkScreen *screen,
     gboolean hidden)
 {
   GError *error = NULL;
+  GdkDisplay *display;
   GString *cmd;
   gchar *path;
   GAppInfo *app_info;
@@ -2435,8 +2436,8 @@ empathy_accounts_dialog_show_application (GdkScreen *screen,
       goto out;
     }
 
-  context = gdk_app_launch_context_new ();
-  gdk_app_launch_context_set_display (context, gdk_screen_get_display (screen));
+  display = gdk_screen_get_display (screen);
+  context = gdk_display_get_app_launch_context (display);
 
   if (!g_app_info_launch (app_info, NULL, (GAppLaunchContext *) context,
         &error))
diff --git a/src/empathy-chat-window.c b/src/empathy-chat-window.c
index 9f893dc..07b940e 100644
--- a/src/empathy-chat-window.c
+++ b/src/empathy-chat-window.c
@@ -219,20 +219,23 @@ chat_window_close_clicked_cb (GtkAction   *action,
 }
 
 static void
-chat_tab_style_set_cb (GtkWidget *hbox,
-				       GtkStyle  *previous_style,
-				       gpointer   user_data)
+chat_tab_style_updated_cb (GtkWidget *hbox,
+			   gpointer   user_data)
 {
 	GtkWidget *button;
 	int char_width, h, w;
 	PangoContext *context;
+	const PangoFontDescription *font_desc;
 	PangoFontMetrics *metrics;
 
 	button = g_object_get_data (G_OBJECT (user_data),
 		"chat-window-tab-close-button");
 	context = gtk_widget_get_pango_context (hbox);
 
-	metrics = pango_context_get_metrics (context, gtk_widget_get_style (hbox)->font_desc,
+	font_desc = gtk_style_context_get_font (gtk_widget_get_style_context (hbox),
+						GTK_STATE_FLAG_NORMAL);
+
+	metrics = pango_context_get_metrics (context, font_desc,
 		pango_context_get_language (context));
 	char_width = pango_font_metrics_get_approximate_char_width (metrics);
 	pango_font_metrics_unref (metrics);
@@ -335,8 +338,8 @@ chat_window_create_label (EmpathyChatWindow *window,
 
 		/* React to theme changes and also setup the size correctly.  */
 		g_signal_connect (hbox,
-				  "style-set",
-				  G_CALLBACK (chat_tab_style_set_cb),
+				  "style-updated",
+				  G_CALLBACK (chat_tab_style_updated_cb),
 				  chat);
 	}
 
diff --git a/src/empathy-main-window.c b/src/empathy-main-window.c
index 88335b6..740220b 100644
--- a/src/empathy-main-window.c
+++ b/src/empathy-main-window.c
@@ -1479,14 +1479,12 @@ static void
 main_window_help_debug_cb (GtkAction         *action,
 			   EmpathyMainWindow *window)
 {
-	GdkScreen *screen = gdk_screen_get_default ();
+	GdkDisplay *display;
 	GError *error = NULL;
 	gchar *path;
 	GAppInfo *app_info;
 	GdkAppLaunchContext *context = NULL;
 
-	g_return_if_fail (GDK_IS_SCREEN (screen));
-
 	/* Try to run from source directory if possible */
 	path = g_build_filename (g_getenv ("EMPATHY_SRCDIR"), "src",
 			"empathy-debugger", NULL);
@@ -1503,8 +1501,8 @@ main_window_help_debug_cb (GtkAction         *action,
 		goto out;
 	}
 
-	context = gdk_app_launch_context_new ();
-	gdk_app_launch_context_set_display (context, gdk_screen_get_display (screen));
+	display = gdk_display_get_default ();
+	context = gdk_display_get_app_launch_context (display);
 
 	if (!g_app_info_launch (app_info, NULL, (GAppLaunchContext *) context,
 		&error)) {
